如何消除Z3中的约束

如何消除Z3中的约束,z3,Z3,我有一个约束,比如(t>=0或t>=1)和(t=2),实际上这个约束可以简化为“t>=0”,如何使用z3以CNF形式获得简化结果 (declare-const t Int) (assert (and (or (>= t 0) (>= t

我有一个约束,比如
(t>=0或t>=1)
(t=2)
,实际上这个约束可以简化为“
t>=0
”,如何使用z3以CNF形式获得简化结果

(declare-const t Int)                                                                                  
(assert (and 
            (or
               (>= t 0)
               (>= t 1)
            )
            (or
                (>= t 2)
                 (<= t 2)
            )
            (>= t 0)
            (<= t 1)
        )
)                                                                                         
(apply (par-then (! simplify :elim-and true) tseitin-cnf))
(声明常量Int)
(a)断言(和
(或
(>=t0)
(>=t1)
)
(或
(>=t2)
(=t0)

(simplify
策略只执行“局部简化”。也就是说,当简化表达式
t
时,它将忽略
t
的上下文。例如,它可以将
a+1-a
简化为
1
,但不会将
a!=0或b=a+1
简化为
a!=0或b=1
)。 上下文简化是昂贵的,简化策略意味着高效和简单。可以使用其他策略来实现您想要的

策略
传播ineqs
将传播不等式。但是,它不会处理公式中嵌套的术语。策略
拆分子句
可用于在cases\goals中打破公式。策略
传播值
将传播断言的值,例如:
a=0和b>=a
是简单的教育到
a=0和b>=0

命令
(帮助战术)
将显示所有可用战术


下面是一个将示例简化为
t>=0和t的策略谢谢,莱昂纳多,我想知道这个问题的.net api可以在.net framework 3.5中运行还是仅在4.0中运行?如果我想按如下方式处理嵌套在示例公式中的术语,我想简化(或(>=t2)(=t0)(>=t1))(或(>=t2)(这就是为什么我添加了
split子句
策略。它将子句分为两种情况。之后,
propagate ineq
可以简化ineq。不过,谢谢,我希望得到最简单的结果。例如,给出像
(t>=0或t>=1)和(t>=2或t=0)这样的约束
,但是脚本不起作用。
(声明常量t Int)(断言(和(或(>=t0)(>=t1))(或(=t2)))(应用(然后简化传播值(par then split子句propagate ineqs))
我认为
(t>=0或t>=1)和(t>=2或t=0)
的预期结果是不可能的。当然,在所有分支中
(t>=0)
,但我们有更多的信息。策略
拆分子句
将只拆分一个子句。在您最后的评论中的这个示例中,我们有两个子句。因此,我们可以使用combinator
repeat
在适用时继续应用
拆分子句
。下面是一个指向执行此操作的脚本的链接:。请注意,我们有ere
(t>=1和t
(apply (then simplify propagate-values split-clause propagate-ineqs))
(apply (then simplify propagate-values (par-then split-clause propagate-ineqs)))