使用Z3中的纯SMT-LIB2检查规则的一致性

使用Z3中的纯SMT-LIB2检查规则的一致性,z3,smt,z3py,sat,choco,Z3,Smt,Z3py,Sat,Choco,如有一套规则— 1:如果是x,那么是a 2:如果x那么b 那么这些规则将是冲突的,因为我们不知道当x被触发时将执行什么操作。因此— 现在假设我想检查规则的一致性,例如- 1:如果(100

如有一套规则—

1:如果是x,那么是a

2:如果x那么b

那么这些规则将是冲突的,因为我们不知道当x被触发时将执行什么操作。因此—

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

1:如果(100 2:If(110 我相信这正是你在寻找的


请注意,当您有2个以上的规则时,您可能希望在建模时更加小心地说,某些规则子集被激发,而不是像我上面所做的那样全部激发。如果您有2个规则,那么结果是相同的,但是如果您有3个规则,您希望允许{1,2}、{1,3}、{2,3}和{1,2,3}的可能性所有触发。后者可以通过计算谓词来建模,方法是确保应用的
ruleN_
booleans的数量至少达到两个。如果您对此有进一步的问题,请随时提问。

亲爱的先生,非常感谢您快速而详细的回答。请原谅,对于z3,我是一个完全的初学者还有smt。我有一个小小的疑问-输出不应该是未统计的吗?就像我给出的规则1和2,如果m=111和n=201,那么在选择输出值时会不会有冲突(可以是200或220)。我正在构建一个可以检测规则冲突的应用程序。如果我错了,请纠正我。谢谢您,先生!也许我不明白您的意图。您自己的问题是
m=115,n=205
解决方案。这与您不喜欢的解决方案
m=111,n=201
有何不同?我基本上是在尝试使用z3存储规则,然后检查它们的一致性。如果有任何一组值可以在sa上触发冲突的操作序列,代码的输出应该告诉用户规则冲突或未统计me输出变量。在这种情况下,所需系统的输出应通知用户,系统中的规则因值(m=111,n=201)而冲突由于一个输出变量上的不同动作而导致不一致。我的输出变量每次只能执行一个动作——或者在任何时候都可以是200或220,以使其更清晰,考虑医疗保健应用的例子。假设我有一个规则1,如果血糖在100到120之间,那么给予胰岛素=1毫升和另一条规则2,其中规定如果血糖在110和130之间,则给予胰岛素=2毫升。请注意,这些规则相互冲突,因为在血糖=115的情况下,我们将进退两难,无法确定应给予多少胰岛素。我们可以像您给我的脚本那样编写一份脚本来检查这种不一致性吗非常感谢您的帮助-我很感激这没关系。在这种情况下,您应该将
sat
响应解读为:是的,有一个模型,因此您的规则是冲突的,下面是冲突的值。
unsat
的意思是:我找不到方法使您的值产生不一致的值,因此它们都是冲突的一致性,这有意义吗?
(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))
sat
((m 111)
 (n 201))