From d5c49f4fe47fa682c22f35bbb3d7d654d7cdc23f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Bobot?= <francois.bobot@cea.fr>
Date: Tue, 12 Oct 2021 18:58:44 +0200
Subject: [PATCH] [Quantifier] Fix useless application criteria

  The consequence was missing congruence closure
---
 src_colibri2/core/egraph.ml                   |   4 +-
 src_colibri2/core/ground.ml                   |  10 +-
 src_colibri2/tests/solve/all/unsat/dune.inc   |   3 +
 .../all/unsat/lost_in_search_union.psmt2      |   2 +-
 .../solve/all/unsat/ordered_is_ordered.psmt2  |   2 +-
 .../all/unsat/union-Union-interqtvc_5.psmt2   | 740 ++++++++++++++++++
 src_colibri2/theories/quantifier/info.ml      |   2 -
 .../theories/quantifier/quantifier.ml         |  32 +-
 src_common/union.mlw                          |   8 +-
 src_common/union/why3session.xml              | 261 +++---
 10 files changed, 861 insertions(+), 203 deletions(-)
 create mode 100644 src_colibri2/tests/solve/all/unsat/union-Union-interqtvc_5.psmt2

diff --git a/src_colibri2/core/egraph.ml b/src_colibri2/core/egraph.ml
index 7f32eb133..6b62164f9 100644
--- a/src_colibri2/core/egraph.ml
+++ b/src_colibri2/core/egraph.ml
@@ -542,9 +542,9 @@ module Delayed = struct
       if Debug.test_flag debug_few then begin
         match Only_for_solver.thterm node with
         | None ->
-          Debug.dprintf2 debug "[Egraph] @[register %a@]" Node.pp node
+          Debug.dprintf2 debug_few "[Egraph] @[register %a@]" Node.pp node
         | Some thterm ->
-          Debug.dprintf4 debug "[Egraph] @[register %a: %a@]"
+          Debug.dprintf4 debug_few "[Egraph] @[register %a: %a@]"
             Node.pp node ThTerm.pp thterm
       end;
       (* assert ( check_no_dom t node ); *)
diff --git a/src_colibri2/core/ground.ml b/src_colibri2/core/ground.ml
index f64774bdf..0207576f9 100644
--- a/src_colibri2/core/ground.ml
+++ b/src_colibri2/core/ground.ml
@@ -487,7 +487,10 @@ module Defs = struct
   let levels = ThTermH.create Popop_stdlib.DInt.pp "ground_levels"
 
   (** Maximum level of unfolding *)
-  let level_max = 10
+  let level_max = 15
+
+  (** Maximum level of delayed decisions *)
+  let level_dec_delayed = 5
 
   (** Maximum level where the terms can be directly decided *)
   let level_dec = 0
@@ -545,8 +548,9 @@ module Defs = struct
                         group)
                   fundef.body
               in
-              Demon.Simple.LastEffort.schedule_immediately d (fun d ->
-                  Choice_group.activate d group);
+              if level_dec < level && level <= level_dec_delayed then
+                Demon.Simple.LastEffort.schedule_immediately d (fun d ->
+                    Choice_group.activate d group);
               Debug.incr stats_function_call;
               Egraph.register d n;
               Egraph.merge d cl n)
