是的,它与应用于符号的重写规则有关。Z3 有两个表达式简化器:src/ast/rewriter
和src/ast/simplifier
. 这src/ast/simplifier
是遗留的,它没有在新代码中使用。simplify
SMT-LIB 前端中的命令基于src/ast/rewriter
. mk_bv_add
实际上是使用mk_add_core
in src/ast/rewriter/poly_rewriter.h
。
更改代码以强制 Z3 将bvxor
您问题中的表达式简化为true
. 我们只需要在src/ast/rewriter/bv_rewriter.h
. 新行只是对bvxor
参数进行排序。这对任何 AC 操作员来说都是正确的重写。
br_status bv_rewriter::mk_bv_xor(unsigned num, expr * const * args, expr_ref & result) {
SASSERT(num > 0);
...
default:
// NEW LINE
std::sort(new_args.begin(), new_args.end(), ast_to_lt());
//
result = m_util.mk_bv_xor(new_args.size(), new_args.c_ptr());
return BR_DONE;
}
}
话虽如此,Z3 重写器不应该应用所有可能的简化和/或产生规范的范式。他们的主要目标是生成可能更易于求解的公式。规则基于需求增长(例如,Z3 在示例 X 中太慢,性能问题可以通过应用新的预处理规则“修复”),或基于用户请求。因此,如果您认为这是一个有用的功能,我们可以添加一个选项,对每个 AC 运算符的参数进行排序。
编辑
更正:我们还必须修改以下语句
if (!merged && !flattened && (num_coeffs == 0 || (num_coeffs == 1 && !v1.is_zero() && v1 != (rational::power_of_two(sz) - numeral(1))))
return BR_FAILED;
mk_bv_xor
当现有的重写规则都不适用时,此语句会中断 的执行。我们还必须对其进行修改。我在这里实现了这些修改。我们可以使用新选项来激活它们:bv-sort-ac
。默认情况下不启用此选项。新选项在unstable
(work-in-progress) 分支中可用。当设置为 true 时,它将对位向量 AC 运算符进行排序。请注意,该unstable
分支使用了新的参数设置框架,该框架将在下一个正式版本中提供。 以下是有关如何构建unstable
分支的说明。这些修改也将在本周的夜间版本中提供。
以下是一些使用新选项的示例:
(declare-const a (_ BitVec 8))
(declare-const b (_ BitVec 8))
(declare-const c (_ BitVec 8))
(declare-const d (_ BitVec 8))
(simplify (= (bvxor a b c) (bvxor b a c)))
(simplify (= (bvxor a b c) (bvxor b a c)) :bv-sort-ac true)
(simplify (= (bvxor a (bvxor b c)) (bvxor b a c)) :bv-sort-ac true)
(simplify (= (bvor a b c) (bvor b a c)))
(simplify (= (bvor a b c) (bvor b a c)) :bv-sort-ac true)
(simplify (= (bvor a (bvor b c)) (bvor b a c)) :bv-sort-ac true)
(simplify (= (bvand a b c) (bvand b a c)))
(simplify (= (bvand a b c) (bvand b a c)) :bv-sort-ac true)
(simplify (= (bvand a (bvand b c)) (bvand b a c)) :bv-sort-ac true)
; In the new parameter setting framework, each module has its own parameters.
; The bv-sort-ac is a parameter of the "rewriter" framework.
(set-option :rewriter.bv-sort-ac true)
; Now, Z3 will rewrite the following formula to true even when we do not provide
; the option :bv-sort-ac true
(simplify (= (bvand a b c) (bvand b a c)))
; It will also simplify the following assertion.
(assert (= (bvand a b c) (bvand b a c)))
(check-sat)
结束编辑