SWI-Prolog 的家谱
Family tree with SWI-Prolog
我正在尝试使用最多 3 个允许的事实来获得一个简单的家谱来与 Prolog 一起使用,但是我似乎无法将我的妹妹定义为 child parents。这是我写的:
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).
当我在 Prolog 中输入 father(ZFather,ZChild)
时,它只显示 me
作为 child 而不是我的 sis
。我知道我实际上没有定义它,但我试图在 child(Z2,X)
和 child(Z2,Y)
的规则中定义它,这意味着 Z2
是我的 sis
.
我们将不胜感激。
您的谓词father/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
但是,从逻辑上讲,这不是一种非常干净的方法。毕竟,兄弟姐妹可能只有同一个母亲(或者一般来说:只有一个 parent)。最好不要将自己局限于 3 个事实。
我正在尝试使用最多 3 个允许的事实来获得一个简单的家谱来与 Prolog 一起使用,但是我似乎无法将我的妹妹定义为 child parents。这是我写的:
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).
当我在 Prolog 中输入 father(ZFather,ZChild)
时,它只显示 me
作为 child 而不是我的 sis
。我知道我实际上没有定义它,但我试图在 child(Z2,X)
和 child(Z2,Y)
的规则中定义它,这意味着 Z2
是我的 sis
.
我们将不胜感激。
您的谓词father/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
但是,从逻辑上讲,这不是一种非常干净的方法。毕竟,兄弟姐妹可能只有同一个母亲(或者一般来说:只有一个 parent)。最好不要将自己局限于 3 个事实。