我正在尝试使用smt-lib 2语法为z3编码QBF。运行z3会产生警告
警告:未能找到量词的模式(量词ID:k!14)
且可满足性结果为“未知”。
代码如下:
(declare-fun R (Bool Bool Bool Bool) Bool)
(assert
(forall ((x2 Bool) (x3 Bool))
(exists ((y Bool))
(forall ((x1 Bool))
(R x1 x2 x3 y)
)
)
)
)
(check-sat)
我通过将代码重写为
来消除警告(set-option :auto-config false)
(set-option :mbqi false)
(declare-fun R (Bool Bool Bool Bool) Bool)
(declare-fun x1 () Bool)
(declare-fun x2 () Bool)
(declare-fun x3 () Bool)
(declare-fun y () Bool)
(assert
(forall ((x2 Bool) (x3 Bool))
(!
(exists ((y Bool))
(!
(forall ((x1 Bool))
(!
(R x1 x2 x3 y)
:pattern((R x1 x2 x3 y)))
)
:pattern((R x1 x2 x3 y)))
)
:pattern((R x1 x2 x3 y)))
)
)
(check-sat)
然而,sat-query的结果仍然是“未知”。
我猜我需要正确的模式?如何为嵌套量词指定它们?但是,使用量词的简单示例似乎无法使用模式注释。
不幸的是,对What is the reason behind the warning message in Z3: "failed to find a pattern for quantifier (quantifier id: k!18) "和z3指南的回答并没有给我太多帮助。
答案 0 :(得分:7)
可以忽略此警告消息。它只是通知您,E匹配引擎将无法处理此量化公式。
电子匹配仅对表明问题不可满足有效。由于您的示例是可以满足的,因此E匹配不会非常有用。也就是说,Z3将无法使用E匹配引擎返回sat
。基于模型的量词实例化(MBQI)是Z3中唯一能够显示包含量词的问题是否令人满意的引擎。
使用默认配置,Z3将为您的示例返回sat
。它返回unknown
,因为您禁用了MBQI模块。
MBQI引擎保证Z3是许多片段的决策过程(参见http://rise4fun.com/Z3/tutorial/guide)。但是,它通常非常昂贵,并且当快速和近似的答案足够时应该禁用。在这种情况下,unknown
可能会被视为probably sat
。诸如VCC之类的验证工具会禁用MBQI模块,因为它无法确定由它们生成的公式。也就是说,由VCC产生的公式不在可由MBQI引擎决定的任何片段中。
我们说当片段Z3中的任何公式将返回sat
或unsat
(即,它不返回unknown
)时,片段可由Z3决定。当然,这种说法假定我们拥有无限量的资源。也就是说,当内存耗尽或用户指定超时时,Z3也可能因可判定片段而失败(即返回unknown
。
最后,Z3 3.2在MBQI引擎中有一个bug。该错误已得到修复,并不会影响您的问题。如果您需要,我可以为您提供包含错误修复的Z3 4.0的预发布版本。