【发布时间】:2009-10-12 22:52:04
【问题描述】:
为什么不能在 Prolog 中定义“已婚”?
married(X,Y):-married(Y,X).
不允许使用这些循环谓词吗?我该如何解决?
谢谢
【问题讨论】:
标签: prolog
为什么不能在 Prolog 中定义“已婚”?
married(X,Y):-married(Y,X).
不允许使用这些循环谓词吗?我该如何解决?
谢谢
【问题讨论】:
标签: prolog
如果语法有误,请见谅,我已经有一段时间没有玩 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 - 特殊关系下。
【讨论】:
据我了解,基本问题是,如果允许循环定义,尽管生成的语言是自洽的,但可能会产生微妙的后果,这往往是违反直觉的。还有效率方面的考虑(循环定义会产生额外的开销)。
请参阅此detailed discussion 以获得更多解释和相当多的不同观点。
【讨论】:
一种可能的解决方案是使用表格,例如this answer.
【讨论】: