如何从Z3中的Seq类型中提取元素作为基类型?

如何从Z3中的Seq类型中提取元素作为基类型?,z3,Z3,如何将一个序列中的元素提取到基类型中,以便执行以下操作 (define-sort ISeq () (Seq Int)) (define-const x ISeq (seq.unit 5)) (define-const y ISeq (seq.unit 6)) (assert (>= (seq.at x 0) (seq.at y 0))) 请参阅Z3问题跟踪上的相关讨论: 这似乎是一个可行的解决办法,但由于量词的原因,它不可能给你一个有效的方法。同时,像Malte建议的显式编码可能是最实用

如何将一个序列中的元素提取到基类型中,以便执行以下操作

(define-sort ISeq () (Seq Int))
(define-const x ISeq (seq.unit 5))
(define-const y ISeq (seq.unit 6))
(assert (>= (seq.at x 0) (seq.at y 0)))

请参阅Z3问题跟踪上的相关讨论:


这似乎是一个可行的解决办法,但由于量词的原因,它不可能给你一个有效的方法。同时,像Malte建议的显式编码可能是最实用的方法。

在实现合适的函数(或向我们透露其存在)之前,您可以使用以下解决方法:

(define-sort ISeq () (Seq Int))
(define-const x ISeq (seq.unit 5))
(define-const y ISeq (seq.unit 6))

(declare-const e1 Int)
(declare-const e2 Int)

(push)
  (assert (= (seq.unit e1) (seq.at x 0)))
  (assert (= (seq.unit e2) (seq.at y 0)))

  (assert (not (>= e2 e1)))
  (check-sat)
(pop)

(push) ;; or alternatively
  (assert (not
    (implies
      (and
        (= (seq.unit e1) (seq.at x 0))
        (= (seq.unit e2) (seq.at y 0)))
      (>= e2 e1))))
  (check-sat)
(pop)

您正在查找第n个。下面是一个简单的例子:

(define-sort ISeq () (Seq Int))
(declare-const x ISeq)
(declare-const y ISeq)
(assert (= (seq.len x) 4))
(assert (= (seq.len y) 3))
(assert (< (seq.nth x 3) (seq.nth y 1)))
(check-sat)
(get-value (x y))
sat
((x (seq.++ (seq.unit 6)
        (seq.++ (seq.unit 7) (seq.++ (seq.unit 8) (seq.unit 1236)))))
 (y (seq.++ (seq.unit 9) (seq.++ (seq.unit 1237) (seq.unit 12)))))