Z3:编码函数,其范围是子集的集合

时间:2015-08-28 16:19:48

标签: z3

我想问一下如何编码范围是子集的函数。

例如,我有一套Proc = {1,2,3}和一套Number = {4,5,6}。现在我想从Proc声明一个函数“fcn”到一组Number的子集。我打算通过声明:

为Number的每个子集使用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”应该是(declare-fun fcn(Int)...)。不幸的是,我不知道如何声明“fcn”的范围。

非常感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用数组来编码集(和集合集)。一组A被编码为(阵列A布尔)。那么一组A是(Array(Array A Bool)Bool)。 您可以使用“store”在这些集合中添加和删除元素。您可以使用“地图”功能获取工会和十字路口。 也可以看看, 广义,高效的阵列决策程序。 Leonardo de Moura,NikolajBjørner。 FMCAD 2009. MSR-TR-121的扩展版。 http://research.microsoft.com/apps/pubs/?id=102329