メッセージで説明する操作(contains S1 S2)
はサブセット関係です。整数のセットをIntからブール値までの関数としてエンコードする場合(たとえば、setz3のmaxvalue)、S1
およびS2
は次のように宣言されます。
(declare-fun S1 (Int) Bool)
(declare-fun S2 (Int) Bool)
次に、それは主張することによってS1
のサブセットであると言うことができますS2
(assert (forall ((x Int)) (=> (S1 x) (S2 x))))
S1
の要素はすべての要素でもあると言っていますS2
。
編集
式を使用して(exists ((x Int)) (and (S1 x) (S2 x)))
、セットS1
とS2
要素が共通しているかどうかを確認できます
編集終了
セットの最小要素は、セットz3の最大値で行ったようにエンコードできます。たとえば、の最小要素がであるS1
としmin_S1
ます。
; Now, let min_S1 be the min value in S1
(declare-const min_S1 Int)
; Then, we now that min_S1 is an element of S1, that is
(assert (S1 min_S1))
; All elements in S1 are bigger than or equal to min_S1
(assert (forall ((x Int)) (=> (S1 x) (not (<= x (- min_S1 1))))))
エンコードしているセットの最小値が「エンコード時」にわかっている場合(そして小さい場合)。ビットベクトルに基づくさらに別のエンコーディングを使用できます。このエンコーディングでは、セットはビットベクトルです。セットに0〜5の値しか含まれていない場合は、サイズ6のビットベクトルを使用できます。アイデアは、ビットi
がtrueの場合i
、セットの要素である場合に限ります。
主な操作の例を次に示します。
(declare-const S1 (_ BitVec 6))
(declare-const S2 (_ BitVec 6))
(declare-const S3 (_ BitVec 6))
; set equality is just bit-vector equality
(assert (= S1 S2))
; set intersection, union, and complement are encoded using bit-wise operations
; S3 is S1 union S2
(assert (= S3 (bvor S1 S2)))
; S3 is S1 intersection of S2
(assert (= S3 (bvand S1 S2)))
; S3 is the complement of S1
(assert (= S3 (bvnot S1)))
; S1 is a subset of S2 if S1 = (S1 intersection S2), that is
(assert (= S1 (bvand S1 S2)))
; S1 is the empty set if it is the 0 bit-vector
(assert (= S1 #b000000))
; To build a set that contains only i we can use the left shift
; Here, we assume that i is also a bit-vector
(declare-const i (_ BitVec 6))
; S1 is the set that contains only i
; We are also assuming that i is a value in [0, 5]
(assert (= S1 (bvshl #b000001 i)))