首页 文章

与SWI-Prolog的家谱

提问于
浏览
1

我试图让一个简单的家谱与Prolog一起使用,最多允许3个事实,但我似乎无法将我的妹妹定义为我父母的孩子 . 这是我写的:

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 作为孩子,而不是我的 sis . 我知道我没有在事实中定义它,但我试图在 child(Z2,X)child(Z2,Y) 的规则中这样做,这意味着 Z2 是我的 sis .

帮助将不胜感激 .

1 回答

  • 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个事实 .

相关问题