开始使用Prolog并明显对其工作方式有一个基本的误解,有帮助吗?

时间:2011-02-10 16:04:00

标签: prolog

我在Prolog中运行我的前几个程序,并且在我试图运行的那种实验中遇到了障碍。最初我是在美国几个州的迷你地图上做的,但我将其简化为字母表:

adj(a,b).
adj(b,a).
adj(b,c).
adj(c,b).
adj(c,d).

na(X, Z) :- \+adj(X, Z).

当我查询 na(a,What)时。我没有得到任何回复(只是否)但如果我单独检查 na(a,d)当然,它自然会返回是。

为什么会发生这种情况的原因是什么?我已经能够得到其他查询在不同的程序中工作,所以我想知道我缺少什么关键信息。谢谢!

1 个答案:

答案 0 :(得分:6)

认为(\ +)/ 1不是逻辑否定,而是“不可证明”。 \+ na(a, What)当且仅当na(a, What)不可证明时才会成功。由于na(a, What)产生至少一个解决方案并因此是可证明的,因此它的否定(在这个意义上)失败。因此,(\ +)/ 1在逻辑上是不完整的:在这种情况下它失败了,尽管如你所观察到的那样,有一些基础值可以使它成功。但是,如果它的参数是基础的话,(\ + / 1)的工作方式就像你期望的逻辑否定一样。因此,您可以使用

解决此问题
na(X, Y) :- country(X), country(Y), \+ adj(X, Y).

其中country / 1产生国家的地面实例。解决它的另一种方法是明确枚举不相邻的国家,这是可能的,因为域是有限的。这种方法的一个优点是您的查询是单调的:添加新事实永远不会使先前成功的查询失败(当使用(\ +)/ 1时,这不成立)。这是声明性调试的一个很好的属性。