2017-06-04 11 views
3

私はPrologのファミリーツリーのさまざまな実装を見てきましたが、お互いを参照して子と親を定義することをやりたいものは見つかりませんでした。 私は時々私は誰かが誰かの子供であるという事実を持っているので、私は誰かの親であるという事実を持っているので、これをしたいと思います。このような事実のいずれかから、私は両親と誰が子供であるかを聞くことができるようになりたいと思います。このコーディングでファミリーツリーの相互参照Prologルール

私の試みは、次のとおりです。 -

parent(mary, fred). 
child(john, peter). 
child(paul, peter). 

parent(P, C). 
parent(P, C) :- child(C, P). 
child (C, P). 
child(C, P) :- parent(P, C). 

これは、それは私に何度も重複して同じ結果を与えることを続けることを除いて、[OK]を動作するようです。例: -

[3] ?- parent(peter, X). 
true ; 
X = john ; 
X = paul ; 
true ; 
X = john ; 
X = paul ; 
true 

私に結果を一度与えてから停止する方法はありますか?

より一般的に、この種の定義は(相互再帰のために)したい奇妙なことですか?私は報告されているように、親または子のどちらかの事実を持つことができたいと思っていますが、これらとの "反対の"関係も推測することができます。

ありがとうございます!

答えて

2

プログラムの問題は、述語をマージしていることです。 parent/2とchild/2は事実ですので、あなたのプログラムですでに定義されている事実のような名前を付けてはいけません。

ルールの名前を変更しても問題ありません。また、あなたのルールのベース句は、条件を追加するという事実と一致している、このような何か必要があります。今

parent(mary, fred). 
child(john, peter). 
child(paul, peter). 

isparent(P, C):- parent(P, C). 
isparent(P, C):- child(C, P). 

ischild(C, P):- child(C, P). 
ischild(C, P) :- parent(P, C). 

クエリ:

?- isparent(peter, X). 
X = john 
X = paul 

また、で補完ルールを使用していませんあなたの状態は、必要ではなく、あなたに再帰を避けるでしょう

+0

完璧!ありがとう:) – guraaku

関連する問題