Пролог. Предикаты - Prolog

Узнай цену своей работы

Формулировка задачи:

Что-то мне совсем взорвало мозг это задание "Создайте предикат, проверяющий, являются ли два человека сестрами, братьями, дедушкой, бабушкой, внуком, внучкой, дядей, тетей, племянником, племянницей, супругами, родственниками" Как это решать? Спасибо!

Решение задачи: «Пролог. Предикаты»

textual
Листинг программы
%% <family>
 
%% <sample>
% ?- family_call(0, 147007207, 147007209, Relation1, Relation2, RelationType, PersonInfo1, PersonInfo2).
% Relation1 = "двоюродная сестра",
% Relation2 = "двоюродный брат",
% RelationType = "родственник",
% PersonInfo1 = 'Гуляева Марфа (жен, совершеннолетняя)',
% PersonInfo2 = 'Лапин Егор (муж, совершеннолетний)' ;
% false.
%% </sample>
 
%% <kb>
gd_family(147007177,0,0,"M",'1900-01-01',"Сидоров Иван").
gd_family(147007179,0,0,"F",'1901-01-01',"Петрова Мария").
gd_family(147007181,147007179,147007177,"M",'1920-01-01',"Сидоров Борис").
gd_family(147007183,147007179,147007177,"F",'1923-01-01',"Сидорова Ирина").
gd_family(147007185,0,0,"F",'1925-01-01',"Панова Зоя").
gd_family(147007187,0,0,"M",'1922-01-01',"Лапин Максим").
gd_family(147007189,147007185,147007181,"M",'1950-01-01',"Сидоров Павел").
gd_family(147007191,147007183,147007187,"F",'1951-01-01',"Лапина Фёкла").
gd_family(147007193,147007183,147007187,"M",'1954-01-01',"Лапин Сергей").
gd_family(147007195,0,0,"F",'1953-01-01',"Маркова Полина").
gd_family(147007197,147007195,147007189,"M",'1974-01-01',"Сидоров Виктор").
gd_family(147007199,0,0,"M",'1952-01-01',"Гуляев Степан").
gd_family(147007201,0,0,"F",'1957-01-01',"Бурова Дарья").
gd_family(147007203,147007195,147007189,"F",'1977-01-01',"Сидорова Соня").
gd_family(147007205,147007195,147007189,"M",'1977-01-01',"Сидоров Глеб").
gd_family(147007207,147007191,147007199,"F",'1975-01-01',"Гуляева Марфа").
gd_family(147007209,147007201,147007193,"M",'1974-01-01',"Лапин Егор").
gd_family(147007211,147007201,147007193,"F",'1979-01-01',"Лапина Нина").
gd_family(147007213,147007179,147007177,"M",'1926-01-01',"Сидоров Олег").
gd_family(147007231,147007183,147007187,"F",'1955-01-01',"Лапина София").
%% </kb>
 
%% <call>
% family_call(Release, ContactKey1, ContactKey2, Relation1, Relation2, RelationType, PersonInfo1, PersonInfo2)
family_call(Release, ContactKey1, ContactKey2, Relation1, Relation2, RelationType, PersonInfo1, PersonInfo2) :-
    gd_family(ContactKey1, _, _, _, _, _),
    gd_family(ContactKey2, _, _, _, _, _),
    \+ ContactKey1 = ContactKey2,
    once( family_relation(Release, ContactKey1, ContactKey2, Relation2, RelationType) ),
    once( family_relation(Release, ContactKey2, ContactKey1, Relation1, RelationType) ),
    person_info(ContactKey1, PersonInfo1),
    person_info(ContactKey2, PersonInfo2).
%% </call>
 
%% <classic>
 
% женщина
female(Person) :-
    gd_family(Person, _, _, "F", _, _).
 
% мужчина
male(Person) :-
    gd_family(Person, _, _, "M", _, _).
 
% ребёнок, родитель
child_parent(Child, Parent) :-
    gd_family(Child, Mother, Father, _, _, _),
    ( Parent = Mother ; Parent = Father ),
    \+ Parent = 0.
 
% мать: женщина, родитель
mother(Child, Parent) :-
    female(Parent),
    child_parent(Child, Parent).
 
% отец: мужчина, родитель
father(Child, Parent) :-
    male(Parent),
    child_parent(Child, Parent).
    
% дочь: женщина, ребёнок
daughter(Parent, Child) :-
    female(Child),
    child_parent(Child, Parent).
 
% сын: мужчина, ребёнок
son(Parent, Child) :-
    male(Child),
    child_parent(Child, Parent).
 
% сестра: женщина, общий родитель
sister(ContactKey1, ContactKey2) :-
    female(ContactKey2),
    child_parent(ContactKey1, Parent),
    child_parent(ContactKey2, Parent).
 