diff --git a/src_colibri2/tests/solve/all/unsat/dune.inc b/src_colibri2/tests/solve/all/unsat/dune.inc
index 54cb6af43..15fa7cb3c 100644
--- a/src_colibri2/tests/solve/all/unsat/dune.inc
+++ b/src_colibri2/tests/solve/all/unsat/dune.inc
@@ -23,6 +23,9 @@
 --dont-print-result %{dep:ordered_is_ordered.psmt2})))
 (rule (alias runtest-learning) (action (run %{bin:colibri2} --size=100M --time=30s --max-steps 3500 --check-status unsat --learning --dont-print-result %{dep:ordered_is_ordered.psmt2})))
 (rule (alias runtest) (action (run %{bin:colibri2} --size=100M --time=30s --max-steps 3500 --check-status unsat 
+--dont-print-result %{dep:union-Union-interqtvc_5.psmt2})))
+(rule (alias runtest-learning) (action (run %{bin:colibri2} --size=100M --time=30s --max-steps 3500 --check-status unsat --learning --dont-print-result %{dep:union-Union-interqtvc_5.psmt2})))
+(rule (alias runtest) (action (run %{bin:colibri2} --size=100M --time=30s --max-steps 3500 --check-status unsat 
 --dont-print-result %{dep:union-Union-is_singletonqtvc_1.psmt2})))
 (rule (alias runtest-learning) (action (run %{bin:colibri2} --size=100M --time=30s --max-steps 3500 --check-status unsat --learning --dont-print-result %{dep:union-Union-is_singletonqtvc_1.psmt2})))
 (rule (alias runtest) (action (run %{bin:colibri2} --size=100M --time=30s --max-steps 3500 --check-status unsat 
diff --git a/src_colibri2/tests/solve/all/unsat/lost_in_search_union.psmt2 b/src_colibri2/tests/solve/all/unsat/lost_in_search_union.psmt2
index 618aeb15c..3d403ebe2 100644
--- a/src_colibri2/tests/solve/all/unsat/lost_in_search_union.psmt2
+++ b/src_colibri2/tests/solve/all/unsat/lost_in_search_union.psmt2
@@ -3,7 +3,7 @@
 (set-info :smt-lib-version 2.6)
 ;;; SMT-LIB2: integer arithmetic
 ;;; SMT-LIB2: real arithmetic
-(set-option :max-steps-colibri2 41000)
+(set-option :max-steps-colibri2 30000)
 (declare-sort t 0)
 
 ;; real
diff --git a/src_colibri2/tests/solve/all/unsat/ordered_is_ordered.psmt2 b/src_colibri2/tests/solve/all/unsat/ordered_is_ordered.psmt2
index d3c911337..16c96a949 100644
--- a/src_colibri2/tests/solve/all/unsat/ordered_is_ordered.psmt2
+++ b/src_colibri2/tests/solve/all/unsat/ordered_is_ordered.psmt2
@@ -1,7 +1,7 @@
 ;; produced by local colibri2.drv ;;
 (set-logic ALL)
 (set-info :smt-lib-version 2.6)
-(set-option :max-steps-colibri2 14000)
+(set-option :max-steps-colibri2 10000)
 
 (declare-datatypes ((tuple2 2))
   ((par (a1 a2) ((Tuple2 (Tuple2_proj_1 a1)(Tuple2_proj_2 a2))))))
diff --git a/src_colibri2/tests/solve/all/unsat/union-Union-interqtvc_5.psmt2 b/src_colibri2/tests/solve/all/unsat/union-Union-interqtvc_5.psmt2
new file mode 100644
index 000000000..3f2bc9b89
--- /dev/null
+++ b/src_colibri2/tests/solve/all/unsat/union-Union-interqtvc_5.psmt2
@@ -0,0 +1,740 @@
+;; produced by local colibri2.drv ;;
+(set-logic ALL)
+(set-info :smt-lib-version 2.6)
+;;; SMT-LIB2: integer arithmetic
+;;; SMT-LIB2: real arithmetic
+(declare-sort string 0)
+
+(declare-datatypes ((tuple0 0))
+  (((Tuple0))))
+
+(declare-datatypes ((option 1))
+  ((par (a) ((None) (Some (Some_proj_1 a))))))
+
+;; is_none
+(define-fun is_none (par (a)
+  ((o (option a))) Bool
+  (ite ((_ is None) o) true false)))
+
+;; is_none'spec
+(assert (par (a)
+  (forall ((o (option a))) (= (is_none o) (= o (as None (option a)))))))
+
+;; add_div
+(assert
+  (forall ((x Real) (y Real) (z Real))
+    (=> (not (= z 0.0)) (= (/ (+ x y) z) (+ (/ x z) (/ y z))))))
+
+;; sub_div
+(assert
+  (forall ((x Real) (y Real) (z Real))
+    (=> (not (= z 0.0)) (= (/ (- x y) z) (- (/ x z) (/ y z))))))
+
+;; neg_div
+(assert
+  (forall ((x Real) (y Real))
+    (=> (not (= y 0.0)) (= (/ (- x) y) (- (/ x y))))))
+
+;; assoc_mul_div
+(assert
+  (forall ((x Real) (y Real) (z Real))
+    (=> (not (= z 0.0)) (= (/ (* x y) z) (* x (/ y z))))))
+
+;; assoc_div_mul
+(assert
+  (forall ((x Real) (y Real) (z Real))
+    (=>
+      (and (not (= y 0.0)) (not (= z 0.0)))
+      (= (/ (/ x y) z) (/ x (* y z))))))
+
+;; assoc_div_div
+(assert
+  (forall ((x Real) (y Real) (z Real))
+    (=>
+      (and (not (= y 0.0)) (not (= z 0.0)))
+      (= (/ x (/ y z)) (/ (* x z) y)))))
+
+;; Zero
+(assert (= (to_real 0) 0.0))
+
+;; One
+(assert (= (to_real 1) 1.0))
+
+;; Add
+(assert
+  (forall ((x Int) (y Int))
+    (= (to_real (+ x y)) (+ (to_real x) (to_real y)))))
+
+;; Sub
+(assert
+  (forall ((x Int) (y Int))
+    (= (to_real (- x y)) (- (to_real x) (to_real y)))))
+
+;; Mul
+(assert
+  (forall ((x Int) (y Int))
+    (= (to_real (* x y)) (* (to_real x) (to_real y)))))
+
+;; Neg
+(assert (forall ((x Int)) (= (to_real (- x)) (- (to_real x)))))
+
+;; Injective
+(assert (forall ((x Int) (y Int)) (=> (= (to_real x) (to_real y)) (= x y))))
+
+;; Monotonic
+(assert
+  (forall ((x Int) (y Int)) (=> (<= x y) (<= (to_real x) (to_real y)))))
+
+;; ddivisible_using
+(define-fun ddivisible_using ((a1 Int) (b Int) (c Int)) Bool
+  (= a1 (* c b)))
+
+;; ddivisible
+(define-fun ddivisible ((a1 Int) (b Int)) Bool
+  (exists ((d Int)) (ddivisible_using a1 b d)))
+
+(declare-datatypes ((tuple2 2))
+  ((par (a1 a2) ((Tuple2 (Tuple2_proj_1 a1)(Tuple2_proj_2 a2))))))
+
+;; gcd
+(declare-fun gcd (Int
+  Int) Int)
+
+(declare-datatypes ((tuple3 3))
+  ((par (a3 a4
+   a5) ((Tuple3 (Tuple3_proj_1 a3)(Tuple3_proj_2 a4)(Tuple3_proj_3 a5))))))
+
+;; lcm
+(declare-fun lcm (Int
+  Int) Int)
+
+(declare-sort infix_mngt 2)
+
+;; infix @
+(declare-fun infix_at (par (a6
+  b)
+  ((infix_mngt a6
+  b)
+  a6) b))
+
+(declare-datatypes ((tuple4 4))
+  ((par (a7 a8 a9
+   a10) ((Tuple4
+         (Tuple4_proj_1 a7)(Tuple4_proj_2 a8)(Tuple4_proj_3 a9)(Tuple4_proj_4 a10))))))
+
+;; prime_to_one_another
+(declare-fun prime_to_one_another (Int
+  Int) Bool)
+
+;; prime_to_one_another_refl
+(assert (forall ((a11 Int)) (prime_to_one_another a11 a11)))
+
+;; GCD1
+(assert
+  (forall ((a11 Int) (b1 Int) (c Int))
+    (=> (prime_to_one_another a11 b1) (prime_to_one_another (gcd a11 c) b1))))
+
+;; GCD2
+(assert
+  (forall ((a11 Int) (b1 Int) (c Int))
+    (=> (prime_to_one_another a11 b1) (prime_to_one_another a11 (gcd b1 c)))))
+
+;; GCD3
+(assert
+  (forall ((a11 Int) (b1 Int) (c Int))
+    (=>
+      (prime_to_one_another a11 b1)
+      (=> (prime_to_one_another a11 c) (prime_to_one_another a11 (lcm b1 c))))))
+
+;; GCD4
+(assert
+  (forall ((a11 Int) (b1 Int) (c Int))
+    (=>
+      (prime_to_one_another a11 b1)
+      (=> (prime_to_one_another c b1) (prime_to_one_another (lcm a11 c) b1)))))
+
+;; GCD_comm
+(assert (forall ((a11 Int) (b1 Int)) (= (gcd a11 b1) (gcd b1 a11))))
+
+(declare-sort t 0)
+
+;; num
+(declare-fun num (t) Int)
+
+;; den
+(declare-fun den (t) Int)
+
+;; t'invariant
+(assert
+  (forall ((self t))
+    (! (and (< 0 (den self)) (prime_to_one_another (num self) (den self))) :pattern (
+    (den
+      self)) :pattern ((num self)) )))
+
+;; real
+(define-fun real ((q t)) Real
+  (/ (to_real (num q)) (to_real (den q))))
+
+;; equal
+(define-fun equal ((a11 t) (b1 t)) Bool
+  (= (real a11) (real b1)))
+
+;; equal_is_eq
+(assert (forall ((a11 t) (b1 t)) (=> (equal a11 b1) (= a11 b1))))
+
+;; infix <=
+(define-fun infix_lseq ((a11 t) (b1 t)) Bool
+  (<= (real a11) (real b1)))
+
+;; infix <
+(define-fun infix_ls ((a11 t) (b1 t)) Bool
+  (< (real a11) (real b1)))
+
+;; abs
+(define-fun abs1 ((x Real)) Real
+  (ite (>= x 0.0) x (- x)))
+
+;; Abs_le
+(assert
+  (forall ((x Real) (y Real))
+    (= (<= (abs1 x) y) (and (<= (- y) x) (<= x y)))))
+
+;; Abs_pos
+(assert (forall ((x Real)) (>= (abs1 x) 0.0)))
+
+;; Abs_sum
+(assert
+  (forall ((x Real) (y Real)) (<= (abs1 (+ x y)) (+ (abs1 x) (abs1 y)))))
+
+;; Abs_prod
+(assert
+  (forall ((x Real) (y Real)) (= (abs1 (* x y)) (* (abs1 x) (abs1 y)))))
+
+;; triangular_inequality
+(assert
+  (forall ((x Real) (y Real) (z Real))
+    (<= (abs1 (- x z)) (+ (abs1 (- x y)) (abs1 (- y z))))))
+
+(declare-datatypes ((t1 0))
+  (((Eq) (Lt) (Gt))))
+
+;; infix +
+(declare-fun infix_pl (t
+  t) t)
+
+;; infix +'spec
+(assert
+  (forall ((a11 t) (b1 t))
+    (= (+ (real a11) (real b1)) (real (infix_pl a11 b1)))))
+
+;; infix -
+(declare-fun infix_mn (t
+  t) t)
+
+;; infix -'spec
+(assert
+  (forall ((a11 t) (b1 t))
+    (= (- (real a11) (real b1)) (real (infix_mn a11 b1)))))
+
+;; infix *
+(declare-fun infix_as (t
+  t) t)
+
+;; infix *'spec
+(assert
+  (forall ((a11 t) (b1 t))
+    (= (* (real a11) (real b1)) (real (infix_as a11 b1)))))
+
+;; infix /
+(declare-fun infix_sl (t
+  t) t)
+
+;; infix /'spec
+(assert
+  (forall ((a11 t) (b1 t))
+    (=>
+      (not (= (real b1) 0.0))
+      (= (/ (real a11) (real b1)) (real (infix_sl a11 b1))))))
+
+;; make
+(declare-fun make (Int
+  Int) t)
+
+;; make_def
+(assert
+  (forall ((num1 Int) (den1 Int))
+    (=>
+      (not (= den1 0))
+      (= (real (make num1 den1)) (/ (to_real num1) (to_real den1))))))
+
+;; truncate
+(declare-fun truncate (Real) Int)
+
+;; Truncate_int
+(assert (forall ((i Int)) (= (truncate (to_real i)) i)))
+
+;; Truncate_down_pos
+(assert
+  (forall ((x Real))
+    (=>
+      (>= x 0.0)
+      (and (<= (to_real (truncate x)) x) (< x (to_real (+ (truncate x) 1)))))))
+
+;; Truncate_up_neg
+(assert
+  (forall ((x Real))
+    (=>
+      (<= x 0.0)
+      (and (< (to_real (- (truncate x) 1)) x) (<= x (to_real (truncate x)))))))
+
+;; Real_of_truncate
+(assert
+  (forall ((x Real))
+    (and
+      (<= (- x 1.0) (to_real (truncate x)))
+      (<= (to_real (truncate x)) (+ x 1.0)))))
+
+;; Truncate_monotonic
+(assert
+  (forall ((x Real) (y Real)) (=> (<= x y) (<= (truncate x) (truncate y)))))
+
+;; Truncate_monotonic_int1
+(assert
+  (forall ((x Real) (i Int)) (=> (<= x (to_real i)) (<= (truncate x) i))))
+
+;; Truncate_monotonic_int2
+(assert
+  (forall ((x Real) (i Int)) (=> (<= (to_real i) x) (<= i (truncate x)))))
+
+;; Floor_int
+(assert (forall ((i Int)) (= (to_int (to_real i)) i)))
+
+;; Ceil_int
+(assert (forall ((i Int)) (= (- (to_int (- (to_real i)))) i)))
+
+;; Floor_down
+(assert
+  (forall ((x Real))
+    (and (<= (to_real (to_int x)) x) (< x (to_real (+ (to_int x) 1))))))
+
+;; Ceil_up
+(assert
+  (forall ((x Real))
+    (and
+      (< (to_real (- (- (to_int (- x))) 1)) x)
+      (<= x (to_real (- (to_int (- x))))))))
+
+;; Floor_monotonic
+(assert
+  (forall ((x Real) (y Real)) (=> (<= x y) (<= (to_int x) (to_int y)))))
+
+;; Ceil_monotonic
+(assert
+  (forall ((x Real) (y Real))
+    (=> (<= x y) (<= (- (to_int (- x))) (- (to_int (- y)))))))
+
+(declare-datatypes ((t2 0))
+  (((Strict) (Large))))
+
+(declare-datatypes ((t0 0))
+  (((Singleton (Singleton_proj_1 t)(Singleton_proj_2 t0))
+   (Inter
+   (Inter_proj_1 t)(Inter_proj_2 t2)(Inter_proj_3 t)(Inter_proj_4 t2)(Inter_proj_5 t0))
+   (FiniteInf (FiniteInf_proj_1 t)(FiniteInf_proj_2 t2)) (End))))
+
+(declare-datatypes ((t3 0))
+  (((InfFinite
+    (InfFinite_proj_1 t)(InfFinite_proj_2 t2)(InfFinite_proj_3 t0))
+   (Finite (Finite_proj_1 t0)) (Inf))))
+
+;; length0
+(define-fun-rec length0 ((l t0)) Int
+  (ite ((_ is Singleton) l) (let (
+                              (x (Singleton_proj_2 l))) (+ (length0 x) 1)) 
+    (ite ((_ is Inter) l) (let (
+                            
+                            
+                            
+                            (x1 (Inter_proj_5 l))) (+ (length0 x1) 2)) 
+      (ite ((_ is FiniteInf) l) 1 0))))
+
+;; length0_positive
+(assert (forall ((l t0)) (>= (length0 l) 0)))
+
+;; nth0
+(define-fun-rec nth0 ((i Int) (l t0)) t
+  (ite ((_ is Singleton) l) (let ((x2 (Singleton_proj_1 l))
+                              (x3 (Singleton_proj_2 l))) (ite (= i 0)
+                                                           x2
+                                                           (nth0 (- i 1) x3))) 
+    (ite ((_ is Inter) l) (let ((x4 (Inter_proj_1 l))
+                            
+                            (x5 (Inter_proj_3 l))
+                            
+                            (x6 (Inter_proj_5 l))) (ite (= i 0)
+                                                     x4
+                                                     (ite (= i 1)
+                                                       x5
+                                                       (nth0 (- i 2) x6)))) 
+      (ite ((_ is FiniteInf) l) (let ((x7 (FiniteInf_proj_1 l))
+                                  ) (ite (= i 0) x7 (make 0 1))) (make 0 1)))))
+
+;; nth0_rewritted
+(assert
+  (forall ((i Int) (l t0))
+    (ite ((_ is Singleton) l) (let (
+                                (x8 (Singleton_proj_2 l))) (=>
+                                                             (not
+                                                               (= i (- 1)))
+                                                             (= (nth0
+                                                                  (+ i 1)
+                                                                  l) 
+                                                             (nth0
+                                                               i
+                                                               x8)))) 
+      (ite ((_ is Inter) l) (let (
+                              
+                              
+                              
+                              (x9 (Inter_proj_5 l))) (=>
+                                                       (not (= i (- 2)))
+                                                       (=>
+                                                         (not (= i (- 1)))
+                                                         (= (nth0 (+ i 2) l) 
+                                                         (nth0
+                                                           i
+                                                           x9))))) (ite ((_ is FiniteInf) l) true true)))))
+
+;; nth0_singleton
+(assert
+  (forall ((i Int) (q t) (l t0))
+    (ite (= i 0)
+      (= (nth0 i (Singleton q l)) q)
+      (= (nth0 i (Singleton q l)) (nth0 (- i 1) l)))))
+
+;; length
+(define-fun length ((l t3)) Int
+  (ite ((_ is InfFinite) l) (let (
+                              
+                              (x10 (InfFinite_proj_3 l))) (+ (length0 x10) 1)) 
+    (ite ((_ is Finite) l) (let ((x11 (Finite_proj_1 l))) (length0 x11)) 0)))
+
+;; nth
+(define-fun nth ((i Int) (l t3)) t
+  (ite ((_ is InfFinite) l) (let ((x12 (InfFinite_proj_1 l))
+                              
+                              (x13 (InfFinite_proj_3 l))) (ite (= i 0)
+                                                            x12
+                                                            (nth0
+                                                              (- i 1)
+                                                              x13))) 
+    (ite ((_ is Finite) l) (let ((x14 (Finite_proj_1 l))) (nth0 i x14)) 
+      (make
+        0
+        1))))
+
+;; lt_bound0
+(define-fun-rec lt_bound0 ((x15 t) (l t0)) Bool
+  (ite ((_ is Singleton) l) (let ((x16 (Singleton_proj_1 l))
+                              (x17 (Singleton_proj_2 l))) (and
+                                                            (< (real x15) 
+                                                            (real
+                                                              x16))
+                                                            (lt_bound0
+                                                              x15
+                                                              x17))) 
+    (ite ((_ is Inter) l) (let ((x18 (Inter_proj_1 l))
+                            
+                            (x19 (Inter_proj_3 l))
+                            
+                            (x20 (Inter_proj_5 l))) (and
+                                                      (< (real x15) (real
+                                                                    x18))
+                                                      (and
+                                                        (< (real x15) 
+                                                        (real
+                                                          x19))
+                                                        (lt_bound0 x15 x20)))) 
+      (ite ((_ is FiniteInf) l) (let ((x21 (FiniteInf_proj_1 l))
+                                  ) (< (real x15) (real x21))) true))))
+
+;; lt_bound
+(define-fun lt_bound ((x22 t) (l t3)) Bool
+  (ite ((_ is InfFinite) l) (let ((x23 (InfFinite_proj_1 l))
+                              
+                              (x24 (InfFinite_proj_3 l))) (or
+                                                            (< (real x22) 
+                                                            (real
+                                                              x23))
+                                                            (lt_bound0
+                                                              x22
+                                                              x24))) 
+    (ite ((_ is Finite) l) (let ((x25 (Finite_proj_1 l))) (lt_bound0 x22 x25)) true)))
+
+;; ordered0
+(define-fun-rec ordered0 ((l t0)) Bool
+  (ite ((_ is Singleton) l) (let ((x26 (Singleton_proj_1 l))
+                              (x27 (Singleton_proj_2 l))) (and
+                                                            (lt_bound0
+                                                              x26
+                                                              x27)
+                                                            (ordered0 x27))) 
+    (ite ((_ is Inter) l) (let ((x28 (Inter_proj_1 l))
+                            
+                            (x29 (Inter_proj_3 l))
+                            
+                            (x30 (Inter_proj_5 l))) (and
+                                                      (infix_ls x28 x29)
+                                                      (and
+                                                        (lt_bound0 x29 x30)
+                                                        (ordered0 x30)))) 
+      (ite ((_ is FiniteInf) l) true true))))
+
+;; ordered
+(define-fun ordered ((l t3)) Bool
+  (ite ((_ is InfFinite) l) (let ((x31 (InfFinite_proj_1 l))
+                              
+                              (x32 (InfFinite_proj_3 l))) (and
+                                                            (lt_bound0
+                                                              x31
+                                                              x32)
+                                                            (ordered0 x32))) 
+    (ite ((_ is Finite) l) (let ((x33 (Finite_proj_1 l))) (ordered0 x33)) true)))
+
+(declare-datatypes ((tuple1 1))
+  ((par (a11) ((Tuple1 (Tuple1_proj_1 a11))))))
+
+(declare-sort tqt 0)
+
+;; a
+(declare-fun a12 (tqt) t3)
+
+;; t''invariant
+(assert
+  (forall ((self tqt))
+    (! (and (ordered (a12 self)) (not (= (a12 self) (Finite End)))) :pattern (
+    (a12
+      self)) )))
+
+;; cmp
+(define-fun cmp ((x34 Real) (b1 t2) (y Real)) Bool
+  (ite ((_ is Large) b1) (<= x34 y) (< x34 y)))
+
+;; mem0
+(define-fun-rec mem0 ((x34 Real) (l t0)) Bool
+  (ite ((_ is Singleton) l) (let ((x35 (Singleton_proj_1 l))
+                              (x36 (Singleton_proj_2 l))) (or
+                                                            (= x34 (real x35))
+                                                            (mem0 x34 x36))) 
+    (ite ((_ is Inter) l) (let ((x37 (Inter_proj_1 l))
+                            (x38 (Inter_proj_2 l))
+                            (x39 (Inter_proj_3 l))
+                            (x40 (Inter_proj_4 l))
+                            (x41 (Inter_proj_5 l))) (or
+                                                      (and
+                                                        (cmp
+                                                          (real x37)
+                                                          x38
+                                                          x34)
+                                                        (cmp
+                                                          x34
+                                                          x40
+                                                          (real x39)))
+                                                      (mem0 x34 x41))) 
+      (ite ((_ is FiniteInf) l) (let ((x42 (FiniteInf_proj_1 l))
+                                  (x43 (FiniteInf_proj_2 l))) (cmp
+                                                                (real x42)
+                                                                x43
+                                                                x34)) false))))
+
+;; lt_bound0_is_not_mem0
+(assert
+  (forall ((q t) (r Real) (l t0))
+    (=> (lt_bound0 q l) (=> (<= r (real q)) (not (mem0 r l))))))
+
+;; mem
+(define-fun mem ((x44 Real) (l t3)) Bool
+  (ite ((_ is InfFinite) l) (let ((x45 (InfFinite_proj_1 l))
+                              (x46 (InfFinite_proj_2 l))
+                              (x47 (InfFinite_proj_3 l))) (or
+                                                            (cmp
+                                                              x44
+                                                              x46
+                                                              (real x45))
+                                                            (mem0 x44 x47))) 
+    (ite ((_ is Finite) l) (let ((x48 (Finite_proj_1 l))) (mem0 x44 x48)) true)))
+
+;; u
+(declare-fun u () tqt)
+
+;; v
+(declare-fun v () tqt)
+
+;; u
+(declare-fun u1 () t0)
+
+;; v
+(declare-fun v1 () t0)
+
+;; Requires
+(assert (ordered0 u1))
+
+;; Requires
+(assert (ordered0 v1))
+
+;; x
+(declare-fun x49 () t)
+
+;; x
+(declare-fun x50 () t2)
+
+;; x
+(declare-fun x51 () t)
+
+;; x
+(declare-fun x52 () t2)
+
+;; x
+(declare-fun x53 () t0)
+
+;; H
+(assert (= v1 (Inter x49 x50 x51 x52 x53)))
+
+;; x
+(declare-fun x54 () t)
+
+;; x
+(declare-fun x55 () t2)
+
+;; x
+(declare-fun x56 () t)
+
+;; x
+(declare-fun x57 () t2)
+
+;; x
+(declare-fun x58 () t0)
+
+;; H
+(assert (= u1 (Inter x54 x55 x56 x57 x58)))
+
+;; qu0
+(declare-fun qu0 () t)
+
+;; bu0
+(declare-fun bu0 () t2)
+
+;; qu1
+(declare-fun qu1 () t)
+
+;; bu1
+(declare-fun bu1 () t2)
+
+;; lu
+(declare-fun lu () t0)
+
+;; u
+(declare-fun u2 () t0)
+
+;; qv0
+(declare-fun qv0 () t)
+
+;; bv0
+(declare-fun bv0 () t2)
+
+;; qv1
+(declare-fun qv1 () t)
+
+;; v
+(declare-fun v2 () t0)
+
+;; Requires
+(assert (ordered0 u2))
+
+;; Requires
+(assert (ordered0 v2))
+
+;; Requires
+(assert (= u2 (Inter qu0 bu0 qu1 bu1 lu)))
+
+;; bv1
+(declare-fun bv1 () t2)
+
+;; lv
+(declare-fun lv () t0)
+
+;; Requires
+(assert (= v2 (Inter qv0 bv0 qv1 bv1 lv)))
+
+;; Requires
+(assert
+  (or
+    (and (= v2 v1) (= (+ (length0 lu) 2) (length0 u1)))
+    (and (= v2 u1) (= (+ (length0 lu) 2) (length0 v1)))))
+
+;; Requires
+(assert (infix_ls qu1 qv1))
+
+;; result
+(declare-fun result () t0)
+
+;; Ensures
+(assert (equal qu1 qv0))
+
+;; o
+(declare-fun o () t0)
+
+;; v3
+(declare-fun v3 () t)
+
+;; b3
+(declare-fun b3 () t2)
+
+;; o
+(declare-fun o1 () t0)
+
+;; H
+(assert (= bv0 Large))
+
+;; H
+(assert (= bu1 Large))
+
+;; Ensures
+(assert (ordered0 o))
+
+;; Ensures
+(assert
+  (forall ((x59 Real)) (= (and (mem0 x59 lu) (mem0 x59 v2)) (mem0 x59 o))))
+
+;; Ensures
+(assert (forall ((q t)) (=> (lt_bound0 q lu) (lt_bound0 q o))))
+
+;; Ensures
+(assert (forall ((q t)) (=> (lt_bound0 q v2) (lt_bound0 q o))))
+
+;; H
+(assert (= result (Singleton qu1 o)))
+
+;; Ensures
+(assert (ordered0 result))
+
+;; Ensures
+(assert
+  (forall ((x59 Real))
+    (= (and (mem0 x59 u2) (mem0 x59 v2)) (mem0 x59 result))))
+
+;; q
+(declare-fun q () t)
+
+;; H
+(assert (lt_bound0 q u2))
+
+;; Hinst
+(assert (=> (lt_bound0 q lu) (lt_bound0 q o)))
+
+;; Goal inter'vc
+;; File "/home/bobot/Sources/colibrics/src_common/union.mlw", line 286, characters 8-13
+(assert
+  (not (lt_bound0 q result)))
+
+(check-sat)
diff --git a/src_colibri2/theories/quantifier/info.ml b/src_colibri2/theories/quantifier/info.ml
index 53755873b..a418ece20 100644
--- a/src_colibri2/theories/quantifier/info.ml
+++ b/src_colibri2/theories/quantifier/info.ml
@@ -29,8 +29,6 @@ type t = {
 
 let _ = pp
 
-(* let pp fmt _ = Fmt.pf fmt "Info" *)
-
 (** because it is currently not hidden and too long *)
 let pp = Fmt.nop
 
diff --git a/src_colibri2/theories/quantifier/quantifier.ml b/src_colibri2/theories/quantifier/quantifier.ml
index f61622228..ce157326d 100644
--- a/src_colibri2/theories/quantifier/quantifier.ml
+++ b/src_colibri2/theories/quantifier/quantifier.ml
@@ -250,23 +250,18 @@ let quantifier_registered d th =
 let application_useless d thg =
   let g = Ground.sem thg in
   let n = Ground.node thg in
-  if IArray.is_empty g.args then false (* No argument no congruence closure *)
-  else
-    let find_app pos n =
-      Opt.get_def Ground.S.empty
-      @@
-      let open CCOpt in
-      let* info = Egraph.get_dom d Info.dom (Egraph.find_def d n) in
-      F_Pos.M.find_opt { f = g.app; pos } info.parents
-    in
-    let check_arg pos arg =
-      Ground.S.exists
-        (fun arg ->
-          Egraph.is_equal d n (Ground.node arg)
-          && List.for_all2 Ground.Ty.equal (Ground.sem arg).tyargs g.tyargs)
-        (find_app pos arg)
-    in
-    IArray.for_alli ~f:check_arg g.args
+  let apps =
+    Opt.get_def Ground.S.empty
+    @@
+    let open CCOpt in
+    let* info = Egraph.get_dom d Info.dom (Egraph.find_def d n) in
+    F.M.find_opt g.app info.apps
+  in
+  Ground.S.exists
+    (fun g' ->
+      List.for_all2 Ground.Ty.equal (Ground.sem g').tyargs g.tyargs
+      && IArray.for_all2_exn ~f:(Egraph.is_equal d) (Ground.sem g').args g.args)
+    apps
 
 let add_info_on_ground_terms d thg =
   Debug.dprintf2 debug_full "[Quant] add_info_on_ground_terms %a" Ground.pp thg;
@@ -303,7 +298,8 @@ let th_register d =
   (* let delay = Events.Delayed_by 10 in *)
   Daemon.attach_reg_sem d Ground.ClosedQuantifier.key quantifier_registered;
   Ground.register_converter d (fun d g ->
-      if not (application_useless d g) then add_info_on_ground_terms d g);
+      if not (application_useless d g) then add_info_on_ground_terms d g
+      else Debug.dprintf2 debug "[Info] %a is redundant" Ground.pp g);
   Interp.Register.check_closed_quantifier d (fun d g ->
       let n = Ground.ClosedQuantifier.node g in
       let unknown =
diff --git a/src_common/union.mlw b/src_common/union.mlw
index fd6ed106c..4c8645ea4 100644
--- a/src_common/union.mlw
+++ b/src_common/union.mlw
@@ -104,18 +104,18 @@ module Union
   predicate lt_bound0 (x:Q.t) (l:t0) =
      match l with
      | Singleton q l ->
-       Q.(x < q) /\ lt_bound0 x l
+       x <. q /\ lt_bound0 x l
      | Inter q _ q' _ l ->
-       Q.(x < q) /\ Q.(x < q') /\ lt_bound0 x l
+       x <. q /\ x <. q' /\ lt_bound0 x l
      | FiniteInf q _ ->
-        Q.(x < q)
+        x <. q
      | End -> true
      end
 
   predicate lt_bound (x:Q.t) (l:t) =
      match l with
      | InfFinite q _ l ->
-       Q.(x < q) \/ lt_bound0 x l
+       x <. q \/ lt_bound0 x l
      | Finite l ->
        lt_bound0 x l
      | Inf ->
diff --git a/src_common/union/why3session.xml b/src_common/union/why3session.xml
index fda794dfa..ed77a419a 100644
--- a/src_common/union/why3session.xml
+++ b/src_common/union/why3session.xml
@@ -26,7 +26,7 @@
  </transf>
  </goal>
  <goal name="lt_bound0_is_not_mem0&#39;vc" expl="VC for lt_bound0_is_not_mem0" proved="true">
- <proof prover="3"><result status="valid" time="0.02"/></proof>
+ <proof prover="3"><result status="valid" time="0.29"/></proof>
  </goal>
  <goal name="singleton&#39;vc" expl="VC for singleton" proved="true">
  <proof prover="3"><result status="valid" time="0.01"/></proof>
@@ -37,7 +37,7 @@
   <proof prover="3"><result status="valid" time="0.00"/></proof>
   </goal>
   <goal name="is_singleton&#39;vc.1" expl="postcondition" proved="true">
-  <proof prover="3"><result status="valid" time="0.40"/></proof>
+  <proof prover="3"><result status="valid" time="3.18"/></proof>
   </goal>
  </transf>
  </goal>
@@ -171,7 +171,6 @@
   </transf>
   </goal>
   <goal name="inter&#39;vc.35" expl="variant decrease" proved="true">
-  <proof prover="3" obsolete="true"><result status="timeout" time="5.00"/></proof>
   <transf name="split_vc" proved="true" >
    <goal name="inter&#39;vc.35.0" expl="variant decrease" proved="true">
    <proof prover="3"><result status="valid" time="0.01"/></proof>
@@ -188,15 +187,7 @@
   <proof prover="3"><result status="valid" time="0.00"/></proof>
   </goal>
   <goal name="inter&#39;vc.38" expl="variant decrease" proved="true">
-  <proof prover="3" obsolete="true"><result status="timeout" time="5.00"/></proof>
-  <transf name="split_vc" proved="true" >
-   <goal name="inter&#39;vc.38.0" expl="variant decrease" proved="true">
-   <proof prover="3"><result status="valid" time="0.01"/></proof>
-   </goal>
-   <goal name="inter&#39;vc.38.1" expl="variant decrease" proved="true">
-   <proof prover="3"><result status="valid" time="0.03"/></proof>
-   </goal>
-  </transf>
+  <proof prover="3"><result status="valid" time="0.04"/></proof>
   </goal>
   <goal name="inter&#39;vc.39" expl="precondition" proved="true">
   <proof prover="3"><result status="valid" time="0.02"/></proof>
@@ -205,15 +196,7 @@
   <proof prover="3"><result status="valid" time="0.03"/></proof>
   </goal>
   <goal name="inter&#39;vc.41" expl="variant decrease" proved="true">
-  <proof prover="3" obsolete="true"><result status="timeout" time="5.00"/></proof>
-  <transf name="split_vc" proved="true" >
-   <goal name="inter&#39;vc.41.0" expl="variant decrease" proved="true">
-   <proof prover="3"><result status="valid" time="0.01"/></proof>
-   </goal>
-   <goal name="inter&#39;vc.41.1" expl="variant decrease" proved="true">
-   <proof prover="3"><result status="valid" time="0.03"/></proof>
-   </goal>
-  </transf>
+  <proof prover="3"><result status="valid" time="0.04"/></proof>
   </goal>
   <goal name="inter&#39;vc.42" expl="precondition" proved="true">
   <proof prover="3"><result status="valid" time="0.01"/></proof>
@@ -222,15 +205,7 @@
   <proof prover="3"><result status="valid" time="0.01"/></proof>
   </goal>
   <goal name="inter&#39;vc.44" expl="variant decrease" proved="true">
-  <proof prover="3" obsolete="true"><result status="timeout" time="5.00"/></proof>
-  <transf name="split_vc" proved="true" >
-   <goal name="inter&#39;vc.44.0" expl="variant decrease" proved="true">
-   <proof prover="3"><result status="valid" time="0.00"/></proof>
-   </goal>
-   <goal name="inter&#39;vc.44.1" expl="variant decrease" proved="true">
-   <proof prover="3"><result status="valid" time="0.04"/></proof>
-   </goal>
-  </transf>
+  <proof prover="3"><result status="valid" time="0.03"/></proof>
   </goal>
   <goal name="inter&#39;vc.45" expl="precondition" proved="true">
   <proof prover="3"><result status="valid" time="0.02"/></proof>
@@ -245,15 +220,7 @@
   <proof prover="3"><result status="valid" time="0.01"/></proof>
   </goal>
   <goal name="inter&#39;vc.49" expl="variant decrease" proved="true">
-  <proof prover="3" obsolete="true"><result status="timeout" time="5.00"/></proof>
-  <transf name="split_vc" proved="true" >
-   <goal name="inter&#39;vc.49.0" expl="variant decrease" proved="true">
-   <proof prover="3"><result status="valid" time="0.01"/></proof>
-   </goal>
-   <goal name="inter&#39;vc.49.1" expl="variant decrease" proved="true">
-   <proof prover="3"><result status="valid" time="0.06"/></proof>
-   </goal>
-  </transf>
+  <proof prover="3"><result status="valid" time="0.05"/></proof>
   </goal>
   <goal name="inter&#39;vc.50" expl="precondition" proved="true">
   <proof prover="3"><result status="valid" time="0.03"/></proof>
@@ -276,7 +243,7 @@
    <proof prover="3"><result status="valid" time="0.01"/></proof>
    </goal>
    <goal name="inter&#39;vc.52.4" expl="postcondition" proved="true">
-   <proof prover="3"><result status="valid" time="0.66"/></proof>
+   <proof prover="3"><result status="valid" time="0.45"/></proof>
    </goal>
   </transf>
   </goal>
@@ -286,53 +253,22 @@
    <goal name="inter&#39;vc.53.0" expl="postcondition" proved="true">
    <transf name="split_vc" proved="true" >
     <goal name="inter&#39;vc.53.0.0" expl="postcondition" proved="true">
-    <proof prover="3"><result status="valid" time="3.42"/></proof>
+    <proof prover="3"><result status="valid" time="0.75"/></proof>
     </goal>
     <goal name="inter&#39;vc.53.0.1" expl="postcondition" proved="true">
-    <proof prover="3"><result status="valid" time="2.26"/></proof>
+    <proof prover="3"><result status="valid" time="0.60"/></proof>
     </goal>
     <goal name="inter&#39;vc.53.0.2" expl="postcondition" proved="true">
-    <proof prover="3"><result status="valid" time="2.37"/></proof>
+    <proof prover="3"><result status="valid" time="1.24"/></proof>
     </goal>
     <goal name="inter&#39;vc.53.0.3" expl="postcondition" proved="true">
-    <proof prover="3"><result status="valid" time="2.99"/></proof>
+    <proof prover="3"><result status="valid" time="1.71"/></proof>
     </goal>
     <goal name="inter&#39;vc.53.0.4" expl="postcondition" proved="true">
-    <proof prover="3" timelimit="100"><undone/></proof>
-    <transf name="case" proved="true" arg1="(mem0 x lu)">
-     <goal name="inter&#39;vc.53.0.4.0" expl="true case (postcondition)" proved="true">
-     <proof prover="3"><result status="valid" time="1.23"/></proof>
-     </goal>
-     <goal name="inter&#39;vc.53.0.4.1" expl="false case (postcondition)" proved="true">
-     <transf name="case" proved="true" arg1="(mem0 x lv)">
-      <goal name="inter&#39;vc.53.0.4.1.0" expl="false case (true case. postcondition)" proved="true">
-      <proof prover="3"><result status="valid" time="3.38"/></proof>
-      </goal>
-      <goal name="inter&#39;vc.53.0.4.1.1" expl="false case (postcondition)" proved="true">
-      <proof prover="3"><result status="timeout" time="5.00"/></proof>
-      <transf name="cut" proved="true" arg1="(cmp v3 b3 x)">
-       <goal name="inter&#39;vc.53.0.4.1.1.0" expl="false case (postcondition)" proved="true">
-       <proof prover="3"><result status="valid" time="0.03"/></proof>
-       </goal>
-       <goal name="inter&#39;vc.53.0.4.1.1.1" expl="asserted formula" proved="true">
-       <proof prover="3"><result status="valid" time="3.04"/></proof>
-       </goal>
-      </transf>
-      <transf name="instantiate" proved="true" arg1="Ensures9" arg2="x">
-       <goal name="inter&#39;vc.53.0.4.1.1.0" expl="false case (postcondition)" proved="true">
-       <proof prover="3"><result status="valid" time="0.04"/></proof>
-       </goal>
-      </transf>
-      </goal>
-     </transf>
-     </goal>
-    </transf>
-    <transf name="case" arg1="(cmp v3 b3 x)">
-     <goal name="inter&#39;vc.53.0.4.0" expl="true case (postcondition)" proved="true">
-     <proof prover="3"><result status="valid" time="1.16"/></proof>
-     </goal>
-     <goal name="inter&#39;vc.53.0.4.1" expl="false case (postcondition)">
-     <proof prover="3"><result status="timeout" time="5.00"/></proof>
+    <proof prover="3" timelimit="30"><result status="valid" time="8.24"/></proof>
+    <transf name="instantiate" proved="true" arg1="Ensures9" arg2="x">
+     <goal name="inter&#39;vc.53.0.4.0" expl="postcondition" proved="true">
+     <proof prover="3"><result status="valid" time="1.12"/></proof>
      </goal>
     </transf>
     </goal>
@@ -341,65 +277,63 @@
    <goal name="inter&#39;vc.53.1" expl="postcondition">
    <transf name="split_vc" >
     <goal name="inter&#39;vc.53.1.0" expl="postcondition" proved="true">
-    <proof prover="3"><result status="valid" time="1.38"/></proof>
+    <proof prover="3"><result status="valid" time="2.00"/></proof>
     </goal>
     <goal name="inter&#39;vc.53.1.1" expl="postcondition" proved="true">
-    <proof prover="3"><result status="valid" time="0.63"/></proof>
+    <proof prover="3"><result status="valid" time="0.25"/></proof>
     </goal>
     <goal name="inter&#39;vc.53.1.2" expl="postcondition" proved="true">
-    <proof prover="3"><result status="valid" time="0.70"/></proof>
+    <proof prover="3"><result status="valid" time="0.23"/></proof>
     </goal>
     <goal name="inter&#39;vc.53.1.3" expl="postcondition" proved="true">
-    <proof prover="3"><result status="valid" time="0.71"/></proof>
+    <proof prover="3"><result status="valid" time="0.22"/></proof>
     </goal>
     <goal name="inter&#39;vc.53.1.4" expl="postcondition">
     <proof prover="3"><result status="timeout" time="5.00"/></proof>
     </goal>
    </transf>
    </goal>
-   <goal name="inter&#39;vc.53.2" expl="postcondition">
-   <transf name="split_vc" >
+   <goal name="inter&#39;vc.53.2" expl="postcondition" proved="true">
+   <transf name="split_vc" proved="true" >
     <goal name="inter&#39;vc.53.2.0" expl="postcondition" proved="true">
-    <proof prover="3"><result status="valid" time="0.64"/></proof>
+    <proof prover="3"><result status="valid" time="1.26"/></proof>
     </goal>
     <goal name="inter&#39;vc.53.2.1" expl="postcondition" proved="true">
-    <proof prover="3"><result status="valid" time="0.35"/></proof>
+    <proof prover="3"><result status="valid" time="0.21"/></proof>
     </goal>
     <goal name="inter&#39;vc.53.2.2" expl="postcondition" proved="true">
-    <proof prover="3"><result status="valid" time="0.42"/></proof>
+    <proof prover="3"><result status="valid" time="0.20"/></proof>
     </goal>
     <goal name="inter&#39;vc.53.2.3" expl="postcondition" proved="true">
-    <proof prover="3"><result status="valid" time="0.44"/></proof>
+    <proof prover="3"><result status="valid" time="0.20"/></proof>
     </goal>
-    <goal name="inter&#39;vc.53.2.4" expl="postcondition">
-    <proof prover="3"><result status="timeout" time="5.00"/></proof>
+    <goal name="inter&#39;vc.53.2.4" expl="postcondition" proved="true">
+    <proof prover="3"><result status="valid" time="4.52"/></proof>
     </goal>
    </transf>
    </goal>
   </transf>
   </goal>
-  <goal name="inter&#39;vc.54" expl="postcondition">
-  <proof prover="3" obsolete="true"><result status="timeout" time="5.00"/></proof>
-  <transf name="split_vc" >
-   <goal name="inter&#39;vc.54.0" expl="postcondition">
-   <proof prover="3"><result status="timeout" time="5.00"/></proof>
+  <goal name="inter&#39;vc.54" expl="postcondition" proved="true">
+  <transf name="split_vc" proved="true" >
+   <goal name="inter&#39;vc.54.0" expl="postcondition" proved="true">
+   <proof prover="3"><result status="valid" time="0.47"/></proof>
    </goal>
-   <goal name="inter&#39;vc.54.1" expl="postcondition">
-   <proof prover="3"><result status="timeout" time="5.00"/></proof>
+   <goal name="inter&#39;vc.54.1" expl="postcondition" proved="true">
+   <proof prover="3"><result status="valid" time="0.26"/></proof>
    </goal>
-   <goal name="inter&#39;vc.54.2" expl="postcondition">
-   <proof prover="3"><result status="timeout" time="5.00"/></proof>
+   <goal name="inter&#39;vc.54.2" expl="postcondition" proved="true">
+   <proof prover="3"><result status="valid" time="0.22"/></proof>
    </goal>
-   <goal name="inter&#39;vc.54.3" expl="postcondition">
-   <proof prover="3"><result status="timeout" time="5.00"/></proof>
+   <goal name="inter&#39;vc.54.3" expl="postcondition" proved="true">
+   <proof prover="3"><result status="valid" time="0.22"/></proof>
    </goal>
-   <goal name="inter&#39;vc.54.4" expl="postcondition">
-   <proof prover="3"><result status="timeout" time="5.00"/></proof>
+   <goal name="inter&#39;vc.54.4" expl="postcondition" proved="true">
+   <proof prover="3"><result status="valid" time="0.51"/></proof>
    </goal>
   </transf>
   </goal>
   <goal name="inter&#39;vc.55" expl="postcondition" proved="true">
-  <proof prover="3" obsolete="true"><result status="timeout" time="5.00"/></proof>
   <transf name="split_vc" proved="true" >
    <goal name="inter&#39;vc.55.0" expl="postcondition" proved="true">
    <proof prover="3"><result status="valid" time="0.32"/></proof>
@@ -414,7 +348,7 @@
    <proof prover="3"><result status="valid" time="0.30"/></proof>
    </goal>
    <goal name="inter&#39;vc.55.4" expl="postcondition" proved="true">
-   <proof prover="3"><result status="valid" time="0.42"/></proof>
+   <proof prover="3"><result status="valid" time="0.27"/></proof>
    </goal>
   </transf>
   </goal>
@@ -529,7 +463,7 @@
    <goal name="inter&#39;vc.72.9" expl="postcondition" proved="true">
    <transf name="split_vc" proved="true" >
     <goal name="inter&#39;vc.72.9.0" expl="postcondition" proved="true">
-    <proof prover="3"><result status="valid" time="0.44"/></proof>
+    <proof prover="3"><result status="valid" time="0.23"/></proof>
     </goal>
     <goal name="inter&#39;vc.72.9.1" expl="postcondition" proved="true">
     <proof prover="3"><result status="valid" time="0.01"/></proof>
@@ -539,12 +473,6 @@
      <goal name="inter&#39;vc.72.9.2.0" expl="postcondition" proved="true">
      <proof prover="3"><result status="valid" time="0.01"/></proof>
      </goal>
-     <goal name="inter&#39;vc.68.9.0.1" expl="postcondition">
-     <proof prover="3"><result status="valid" time="0.35"/></proof>
-     </goal>
-     <goal name="inter&#39;vc.68.9.0.2" expl="postcondition">
-     <proof prover="3"><result status="valid" time="0.38"/></proof>
-     </goal>
     </transf>
     </goal>
    </transf>
@@ -567,30 +495,29 @@
     <proof prover="3"><result status="valid" time="0.01"/></proof>
     </goal>
     <goal name="inter&#39;vc.73.0.3" expl="postcondition" proved="true">
-    <proof prover="3" obsolete="true"><result status="timeout" time="5.00"/></proof>
     <transf name="split_vc" proved="true" >
      <goal name="inter&#39;vc.73.0.3.0" expl="postcondition" proved="true">
-     <proof prover="3"><result status="valid" time="1.69"/></proof>
+     <proof prover="3"><result status="valid" time="0.54"/></proof>
      </goal>
      <goal name="inter&#39;vc.73.0.3.1" expl="postcondition" proved="true">
-     <proof prover="3"><result status="valid" time="1.26"/></proof>
+     <proof prover="3"><result status="valid" time="0.44"/></proof>
      </goal>
      <goal name="inter&#39;vc.73.0.3.2" expl="postcondition" proved="true">
-     <proof prover="3"><result status="valid" time="1.27"/></proof>
+     <proof prover="3"><result status="valid" time="0.42"/></proof>
      </goal>
     </transf>
     </goal>
-    <goal name="inter&#39;vc.73.0.4" expl="postcondition">
-    <proof prover="3"><result status="timeout" time="5.00"/></proof>
+    <goal name="inter&#39;vc.73.0.4" expl="postcondition" proved="true">
+    <proof prover="3"><result status="valid" time="1.92"/></proof>
     </goal>
     <goal name="inter&#39;vc.73.0.5" expl="postcondition" proved="true">
     <proof prover="3"><result status="valid" time="0.00"/></proof>
     </goal>
     <goal name="inter&#39;vc.73.0.6" expl="postcondition" proved="true">
-    <proof prover="3"><result status="valid" time="0.20"/></proof>
+    <proof prover="3"><result status="valid" time="0.64"/></proof>
     </goal>
-    <goal name="inter&#39;vc.73.0.7" expl="postcondition">
-    <proof prover="3"><result status="timeout" time="5.00"/></proof>
+    <goal name="inter&#39;vc.73.0.7" expl="postcondition" proved="true">
+    <proof prover="3"><result status="valid" time="1.97"/></proof>
     </goal>
     <goal name="inter&#39;vc.73.0.8" expl="postcondition" proved="true">
     <proof prover="3"><result status="valid" time="0.01"/></proof>
@@ -611,9 +538,8 @@
     </goal>
    </transf>
    </goal>
-   <goal name="inter&#39;vc.73.1" expl="postcondition">
-   <proof prover="3" obsolete="true"><result status="timeout" time="5.00"/></proof>
-   <transf name="split_vc" >
+   <goal name="inter&#39;vc.73.1" expl="postcondition" proved="true">
+   <transf name="split_vc" proved="true" >
     <goal name="inter&#39;vc.73.1.0" expl="postcondition" proved="true">
     <proof prover="3"><result status="valid" time="0.01"/></proof>
     </goal>
@@ -624,13 +550,13 @@
     <proof prover="3"><result status="valid" time="0.01"/></proof>
     </goal>
     <goal name="inter&#39;vc.73.1.3" expl="postcondition" proved="true">
-    <proof prover="3" obsolete="true"><result status="timeout" time="5.00"/></proof>
+    <proof prover="3"><result status="valid" time="1.47"/></proof>
     <transf name="split_vc" proved="true" >
      <goal name="inter&#39;vc.73.1.3.0" expl="postcondition" proved="true">
-     <proof prover="3"><result status="valid" time="0.72"/></proof>
+     <proof prover="3"><result status="valid" time="0.46"/></proof>
      </goal>
      <goal name="inter&#39;vc.73.1.3.1" expl="postcondition" proved="true">
-     <proof prover="3"><result status="valid" time="0.43"/></proof>
+     <proof prover="3"><result status="valid" time="0.16"/></proof>
      </goal>
      <goal name="inter&#39;vc.73.1.3.2" expl="postcondition" proved="true">
      <proof prover="3"><result status="valid" time="0.17"/></proof>
@@ -638,7 +564,7 @@
     </transf>
     </goal>
     <goal name="inter&#39;vc.73.1.4" expl="postcondition" proved="true">
-    <proof prover="3"><result status="valid" time="3.69"/></proof>
+    <proof prover="3"><result status="valid" time="1.59"/></proof>
     </goal>
     <goal name="inter&#39;vc.73.1.5" expl="postcondition" proved="true">
     <proof prover="3"><result status="valid" time="0.01"/></proof>
@@ -646,17 +572,16 @@
     <goal name="inter&#39;vc.73.1.6" expl="postcondition" proved="true">
     <proof prover="3"><result status="valid" time="0.29"/></proof>
     </goal>
-    <goal name="inter&#39;vc.73.1.7" expl="postcondition">
-    <proof prover="3"><result status="timeout" time="5.00"/></proof>
+    <goal name="inter&#39;vc.73.1.7" expl="postcondition" proved="true">
+    <proof prover="3"><result status="valid" time="1.63"/></proof>
     </goal>
     <goal name="inter&#39;vc.73.1.8" expl="postcondition" proved="true">
     <proof prover="3"><result status="valid" time="0.01"/></proof>
     </goal>
     <goal name="inter&#39;vc.73.1.9" expl="postcondition" proved="true">
-    <proof prover="3" obsolete="true"><result status="timeout" time="5.00"/></proof>
     <transf name="split_vc" proved="true" >
      <goal name="inter&#39;vc.73.1.9.0" expl="postcondition" proved="true">
-     <proof prover="3"><result status="valid" time="6.33"/></proof>
+     <proof prover="3"><result status="valid" time="3.31"/></proof>
      </goal>
      <goal name="inter&#39;vc.73.1.9.1" expl="postcondition" proved="true">
      <proof prover="3"><result status="valid" time="0.19"/></proof>
@@ -668,9 +593,8 @@
     </goal>
    </transf>
    </goal>
-   <goal name="inter&#39;vc.73.2" expl="postcondition">
-   <proof prover="3" obsolete="true"><result status="timeout" time="5.00"/></proof>
-   <transf name="split_vc" >
+   <goal name="inter&#39;vc.73.2" expl="postcondition" proved="true">
+   <transf name="split_vc" proved="true" >
     <goal name="inter&#39;vc.73.2.0" expl="postcondition" proved="true">
     <proof prover="3"><result status="valid" time="0.00"/></proof>
     </goal>
@@ -681,10 +605,9 @@
     <proof prover="3"><result status="valid" time="0.01"/></proof>
     </goal>
     <goal name="inter&#39;vc.73.2.3" expl="postcondition" proved="true">
-    <proof prover="3" obsolete="true"><result status="timeout" time="5.00"/></proof>
     <transf name="split_vc" proved="true" >
      <goal name="inter&#39;vc.73.2.3.0" expl="postcondition" proved="true">
-     <proof prover="3"><result status="valid" time="0.75"/></proof>
+     <proof prover="3"><result status="valid" time="0.46"/></proof>
      </goal>
      <goal name="inter&#39;vc.73.2.3.1" expl="postcondition" proved="true">
      <proof prover="3"><result status="valid" time="0.17"/></proof>
@@ -694,8 +617,8 @@
      </goal>
     </transf>
     </goal>
-    <goal name="inter&#39;vc.73.2.4" expl="postcondition">
-    <proof prover="3"><result status="timeout" time="5.00"/></proof>
+    <goal name="inter&#39;vc.73.2.4" expl="postcondition" proved="true">
+    <proof prover="3"><result status="valid" time="1.62"/></proof>
     </goal>
     <goal name="inter&#39;vc.73.2.5" expl="postcondition" proved="true">
     <proof prover="3"><result status="valid" time="0.01"/></proof>
@@ -704,16 +627,15 @@
     <proof prover="3"><result status="valid" time="0.20"/></proof>
     </goal>
     <goal name="inter&#39;vc.73.2.7" expl="postcondition" proved="true">
-    <proof prover="3"><result status="valid" time="3.35"/></proof>
+    <proof prover="3"><result status="valid" time="1.63"/></proof>
     </goal>
     <goal name="inter&#39;vc.73.2.8" expl="postcondition" proved="true">
     <proof prover="3"><result status="valid" time="0.01"/></proof>
     </goal>
-    <goal name="inter&#39;vc.73.2.9" expl="postcondition">
-    <proof prover="3" obsolete="true"><result status="timeout" time="5.00"/></proof>
-    <transf name="split_vc" >
-     <goal name="inter&#39;vc.73.2.9.0" expl="postcondition">
-     <proof prover="3"><result status="timeout" time="5.00"/></proof>
+    <goal name="inter&#39;vc.73.2.9" expl="postcondition" proved="true">
+    <transf name="split_vc" proved="true" >
+     <goal name="inter&#39;vc.73.2.9.0" expl="postcondition" proved="true">
+     <proof prover="3"><result status="valid" time="1.78"/></proof>
      </goal>
      <goal name="inter&#39;vc.73.2.9.1" expl="postcondition" proved="true">
      <proof prover="3"><result status="valid" time="0.23"/></proof>
@@ -727,9 +649,8 @@
    </goal>
   </transf>
   </goal>
-  <goal name="inter&#39;vc.74" expl="postcondition">
-  <proof prover="3" obsolete="true"><result status="timeout" time="5.00"/></proof>
-  <transf name="split_vc" >
+  <goal name="inter&#39;vc.74" expl="postcondition" proved="true">
+  <transf name="split_vc" proved="true" >
    <goal name="inter&#39;vc.74.0" expl="postcondition" proved="true">
    <proof prover="3"><result status="valid" time="0.01"/></proof>
    </goal>
@@ -739,11 +660,11 @@
    <goal name="inter&#39;vc.74.2" expl="postcondition" proved="true">
    <proof prover="3"><result status="valid" time="0.01"/></proof>
    </goal>
-   <goal name="inter&#39;vc.74.3" expl="postcondition">
-   <proof prover="3"><result status="timeout" time="5.00"/></proof>
+   <goal name="inter&#39;vc.74.3" expl="postcondition" proved="true">
+   <proof prover="3"><result status="valid" time="1.07"/></proof>
    </goal>
    <goal name="inter&#39;vc.74.4" expl="postcondition" proved="true">
-   <proof prover="3"><result status="valid" time="1.72"/></proof>
+   <proof prover="3"><result status="valid" time="1.03"/></proof>
    </goal>
    <goal name="inter&#39;vc.74.5" expl="postcondition" proved="true">
    <proof prover="3"><result status="valid" time="0.00"/></proof>
@@ -752,19 +673,18 @@
    <proof prover="3"><result status="valid" time="0.01"/></proof>
    </goal>
    <goal name="inter&#39;vc.74.7" expl="postcondition" proved="true">
-   <proof prover="3"><result status="valid" time="2.08"/></proof>
+   <proof prover="3"><result status="valid" time="0.98"/></proof>
    </goal>
    <goal name="inter&#39;vc.74.8" expl="postcondition" proved="true">
    <proof prover="3"><result status="valid" time="0.01"/></proof>
    </goal>
-   <goal name="inter&#39;vc.74.9" expl="postcondition">
-   <proof prover="3"><result status="timeout" time="5.00"/></proof>
+   <goal name="inter&#39;vc.74.9" expl="postcondition" proved="true">
+   <proof prover="3"><result status="valid" time="1.17"/></proof>
    </goal>
   </transf>
   </goal>
-  <goal name="inter&#39;vc.75" expl="postcondition">
-  <proof prover="3" obsolete="true"><result status="timeout" time="5.00"/></proof>
-  <transf name="split_vc" >
+  <goal name="inter&#39;vc.75" expl="postcondition" proved="true">
+  <transf name="split_vc" proved="true" >
    <goal name="inter&#39;vc.75.0" expl="postcondition" proved="true">
    <proof prover="3"><result status="valid" time="0.01"/></proof>
    </goal>
@@ -775,7 +695,6 @@
    <proof prover="3"><result status="valid" time="0.00"/></proof>
    </goal>
    <goal name="inter&#39;vc.75.3" expl="postcondition" proved="true">
-   <proof prover="3" obsolete="true"><result status="timeout" time="5.00"/></proof>
    <transf name="split_vc" proved="true" >
     <goal name="inter&#39;vc.75.3.0" expl="postcondition" proved="true">
     <proof prover="3"><result status="valid" time="0.26"/></proof>
@@ -789,7 +708,6 @@
    </transf>
    </goal>
    <goal name="inter&#39;vc.75.4" expl="postcondition" proved="true">
-   <proof prover="3" obsolete="true"><result status="timeout" time="5.00"/></proof>
    <transf name="split_vc" proved="true" >
     <goal name="inter&#39;vc.75.4.0" expl="postcondition" proved="true">
     <proof prover="3"><result status="valid" time="0.17"/></proof>
@@ -812,16 +730,15 @@
    <proof prover="3"><result status="valid" time="0.02"/></proof>
    </goal>
    <goal name="inter&#39;vc.75.7" expl="postcondition" proved="true">
-   <proof prover="3"><result status="valid" time="1.77"/></proof>
+   <proof prover="3"><result status="valid" time="1.06"/></proof>
    </goal>
    <goal name="inter&#39;vc.75.8" expl="postcondition" proved="true">
    <proof prover="3"><result status="valid" time="0.00"/></proof>
    </goal>
-   <goal name="inter&#39;vc.75.9" expl="postcondition">
-   <proof prover="3" obsolete="true"><result status="timeout" time="5.00"/></proof>
-   <transf name="split_vc" >
-    <goal name="inter&#39;vc.75.9.0" expl="postcondition">
-    <proof prover="3"><result status="timeout" time="5.00"/></proof>
+   <goal name="inter&#39;vc.75.9" expl="postcondition" proved="true">
+   <transf name="split_vc" proved="true" >
+    <goal name="inter&#39;vc.75.9.0" expl="postcondition" proved="true">
+    <proof prover="3"><result status="valid" time="0.29"/></proof>
     </goal>
     <goal name="inter&#39;vc.75.9.1" expl="postcondition" proved="true">
     <proof prover="3"><result status="valid" time="0.19"/></proof>
@@ -1017,8 +934,8 @@
     <goal name="inter&#39;vc.120.1.2" expl="postcondition" proved="true">
     <proof prover="3"><result status="valid" time="0.01"/></proof>
     </goal>
-    <goal name="inter&#39;vc.120.1.3" expl="postcondition">
-    <proof prover="3"><result status="timeout" time="5.00"/></proof>
+    <goal name="inter&#39;vc.120.1.3" expl="postcondition" proved="true">
+    <proof prover="3"><result status="valid" time="3.09"/></proof>
     </goal>
     <goal name="inter&#39;vc.120.1.4" expl="postcondition">
     <proof prover="3"><result status="timeout" time="5.00"/></proof>
@@ -1046,8 +963,8 @@
     <goal name="inter&#39;vc.120.2.2" expl="postcondition" proved="true">
     <proof prover="3"><result status="valid" time="0.01"/></proof>
     </goal>
-    <goal name="inter&#39;vc.120.2.3" expl="postcondition">
-    <proof prover="3"><result status="timeout" time="5.00"/></proof>
+    <goal name="inter&#39;vc.120.2.3" expl="postcondition" proved="true">
+    <proof prover="3"><result status="valid" time="1.84"/></proof>
     </goal>
     <goal name="inter&#39;vc.120.2.4" expl="postcondition">
     <proof prover="3"><result status="timeout" time="5.00"/></proof>
@@ -1075,8 +992,8 @@
     <goal name="inter&#39;vc.120.3.2" expl="postcondition" proved="true">
     <proof prover="3"><result status="valid" time="0.01"/></proof>
     </goal>
-    <goal name="inter&#39;vc.120.3.3" expl="postcondition">
-    <proof prover="3"><result status="timeout" time="5.00"/></proof>
+    <goal name="inter&#39;vc.120.3.3" expl="postcondition" proved="true">
+    <proof prover="3"><result status="valid" time="1.54"/></proof>
     </goal>
     <goal name="inter&#39;vc.120.3.4" expl="postcondition">
     <proof prover="3"><result status="timeout" time="5.00"/></proof>
-- 
GitLab