8

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

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

不允许使用这些循环谓词吗?我将如何解决它?

谢谢

4

3 回答 3

5

如果我的语法错误,请原谅我,自从我玩 Prolog 以来已经有一段时间了。


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

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

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

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

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

更多信息可以在这里找到:CSc 8710,演绎数据库和逻辑编程,第 6 章 - 逻辑和数据库,在 6.5 - 特殊关系下。

于 2009-09-14T22:22:49.890 回答
1

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

请参阅此详细讨论以获取更多解释和相当多的不同观点。

于 2009-09-14T22:30:50.023 回答
1

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

于 2009-10-12T14:52:04.313 回答