% брат: мужчина, общий родитель
brother(ContactKey1, ContactKey2) :-
    male(ContactKey2),
    child_parent(ContactKey1, Parent),
    child_parent(ContactKey2, Parent).
 
% бабушка: мать родителя
grandma(ContactKey1, ContactKey2) :-
    mother(Parent, ContactKey2),
    child_parent(ContactKey1, Parent).
 
% дедушка: отец родителя
grandpa(ContactKey1, ContactKey2) :-
    father(Parent, ContactKey2),
    child_parent(ContactKey1, Parent).
 
% внучка: дочь ребёнка
granddaughter(ContactKey1, ContactKey2) :-
    daughter(Child, ContactKey2),
    child_parent(Child, ContactKey1).
 
% внук: сын ребёнка
grandson(ContactKey1, ContactKey2) :-
    son(Child, ContactKey2),
    child_parent(Child, ContactKey1).
 
% прабабушка: бабушка родителя
great_grandma(ContactKey1, ContactKey2) :-
    grandma(Parent, ContactKey2),
    child_parent(ContactKey1, Parent).
 
% прадедушка: дедушка родителя
great_grandpa(ContactKey1, ContactKey2) :-
    grandpa(Parent, ContactKey2),
    child_parent(ContactKey1, Parent).
 
% правнучка: внучка ребёнка
great_granddaughter(ContactKey1, ContactKey2) :-
    granddaughter(Child, ContactKey2),
    child_parent(Child, ContactKey1).
 
% правнук: внук ребёнка
great_grandson(ContactKey1, ContactKey2) :-
    grandson(Child, ContactKey2),
    child_parent(Child, ContactKey1).
 
% тётя: сестра родителя
aunt(ContactKey1, ContactKey2) :-
    sister(Parent, ContactKey2),
    child_parent(ContactKey1, Parent).
 
% дядя: брат родителя
uncle(ContactKey1, ContactKey2) :-
    brother(Parent, ContactKey2),
    child_parent(ContactKey1, Parent).
 
% племянница: дочь сестры или брата
niece(ContactKey1, ContactKey2) :-
    daughter(Person, ContactKey2),
    ( sister(ContactKey1, Person) ; brother(ContactKey1, Person) ).
 
% племянник: сын сестры или брата
nephew(ContactKey1, ContactKey2) :-
    son(Person, ContactKey2),
    ( sister(ContactKey1, Person) ; brother(ContactKey1, Person) ).
 
% двоюродная сестра: женщина, не сестра, общие бабушка или дедушка
cousin_sister(ContactKey1, ContactKey2) :-
    female(ContactKey2),
    \+ sister(ContactKey1, ContactKey2),
    ( grandma(ContactKey1, Grand), grandma(ContactKey2, Grand)
    ; grandpa(ContactKey1, Grand), grandpa(ContactKey2, Grand)
    ).
 
% двоюродный брат: мужчина, не брат, общие бабушка или дедушка
cousin_brother(ContactKey1, ContactKey2) :-
    male(ContactKey2),
    \+ brother(ContactKey1, ContactKey2),
    ( grandma(ContactKey1, Grand), grandma(ContactKey2, Grand)
    ; grandpa(ContactKey1, Grand), grandpa(ContactKey2, Grand)
    ).
 
% предок
ancestor(Child, Parent) :-
    child_parent(Child, Parent).
ancestor(Child, Person) :-
    child_parent(Child, Parent),
    ancestor(Parent, Person).
 
% родственник: общий предок.
relative(ContactKey1, ContactKey2) :-
    ancestor(ContactKey1, Ancestor),
    ancestor(ContactKey2, Ancestor).
 
% family_relation(Release, ContactKey1, ContactKey2, Relation, RelationType)
family_relation(0, ContactKey1, ContactKey2, "мать", "близкий родственник") :-
    mother(ContactKey1, ContactKey2).
family_relation(0, ContactKey1, ContactKey2, "отец", "близкий родственник") :-
    father(ContactKey1, ContactKey2).
family_relation(0, ContactKey1, ContactKey2, "дочь", "близкий родственник") :-
    daughter(ContactKey1, ContactKey2).
family_relation(0, ContactKey1, ContactKey2, "сын", "близкий родственник") :-
    son(ContactKey1, ContactKey2).
family_relation(0, ContactKey1, ContactKey2, "сестра", "близкий родственник") :-
    sister(ContactKey1, ContactKey2).
family_relation(0, ContactKey1, ContactKey2, "брат", "близкий родственник") :-
    brother(ContactKey1, ContactKey2).
family_relation(0, ContactKey1, ContactKey2, "бабушка", "родственник") :-
    grandma(ContactKey1, ContactKey2).
