我正在尝试用 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 的结果仍然是“未知的”。
我猜我需要得到正确的模式?如何为嵌套量词指定它们?不过,带有量词的更简单示例似乎可以在没有模式注释的情况下工作。
不幸的是, Z3中警告消息背后的原因是什么:“未能找到量词的模式(量词id:k!18)”和z3指南对我没有太大帮助。