From 7a5a0eefc3cfbdf06a5fa5a42654f1922df31f70 Mon Sep 17 00:00:00 2001
From: Patrick Baudin <patrick.baudin@cea.fr>
Date: Mon, 31 Jan 2022 11:39:53 +0100
Subject: [PATCH] [WP] Review of the sequent decomposition

---
 src/plugins/wp/Conditions.ml                  | 24 +++++++++++++++----
 .../wp_acsl/oracle/base_offset.res.oracle     |  3 ++-
 .../tests/wp_acsl/oracle/bitwise.res.oracle   |  7 +-----
 .../wp_acsl/oracle_qualif/bitwise.res.oracle  |  8 +++----
 .../wp/tests/wp_bts/oracle/ex5.res.oracle     |  2 +-
 5 files changed, 28 insertions(+), 16 deletions(-)

diff --git a/src/plugins/wp/Conditions.ml b/src/plugins/wp/Conditions.ml
index f6bd2c4468f..fcf91379566 100644
--- a/src/plugins/wp/Conditions.ml
+++ b/src/plugins/wp/Conditions.ml
@@ -447,7 +447,10 @@ let rec exist_intro p =
       let _,t = e_open ~pool ~exists:true
           ~forall:false ~lambda:false (e_prop p) in
       exist_intro (F.p_bool t)
-  | _ ->
+  | _ -> (* Note: Qed implement De Morgan rules
+            such that [p] cannot match the
+            decomposable representations:
+            Not Or, Not Imply, Not Forall *)
       if Wp_parameters.Prenex.get ()
       then prenex_intro p
       else p
@@ -463,7 +466,11 @@ let rec exist_intros = function
           let _,t = F.QED.e_open ~pool ~exists:true
               ~forall:false ~lambda:false (e_prop p) in
           exist_intros ((F.p_bool t)::hs)
-      | _ -> p::(exist_intros hs)
+      | _ -> (* Note: Qed implement De Morgan rules
+                such that [p] cannot match the
+                decomposable representations:
+                Not Or, Not Imply, Not Forall *)
+          p::(exist_intros hs)
     end
 
 (* -------------------------------------------------------------------------- *)
@@ -488,8 +495,17 @@ let rec forall_intro p =
           (hp @ hs), (p::ps)) ([],[]) qs
       in (* ORs qs  <==> ORs (hps ==> ps)
                     <==> ((ANDs hps) ==> ORs ps) *)
-      hps, (p_disj ps)
-  | _ -> [] , p
+      let hps,ps = List.fold_left (fun (hs,ps) q ->
+          match F.repr (F.e_prop q) with
+          | Neq _ -> ((F.p_not q)::hs), ps
+          | _ -> hs, (q::ps)) (hps,[]) ps
+      in (* ORs qs <==> ((ANDs hps) ==> ORs ps)) *)
+      hps, (F.p_disj ps)
+  | _ -> (* Note: Qed implement De Morgan rules
+            such that [p] cannot match the
+            decomposable representations:
+            Not And, Not Exists *)
+      [] , p
 
 (* -------------------------------------------------------------------------- *)
 (* --- Constructors                                                       --- *)
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/base_offset.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/base_offset.res.oracle
index 951ae643d25..18e31ad1d27 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/base_offset.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/base_offset.res.oracle
@@ -39,6 +39,7 @@ Prove: table_of_base(G_z_33) = table_of_base(G_x_31).
 ------------------------------------------------------------
 
 Goal Check 'KO' (file base_offset.i, line 30):
-Prove: table_of_base(G_y_32) != table_of_base(G_x_31).
+Assume { (* Goal *) When: table_of_base(G_y_32) = table_of_base(G_x_31). }
+Prove: false.
 
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle/bitwise.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/bitwise.res.oracle
index 232b2653404..836623e5e0d 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle/bitwise.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle/bitwise.res.oracle
@@ -153,12 +153,7 @@ Prove: (a = 0) /\ (b = 0).
 ------------------------------------------------------------
 
 Goal Post-condition for 'true' (file bitwise.i, line 78) in 'bor_bool':
-Assume {
-  Type: is_bool(a) /\ is_bool(b).
-  (* Pre-condition for 'true' *)
-  Have: (a = 1) \/ (b = 1).
-}
-Prove: (a != 0) \/ (b != 0).
+Prove: true.
 
 ------------------------------------------------------------
 ------------------------------------------------------------
diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/bitwise.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/bitwise.res.oracle
index 413c2326caa..97ca9dc0b2e 100644
--- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/bitwise.res.oracle
+++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/bitwise.res.oracle
@@ -27,7 +27,7 @@
 [wp] [Qed] Goal typed_lshift_shift2_ensures_lsl3 : Valid
 [wp] [Qed] Goal typed_rshift_ensures : Valid
 [wp] [Qed] Goal typed_rshift_shift1_ensures_lsr1 : Valid
-[wp] [Alt-Ergo] Goal typed_bor_bool_true_ensures : Valid
+[wp] [Qed] Goal typed_bor_bool_true_ensures : Valid
 [wp] [Alt-Ergo] Goal typed_bor_bool_false_ensures : Valid
 [wp] [Qed] Goal typed_band_bool_true_ensures : Valid
 [wp] [Alt-Ergo] Goal typed_band_bool_false_ensures : Valid
@@ -42,8 +42,8 @@
 [wp] [Qed] Goal typed_lemma_check_7 : Valid
 [wp] [Qed] Goal typed_cast_uchar_ensures : Valid
 [wp] Proved goals:   38 / 38
-  Qed:            34 
-  Alt-Ergo:        4
+  Qed:            35 
+  Alt-Ergo:        3
 ------------------------------------------------------------
  Functions                 WP     Alt-Ergo  Total   Success
   band                      8        -        8       100%
@@ -52,7 +52,7 @@
   bnot                      1        -        1       100%
   lshift                    4        -        4       100%
   rshift                    2        -        2       100%
-  bor_bool                  -        2        2       100%
+  bor_bool                  1        1        2       100%
   band_bool                 1        1        2       100%
   bxor_bool                 1        1        2       100%
   lemma                     7        -        7       100%
diff --git a/src/plugins/wp/tests/wp_bts/oracle/ex5.res.oracle b/src/plugins/wp/tests/wp_bts/oracle/ex5.res.oracle
index 5e8dbbdb083..97a39bb3a67 100644
--- a/src/plugins/wp/tests/wp_bts/oracle/ex5.res.oracle
+++ b/src/plugins/wp/tests/wp_bts/oracle/ex5.res.oracle
@@ -174,7 +174,7 @@ Prove: (i + L_f(i)) != b.
 ------------------------------------------------------------
 
 Goal Post-condition 'ko4' in 'forall':
-Prove: (L_f(i) != i_1) \/ P_P(i_1).
+Prove: P_P(L_f(i)).
 
 ------------------------------------------------------------
 
-- 
GitLab