嗨,我有这个问题,我无法解决。 我是Prolog的新手,我看过很多这些家庭树的例子,但似乎都没有解决我的问题。
说我有
son(X, Y) :-
\+daughter(X, Y),
father(Y, X).
father(Y, X) :-
male(X),
son(X, Y).
我调用其中一个,它会在条件之间来回传递,因为每个条件都会满足之前的条件,因此会导致本地堆栈错误。
大多数似乎建议删除其中一个定义,但我需要回答父子查询。请帮忙,这看起来很简单,但我无法弄清楚。如何在循环一次后中断?
TIA
答案 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)(或实现它;不是这样的好主意)