Z3:范围为子集集的编码函数

Z3:范围为子集集的编码函数,z3,Z3,我想问一下如何对范围为子集集的函数进行编码 例如,我有一个set Proc={1,2,3}和一个set Number={4,5,6}。现在我想把一个函数“fcn”从Proc声明为一组数的子集。我打算对每个数字子集使用8个变量,声明: (declare-fun var1 (Int) Bool) (assert (= (var1 4) true)) (assert (= (var1 5) true)) (assert (= (var1 6) true))

我想问一下如何对范围为子集集的函数进行编码

例如,我有一个set Proc={1,2,3}和一个set Number={4,5,6}。现在我想把一个函数“fcn”从Proc声明为一组数的子集。我打算对每个数字子集使用8个变量,声明:

    (declare-fun var1 (Int) Bool) 
    (assert (= (var1 4) true)) 
    (assert (= (var1 5) true)) 
    (assert (= (var1 6) true))

    ...

    (declare-fun var8 (Int) Bool) 
    (assert (= (var8 4) false)) 
    (assert (= (var8 5) false)) 
    (assert (= (var8 6) false))
我想,“fcn”应该是(声明有趣的fcn(Int)。不幸的是,我不知道如何声明“fcn”的范围


非常感谢。

您可以使用数组对集合(以及集合集合)进行编码。一组A被编码为一个数组(一个布尔)。那么一组a是(Array(Array a Bool)Bool)。 您可以使用“存储”从这些集合中添加和删除元素。可以使用“映射”功能获取并集和交点。 另见, 通用、高效的阵列决策程序。莱昂纳多·德莫拉,尼古拉·比约纳。FMCAD 2009。MSR-TR-121中的扩展版本。

非常感谢你,尼古拉。