Map 有没有一种方法可以使用Z3来获取涉及序列和地图的约束模型?

Map 有没有一种方法可以使用Z3来获取涉及序列和地图的约束模型?,map,sequence,z3,Map,Sequence,Z3,不久前,我问我如何使用Z3为涉及集合()的约束获取模型。为此,扩展阵列理论在我的例子中运行良好 现在,我对序列(操作长度、成员资格、(in-)相等,可能是切片)和映射也有同样的问题。也就是说,公理化导致了与集合相同的问题。我一直在考虑使用扩展数组理论对序列和映射进行编码,但我还没有想出一个好的方法来做到这一点 有人知道如何对序列和映射进行编码以获得精确的模型吗?在Z3中,数组本质上就是映射。是一个关于如何从整数列表到整数创建“数组”的示例 (declare-const a (Array (Lis

不久前,我问我如何使用Z3为涉及集合()的约束获取模型。为此,扩展阵列理论在我的例子中运行良好

现在,我对序列(操作长度、成员资格、(in-)相等,可能是切片)和映射也有同样的问题。也就是说,公理化导致了与集合相同的问题。我一直在考虑使用扩展数组理论对序列和映射进行编码,但我还没有想出一个好的方法来做到这一点


有人知道如何对序列和映射进行编码以获得精确的模型吗?

在Z3中,数组本质上就是映射。是一个关于如何从整数列表到整数创建“数组”的示例

(declare-const a (Array (List Int) Int))
(declare-const l1 (List Int))
(declare-const l2 (List Int))
(assert (= (select a l1) 0))
(assert (= (select a l2) 0))
(check-sat)
(get-model)
对于序列,我们可以使用量词对其进行编码。Z3对于许多可判定的片段是完整的。 其中大多数在本手册中进行了描述。是一种可能的编码

;; In this example, we are encoding sequences of T.
;; Let us make T == Int
(define-sort T () Int)

;; We represent a sequence as a pair: function + length
(declare-fun S1-data (Int) T)
(declare-const S1-len  Int)

(declare-fun S2-data (Int) T)
(declare-const S2-len  Int)

(declare-fun S3-data (Int) T)
(declare-const S3-len  Int)

;; This encoding has one limitation, we can't have sequences of sequences; nor have sequences as arguments of functions.

;; Here is how we assert that the sequences S1 and S2 are equal.
(push)
(assert (= S1-len S2-len)) 
(assert (forall ((i Int)) (=> (and (<= 0 i) (< i S1-len)) (= (S1-data i) (S2-data i)))))
;; To make the example more interesting, let us assume S1-len > 0
(assert (> S1-len 0))
(check-sat)
(get-model)
(pop)

;; Here is how we say that sequence S3 is the concatenation of sequences S1 and S2.
(push)
(assert (= S3-len (+ S1-len S2-len)))
(assert (forall ((i Int)) (=> (and (<= 0 i) (< i S1-len)) (= (S3-data i) (S1-data i)))))
(assert (forall ((i Int)) (=> (and (<= 0 i) (< i S2-len)) (= (S3-data (+ i S1-len)) (S2-data i)))))
;; let us assert that S1-len and S2-len > 1
(assert (> S1-len 1))
(assert (> S2-len 1))
;; let us also assert that S3(0) != S3(1)
(assert (not (= (S3-data 0) (S3-data 1))))
(check-sat)
(get-model)
(pop)

;; Here is how we encode that sequence S2 is sequence S1 with one extra element a
(push)
(declare-const a T)
(assert (> a 10))
(assert (= S2-len (+ 1 S1-len)))
(assert (= (S2-data S1-len) a))
(assert (forall ((i Int)) (=> (and (<= 0 i) (< i S1-len)) (= (S2-data i) (S1-data i)))))
;; let us also assert that S1-len > 1
(assert (> S1-len 1))
(check-sat)
(get-model)
(pop)
;;在本例中,我们对T的序列进行编码。
;; 让我们把T==Int
(定义排序T()Int)
;; 我们将序列表示为一对:函数+长度
(数据(整数)T)
(声明常数S1 len Int)
(数据(Int)T)
(声明常量S2 len Int)
(数据(Int)T)
(声明常量S3 len Int)
;; 这种编码有一个限制,我们不能有序列的序列;序列也不能作为函数的参数。
;; 下面是我们如何断言序列S1和S2是相等的。
(推)
(断言(=S1 len S2 len))
(assert(forall((i Int))(=>(and(0))
(断言(>S1 len 0))
(检查sat)
(获取模型)
(流行音乐)
这里我们说序列S3是序列S1和S2的串联。
(推)
(断言(=S3 len(+S1 len S2 len)))
(assert(for all((i Int))(=>)和((and)(1
(断言(>S1 len 1))
(断言(>S2 len 1))
;让我们也断言S3(0)!=S3(1)
(断言(非(=(S3数据0)(S3数据1)))
(检查sat)
(获取模型)
(流行音乐)
这里是我们如何编码序列S2是序列S1和一个额外的元素a
(推)
(宣布常数为T)
(断言(>a 10))
(断言(=S2 len(+1 S1 len)))
(断言(((S2数据S1 len)a))
(assert(forall((i Int))(=>)和(1
(断言(>S1 len 1))
(检查sat)
(获取模型)
(流行音乐)