如果有一套规则 -
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上运行的实际代码的例子,我将非常感激。 谢谢
答案 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。如果您对此有进一步的疑问,请随时询问。