用Prolog进行定理证明

用Prolog进行定理证明,prolog,Prolog,如何使用序言编写定理证明 我试着像这样正常地写: parallel(X,Y):-perpendicular(X,Z),perpendicular(Y,Z), X\==Y,!. perpendicular(X,Y):-perpendicular(X,Z),parallel(Z,Y),!. 你能帮我吗?我不愿意发布答案,因为这个问题的框架很差。感谢Jollysin添加了干净的格式!重写中遗漏了一点,表明了Aman的想法,那就是“循环中的I inter”(原文如此) 我们不知道输入了什么查询导致了这

如何使用序言编写定理证明

我试着像这样正常地写:

parallel(X,Y):-perpendicular(X,Z),perpendicular(Y,Z), X\==Y,!.
perpendicular(X,Y):-perpendicular(X,Z),parallel(Z,Y),!.

你能帮我吗?

我不愿意发布答案,因为这个问题的框架很差。感谢Jollysin添加了干净的格式!重写中遗漏了一点,表明了Aman的想法,那就是“循环中的I inter”(原文如此)

我们不知道输入了什么查询导致了这种循环,因此需要进行推测。这两条规则表明,目标涉及平行/2垂直/2谓词

通过实践,不难理解Prolog引擎在提出查询(尤其是单目标查询)时会做什么。Prolog使用了一个非常简单的“跟着你的鼻子走”策略来尝试实现一个目标。查找调用哪个谓词的规则。然后看看这些规则中是否有任何一条可以应用,从第一条开始,一直到它们的列表中

初级Prolog程序员通常会遇到三个问题。一个是Prolog引擎所做搜索的递归性质。这里,parallel/2的唯一规则有一个右侧,它调用了vertical/2的两个子目标,而vertical/2的唯一规则调用了自身的一个子目标和parallel/2的另一个子目标。人们应该预料到,试图满足这两种查询必然会导致与分叉头的斗争

我们在本例中看到的第二个主题是自由变量的使用。如果我们想了解两条特定直线(几何体)的垂直度或平行度,那么查询或规则需要提供变量与“基本”术语的“绑定”。同样,如果不询问实际的目标,很难猜测Aman期望它如何工作。也许应该提供关于垂直或平行的特定线的“事实”。行可以仅表示为原子(可能是小写字母),但Prolog变量是以大写字母(如在两个给定规则中)或下划线(_)字符开头的名称

最后,第三个容易混淆的主题是Prolog如何处理否定。在这些规则中只有一点,调用
X\==Y
的地方。但即使是那个简短的子目标也需要仔细理解。Prolog实现“否定为失败”,因此
X\==Y
在且仅在以下情况下成功。后一个目标也很微妙,因为它询问
X
Y
是否相同,而不尝试进行任何统一。因此,如果这些变量不同,都是自由变量,那么
X==Y
将失败(并且
X\==Y
成功)。另一方面,
X==Y
成功的唯一方法(因此,
X\==Y
失败)是将两个变量绑定到相同的基础项。如上所述,上述两条规则并没有提供一种实现这种情况的方法,尽管在查询目标中可能已经考虑到了这一点

Aman的家庭作业是学习以下序言主题:

  • 递归
  • 自由约束变量
  • 否定
也许可以对Prolog做几何证明提出更具体的建议

补充:PTTP(Prolog技术定理证明程序)由M.E.Stickel在20世纪80年代末编写,并对其进行了描述,并提供了下载链接


它还简明扼要地总结了为什么Prolog本身并不是“一个完整的通用定理证明系统”。指向后面更强大的定理证明程序也可以遵循。

Prolog是一种编程语言,而不是一种定理证明程序。Prolog通常被描述为一种推理方法,即给定一个目标,Prolog引擎会寻求“深度优先”是实现这一目标的方法。定理证明者通常使用更通用的策略,添加推理方法。@hardmath和SETHEO呢?我喜欢Richard O'Keefe的这句话:“Prolog是一种高效的编程语言,因为它是一种非常愚蠢的定理证明者。“@mat:谢谢,我是R.O'Keefe的超级粉丝,但我没有看到那句话!