Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让Z3返回最小模型?_Z3 - Fatal编程技术网

如何让Z3返回最小模型?

如何让Z3返回最小模型?,z3,Z3,如果我给Z3一个像p | q这样的公式,我希望Z3返回p=true,q=don't care(或者切换了p和q),但它似乎坚持同时给p和q赋值(即使在调用Eval()时我没有打开补全)。除了对此感到惊讶之外,我的问题是,如果p和q不是简单的道具怎么办。变量,但昂贵的表达式,我知道通常p或q都是真的。有没有一种简单的方法可以让Z3返回一个“最小”模型,而不浪费时间同时满足p和q?我已经试过MkITE,但那没什么区别。还是我必须使用某种策略来强制执行 谢谢! 另外,我想补充一点,我已经关闭了AUTO

如果我给Z3一个像p | q这样的公式,我希望Z3返回p=true,q=don't care(或者切换了p和q),但它似乎坚持同时给p和q赋值(即使在调用
Eval()
时我没有打开补全)。除了对此感到惊讶之外,我的问题是,如果p和q不是简单的道具怎么办。变量,但昂贵的表达式,我知道通常p或q都是真的。有没有一种简单的方法可以让Z3返回一个“最小”模型,而不浪费时间同时满足p和q?我已经试过
MkITE
,但那没什么区别。还是我必须使用某种策略来强制执行

谢谢! 另外,我想补充一点,我已经关闭了AUTO_CONFIG,但Z3正试图将值分配给or的两个分支中的常量:例如,在下面的代码段中,我希望它将值分配给path2_2和path2_1或path2R_2和path2R_1,但不是同时分配给这两个分支

   (or (and (select a!5 path2_2) a!6 (select a!5 path2_1) a!7)
       (and (select a!5 path2R_2) a!8 (select a!5 path2R_1) a!9))

Z3有一个称为关联传播的特性。如中所述。它做你想要的。注意,在大多数情况下,相关性传播对性能有负面影响。在我们的实验中,它只对包含量词的问题有用(量词推理非常昂贵,因此是值得的)。默认情况下,Z3将在包含量词的问题中使用相关性传播。否则,它将不会使用它。 下面是一个示例,说明如何在问题没有量词时启用它(该示例也可在线获得)

x,y=Bools('xy')
s=解算器()
s、 设置(自动配置=False,相关性=2)
s、 加(或(x,y))
打印s.检查()
打印s.model()

注意:这里给出的示例在Z3的最新版本中不起作用,但在使用SimpleSolver()而不是Solver()时确实起作用。另请参见此处:文章链接已断开?