family_relation(0, ContactKey1, ContactKey2, "дедушка", "родственник") :-
    grandpa(ContactKey1, ContactKey2).
family_relation(0, ContactKey1, ContactKey2, "внучка", "родственник") :-
    granddaughter(ContactKey1, ContactKey2).
family_relation(0, ContactKey1, ContactKey2, "внук", "родственник") :-
    grandson(ContactKey1, ContactKey2).
family_relation(0, ContactKey1, ContactKey2, "прабабушка", "родственник") :-
    great_grandma(ContactKey1, ContactKey2).
family_relation(0, ContactKey1, ContactKey2, "прадедушка", "родственник") :-
    great_grandpa(ContactKey1, ContactKey2).
family_relation(0, ContactKey1, ContactKey2, "правнучка", "родственник") :-
    great_granddaughter(ContactKey1, ContactKey2).
family_relation(0, ContactKey1, ContactKey2, "правнук", "родственник") :-
    great_grandson(ContactKey1, ContactKey2).
family_relation(0, ContactKey1, ContactKey2, "тётя", "родственник") :-
    aunt(ContactKey1, ContactKey2).
family_relation(0, ContactKey1, ContactKey2, "дядя", "родственник") :-
    uncle(ContactKey1, ContactKey2).
family_relation(0, ContactKey1, ContactKey2, "племянница", "родственник") :-
    niece(ContactKey1, ContactKey2).
family_relation(0, ContactKey1, ContactKey2, "племянник", "родственник") :-
    nephew(ContactKey1, ContactKey2).
family_relation(0, ContactKey1, ContactKey2, "двоюродная сестра", "родственник") :-
    cousin_sister(ContactKey1, ContactKey2).
family_relation(0, ContactKey1, ContactKey2, "двоюродный брат", "родственник") :-
    cousin_brother(ContactKey1, ContactKey2).
family_relation(0, ContactKey1, ContactKey2, "", "родственник") :-
    relative(ContactKey1, ContactKey2).
%% </classic>
%% <graph>
family_relation(1, ContactKey1, ContactKey2, Relation, RelationType) :-
    ( family_path_up(ContactKey1, Path) ; family_path_down(ContactKey1, Path) ),
    member([ContactKey2, Level, Sex], Path),
    family_relation_def(Level, Sex, Relation0),
    family_relation_type(Relation0, RelationType),
    !,
    Relation = Relation0.
family_relation(1, ContactKey1, ContactKey2, Relation, RelationType) :-
    family_path_up(ContactKey1, PathUp1),
    family_path_up(ContactKey2, PathUp2),
    member([Parent, Level1, _], PathUp1),
    member([Parent, Level2, _], PathUp2),
    gd_family(ContactKey2, _, _, Sex, _, _),
    ( family_relation_def([Level1, Level2], Sex, Relation0) ; Relation0 = "" ),
    family_relation_type(Relation0, RelationType),
    !,
    Relation = Relation0.
 
% family_path_up(ContactKey, PathUp)
family_path_up(ContactKey, PathUp) :-
    family_path_up(ContactKey, 0, PathUp).
% family_path_up(ContactKey, Level0, PathUp)
family_path_up(ContactKey, Level0, [[Parent, Level, Sex] | RestPathUp]) :-
    gd_family(ContactKey, Mother, Father, _, _, _),
    member(Parent, [Mother, Father]),
    gd_family(Parent, _, _, Sex, _, _),
    Level is Level0 + 1,
    family_path_up(Parent, Level, RestPathUp).
family_path_up(_, _, []).
 
% family_path_down(ContactKey, PathDown)
family_path_down(ContactKey, PathDown) :-
    family_path_down(ContactKey, 0, PathDown).
% family_path_down(ContactKey, Level0, PathDown)
family_path_down(ContactKey, Level0, [[Child, Level, Sex] | RestPathDown]) :-
    gd_family(ContactKey, _, _, _, _, _),
    gd_family(Child, Mother, Father, Sex, _, _),
    member(ContactKey, [Mother, Father]),
    Level is Level0 - 1,
    family_path_down(Child, Level, RestPathDown).
family_path_down(_, _, []).
 
% family_relation_type(Relation, RelationType)
family_relation_type(Relation, RelationType) :-
    family_relation_def(CloseRelations, "", RelationType),
    member(Relation, CloseRelations),
    !.
family_relation_type(_, RelationType) :-
    family_relation_def([], "", RelationType).
 
