如何解决在序言本通函谓语?(How can I fix this circular predicat

2019-08-06 04:25发布

为什么不这项工作在序言定义“结婚”?

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

在这些类型的圆形谓词不被允许? 我将如何解决?

谢谢

Answer 1:

原谅我,如果我得到的语法错误,它是因为我打的Prolog已经有一段时间。


一个典型的解决方案是引入另一层次的条文,如下所示:

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

然后指定使用的妻子,而不是条款的关系:

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

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

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



Answer 2:

据我了解,基本的问题是,如果循环定义是允许的,但所产生的语言是自洽的,有可能是微妙的后果往往是反直觉的。 也有效率的考虑(循环定义招致额外的开销)。

看到这个详细的讨论了其它更多的解释和观点相当多的不同点。



Answer 3:

一个可能的解决方案是使用桌游戏,例如见这个答案 。



文章来源: How can I fix this circular predicate in Prolog?
标签: prolog