如何在Prolog中修复此循环谓词?

时间:2009-09-14 22:06:44

标签: prolog

为什么这不能在Prolog中定义“已婚”?

married(X,Y):-married(Y,X).

这些循环谓词是不允许的?我该如何解决?

由于

3 个答案:

答案 0 :(得分:5)

请原谅我,如果我的语法错误,我和Prolog玩了一段时间。


典型的解决方案是在子句中引入另一个级别,如下所示:

married(X, Y) :- wife(X, Y).
married(X, Y) :- wife(Y, X).

然后使用wife子句指定关系:

wife(jane, bob).
wife(alice, john).

?- married(jane, X).
X = bob

更多信息可以在这里找到:CSc 8710, Deductive Databases and Logic Programming, chapter 6 - Logic and databases,6.5以下 - 特殊关系。

答案 1 :(得分:1)

据我了解,基本问题是如果允许循环定义,虽然结果语言是自洽的,但可能会产生微妙的后果,这些后果往往是违反直觉的。还有效率考虑因素(循环定义会产生额外的开销)。

请参阅此detailed discussion以获取更多解释和相当多的不同观点。

答案 2 :(得分:1)

一种可能的解决方案是使用表格,例如this answer