2016-04-17 14 views
1

私は、最大3つの事実を使用してPrologと作業する単純なファミリーツリーを取得しようとしていますが、私の姉妹を私の両親の子として定義することはできないようです。ここで私が書いたものである: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). 

を、私はPrologでfather(ZFather,ZChild)に入力すると、それが唯一の子ではなく、私のsisとしてme示しています。私は事実でそれを定義していないことを知っていますが、child(Z2,X)child(Z2,Y)という規則では、Z2が私のsisであることを意味しています。

お手数をおかけします。

答えて

2

述語父/ 2には1つの解決策しか記述されていません。あなたは今、述語を照会した場合

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

:あなたはそれがより多くを記述したいが、さらなる事実を追加したくない場合は、父のためにルールを追加することができます

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

をしかし、論理的に言えば、これは非常にクリーンな方法ではありません。結局のところ、兄弟は同じ母親(または一般的にはただ1つの親)を共有する可能性があります。自分自身を3つの事実だけに制限しない方が良いでしょう。

関連する問題