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

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

Другие виды родственных отношений в Prolog рассмотрим на следующей базе данных:

parent(иван, георгий).
parent(иван, софья). 
parent(иван, галина).
parent(дарья, георгий).
parent(дарья, софья). 
parent(дарья, галина).
parent(генадий, николай).
parent(генадий, сергей). 
parent(галина, николай).
parent(галина, сергей).
parent(ирина, елена). 
parent(николай, елена).
parent(татьяна, александр).
parent(сергей, александр). 

man(георгий).
man(генадий).
man(николай).
man(сергей).
man(александр).

woman(софья).
woman(галина).
woman(дарья).
woman(ирина).
woman(елена).
woman(татьяна).

married(иван, дарья).
married(генадий, галина).
married(николай, ирина).
married(татьяна, сергей).

На рисунке показан граф родственных отношений, соответствующий базе данных:
Граф родственных отношений

Пусть, наша задача: “Найти племянницу сына зятя Дарьи”.

Зять – муж дочери или сестры:

son_in_low(X, Y):-
  daughter(Z, Y),
  husband(X, Z);
  
  sister(Z, Y),
  husband(X, Z).

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

В нашем случае, зять Дарьи – это Генадий, проверим:

?- son_in_low(X, дарья).
X = генадий ;

Предикат поиска сына у нас уже определен, найдем сына зятя Дарьи:

?- son_in_low(X, дарья), son(Z, X).
X = генадий,
Z = николай ;
X = генадий,
Z = сергей ;
false.

Племянница – дочь брата или сестры:

niece(X, Y):-
  brother(Z, Y),
  daughter(X, Z);
  
  sister(Z, Y),
  daughter(X, Z).

X является племянницей Y если Z является братом или сестрой Y, при этом, у Z есть дочь X.

В нашем примере искомой племянницей сына зятя Дарьи является Елена:

?- son_in_low(X, дарья), son(Z, X), niece(Niece, Z).
X = генадий,
Z = сергей,
Niece = елена ;