【问题标题】:Using the Pure SMT-LIB2 in Z3 to check for consistency in rules在 Z3 中使用 Pure SMT-LIB2 检查规则的一致性
【发布时间】:2018-11-22 04:36:11
【问题描述】:

如果有一套规则——

1 : 如果 x 则 a

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 上运行的实际代码示例,我将不胜感激。

谢谢

【问题讨论】:

    标签: z3 smt z3py sat choco


    【解决方案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 高的布尔值的数量至少为两个。如果您对此还有其他问题,请随时询问。

    【讨论】:

    • 尊敬的先生,非常感谢您快速详细的回复。请原谅我,但在 z3 和 smt 方面,我是一个完整的初学者。我有一个小小的疑问 - 输出不应该是 unsat 吗?就像我给出的规则 1 和 2 一样,如果 m=111 和 n=201,那么在选择输出值时不会有冲突(可以是 200 或 220)。我正在构建一个可以在规则中检测到这种冲突的应用程序。如果我错了,请纠正我。谢谢楼主!
    • 也许我不明白你在做什么。您自己的问题规定m=115, n=205 是一个“冲突”的解决方案。这与您不喜欢的解决方案m=111, n=201 有何不同?
    • 我基本上是在尝试使用 z3 来存储规则,然后检查它们的一致性。如果有任何一组值可以在同一输出变量上触发冲突的操作序列,则代码的输出应告诉用户规则是冲突的或未满足的。在这种情况下,我想要的系统的输出应该通知用户系统中的规则由于值(m = 111,n = 201)而发生冲突,从而导致由于对单个输出变量的不同操作而导致不一致。我的输出变量一次只能执行一个操作 - 任何时候都可以是 200 或 220
    • 为了更清楚,考虑一个医疗保健应用程序的例子。假设我有一条规则 1,规定如果血糖在 100 到 120 之间,则给予胰岛素 = 1 毫升,而另一条规则 2 规定,如果血糖在 110 和 130 之间,则给予胰岛素 = 2 毫升。请注意,这些是相互矛盾的规则,因为在血糖 = 115 的情况下,我们将面临要施用多少胰岛素的困境。我们可以像你给我的那样写一个脚本来检查这种不一致吗?非常感谢你的直升机 - 我很感激
    • 没关系。在这种情况下,您应该将sat 响应阅读为:是的,有一个模型,因此您的规则是冲突的,这是冲突的值。而unsat 的意思是:我找不到让你的值产生不一致的值的方法,因此它们都是一致的。这有意义吗?
    猜你喜欢
    • 1970-01-01
    • 2013-07-16
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    相关资源
    最近更新 更多