使用Prolog的定理证明

时间:2012-04-17 10:06:27

标签: prolog

如何使用Prologs编写Theorem Proofs?

我试着把它写成正常像这样:

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

你能帮助我吗?

1 个答案:

答案 0 :(得分:3)

我不愿意发布答案,因为这个问题框架很差。感谢theJollySin添加干净的格式!重写中遗漏的东西,表明了阿曼的想法,是“我在圈内”(原文如此)。

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

通过练习,不难理解Prolog引擎在提出查询时会做什么,尤其是单个目标查询。 Prolog使用一个非常简单的“跟随你的鼻子”策略来试图达到目标。查找调用任何谓词的规则。然后看看是否可以应用这些规则中的任何规则,从第一个规则开始,然后在它们列表中下移。

Prolog程序员通常会遇到三个主题。一个是Prolog引擎进行搜索的递归特性。这里 parallel / 2 的唯一规则是右侧为垂直/ 2 调用两个子目标,而垂直/ 2 为自己调用子目标,为 parallel / 2 调用另一个子目标。人们应该期望,试图满足任何一种查询都不可避免地导致a Hydra-like与分叉的头部斗争。

我们在这个例子中看到的第二个主题是使用自由变量。如果我们要获得关于两个特定线(几何)的垂直性或平行性的知识,那么查询或规则需要以某种方式将变量“绑定”为“基础”术语。再次没有实际的目标被查询,很难猜测阿曼是如何期望的那样。也许应该提供关于垂直或平行的特定线的“事实”。行只能表示为原子(可能是小写字母),但Prolog变量是以大写字母开头的名称(如两个给定的规则)或下划线(_)字符。

最后,令人困惑的第三个主题是Prolog如何处理否定。在这些规则中只有一点,即X\==Y被调用的地方。但即使是那个简短的子目标也需要仔细了解。 Prolog实现“否定为失败”,因此X\==Y当且仅当X==Y does not succeed成功时才会成功。后一个目标也很微妙,因为它询问XY是否相同,而不试图进行任何统一。因此,如果这些是不同的变量,两者都是空闲的,则X==Y失败(并且X\==Y成功)。另一方面,X==Y成功(因此X\==Y失败)的唯一方法是两个变量都绑定到相同的基础项。如上所述,所述的两条规则并未提供一种方法,但在查询目标中可能会考虑到这一点。

Aman的家庭作业是要了解这些Prolog主题:

  • 递归
  • 自由和约束变量
  • 否定

也许可以对Prolog进行几何证明提出更具体的建议!

已添加: PTTP(Prolog Technology Theorem Prover)由M.E.Stindel在20世纪80年代后期撰写,this 2006 web page描述了它并链接到下载。

它还简明扼要地总结了为什么Prolog本身不是“一个完整的通用定理证明系统”。稍后的指针,也可以在那里遵循更有能力的定理证明。