Z3 任意基上两位数编码内射性的证明

Z3 任意基上两位数编码内射性的证明,z3,smt,Z3,Smt,我想自动证明以下关于任意大小整数的陈述: forall base a b c d, 0 <= a < base -> 0 <= b < base -> 0 <= c < base -> 0 <= d < base -> base * a + b = base * c + d -> b = d 如果我把这个输入到Z3,它将返回未知,尽管这看起来像是一个非常简单的输入 所以我的问题是:自动证明这一点的正确方法是什么?Z3

我想自动证明以下关于任意大小整数的陈述:

forall base a b c d,
0 <= a < base ->
0 <= b < base ->
0 <= c < base ->
0 <= d < base ->
base * a + b = base * c + d ->
b = d
如果我把这个输入到Z3,它将返回未知,尽管这看起来像是一个非常简单的输入

所以我的问题是:自动证明这一点的正确方法是什么?Z3有没有配置选项可以让它工作?我应该做不同的预处理吗?或者这个问题属于Z3专业领域之外的一类问题,我应该使用另一种工具吗

更新:这是同一查询的更可读版本,使用暗示B而不是B:


因为你在做乘法,所以问题是非线性的;SMT求解器通常无法处理非线性算法。Z3有一个非线性推理引擎,但由于不可判定性,它肯定不能解决任意问题

如果您将基数固定为给定值,那么z3可以相当容易地处理您的问题。例如,添加:

(assert (= a 10))
使z3在任何时间内都未响应


而且输入看起来不必要的复杂;请记住,SMTLib有一个暗示运算符,而不是xy或notxy,您可以只编写暗示xy,这将使代码更易于阅读。

我知道非线性整数算法是不可判定的,我不是在寻找一个完整的决策器,而是要寻找一个实现大量启发式算法的工具。除了Z3,我还应该考虑其他的工具吗?如果你正在寻找一个按钮式SMT求解器,那么Z3是最好的。如果你愿意做手工定理证明,那么HOL Light、Isabelle和Coq都有大量的数字库,你可以使用它们。
(declare-const a Int)
(declare-const a0 Int)
(declare-const a1 Int)
(declare-const a2 Int)
(declare-const a3 Int)
(assert (not (implies (and (<= 0 a0) (< a0 a))
              (implies (and (<= 0 a1) (< a1 a))
               (implies (and (<= 0 a2) (< a2 a))
                (implies (and (<= 0 a3) (< a3 a))
                 (implies (= (+ ( * a a0) a1) (+ ( * a a2) a3)) (= a1 a3))))))))
(check-sat)
(assert (= a 10))