在z3中将值关联到数组的三种方法

在z3中将值关联到数组的三种方法,z3,smt,Z3,Smt,据我所知,有三种方法可以将值关联到z3中的数组 使用assert将值关联到某些单元格: 当添加约束(assert(=a1 a2))时,z3返回unsat 使用as const首先初始化数组,然后将值关联到特定单元格: 添加(assert(=a3 a4)),我们再次获得unsat 通过函数定义阵列: 但是如果我们添加(assert(=a5a6)),z3将返回sat。为什么? 顺便问一下,在z3中有没有(更好的)给数组赋值的方法?这是一个bug。看看这个。这是一个bug。看看这个 (declare-

据我所知,有三种方法可以将值关联到z3中的数组

  • 使用
    assert
    将值关联到某些单元格:
  • 当添加约束
    (assert(=a1 a2))
    时,z3返回
    unsat

  • 使用
    as const
    首先初始化数组,然后将值关联到特定单元格:
  • 添加
    (assert(=a3 a4))
    ,我们再次获得
    unsat

  • 通过函数定义阵列:
  • 但是如果我们添加
    (assert(=a5a6))
    ,z3将返回
    sat
    。为什么?


    顺便问一下,在z3中有没有(更好的)给数组赋值的方法?

    这是一个bug。看看这个。

    这是一个bug。看看这个

    (declare-const a1 (Array Int Int))
    (declare-const a2 (Array Int Int))
    
    (assert (= 1 (select a1 0)))
    (assert (= 2 (select a2 0)))
    
    (declare-const a3 (Array Int Int))
    (assert
        (=
            (store ((as const (Array Int Int)) 64) 0 3)
            a3
        )
    )
    (declare-const a4 (Array Int Int))
    (assert
        (=
            (store ((as const (Array Int Int)) 64) 0 4)
            a4
        )
    )
    
    (define-const a5 (Array Int Int)
        (lambda ((i Int))
        (ite (= i 0) 5 64)))
    (define-const a6 (Array Int Int)
        (lambda ((i Int))
        (ite (= i 0) 6 64)))