2016-04-17 4 views
1

Я пытаюсь получить простое генеалогическое древо для работы с Prolog, используя максимум 3 факта, но я не могу определить свою сестру как ребенка моих родителей , Вот что я написал:Семейное древо с SWI-Prolog

father(dad,me). 
mother(mom,me). 
siblings(me,sis). 

parents(X,Z):-father(X,Z). 
parents(Y,Z):-mother(Y,Z). 
child(Z,X):-siblings(Z,Z2),parents(X,Z). 
child(Z,Y):-siblings(Z,Z2),parents(Y,Z). 
child(Z2,X):-siblings(Z,Z2),parents(X,Z). 
child(Z2,Y):-siblings(Z,Z2),parents(Y,Z). 
son(Z,X):-siblings(Z,Z2),parents(X,Z). 
daughter(Z2,X):-siblings(Z,Z2),parents(X,Z). 
brother(Z,Z2):-siblings(Z,Z2). 
sister(Z2,Z):-siblings(Z,Z2). 

и когда я набираю в father(ZFather,ZChild) в Прологе, он показывает только me как ребенок, а не мой sis. Я знаю, что я не определил его в фактах, но я попытался сделать это в правилах с child(Z2,X) и child(Z2,Y), что означает, что Z2 является моим sis.

Помощь будет оценена.

ответ

2

Ваш отец-предикат/2 описывает только одно решение. Если вы хотите, чтобы описать больше, но не хотите, чтобы добавить дополнительные факты, вы можете добавить правило для отца:

father(F,C) :- 
    dif(X,C), 
    siblings(X,C), 
    father(F,X). 

Если вы запрашиваете предикат Теперь:

?- father(X,Y). 
X = dad, 
Y = me ? ; 
X = dad, 
Y = sis ? ; 
no 

Однако, логически говоря, это не очень чистый способ сделать это. Ведь возможно, что родные братья разделяют одну и ту же мать (или вообще: только один родитель). Было бы лучше не ограничивать себя только 3 фактами.

Смежные вопросы