我们能解决Z3中的一组约束条件吗?在所有的量词都有一个值范围的情况下,有一些变量?

我们能解决Z3中的一组约束条件吗?在所有的量词都有一个值范围的情况下,有一些变量?,z3,smt,quantifiers,first-order-logic,Z3,Smt,Quantifiers,First Order Logic,我想解决一组约束,如下所示: C1: x1 > x2 C2: y1 = x1 + t1 C3: y2 = x2 + t2 C4: 2 <= t1 <= 7 C5: 5 <= t2 <= 9 C6: x1 >= 0 C7: x2 >= 0 C8: y1 < y2 C1:x1>x2 C2:y1=x1+t1 C3:y2=x2+t2 C4:2你的问题相当含糊,因为它可以被解释为不同的意思。但我想你是想确定是否存在违反这些约束含义的值?也就是说,在您的示例

我想解决一组约束,如下所示:

C1: x1 > x2
C2: y1 = x1 + t1
C3: y2 = x2 + t2
C4: 2 <= t1 <= 7
C5: 5 <= t2 <= 9
C6: x1 >= 0
C7: x2 >= 0
C8: y1 < y2
C1:x1>x2
C2:y1=x1+t1
C3:y2=x2+t2

C4:2你的问题相当含糊,因为它可以被解释为不同的意思。但我想你是想确定是否存在违反这些约束含义的值?也就是说,在您的示例中,是否有一种方法可以选择值,使C1-C7都满足要求,而不是C8

如果是这样的话,那么通常的技巧就是从你的约束条件中找出你想要遵循的事实。然后,你断言结论是否定的。如果否定不可满足,那么您的约束对所有可能的赋值都有效。但是,如果您得到了
unsat
,则意味着没有反例,即您的约束对所有可能的赋值都有效

在你的情况下,我认为C1-C7是“给定的”,C8是你试图建立的。您只需断言所有C1-C7,但否定C8。在下面,我假设变量是整数值:

(set-logic ALL)
(set-option :produce-models true)

(declare-fun x1 () Int)
(declare-fun x2 () Int)
(declare-fun y1 () Int)
(declare-fun y2 () Int)
(declare-fun t1 () Int)
(declare-fun t2 () Int)

(assert (> x1 x2))        ; C1
(assert (= y1 (+ x1 t1))) ; C2
(assert (= y2 (+ x2 t2))) ; C3
(assert (<= 2 t1 7))      ; C4
(assert (<= 5 t2 9))      ; C5
(assert (>= x1 0))        ; C6
(assert (>= x2 0))        ; C7

(assert (not (< y1 y2)))  ; NEGATION of C8

(check-sat)
(get-value (x1 x2 t1 t2 y1 y2))
好了,给你。您的约束对于上述选择无效,因为您可以轻松地验证自己


这就是你要找的吗?

非常感谢。这在很大程度上澄清了我的问题。
sat
((x1 1)
 (x2 0)
 (t1 4)
 (t2 5)
 (y1 5)
 (y2 5))