为什么这不能在 Prolog 中定义“已婚”?
married(X,Y):-married(Y,X).
不允许使用这些循环谓词吗?我将如何解决它?
谢谢
如果我的语法错误,请原谅我,自从我玩 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 - 特殊关系下。
据我了解,基本问题是,如果允许循环定义,尽管生成的语言是自洽的,但可能会产生微妙的后果,这往往是违反直觉的。还有效率方面的考虑(循环定义会产生额外的开销)。
请参阅此详细讨论以获取更多解释和相当多的不同观点。
一种可能的解决方案是使用表格,请参见例如this answer。