继续获得“未知”结果:SMTLIB v2输入中的模式使用

时间:2013-04-04 08:29:40

标签: z3 smt

在使用SMTLIBv2输入格式和Z3模式时遇到问题:我通过以下输入继续获得结果“未知”:

(declare-datatypes () ((L L0 L1)))
(declare-fun path () (List L))
(declare-fun checkTransition ((List L)) Bool)

(define-fun isCons ((p (List L))) Bool
    (not (= p nil))
)

; configuration options for :pattern, taken from the Z3 tutorial
(set-option :auto-config false) ; disable automatic self configuration
(set-option :smt.mbqi false)    ; disable model-based quantifier instantiation

(assert (isCons path))
(assert (isCons (tail path)))
(assert (= nil (tail (tail path))))
(assert (= L0 (head path)))             ; initial state constraint

(assert
    (forall ((p (List L)))
    (!
        (implies
            (and    (isCons p)
                    (isCons (tail p)))
            (and    (=  L0  (head p))           ; transition from L0
                    (=  L1  (head (tail p)))))  ; to L1
    :pattern ((checkTransition p))
    )
    )
)
(assert (checkTransition path))

(check-sat)
(get-model)

我使用列表来表示通过转换系统的可能路径。在这种情况下,转换系统仅由状态L0和L1组成,它们通过从L0到L1的转换而链接。通过断言语句,我将路径限制为以L0开头并且长度为2。 我期望得到一个模型的路径(L0(缺点(L1(cons nil))))。

我已经尝试将其归结为仍然显示问题的最小示例,从而产生上面的代码。 我想使用该模式对'path'进行递归检查,以确保列表中的每两个连续节点符合某些(转换)约束。对连续缺点的检查用作此递归检查的停止条件。虽然在上面的例子中我通过checkTransition删除了递归检查,但它仍然不起作用。整个想法可以追溯到Milicevic和Kugler的一篇文章,其中他们使用Z3 2.0和.net API以这种方式表示模型检查问题。

我知道模式实例化会导致结果“未知”,但我想知道为什么它已经发生在如此简单的(?)示例中。我是否以错误的方式使用该模式来实现量词支持?

对此问题的任何想法都非常欢迎!

此致 卡斯滕

P.S .: 我在MacOS X上使用Z3版本4.3.2(10.8.3) 上述文章:Milicevic,A。& Kugler,H.,2011。使用SMT和列表理论进行模型检查。美国宇航局正式方法,第282-297页。

根据mhs的评论进行编辑:

版本4.3.2(不稳定)似乎没有获得模型的问题。 我做了一些不同版本的故障排除:

  • Z3 4.3.0 32位,WinXP 32位,来自安装人员
    • 结果:未知,但提供了一个模型
  • Z3版本4.3.1,git checkout 89c1785b73225a1b363c0e485f854613121b70a7,MacOS X,自编译,这是主分支中的最新版本....
    • 结果:未知,但提供了一个模型
  • 主分支的各种其他结账,所有< = 4.3.1产生相同的结果。
  • Z3版本4.3.2,每晚构建z3-4.3.2.197b2e8ddb91-x64-osx-10.8.2,MacOS X ...
    • 结果:未知,给出NO模型
  • Z3版本4.3.2,每晚建立z3-4.3.2.96f4606a7f2d-x64-osx-10.8.2,MacOS X ...
    • 结果:未知,给出NO模型

有趣?

2 个答案:

答案 0 :(得分:0)

我刚刚在Win 7 x64上尝试了Z3 4.3.0上的示例,我得到了结果

unknown

(model 
  (define-fun path () (List L)
    (insert L0 (insert L1 nil)))

  (define-fun checkTransition ((x!1 (List L))) Bool
    (ite (= x!1 (insert L0 (insert L1 nil))) true
      true))
)

这不是您期望的path模型吗?

我认为你得到unknown因为你的问题不明确,但我不能指出具体的问题。如果你给Z3一些东西来反驳,例如附加

(assert (not (= L1 (head (tail path)))))
(check-sat)

到您的代码,然后您将按预期获得unsat

答案 1 :(得分:0)

Z3有很多解算器。当结果为unknown时,并非每个求解器都会生成“候选模型”。 默认求解器是一个自动选择要使用的求解器的投资组合。投资组合解算器在unstable(正在进行中)分支中进行了修改。每晚构建使用unstable分支编译。我将添加一个命令来指定执行(check-sat)时执行的解算器。因此,如果我们对unknown结果的“候选模型”感兴趣,我们可以指定生成它们的求解器。在此期间,您可以使用以下解决方法:

  • (push)之前添加(check-sat)命令。这是一个小小的黑客,它迫使投资组合解决者选择一个产生“候选模型”的解算器。

补充说明:

  • Z3 v4.3.2尚未发布。这就是为什么问题中的每晚构建都会附加git哈希197b2e8ddb9196f4606a7f2d。这些哈希码标识用于构建它们的精确git提交。

  • 如果我们删除命令(set-option :smt.mbqi false),Z3将使用mbqi模块并成功显示断言为unsat