Z3 ini选项案例_拆分生成奇怪的模型

Z3 ini选项案例_拆分生成奇怪的模型,z3,Z3,在用z3写硕士论文的时候,我发现了一些奇怪的东西,我不明白。 我希望你能帮助我。:) 我编写的smt文件如下所示: (set-logic QF_UF) (set-info :smt-lib-version 2.0) ;Declare sort Node and its objects. (declare-sort Node 0) (declare-fun n0 () Node) (declare-fun n1 () Node) ;Predicate (declare-fun dead_0 (

在用z3写硕士论文的时候,我发现了一些奇怪的东西,我不明白。 我希望你能帮助我。:)

我编写的smt文件如下所示:

(set-logic QF_UF)
(set-info :smt-lib-version 2.0)

;Declare sort Node and its objects.
(declare-sort Node 0)
(declare-fun n0 () Node)
(declare-fun n1 () Node)

;Predicate
(declare-fun dead_0 (Node) Bool)
;Abbreviation
(declare-fun I () Bool)

;initial configuration
(assert(= I (and 
(not(= n0 n1))
(not(dead_0 n0))
(dead_0 n1))))

;Predicate
(declare-fun dead_1 (Node) Bool)
;variable
(declare-fun m0_1 () Node)

;Abbreviation for Transformation
(declare-fun TL1_1 () Bool)

;Transformation1neuerKnoten1
(assert(or (= m0_1 n0)(= m0_1 n1)))

;Is the whole formula satisfiable?
(assert(= (and I TL1_1) true))
(check-sat)
(get-model)
当使用z3作为带有默认选项的命令行工具时,一切都很好。 生成的模型包含:

;; universe for Node:
;;   Node!val!0 Node!val!1 
;; -----------

因此,我的变量m0_1绑定到节点n0

然后我将z3与一个ini文件一起使用,该文件只包含
CASE\u SPLIT=5
。 结果是一个奇怪的模型。在我看来,基本上是不同的 我的变量m0_1未绑定到任何节点n0或n1。 生成的模型包含:

;; universe for Node:
;;   Node!val!2 Node!val!0 Node!val!1 
;; -----------

所以我的问题是:为什么z3创建了另一个节点(
node!val!2
),为什么我的变量
m0_1
绑定到这个新节点?我认为我的一个断言(
(assert(或(=m0_1n0)(=m0_1n1))
)会禁止这样做

提前感谢!:)

Z3具有一种称为“相关性传播”的特性。这一特性对于包含量词的问题非常有效,但对于无量词的问题通常是开销。命令行选项
RELEVANCY=0
禁用相关性传播,而
RELEVANCY=2
RELEVANCY=1
启用它。 选项
CASE\u SPLIT=5
假设相关传播已启用。 如果我们提供
CASE\u SPLIT=5 relevance=0
,那么Z3将生成一条警告消息

WARNING: relevacy must be enabled to use option CASE_SPLIT=3, 4 or 5
而且,忽略了这个选项

此外,默认情况下,Z3使用“自动配置”功能。此功能扫描输入公式并调整给定实例的Z3配置。 因此,在您的示例中,会发生以下情况:

  • 您提供选项
    CASE\u SPLIT=5
  • 当Z3验证命令行选项时,相关性传播被禁用,并且不会生成任何警告消息
  • Z3运行自动配置过程,因为您的示例没有量词,所以它禁用相关性传播
    relevancy=0
    。现在,使用了不一致的配置,Z3产生了错误的结果
  • 为避免此问题,如果您使用
    CASE\u SPLIT=5
    ,则还应使用
    AUTO\u CONFIG=false
    (禁用自动配置)和
    RELEVANCY=2
    (启用相关性传播)。因此,命令行应该是:

    z3 CASE_SPLIT=5 AUTO_CONFIG=false RELEVANCY=2 file.smt2
    
    在下一版本(Z3 4.2)中,如果启用自动配置时用户试图设置
    CASE_SPLIT=5
    ,我将使Z3显示警告消息

    WARNING: relevacy must be enabled to use option CASE_SPLIT=3, 4 or 5
    
    z3 CASE_SPLIT=5 AUTO_CONFIG=false RELEVANCY=2 file.smt2