From b19ecab808f7bbfdc92d126453fb9fa68bc3ce93 Mon Sep 17 00:00:00 2001
From: Allan Blanchard <allan.blanchard@cea.fr>
Date: Wed, 27 Apr 2022 08:26:27 +0200
Subject: [PATCH] [wp] fix decreases positive

---
 src/plugins/wp/cfgWP.ml                       |  2 +-
 .../tests/wp_acsl/oracle/clusters.res.oracle  |  2 +-
 .../wp_acsl/oracle/decreases.0.res.oracle     | 18 +++++++--------
 .../wp_acsl/oracle/decreases.1.res.oracle     | 23 +++++++------------
 .../oracle/terminates_formulae.res.oracle     |  2 +-
 .../oracle_qualif/decreases.1.res.oracle      |  8 +++----
 6 files changed, 24 insertions(+), 31 deletions(-)

diff --git a/src/plugins/wp/cfgWP.ml b/src/plugins/wp/cfgWP.ml
index ee6d749805a..110ef26efae 100644
--- a/src/plugins/wp/cfgWP.ml
+++ b/src/plugins/wp/cfgWP.ml
@@ -1162,7 +1162,7 @@ struct
              | (caller_d, rel), Some (callee_d,_ ) ->
                let rel caller callee = match rel with
                  | None ->
-                   p_and (p_leq e_zero callee) (p_lt callee caller)
+                   p_and (p_leq e_zero caller) (p_lt callee caller)
                  | Some rel ->
                    (L.in_frame call_f (L.call_pred call_e))
                      rel [] [caller ; callee]
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/clusters.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/clusters.res.oracle
index 61a3435b5bb..65805aa212d 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/clusters.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/clusters.res.oracle
@@ -122,7 +122,7 @@ Prove: true.
 Goal Recursion variant:
 Call Effect at line 12
 Assume { Type: is_uint32(n). (* Then *) Have: n != 0. }
-Prove: to_uint32(n - 1) < n.
+Prove: (0 <= n) /\ (to_uint32(n - 1) < n).
 
 ------------------------------------------------------------
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/decreases.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/decreases.0.res.oracle
index d20b0623277..84ff1f41b85 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/decreases.0.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/decreases.0.res.oracle
@@ -24,7 +24,7 @@ Prove: true.
 Goal Recursion variant:
 Call Effect at line 17
 Assume { Type: is_uint32(n). (* Else *) Have: n != 0. }
-Prove: to_uint32(n - 1) < n.
+Prove: (0 <= n) /\ (to_uint32(n - 1) < n).
 
 ------------------------------------------------------------
 ------------------------------------------------------------
@@ -52,7 +52,7 @@ Prove: 0 < n.
 Goal Recursion variant:
 Call Effect at line 40
 Assume { Type: is_sint32(n). (* Else *) Have: n != 0. }
-Prove: 0 < n.
+Prove: 0 <= n.
 
 ------------------------------------------------------------
 ------------------------------------------------------------
@@ -120,7 +120,7 @@ Prove: P_Rel(n, n).
 Goal Recursion variant:
 Call Effect at line 55
 Assume { Type: is_uint32(n). (* Then *) Have: n != 0. }
-Prove: to_uint32(n - 1) < n.
+Prove: (0 <= n) /\ (to_uint32(n - 1) < n).
 
 ------------------------------------------------------------
 ------------------------------------------------------------
@@ -130,14 +130,14 @@ Prove: to_uint32(n - 1) < n.
 Goal Recursion variant (1/2):
 Call Effect at line 59
 Assume { Type: is_uint32(x). (* Then *) Have: x != 0. }
-Prove: to_uint32(x - 1) < x.
+Prove: (0 <= x) /\ (to_uint32(x - 1) < x).
 
 ------------------------------------------------------------
 
 Goal Recursion variant (2/2):
 Call Effect at line 60
 Assume { Type: is_uint32(x). (* Then *) Have: 11 <= x. }
-Prove: to_uint32(x - 1) < x.
+Prove: (0 <= x) /\ (to_uint32(x - 1) < x).
 
 ------------------------------------------------------------
 ------------------------------------------------------------
@@ -157,7 +157,7 @@ Prove: false.
 Goal Recursion variant (2/2):
 Call Effect at line 72
 Assume { Type: is_uint32(n). (* Then *) Have: 31 <= n. }
-Prove: to_uint32(n - 1) < n.
+Prove: (0 <= n) /\ (to_uint32(n - 1) < n).
 
 ------------------------------------------------------------
 ------------------------------------------------------------
@@ -179,7 +179,7 @@ Prove: to_uint32(n - 1) <= 10.
 Goal Recursion variant:
 Call Effect at line 86
 Assume { Type: is_uint32(n). (* Then *) Have: n != 0. }
-Prove: to_uint32(n - 1) < n.
+Prove: (0 <= n) /\ (to_uint32(n - 1) < n).
 
 ------------------------------------------------------------
 ------------------------------------------------------------
@@ -200,14 +200,14 @@ Prove: true.
 Goal Recursion variant (1/2):
 Call Effect at line 91
 Assume { Type: is_uint32(x). (* Then *) Have: x != 0. }
-Prove: to_uint32(x - 1) < x.
+Prove: (0 <= x) /\ (to_uint32(x - 1) < x).
 
 ------------------------------------------------------------
 
 Goal Recursion variant (2/2):
 Call Effect at line 92
 Assume { Type: is_uint32(x). (* Then *) Have: 11 <= x. }
