Z3 量词和模式(QBF公式)

Z3 量词和模式(QBF公式),z3,Z3,我试图用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) ) )

我试图用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查询的结果仍然“未知”

我猜我需要正确的模式?如何为嵌套量词指定它们?不过,带有量词的简单示例似乎在没有模式注释的情况下也能工作


不幸的是,z3指南的答案对我帮助不大。

此警告消息可以忽略。它只是通知您,电子匹配引擎将无法处理此量化公式

电子匹配仅在显示问题不可满足时有效。由于您的示例是令人满意的,因此电子匹配将不会非常有用。也就是说,Z3将无法使用电子匹配引擎返回
sat
。基于模型的量词实例化(MBQI)是Z3中唯一能够显示包含量词的问题是可满足的引擎

对于您的示例,使用默认配置,Z3将返回
sat
。由于您禁用了MBQI模块,因此它返回
unknown

MBQI引擎保证Z3是许多片段的决策过程(请参阅)。然而,它通常非常昂贵,并且在快速和近似的答案足够时应该禁用。在这种情况下,
unknown
可能被解读为
可能是sat
。验证工具,如禁用MBQI模块,因为它无法确定由它们生成的公式。也就是说,VCC生成的公式不在MBQI引擎可以确定的任何片段中。 我们说一个片段可以由Z3决定,对于片段中的任何公式,Z3将返回
sat
unsat
(即,它不返回
unknown
)。当然,这种说法假设我们拥有无限量的资源。也就是说,当Z3内存不足或用户指定超时时,它也可能会对可判定片段失败(即,返回未知的)

最后,Z3.2在MBQI引擎中有一个。错误已经修复,不会影响您的问题。如果你需要,我可以给你一个Z34.0的预发布版本,其中包含错误修复