如何使用Mathsat确定给定实例的解决方案数量

时间:2013-11-05 01:43:22

标签: z3 smt z3py

Mathsat支持命令check-allsat,Z3不支持它。请考虑以下示例:

(declare-fun m () Bool)
(declare-fun p () Bool)
(declare-fun b () Bool)
(declare-fun c () Bool)
(declare-fun r () Bool)
(declare-fun al () Bool)
(declare-fun all () Bool)
(declare-fun la () Bool)
(declare-fun lal () Bool)
(declare-fun g () Bool)
(declare-fun a () Bool)
(define-fun conjecture () Bool
(and (= (and (not r) c) m) (= p m) (= b m) (= c (not g)) (= (and (not al) (not all)) r)
(=(and la b) al) 
(= (and al la lal) all) (= (and (not g) p a) la) (= (and (not g) (or la a)) lal)))
(assert conjecture)
(check-allsat (m p b c r al all la lal g a))

使用mathsat执行此代码,可获得所有一致的赋值。问题是如何使用Mathsat确定此类一致性分配的数量?

1 个答案:

答案 0 :(得分:3)

我不知道任何计算解决方案数量的命令。但是这可以使用MathSAT的API轻松完成。创建一个计数器,并在每次MathSAT通知时增加它。

static int counter = 0;
static int my_callback(msat_term *model, int size, void *user_data)
{
   counter++; return 1;
}
...
msat_all_sat(env, important, 4, my_callback, &data);