2017-06-04 42 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). 

这似乎是工作,只是它会不断地给我重复一遍又一遍相同的结果确定。例如: -

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

有没有一种方法可以让我得到它停止它给了我之后的全套结果的一次?

更一般地说,这种定义是一种想要做的奇怪事情(因为相互递归)?据报道,我希望能够得到父母或小孩的事实,但也可以从中推断出“相反”的关系。

谢谢!

回答

2

你的程序的问题是你正在合并谓词。 家长/ 2和孩子/ 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