-Prove: to_uint32(x - 1) < x.
+Prove: (0 <= x) /\ (to_uint32(x - 1) < x).
 
 ------------------------------------------------------------
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/decreases.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/decreases.1.res.oracle
index acfb72158d9..f45e5a772fe 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/decreases.1.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/decreases.1.res.oracle
@@ -24,7 +24,7 @@ Prove: true.
 Goal Recursion variant:
 Call Effect at line 17
 Assume { Type: is_uint32(n). (* Else *) Have: n != 0. }
-Prove: to_uint32(n - 1) < n.
+Prove: (0 <= n) /\ (to_uint32(n - 1) < n).
 
 ------------------------------------------------------------
 ------------------------------------------------------------
@@ -51,14 +51,7 @@ Prove: 0 < n.
 
 Goal Recursion variant:
 Call Effect at line 40
-Assume {
-  Type: is_sint32(n).
-  (* Goal *)
-  When: 0 <= n.
-  (* Else *)
-  Have: n != 0.
-}
-Prove: 0 < n.
+Prove: true.
 
 ------------------------------------------------------------
 ------------------------------------------------------------
@@ -132,7 +125,7 @@ Prove: P_Rel(n, n).
 Goal Recursion variant:
 Call Effect at line 55
 Assume { Type: is_uint32(n). (* Then *) Have: n != 0. }
-Prove: to_uint32(n - 1) < n.
+Prove: (0 <= n) /\ (to_uint32(n - 1) < n).
 
 ------------------------------------------------------------
 ------------------------------------------------------------
@@ -142,14 +135,14 @@ Prove: to_uint32(n - 1) < n.
 Goal Recursion variant (1/2):
 Call Effect at line 59
 Assume { Type: is_uint32(x). (* Then *) Have: x != 0. }
-Prove: to_uint32(x - 1) < x.
+Prove: (0 <= x) /\ (to_uint32(x - 1) < x).
 
 ------------------------------------------------------------
 
 Goal Recursion variant (2/2):
 Call Effect at line 60
 Assume { Type: is_uint32(x). (* Then *) Have: 11 <= x. }
-Prove: to_uint32(x - 1) < x.
+Prove: (0 <= x) /\ (to_uint32(x - 1) < x).
 
 ------------------------------------------------------------
 ------------------------------------------------------------
@@ -169,7 +162,7 @@ Prove: false.
 Goal Recursion variant (2/2):
 Call Effect at line 72
 Assume { Type: is_uint32(n). (* Then *) Have: 31 <= n. }
-Prove: to_uint32(n - 1) < n.
+Prove: (0 <= n) /\ (to_uint32(n - 1) < n).
 
 ------------------------------------------------------------
 ------------------------------------------------------------
@@ -191,7 +184,7 @@ Prove: to_uint32(n - 1) <= 10.
 Goal Recursion variant:
 Call Effect at line 86
 Assume { Type: is_uint32(n). (* Then *) Have: n != 0. }
-Prove: to_uint32(n - 1) < n.
+Prove: (0 <= n) /\ (to_uint32(n - 1) < n).
 
 ------------------------------------------------------------
 ------------------------------------------------------------
@@ -218,7 +211,7 @@ Assume {
   (* Then *)
   Have: x != 0.
 }
-Prove: to_uint32(x - 1) < x.
+Prove: (0 <= x) /\ (to_uint32(x - 1) < x).
 
 ------------------------------------------------------------
 
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/terminates_formulae.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/terminates_formulae.res.oracle
index d8eeb1c7538..484dd6e31ec 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/terminates_formulae.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/terminates_formulae.res.oracle
@@ -77,7 +77,7 @@ Prove: true.
 Goal Recursion variant:
 Call Effect at line 80
 Assume { Type: is_uint32(n). (* Goal *) When: P_Q. (* Then *) Have: n != 0. }
-Prove: to_uint32(n - 1) < n.
+Prove: (0 <= n) /\ (to_uint32(n - 1) < n).
 
 ------------------------------------------------------------
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/decreases.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/decreases.1.res.oracle
index 541e824ca01..f18fe8e1bdf 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/decreases.1.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/decreases.1.res.oracle
@@ -20,7 +20,7 @@
 [wp] [Alt-Ergo] Goal typed_fails_facto_gen_variant : Unsuccess
 [wp] [Qed] Goal typed_fact_i_terminates_part1 : Valid
 [wp] [Alt-Ergo] Goal typed_fact_i_terminates_part2 : Valid
-[wp] [Alt-Ergo] Goal typed_fact_i_variant : Valid
+[wp] [Qed] Goal typed_fact_i_variant : Valid
 [wp] [Qed] Goal typed_fails_fact_i_terminates_part1 : Valid
 [wp] [Alt-Ergo] Goal typed_fails_fact_i_terminates_part2 : Unsuccess
 [wp] [Alt-Ergo] Goal typed_fails_fact_i_variant : Unsuccess
@@ -41,15 +41,15 @@
 [wp] [Alt-Ergo] Goal typed_mw1_variant : Unsuccess (Degenerated)
 [wp] [Qed] Goal typed_se_variant : Valid
 [wp] Proved goals:   19 / 27
-  Qed:             8 
-  Alt-Ergo:       11  (unsuccess: 8)
+  Qed:             9 
+  Alt-Ergo:       10  (unsuccess: 8)
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
   fact                      1        1        2       100%
   fails_fact                -        -        1       0.0%
   facto_gen                 -        1        1       100%
   fails_facto_gen           -        -        1       0.0%
-  fact_i                    1        2        3       100%
+  fact_i                    2        1        3       100%
   fails_fact_i              1        -        3      33.3%
   m2                        -        2        2       100%
   m1                        -        1        1       100%
-- 
GitLab