在Z3中使用Pure SMT-LIB2来检查规则的一致性

时间:2018-06-12 17:45:17

标签: z3 smt z3py sat choco

如果有一套规则 -

1:如果是x那么

2:如果是x则b

然后这些规则应该是冲突的,因为我们不知道当x被触发时要执行的动作是什么。因此 -

现在假设我想检查规则的一致性,例如 -

1:如果(100

2:如果(110

显然,规则1和规则2是冲突的,因为如果m = 115且n = 205,则输出可以是200或220.

有没有办法可以使用Z3库检查上述规则的一致性?或者使用纯SMT-lib2?请帮忙。如果你能给我一个可以在https://rise4fun.com/Z3/vd?frame=1&menu=0&course=1上运行的实际代码的例子,我将非常感激。

谢谢

1 个答案:

答案 0 :(得分:1)

不确定

(declare-fun m () Int)
(declare-fun n () Int)

(define-fun rule1_applies () Bool (and (< 100 m) (< m 120) (< 200 n) (< n 220)))
(define-fun rule2_applies () Bool (and (< 110 m) (< m 120) (< 200 n) (< n 210)))

(declare-fun output0 () Int)

(define-fun output_rule1 () Int (ite rule1_applies 200 output0))
(define-fun output_rule2 () Int (ite rule2_applies 220 output0))

(assert (and rule1_applies rule2_applies (distinct output_rule1 output_rule2)))
(check-sat)
(get-value (m n))

这样,z3产生:

sat
((m 111)
 (n 201))

我认为,在这种情况下,您正在寻找的是什么。

请注意,当您有超过2个规则时,您可能希望在建模时更加小心,以便说出某些规则子集而不是像上面那样触发所有规则。如果您有2个规则,那么最终会成为同一个规则,但如果您有3个规则,则希望允许{1,2},{1,3},{2,3}和{的可能性全部射击,1,2,3}。后者可以通过计算谓词来建模,通过确保高ruleN_applies布尔值的数量至少为2。如果您对此有进一步的疑问,请随时询问。