自动证明线性方程/不等式

时间:2016-02-11 00:13:24

标签: automation equation algebra theorem-proving inequality

我正在寻找一种工具来确定一组给定的线性方程/不等式(A)是否需要另一组给定的线性方程/不等式(B)。返回值应为“true”或“false”。

为了说明,让我们看一下A和B的可能实例以及算法的预期返回值:

A: {Z=3,Y=Z+2, X < Y} ;
B: {X<5} ; 
Expected result: true

A: {Z=3,Y=Z+2, X < Y} ;
B: {X<10} ;
Expected result: true

A: {Z=3,Y=Z+2, X < Y} ;
B: {X=3} ; 
Expected result: false

A: {X<=Y,X>=Y} ;
B: {X=Y} ; 
Expected result: true

A: {X<=Y,X>=Y} ;
B: {X=Y, X>Z+2} ; 
Expected result: false

通常A包含多达10个方程/不等式,B包含1或2.所有这些都是线性的并且相对简单。我们甚至可以假设所有变量都是整数。

这个任务 - 确定A是否需要B - 是一个更大系统的一部分,因此我正在寻找已经实现类似的工具/源代码/包,我可以使用。

我开始关注的事情:

  
      
  1. 使用代数进行定理证明 - Otter,EQP和Z3(吸血鬼目前无法下载)。
  2.   
  3. Coq正式证明管理系统。
  4.   
  5. 线性规划。
  6.   

然而,我使用这些工具的经验非常有限,到目前为止我没有找到一个有希望的方向。任何比我更有经验的人的指导和想法将受到高度赞赏。

感谢您的时间!

1 个答案:

答案 0 :(得分:0)

我想我找到了一个有效的解决方案。这个问题可以被重新定义为一个赋值问题,然后它可以通过Z3这样的定理证明来解决,也可以通过线性编程求解器来解决。

为了说明,让我们看一下上面给出的第一个例子:

A: {Z=3, Y=Z+2, X<Y} ;
B: {X<5} ; 

确定A是否需要B等同于确定在B为假时A是否为真是不可能的。这是一个简单的简单逻辑等价。在我们的例子中,它意味着不是检查B中的条件是否来自A中的条件,我们可以检查是否没有满足A中条件而不是B中的条件的X,Y和Z的赋值。

现在,当把它作为赋值问题时,可以为任务调用诸如Z3的定理证明器。以下代码检查A中的条件是否可满足,而B中的条件不是:

(declare-fun x () Int)
(declare-fun y () Int)
(declare-fun z () Int)
(assert (= z 3))
(assert (= y (+ z 2))) 
(assert (< x y))
(assert (not (< x 5)))
(check-sat)
(get-model)
(exit)    

Z3报告没有满足这些条件的模型,因此B不可能不遵循A,因此我们可以得出结论B跟随A。