如何消除;不是";在表达式中使用z3?

如何消除;不是";在表达式中使用z3?,z3,Z3,我尝试使用代码删除表达式中的not: (declare-const t Int) (assert (and (or (>= t 2) (>= t 1)) (not (= t 1)))) (apply ctx-solver-simplify) 我想得到如下结果:t>=2 然而,结果是: (goals (goal (>= t 1) (not (= t 1)) :precision precise :depth 1) ) 有人能帮我怎么做吗?策略simplify有

我尝试使用代码删除表达式中的not:

(declare-const t Int)

(assert (and (or (>= t 2) (>= t 1)) (not (= t 1))))

(apply ctx-solver-simplify)
我想得到如下结果:t>=2 然而,结果是:

(goals
(goal
  (>= t 1)
  (not (= t 1))
  :precision precise :depth 1)
)

有人能帮我怎么做吗?

策略
simplify
有一个选项
:eq2ineq
。启用时,它会将等式
t1=t2
转换为
t1=t2
。应用此策略后,策略
传播INEQ
将更加有效

下面是一个实现此技巧的脚本:


请注意,这不是一般的解决方案。没有一种内置策略能完全满足您的需要。

是的,这不是一个通用的解决方案,我尝试了另一个例子,它不起作用。也就是说,一般来说,我们不能从表达式中删除“not”?我以为您的目标是得到一个更简单/更小的表达式。原则上,对于算术,可以通过应用诸如:
not t t>s
not t=s-->(ts)
之类的转换来消除所有
not
-表达式。然而,这不适用于其他理论。例如,当
t
s
是数组时,我们无法消除
not
中的
not
。当然,我假设表达式
distinct(t,s)
只是“伪装”中的
而不是t=s
。顺便说一句,消除算术公式中所有的
-表达式的策略对你有用吗?有一种情况不起作用,这是脚本:对不起,这个策略没有消除所有的非表达式,这是脚本,表达式中仍然没有,谢谢你的帮助