Z3 了解生产证明、字段名称和中间检查sat和x27的效果;什么是表演

Z3 了解生产证明、字段名称和中间检查sat和x27的效果;什么是表演,z3,Z3,对于以下代码,我观察到了非常快的结果,这些结果似乎是由三个不寻常的方面引起/影响的: 当使用(设置选项:product-proof-true)时,最终的UNSAT非常快。如果没有此选项,最终检查sat不会终止 当使用中间检查sat和断言(全部推/弹出)时,最终检查sat的性能非常快。如果没有中间检查sat命令,最终检查sat不会终止 重命名数据类型字段后最终检查sat的性能非常差(终止需要30倍的时间) 有人能解释一下这种情况吗?仅仅是选项的组合导致保留正确的事实以快速回答最终SAT吗?未使

对于以下代码,我观察到了非常快的结果,这些结果似乎是由三个不寻常的方面引起/影响的:

  • 当使用
    (设置选项:product-proof-true)
    时,最终的UNSAT非常快。如果没有此选项,最终检查sat不会终止
  • 当使用中间检查sat和断言(全部推/弹出)时,最终检查sat的性能非常快。如果没有中间检查sat命令,最终检查sat不会终止
  • 重命名数据类型字段后最终检查sat的性能非常差(终止需要30倍的时间)
有人能解释一下这种情况吗?仅仅是选项的组合导致保留正确的事实以快速回答最终SAT吗?未使用构造函数的字段名如何影响解算器的性能

与此问题相关的代码如下。代码中嵌入了带有额外上下文的注释和对问题的重新分类

;;;;;;;;;;;;;;;;;;;;;;;;;;;;配置
;; 电子匹配不会在我们的查询中终止,所以请将其关闭
(设置选项:smt.ematching false)
(设置选项:smt.mbqi true)
;; 代替最初的测试,产生真实的证据对客户来说是一个巨大的好处
;; 最后一次检查的结果是sat
(设置选项:生成正确的证明)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 原始数据;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 我们对“比特”的句法表示
;; 删除“Raw2345”或将其重命名为“Raw2”,会使计算时间增加约30倍。
(声明数据类型()((位零(异或(左位)(右位))(原始(原始整数))(Raw2345(raw2整数'))))
;; 数据上的谓词
(宣布有趣的秘密(Bits)Bool)
(声明乐趣已知(Bits)Bool)
;; 第一个测试的存在对性能有很大的好处
;; 最终检查sat(尽管推/弹出)。
(推)
(echo“存在x和y,即使xor可以取消,它们仍然是秘密的”)
(echo“(关于AC理论的NB规则缺失)”)
(断言(存在((x位)(y位)(xA位)(xB位)(xC位)(yA位)(yB位)(yC位))
(和(=x(Xor-xA(Xor-xB-xC)))
(=y(Xor-yA(Xor-yB-yC)))
(秘密十)
(秘密y)
(已知xA)
(已知xB)
(已知xC)
(认识你)
(已知yB)
(已知yC)
(不知道(x))
(不知道(y))
)))
(检查sat)
(流行音乐)
;;;;;;;;;;;;;;;;;;;;;;;;;;;; 异或理论;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; “Xor”的公理,用攻击者知道的内容表示
(断言(所有((y位)(x位));幂零
(!(=>(已知(Xor y(Xor x x)))
(已知y)):权重0)
(断言(所有((x位));标识
(!(=>(已知(异或x零))
(已知x):重量0);交换性
(断言(所有)(x位)
(y位)
(!(=>(已知(Xor x y))
(已知(Xor y x)):权重1)
(断言(用于所有((x位);关联性(1)
(y位)
(z位)
(!(=>(已知(Xor x(Xor y z)))
(已知(Xor(Xor x y)z)):权重1)
断言(用于所有((x位);关联性(2)
(y位)
(z位)
(!(=>(已知(Xor(Xor x y)z))
(已知(Xor x(Xor y z)):权重2)
;; 假设知道xor
(断言(已知零)
(断言(所有)(x位)
(y位)
(!(=>(和(已知x)
(已知)
(已知(Xor x y)):权重4)
;; 下面的测试现在似乎需要良好的性能-奇怪,因为
;; 在此之前,stackoverflow的公式没有包括
;; 这是一张特别的支票。
(echo“Z3已正确放弃推送/弹出的断言。”)
(回应“我们的问题仍然存在”)
(检查sat)
;; 简单测试
(推)
(断言
(存在((a位)
(b位)
(c位)
(ra位)
(rb位)
(rc位)
;我们真正的问题:
(和(秘密(异或a(异或b c)))
(已知(Xor a(Xor ra rc)))
(已知(Xor b(Xor rb ra)))
(已知(Xor c(Xor rc rb)))
) ))
(echo“Z3能否在未解释的函数中使用异或重写”)
(echo“(应该得到UNSAT)”)
(断言
(不存在((a位))
(和(秘密a)(已知a(())))
;; 出于性能原因,必须关闭Skolemize
;; NTS:Z3在存在主义方面做了什么?
(设置选项:nnf.skolemize false)
;; NST:大概,执行深度三杆对位会有所帮助
;; 因为它与我们的资产深度一致,但是
;; 稍后将需要一种更明智的方法。
(使用(par then(par then smt smt)smt)检查sat)
(流行音乐)

在SMT解算器中,某些方面,尤其是文字选择,是“随机的”——也就是说,如果没有更好的选择方法,系统将使用随机数。通过更改事物的命名方式,或者是否记录证明,您可能会更改随机数的使用模式,从而导致解算器进入更合适或不合适的方向

我注意到你使用了量化的公理。一般来说,当面对这样的公理时,Z3将使用一种称为“量词实例化”的不完整方法——也就是说,如果它有∀xf(x),它将尝试F(x)以获得它认为有趣的各种x值。这些值的选择是启发式的,并且(我没有检查)可能依赖于随机选择

我建议你用不同的
random\u seed
试试你的例子,看看会发生什么