为什么这不能在Prolog中定义“已婚”?
married(X,Y):-married(Y,X).
这些循环谓词是不允许的?我该如何解决?
由于
答案 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