在我的项目中,我定义了以下const:
(declare-const v0_g Int)
(declare-const v1_g Int)
(declare-const v2_g Int)
(declare-const v3_g Int)
(declare-const v4_g Int)
...
结果,我在模型中得到以下值:
...
(define-fun v4_g () Int
2)
(define-fun v3_g () Int
10)
(define-fun v2_g () Int
10)
(define-fun v1_g () Int
8)
(define-fun v0_g () Int
0)
...
现在,我想定义一个名为cost
的新const并分配vi_g
的唯一值的数量(在上面的示例cost == 4
中(即{0,2,8,10}
)。我可以使用z3求解器来实现它?
我想到的唯一想法是:
MAXVAL
中的任何一个的最大值(vi_g
),定义MAXVAL
布尔常量(ci
),c0 = (v0_g == 0) v (v1_g == 0) v ... v (vn_g == 0)
,ci
常量等于True
。但是,如果MAXVAL
大,则需要很多附加条款。
答案 0 :(得分:-1)
没有简单的方法可以计算通用公式的模型数量。您的特定公式允许某种简化,或者不容易。参见例如#SAT(https://en.wikipedia.org/wiki/Sharp-SAT)的文献。 一种简单的方法是使用一次线性循环来实现一次计数,该一次循环会阻塞一个模型(如果模型是部分模型,则可能会阻塞多个模型)。