首页 > 解决方案 > 在 z3 中将值分配给数组的三种方法

问题描述

据我所知,在 z3 中有三种方法可以将值分配给数组。

  1. 用于assert为某些单元格分配值:
(declare-const a1 (Array Int Int))
(declare-const a2 (Array Int Int))

(assert (= 1 (select a1 0)))
(assert (= 2 (select a2 0)))

z3在添加unsat约束时返回(assert (= a1 a2))

  1. 用于as const首先初始化数组,然后将值分配给特定单元格:
(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
    )
)

添加(assert (= a3 a4)),我们unsat再次获得。

  1. 通过函数定义数组:
(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)))

但是如果我们添加(assert (= a5 a6)), z3 会返回sat。为什么?

顺便说一句,有没有(更好的)方法可以将值分配给 z3 中的数组?

标签: z3smt

解决方案


这是一个错误。看看这个问题


推荐阅读