Ответ в теме: Родственные отношения на Prolog

      Комментарии к записи Ответ в теме: Родственные отношения на Prolog отключены
#3412

Я исправил ошибки прямо в вашем сообщении, ниже комментарии к коду:

Предикатом

father(X,Y):-
  parent(X,Y),man(X),!.

вы говорите, что X отец Y если он является родителем и при этом мужчиной. Очень похоже работает правило mother.

Функция

sister(X,Y):-
  parent(Z,X), parent(Z,Y), woman(X), X\=Y,!.

значит, что X является сестрой для Y если у них есть общий родитель (Z), X является женщиной и X не равен Y (человек не является сестрой сам себе). Аналогично построено правило brother, но в нем X является мужчиной.

Предикат

son(X,Y):-
  parent(Y,X),man(X),!.

проверяет, что X является сыном для Y тогда и только тогда, когда Y является родителем X и X является мужчиной. Почти также работает предикат daughter.

Функции проверки жены и мужа используют не предикат married, а check_married, который проверяет что люди (X и Y) женаты если в базе если запись married(X, Y) или married(Y, X).

wife(X,Y):-
  check_married(X,Y), woman(X),!.

тут говорится, что X является женой Y если они женаты и X — женщина. Аналогично выполняется проверка мужа (но он мужчина).

Шурин — это брат жены, поэтому для его проверки можно использовать предикаты wife и brother:

brother_in_law(X, Y):-
  wife(Y, Wife),
  brother(X, Wife).

Тут мы говорим, что X является шурином для Y если у Y есть жена (Wife), братом которой является X.

Теща — это мать жены:

mother_in_law(X,Y):-
  wife(Y, Wife),
  mother(X, Wife).

Таким образом, X — теща для Y если у Y есть такая жена (Wife), что ее матерью является X.

Если дядю понимать как брата отца или матери (в более общем случае — это муж тетки, т.е. он может быть не родным), то:

uncle(X, Y):-
  parent(Parent, Y), brother(X, Parent),!.

тут говорится, что X является дядей для Y если у Y есть такой родитель (Parent), что X является его братом.