我正在寻找一种工具来确定一组给定的线性方程/不等式(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 - 是一个更大系统的一部分,因此我正在寻找已经实现类似的工具/源代码/包,我可以使用。
我开始关注的事情:
- 使用代数进行定理证明 - Otter,EQP和Z3(吸血鬼目前无法下载)。
- Coq正式证明管理系统。
- 线性规划。
醇>
然而,我使用这些工具的经验非常有限,到目前为止我没有找到一个有希望的方向。任何比我更有经验的人的指导和想法将受到高度赞赏。
感谢您的时间!
答案 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。