我正在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),则当然会自然地返回yes。
为什么会发生这种情况背后的解释是什么?我已经能够使其他查询在不同的程序中工作,所以我想知道我缺少哪些关键信息。谢谢!
最佳答案
不要将(\ +)/ 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时不成立)。这是用于声明式调试的好属性。