;;;; Axioms and definitions (declare-fun len ((Array Int Int)) Int) (define-fun index ((a (Array Int Int)) (i Int)) Bool (and (<= 0 i) (< i (len a)))) ;; Declare the existence of the "append" function (declare-fun append ((Array Int Int) (Array Int Int)) (Array Int Int)) ;; Axiom 1: select from the left half of an appended array (assert (forall ((a (Array Int Int)) (b (Array Int Int)) (i Int)) (=> (index (append a b) i) (< i (len a)) (= (select (append a b) i) (select a i))))) ;; Axiom 2: select from the right half of an appended array (assert (forall ((a (Array Int Int)) (b (Array Int Int)) (i Int)) (=> (index (append a b) i) (>= i (len a)) (= (select (append a b) i) (select b (- i (len a))))))) ;; Axioms 3: length of an appended array (assert (forall ((a (Array Int Int)) (b (Array Int Int))) (= (len (append a b)) (+ (len a) (len b))))) ;; Definition of an array being sorted (define-fun sorted ((a (Array Int Int))) Bool (forall ((i Int) (j Int)) (=> (index a i) (index a j) (< i j) (< (select a i) (select a j))))) ;; Definition of two arrays being partitioned (define-fun partitioned ((a (Array Int Int)) (b (Array Int Int))) Bool (forall ((i Int) (j Int)) (=> (index a i) (index b j) (< (select a i) (select b j))))) ;;;; Actual problem ;; "left2" and "right2" are sorted arrays (declare-const left2 (Array Int Int)) (declare-const right2 (Array Int Int)) (assert (sorted left2)) (assert (sorted right2)) (assert (> (len left2) 0)) ;; "left2" is less than "right2" (assert (partitioned left2 right2)) (assert (sorted (append left2 right2))) (check-sat) (get-model)