计算const的唯一值

时间:2019-04-20 11:12:48

标签: unique z3 counting smt

在我的项目中,我定义了以下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求解器来实现它?

我想到的唯一想法是:

  1. 了解可分配给MAXVAL中的任何一个的最大值(vi_g),定义MAXVAL布尔常量(ci),
  2. 对于每个此const进行断言,例如c0 = (v0_g == 0) v (v1_g == 0) v ... v (vn_g == 0)
  3. 计算有多少ci常量等于True

但是,如果MAXVAL大,则需要很多附加条款。

1 个答案:

答案 0 :(得分:-1)

没有简单的方法可以计算通用公式的模型数量。您的特定公式允许某种简化,或者不容易。参见例如#SAT(https://en.wikipedia.org/wiki/Sharp-SAT)的文献。 一种简单的方法是使用一次线性循环来实现一次计数,该一次循环会阻塞一个模型(如果模型是部分模型,则可能会阻塞多个模型)。