完整的循环循环

时间:2012-06-29 15:59:57

标签: prolog infinite-loop

嗨,我有这个问题,我无法解决。 我是Prolog的新手,我看过很多这些家庭树的例子,但似乎都没有解决我的问题。

说我有

son(X, Y) :-
   \+daughter(X, Y),
   father(Y, X).

father(Y, X) :-
   male(X),
   son(X, Y).

我调用其中一个,它会在条件之间来回传递,因为每个条件都会满足之前的条件,因此会导致本地堆栈错误。

大多数似乎建议删除其中一个定义,但我需要回答父子查询。请帮忙,这看起来很简单,但我无法弄清楚。如何在循环一次后中断?

TIA

1 个答案:

答案 0 :(得分:2)

你可以:

1)你可以使用包装器谓词:

father(Y,X):-
   male(X),
   son_data(X,Y).

son(X,Y):-
   son_data(X,Y).
son(X,Y):-
   \+daughter(X, Y), 
    father(Y, X).

您的数据库应该是

son_data(mike,steph).
....
father(nick,john).
....

(没有儿子/ 2个条目)

2)使用支持tabling的prolog版本(例如XSB)(或实现它;不是这样的好主意)