尝试rise4fun/z3/tutorial/strategies中的一个示例

尝试rise4fun/z3/tutorial/strategies中的一个示例,z3,smt,sat,Z3,Smt,Sat,rise4fun站点中的一些示例: (declare-const x Int) (declare-const y Int) (declare-const z Int) (declare-const a Int) ; this is added (assert (= a 3 )) ; this is added: a := 3 (assert (< 0 x 10)) ; rewritten, but same constraint

rise4fun站点中的一些示例:

(declare-const x Int)
(declare-const y Int)
(declare-const z Int)
(declare-const a Int)        ;  this is added

(assert (= a 3 ))            ; this is added:  a := 3
(assert (< 0 x  10))         ; rewritten, but same constraint
(assert (< 0 y  10))
(assert (< 0 z  10))

(assert (= (+ (* 3 y) (* 2 x)) z))        ; plain function from rise4fun
;(assert (= (+ (* a y) (* 2 x)) z))       ; here literal 3 is replaced by a

(check-sat-using (then (using-params simplify :arith-lhs true :som true)
                       normalize-bounds
                       lia2pb
                       pb2bv
                       bit-blast
                       sat))
(get-model)
(get-info :version)
(声明常量x Int)
(声明常数y Int)
(声明常量z Int)
(声明常量为Int);这是增加的
(断言(=A3));这是增加的:a:=3
(断言(<0 x 10));重写,但约束相同
(断言(<0 y 10))
(断言(<0 z 10))
(断言((+(*3y)(*2x))z);rise4fun的普通函数
;(断言((+(*ay)(*2x))z));这里,文字3被替换为
(使用检查sat(然后(使用参数simplify:arith lhs true:som true)
规范化边界
lia2pb
pb2bv
钻头爆破
(星期六)
(获取模型)
(获取信息:版本)

当我从rise4fun中注释普通函数并取消注释我的函数时,解算器将无法生成结果并以“未知”响应(使用4.8.0尝试)。解算器或某个预处理器是否足够聪明,可以看到“a”只是一个固定值为3的常数?

没错,
简化策略不够聪明,无法传播值,因为它通常太昂贵了。但是,
ctx simplify
传播值
完成这项工作。例如:

(check-sat-using (then (using-params simplify :arith-lhs true :som true)
                       propagate-values
                       normalize-bounds
                       lia2pb
                       pb2bv
                       bit-blast
                       sat))

如果常数传播对于简化来说太难了,那么它简化了什么呢?顺便说一句,根据sat解算器的要求,谁有理由将现有的布尔公式转换为CNF?无论如何,我建议通过propagate values参数
simplify
执行特定于理论的局部简化和(某些)规范化来扩展rise4fun中的文档示例;请看这里: