如何让z3识别某些算术表达式的等价性?

如何让z3识别某些算术表达式的等价性?,z3,Z3,我有一个非常简单的问题,我在这里提到相关部分: ;; All variables are declared to be of type Real (assert (and (<= 1.0 var1-r) (< var1-r 4.0))) ;;following defines var1-r (assert (= var1-r (+ a b))) ;;following defines var1-e (assert (=> (and (<= 1.0 var1-r) (&

我有一个非常简单的问题,我在这里提到相关部分:

;; All variables are declared to be of type Real

(assert (and (<= 1.0  var1-r) (< var1-r 4.0)))
;;following defines var1-r
(assert (= var1-r (+ a b)))
;;following defines var1-e
(assert (=> (and (<= 1.0 var1-r) (< var1-r 2.0)) (= var1-e 8388608.0)))
(assert (=> (and (<= 2.0 var1-r) (< var1-r 4.0)) (= var1-e 4194304.0)))
;;following defines var1
(assert (= var1 (/ (foo (* var1-r var1-e)) var1-e)))

;;Similarly for var2-r, var2-e, var2
(assert (and (<= 1.0  var2-r) (< var2-r 4.0)))
(assert (= var2-r (+ b a)))
(assert (=> (and (<= 1.0 var2-r) (< var2-r 2.0)) (= var2-e 8388608.0)))
(assert (=> (and (<= 2.0 var2-r) (< var2-r 4.0)) (= var2-e 4194304.0)))
(assert (= var2 (/ (foo (* var2-r var2-e)) var2-e)))
;;所有变量都声明为Real类型
请看,我正在获取

unsat


感谢您的关注,如果像您一样声明
foo
,它确实会产生unsat。但是正如我在我的帖子中提到的
foo
,我需要
foo
这样:
(定义fun foo((x Real))Real(to_Real(to_int x)))
我事先不知道什么时候一个未解释的
foo
也足够好。你是对的。据我所知,问题是8388608和4194304.0的值非常大。我正在用非常低的值测试你对函数“foo”的定义,你的代码工作并生成“unsat”。你同意吗?使用“unsat”的值越大:498.0,497.0同意。这些约束来自于对特定域中的问题进行编码,并且这些大常量始终是2的连续幂。我在几秒钟内获得了512.0,256.0的unsat。谢谢,我还会看看你是否建议使用未解释的函数(虽然不是理想的解决方案)可以以某种方式投入使用