Open source GNU序言的重言式检查器

Open source GNU序言的重言式检查器,open-source,prolog,gnu-prolog,theorem-proving,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 power 2) mul (X plus 2) equals (9 mul X) plus 18. 我所期望的结果是布尔答案,比如“是/否”、“等于/不同”、“找到证明/找不到证明”或类似的答案 我在上找

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

我想为程序输入提供如下查询:

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

当然,符号可以不同,如下所示:

(3 power 2) mul (X plus 2) equals (9 mul X) plus 18.
我所期望的结果是布尔答案,比如“是/否”、“等于/不同”、“找到证明/找不到证明”或类似的答案

我在上找到了GNU Prolog的重言式检查器,但并没有附加许可证,也并没有关于如何应用和功能的线索,以便用算术扩展逻辑模型

  • 还有其他类似的解决方案吗
  • 一些示例说明了如何使用算术功能来扩展模型
谢谢你,格雷格

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


p.p.S@larsmans指出,根据该理论,没有办法证明“所有”公式。这就是为什么我在寻找能够证明的东西,从给定的一组公理和规则中可以证明的东西,正如我在寻找Gnu Prolog程序一样,我在寻找这些公理和规则的例子;)。当然,检查器可能会失败-我希望它在“某些”情况下会起作用:)-另一方面,有;)

如果您想在Prolog中使用可扩展的定理证明程序,请查看lean定理证明程序系列,它是主要的代表;它处理555字节Prolog中的经典一阶逻辑

版本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).
prove(M,I):-append(Q[C | R],M),\+成员(-,C),
附加(Q,R,S),证明([!],[[-!;C]| S],]I)。
证明([],,,,,)。
证明([L | C],M,P,I):(-N=L;-L=N)->(成员(N,P);
附加(Q,[D | R],M),复制(D,E),附加(A,[N | B],E),

append(A,B,F),(D==E->append(R,Q,S);length(P,K),K

我发现了一些重言式检查器,不幸的是,它们涵盖了布尔逻辑。他的实现是在Prolog中实现的,并且提供了各种与自动证明或解决此类方程(或自动验证证明)相关的方法.

您可以使用约束逻辑编程解决您的问题。等式 直接向您提供结果(示例GNU Prolog):

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

在这里可以找到一个列表,显示哪些序言有哪种CLP。只需 检查CLP多列


拜拜

感谢您指出哥德尔不完全性定理。这就是为什么我只需要对算术的部分支持,我可以处理(实现),如果源代码可以扩展的话:).Hey,@larsmans,可能会喜欢。谢谢你的参考。leanCOP看起来很有趣,但它并不能解决我的问题,而且我发现它很难扩展。它绝对适合开始。覆盖线性约束情况是一个很好的起点。我要找的更像Maxima或Wolframalpha的工具。更多详细信息,请参阅。如中所示,Maxima的
是(equal())
是通过
ratsimp()实现的
,它简化了两个方程的差分。如果差分可以符号化地简化为0,则意味着它是相等的。您知道如何用prolog实现类似的东西吗?它合适吗?或者是符号方程的另一个工具CAS?这很简单,请看这里:您可以轻松定义自己的Is_poly/2刚才定义的X是多边形a+B:-Y是多边形a,Z是多边形B,多边形加(Y,Z,X)等等,也许还有一些很好的打印。上面的代码中没有包含它。实际上这看起来像是一本好书。我喜欢定理2.25,因为它实际上是我的答案。它还使用了Prolog,这很好!但是我在网上看不到整本书。那么你认为哪一部分与“多项式重言式”有关?这本书有介绍吗?不幸的是,它只涉及布尔情况,即使它介绍了处理布尔逻辑的各种方法。
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).
?- X*X #= 4.
X = 2
?- 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..