% family_relation_def(Level, Sex, Relation)
family_relation_def(1, "F", "мать").
family_relation_def(1, "M", "отец").
family_relation_def(2, "F", "бабушка").
family_relation_def(2, "M", "дедушка").
family_relation_def(3, "F", "прабабушка").
family_relation_def(3, "M", "прадедушка").
family_relation_def(-1, "F", "дочь").
family_relation_def(-1, "M", "сын").
family_relation_def(-2, "F", "внучка").
family_relation_def(-2, "M", "внук").
family_relation_def(-3, "F", "правнучка").
family_relation_def(-3, "M", "правнук").
% family_relation_def([Level1, Level2], Sex, Relation)
family_relation_def([1, 1], "F", "сестра").
family_relation_def([1, 1], "M", "брат").
family_relation_def([2, 1], "F", "тётя").
family_relation_def([2, 1], "M", "дядя").
family_relation_def([1, 2], "F", "племянница").
family_relation_def([1, 2], "M", "племянник").
family_relation_def([2, 2], "F", "двоюродная сестра").
family_relation_def([2, 2], "M", "двоюродный брат").
% family_relation_def(RelationList, Gap, Relation)
family_relation_def([
                    "мать", "отец", "дочь", "сын", "сестра", "брат"
                    %, "бабушка", "дедушка", "внучка", "внук"
                    ], "",
                    "близкий родственник").
family_relation_def([], "", "родственник").
 
%% </graph>
 
%% <info>
 
% family_date(Date)
family_date('1994-01-01').
 
% person_info(ContactKey, Info)
person_info(ContactKey, Info) :-
    gd_family(ContactKey, _, _, Sex, BirthDay, FIO),
    member(Sex-Gender, ["F"-"жен", "M"-"муж"]),
    age_type(BirthDay, Sex, AgeType),
    atomic_list_concat([FIO, " (", Gender, ", ", AgeType, ")"], Info).
 
% age_type(BirthDay, Sex, AgeType)
age_type(BirthDay, Sex, AgeType) :-
    atom_to_date(BirthDay, date(Y1, M1, D1)),
    family_date(CurrentDate),
    atom_to_date(CurrentDate, date(Y2, M2, D2)),
    ( Y2 - Y1 > 18
    ; Y2 - Y1 =:= 18, ( M2 > M1 ; M2 = M1, D2 >= D1 )
    ),
    member(Sex-AgeType, ["F"-"совершеннолетняя", "M"-"совершеннолетний"]),
    !.
age_type(_, Sex, AgeType) :-
    member(Sex-AgeType, ["F"-"несовершеннолетняя", "M"-"несовершеннолетний"]).
 
% atom_to_date(YYYYMMDD, date(YYYY, MM, DD))
atom_to_date(YYYYMMDD, date(YYYY, MM, DD)) :-
    atom_chars(YYYYMMDD, [Y1, Y2, Y3, Y4, '-', M1, M2, '-', D1, D2 ]),
    number_chars(YYYY, [Y1, Y2, Y3, Y4]),
    number_chars(MM, [M1, M2]),
    number_chars(DD, [D1, D2]).
 
% age_diff(ContactKey1, ContactKey2, AgeDiff)
age_diff(ContactKey1, ContactKey2, AgeDiff) :-
    gd_family(ContactKey1, _, _, _, BirthDay1, _),
    gd_family(ContactKey2, _, _, _, BirthDay2, _),
    age_date_diff(BirthDay1, BirthDay2, AgeDiff),
    !.
 
% age_date_diff(Date1, Date2, Diff)
age_date_diff(Date1, Date2, AgeDiff) :-
    Date1 @< Date2,
    age_date_diff(Date1, Date2, Y, M),
    ( Y = 0, M = 0,
      DiffList = ["немного младше"]
    ; DiffList = ["младше на ", Y, " лет ", M, " месяцев"]
    ),
    atomic_list_concat(DiffList, AgeDiff),
    !.
age_date_diff(Date1, Date2, AgeDiff) :-
    Date1 @> Date2,
    age_date_diff(Date2, Date1, Y, M),
    ( Y = 0, M = 0,
      DiffList = ["немного старше"]
    ; DiffList = ["старше на ", Y, " лет ", M, " месяцев"]
    ),
    atomic_list_concat(DiffList, AgeDiff),
    !.
age_date_diff(_, _, "ровестники").
 
% age_date_diff(Date1, Date2, Y, M)
age_date_diff(Date1, Date2, Y, M) :-
    atom_to_date(Date1, date(Y1, M1, D1)),
    atom_to_date(Date2, date(Y2, M2, D2)),
    Y0 is Y2 - Y1,
    M0 is M2 - M1,
    ( M0 > 0, ( D2 >= D1, M = M0 ; M is M0 - 1 ), Y = Y0
    ; M0 = 0, ( D2 >= D1, M = 0, Y = Y0 ; M is 12 + M0 - 1, Y is Y0 - 1 )
    ; ( D2 >= D1, M is 12 + M0 ; M is 12 + M0 - 1 ), Y is Y0 - 1
    ).
    
%% </info>
 
%% </family>

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.846 из 5