GNU Prolog的重言式检查器

时间:2011-08-14 19:01:29

标签: open-source prolog gnu-prolog theorem-proving

我正在寻找用GNU Prolog编写的重言式检查器的开源实现(SWI-Prolog的实现也是可以接受的,但GNU Prolog是首选)。

我想通过以下查询提供程序输入:

A and (B or C) iff (A or B) and (A or C).

3^2 * (X + 2) == (9 * X) + 18.

当然,符号可以是不同的,如下:

(3 power 2) mul (X plus 2) equals (9 mul X) plus 18.

我期望的结果,是布尔回答,例如“是/否”,“等于/不同”,“证明发现/未能找到证明”或类似。

我在ftp://ftp.cs.yorku.ca/pub/peter/SVT/GNU/上找到了GNU-Prolog的重言式检查程序,但是没有附加许可证,也不知道如何应用Gnu Prolog Arithmetic constraintsArithmetic功能以扩展逻辑模型算术。

  • 还有其他类似的求解器吗?
  • 如何使用算术功能来扩展模型。

谢谢,格雷格。

P.S。根据算术,我正在寻找部分支持 - 我只想处理一些基本情况,我可以用简单的启发式手工编写代码(gnu-prolog整数函数示例也欢迎),如果提出的解决方案将正确处理经典逻辑并打开 - 源代码将很好地扩展:)。

P.P.S正如@larsmans所说,根据Gödel's incompleteness theorems,没有办法证明“所有”公式。这就是为什么我正在寻找证明的东西,可以通过给定的公理和规则来证明什么,因为我正在寻找Gnu Prolog程序,我正在寻找这些公理和规则集的例子;)。当然检查员可能会失败 - 我期待它会在“某些”情况下工作:)。 - 另一方面,有Gödel's completeness theorem;)。

3 个答案:

答案 0 :(得分:4)

如果你想在Prolog中找到可扩展的定理证明器,请查看精益定理证明家族,其中leanCOP是主要代表;它处理Prolog中555字节的经典一阶逻辑。

1.0版是以下程序:

prove(M,I) :- append(Q,[C|R],M), \+member(-_,C),
 append(Q,R,S), prove([!],[[-!|C]|S],[],I).
prove([],_,_,_).
prove([L|C],M,P,I) :- (-N=L; -L=N) -> (member(N,P);
 append(Q,[D|R],M), copy_term(D,E), append(A,[N|B],E),
 append(A,B,F), (D==E -> append(R,Q,S); length(P,K), K<I,
 append(R,[D|Q],S)), prove(F,S,[L|P],I)), prove(C,M,P,I).

leanCOP网站具有更多可读版本,具有更多功能。你必须自己实现平等和算术。

答案 1 :(得分:1)

我在Mathematical Logic for Computer Science by Ben-Ari, Mordechai找到了一些重言式检查器,不幸的是它们涵盖了布尔逻辑。他的实现在Prolog中有什么优势,并提出了与自动化证明相关的各种方法,或者解决了这些方程式(或者,自动验证证明)。

答案 2 :(得分:1)

您可以为您的问题使用约束逻辑编程。平等 直接给你一个结果(例如GNU Prolog):

?- X*X #= 4.
X = 2

对于不平等,您通常需要要求系统生成 设置约束后的实例化。这通常是 通过标签指令(例如GNU Prolog)完成:

?- 27 * (X + 2) #\= (9 * X) + 18.
X = _#22(0..14913080)
?- 27 * (X + 2) #\= (9 * X) + 18, fd_labeling(X).
X = 0 ? ;
X = 1 ? ;
X = 2 ? ;
Etc..

一个列表,显示哪些prolog确实可以在这里找到哪种CLP。只是 检查CLP多列。

Overview of Prolog Systems, Ulrich Neumerkel

再见