From 5bb5b88294a26f9d7a652f42326d933a3ae07c7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9cile=20Ruet-Cros?= <cecile.ruet-cros@cea.fr> Date: Wed, 3 Jul 2024 18:03:16 +0200 Subject: [PATCH] [wp] vset: library/test cleanup --- src/plugins/wp/share/why3/frama_c_wp/vset.mlw | 23 +- .../wp/tests/wp_acsl/oracle/vset.res.oracle | 212 +++--------------- .../wp_acsl/oracle_qualif/vset.res.oracle | 42 ++-- src/plugins/wp/tests/wp_acsl/vset.i | 53 +---- 4 files changed, 71 insertions(+), 259 deletions(-) diff --git a/src/plugins/wp/share/why3/frama_c_wp/vset.mlw b/src/plugins/wp/share/why3/frama_c_wp/vset.mlw index af94135774d..ee23f283c51 100644 --- a/src/plugins/wp/share/why3/frama_c_wp/vset.mlw +++ b/src/plugins/wp/share/why3/frama_c_wp/vset.mlw @@ -28,6 +28,7 @@ theory Vset use bool.Bool use int.Int + use map.Map use export set.Set (* -------------------------------------------------------------------------- *) @@ -38,26 +39,32 @@ theory Vset predicate eqset (a : set 'a) (b : set 'a) = forall x : 'a. (mem x a) <-> (mem x b) - function range int int : set int (* [a..b] *) - function range_sup int : set int (* [a..] *) - function range_inf int : set int (* [..b] *) - function range_all : set int (* [..] *) + let function range (inf sup:int) : set int (* [a..b] *) = + fun elt -> if inf <= elt <= sup then true else false + + function range_sup (sup:int) : set int (* [a..] *) = + fun elt -> if elt <= sup then true else false + + function range_inf (inf:int) : set int (* [..b] *) = + fun elt -> if inf <= elt then true else false + + function range_all : set int (* [..] *) = fun _ -> true (* -------------------------------------------------------------------------- *) axiom member_bool : forall x:'a. forall s:set 'a [member_bool x s]. if mem x s then member_bool x s = True else member_bool x s = False - axiom member_range : forall x:int,a:int,b:int [mem x (range a b)]. + lemma member_range : forall x:int,a:int,b:int [mem x (range a b)]. mem x (range a b) <-> (a <= x /\ x <= b) - axiom member_range_sup : forall x:int,a:int [mem x (range_sup a)]. + lemma member_range_sup : forall x:int,a:int [mem x (range_sup a)]. mem x (range_sup a) <-> (a <= x) - axiom member_range_inf : forall x:int,b:int [mem x (range_inf b)]. + lemma member_range_inf : forall x:int,b:int [mem x (range_inf b)]. mem x (range_inf b) <-> (x <= b) - axiom member_range_all : forall x:int [mem x range_all]. + lemma member_range_all : forall x:int [mem x range_all]. mem x range_all (* -------------------------------------------------------------------------- *) diff --git a/src/plugins/wp/tests/wp_acsl/oracle/vset.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/vset.res.oracle index d0bb2c0c3d4..1a1c4a973c9 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle/vset.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle/vset.res.oracle @@ -1,64 +1,47 @@ # frama-c -wp [...] [kernel] Parsing vset.i (no preprocessing) [wp] Running WP plugin... -[wp] 21 goals scheduled -[wp] [Valid] typed_lemma_direct_in (Qed) -[wp] [Valid] typed_lemma_direct_in_singleton (Qed) -[wp] [NoResult] typed_lemma_indirect_in_constants (Qed) -[wp] [Unsuccess] typed_lemma_indirect_equal_logical (Tactic) (Qed) -[wp] [Unsuccess] typed_lemma_indirect_equal_ghost (Tactic) (Qed) -[wp] [Unsuccess] typed_lemma_indirect_equal_constants (Tactic) (Qed) -[wp] [NoResult] typed_lemma_indirect_not_equal_logical (Qed) -[wp] [NoResult] typed_lemma_indirect_not_equal_constants (Qed) -[wp] [NoResult] typed_lemma_indirect_in_logical (Qed) -[wp] [NoResult] typed_lemma_indirect_in_ghost (Qed) -[wp] [Unsuccess] typed_lemma_iota1_compute_equal_constants (Tactic) (Qed) -[wp] [NoResult] typed_lemma_iota0_compute_0in_constants (Qed) -[wp] [NoResult] typed_lemma_indirect_not_in_logical (Qed) -[wp] [NoResult] typed_lemma_indirect_not_in_constants (Qed) -[wp] [Unsuccess] typed_lemma_iota_ind0 (Tactic) (Qed) -[wp] [Unsuccess] typed_lemma_iota3_compute_equal_constants (Tactic) (Qed) -[wp] [NoResult] typed_lemma_iota3_compute_2in_constants (Qed) -[wp] [NoResult] typed_lemma_iota3_compute_0in_constants (Qed) -[wp] [NoResult] typed_lemma_rec_iota_le0 (Qed) -[wp] [NoResult] typed_lemma_rec_iota_gt0 (Qed) -[wp] [NoResult] typed_lemma_rec_iota (Qed) -[wp] Proved goals: 2 / 21 +[wp] 12 goals scheduled +[wp] [Valid] typed_check_lemma_direct_in (Qed) +[wp] [Valid] typed_check_lemma_direct_in_singleton (Qed) +[wp] [NoResult] typed_check_lemma_indirect_in_constants (Qed) +[wp] [Unsuccess] typed_check_lemma_indirect_equal_logical (Tactic) (Qed) +[wp] [Unsuccess] typed_check_lemma_indirect_equal_ghost (Tactic) (Qed) +[wp] [Unsuccess] typed_check_lemma_indirect_equal_constants (Tactic) (Qed) +[wp] [NoResult] typed_check_lemma_indirect_not_equal_logical (Qed) +[wp] [NoResult] typed_check_lemma_indirect_not_equal_constants (Qed) +[wp] [NoResult] typed_check_lemma_indirect_in_logical (Qed) +[wp] [NoResult] typed_check_lemma_indirect_in_ghost (Qed) +[wp] [NoResult] typed_check_lemma_indirect_not_in_logical (Qed) +[wp] [NoResult] typed_check_lemma_indirect_not_in_constants (Qed) +[wp] Proved goals: 2 / 12 Qed: 2 - Unsuccess: 19 - Missing: 13 + Unsuccess: 10 + Missing: 7 ------------------------------------------------------------ Global ------------------------------------------------------------ -Goal Lemma 'direct_in': +Goal Check Lemma 'direct_in': Prove: true. Prover Qed returns Valid ------------------------------------------------------------ -Goal Lemma 'direct_in_singleton': -Assume Lemmas: 'direct_in' +Goal Check Lemma 'direct_in_singleton': Prove: true. Prover Qed returns Valid ------------------------------------------------------------ -Goal Lemma 'indirect_equal_constants': -Assume Lemmas: 'indirect_not_in_constants' 'indirect_in_constants' - 'direct_in_singleton' 'direct_in' +Goal Check Lemma 'indirect_equal_constants': Prove: mem(1, L_Set1) /\ mem(2, L_Set1) /\ mem(3, L_Set1) /\ (forall i : Z. (mem(i, L_Set1) -> ((i = 1) \/ (i = 2) \/ (i = 3)))). Prover Script returns Unsuccess ------------------------------------------------------------ -Goal Lemma 'indirect_equal_ghost': -Assume Lemmas: 'indirect_in_ghost' 'indirect_not_equal_logical' - 'indirect_equal_logical' 'indirect_not_in_logical' 'indirect_in_logical' - 'indirect_not_equal_constants' 'indirect_equal_constants' - 'indirect_not_in_constants' 'indirect_in_constants' 'direct_in_singleton' - 'direct_in' +Goal Check Lemma 'indirect_equal_ghost': Let a = L_Set2(int2_0, int1_0). Assume { Have: is_sint32(int1_0). Have: is_sint32(int2_0). } Prove: mem(int1_0, a) /\ mem(int2_0, a) /\ @@ -67,186 +50,47 @@ Prover Script returns Unsuccess ------------------------------------------------------------ -Goal Lemma 'indirect_equal_logical': -Assume Lemmas: 'indirect_not_in_logical' 'indirect_in_logical' - 'indirect_not_equal_constants' 'indirect_equal_constants' - 'indirect_not_in_constants' 'indirect_in_constants' 'direct_in_singleton' - 'direct_in' +Goal Check Lemma 'indirect_equal_logical': Prove: mem(1, L_Set3) /\ mem(2, L_Set3) /\ (forall i : Z. (mem(i, L_Set3) -> ((i = 1) \/ (i = 2)))). Prover Script returns Unsuccess ------------------------------------------------------------ -Goal Lemma 'indirect_in_constants': -Assume Lemmas: 'direct_in_singleton' 'direct_in' +Goal Check Lemma 'indirect_in_constants': Prove: mem(2, L_Set1). ------------------------------------------------------------ -Goal Lemma 'indirect_in_ghost': -Assume Lemmas: 'indirect_not_equal_logical' 'indirect_equal_logical' - 'indirect_not_in_logical' 'indirect_in_logical' - 'indirect_not_equal_constants' 'indirect_equal_constants' - 'indirect_not_in_constants' 'indirect_in_constants' 'direct_in_singleton' - 'direct_in' +Goal Check Lemma 'indirect_in_ghost': Assume { Have: is_sint32(int2_0). } Prove: mem(int2_0, L_Set2(int2_0, int1_0)). ------------------------------------------------------------ -Goal Lemma 'indirect_in_logical': -Assume Lemmas: 'indirect_not_equal_constants' 'indirect_equal_constants' - 'indirect_not_in_constants' 'indirect_in_constants' 'direct_in_singleton' - 'direct_in' +Goal Check Lemma 'indirect_in_logical': Prove: mem(2, L_Set3). ------------------------------------------------------------ -Goal Lemma 'indirect_not_equal_constants': -Assume Lemmas: 'indirect_equal_constants' 'indirect_not_in_constants' - 'indirect_in_constants' 'direct_in_singleton' 'direct_in' +Goal Check Lemma 'indirect_not_equal_constants': Prove: (!mem(0, L_Set1)) \/ (!mem(1, L_Set1)) \/ (!mem(2, L_Set1)) \/ (exists i : Z. (i != 0) /\ (i != 1) /\ (i != 2) /\ mem(i, L_Set1)). ------------------------------------------------------------ -Goal Lemma 'indirect_not_equal_logical': -Assume Lemmas: 'indirect_equal_logical' 'indirect_not_in_logical' - 'indirect_in_logical' 'indirect_not_equal_constants' - 'indirect_equal_constants' 'indirect_not_in_constants' - 'indirect_in_constants' 'direct_in_singleton' 'direct_in' +Goal Check Lemma 'indirect_not_equal_logical': Prove: (!mem(0, L_Set3)) \/ (!mem(1, L_Set3)) \/ (exists i : Z. (i != 0) /\ (i != 1) /\ mem(i, L_Set3)). ------------------------------------------------------------ -Goal Lemma 'indirect_not_in_constants': -Assume Lemmas: 'indirect_in_constants' 'direct_in_singleton' 'direct_in' +Goal Check Lemma 'indirect_not_in_constants': Prove: !mem(4, L_Set1). ------------------------------------------------------------ -Goal Lemma 'indirect_not_in_logical': -Assume Lemmas: 'indirect_in_logical' 'indirect_not_equal_constants' - 'indirect_equal_constants' 'indirect_not_in_constants' - 'indirect_in_constants' 'direct_in_singleton' 'direct_in' +Goal Check Lemma 'indirect_not_in_logical': Prove: !mem(0, L_Set3). ------------------------------------------------------------ - -Goal Lemma 'iota0_compute_0in_constants': -Assume Lemmas: 'rec_iota' 'rec_iota_gt0' 'rec_iota_le0' 'iota_ind0' - 'indirect_equal_ghost' 'indirect_in_ghost' 'indirect_not_equal_logical' - 'indirect_equal_logical' 'indirect_not_in_logical' 'indirect_in_logical' - 'indirect_not_equal_constants' 'indirect_equal_constants' - 'indirect_not_in_constants' 'indirect_in_constants' 'direct_in_singleton' - 'direct_in' -Prove: mem(0, L_iota(0)). - ------------------------------------------------------------- - -Goal Lemma 'iota1_compute_equal_constants': -Assume Lemmas: 'iota3_compute_equal_constants' 'iota3_compute_2in_constants' - 'iota3_compute_0in_constants' 'iota0_compute_0in_constants' 'rec_iota' - 'rec_iota_gt0' 'rec_iota_le0' 'iota_ind0' 'indirect_equal_ghost' - 'indirect_in_ghost' 'indirect_not_equal_logical' 'indirect_equal_logical' - 'indirect_not_in_logical' 'indirect_in_logical' - 'indirect_not_equal_constants' 'indirect_equal_constants' - 'indirect_not_in_constants' 'indirect_in_constants' 'direct_in_singleton' - 'direct_in' -Let a = L_iota(1). -Prove: mem(0, a) /\ mem(1, a) /\ - (forall i : Z. (mem(i, a) -> ((i = 0) \/ (i = 1)))). -Prover Script returns Unsuccess - ------------------------------------------------------------- - -Goal Lemma 'iota3_compute_0in_constants': -Assume Lemmas: 'iota0_compute_0in_constants' 'rec_iota' 'rec_iota_gt0' - 'rec_iota_le0' 'iota_ind0' 'indirect_equal_ghost' 'indirect_in_ghost' - 'indirect_not_equal_logical' 'indirect_equal_logical' - 'indirect_not_in_logical' 'indirect_in_logical' - 'indirect_not_equal_constants' 'indirect_equal_constants' - 'indirect_not_in_constants' 'indirect_in_constants' 'direct_in_singleton' - 'direct_in' -Prove: mem(0, L_iota(3)). - ------------------------------------------------------------- - -Goal Lemma 'iota3_compute_2in_constants': -Assume Lemmas: 'iota3_compute_0in_constants' 'iota0_compute_0in_constants' - 'rec_iota' 'rec_iota_gt0' 'rec_iota_le0' 'iota_ind0' 'indirect_equal_ghost' - 'indirect_in_ghost' 'indirect_not_equal_logical' 'indirect_equal_logical' - 'indirect_not_in_logical' 'indirect_in_logical' - 'indirect_not_equal_constants' 'indirect_equal_constants' - 'indirect_not_in_constants' 'indirect_in_constants' 'direct_in_singleton' - 'direct_in' -Prove: mem(2, L_iota(3)). - ------------------------------------------------------------- - -Goal Lemma 'iota3_compute_equal_constants': -Assume Lemmas: 'iota3_compute_2in_constants' 'iota3_compute_0in_constants' - 'iota0_compute_0in_constants' 'rec_iota' 'rec_iota_gt0' 'rec_iota_le0' - 'iota_ind0' 'indirect_equal_ghost' 'indirect_in_ghost' - 'indirect_not_equal_logical' 'indirect_equal_logical' - 'indirect_not_in_logical' 'indirect_in_logical' - 'indirect_not_equal_constants' 'indirect_equal_constants' - 'indirect_not_in_constants' 'indirect_in_constants' 'direct_in_singleton' - 'direct_in' -Let a = L_iota(3). -Prove: mem(0, a) /\ mem(1, a) /\ mem(2, a) /\ mem(3, a) /\ - (forall i : Z. (mem(i, a) -> ((i = 0) \/ (i = 1) \/ (i = 2) \/ (i = 3)))). -Prover Script returns Unsuccess - ------------------------------------------------------------- - -Goal Lemma 'iota_ind0': -Assume Lemmas: 'indirect_equal_ghost' 'indirect_in_ghost' - 'indirect_not_equal_logical' 'indirect_equal_logical' - 'indirect_not_in_logical' 'indirect_in_logical' - 'indirect_not_equal_constants' 'indirect_equal_constants' - 'indirect_not_in_constants' 'indirect_in_constants' 'direct_in_singleton' - 'direct_in' -Let a = L_iota(n). Assume { Have: n <= 0. } -Prove: mem(0, a) /\ (forall i : Z. (mem(i, a) -> (i = 0))). -Prover Script returns Unsuccess - ------------------------------------------------------------- - -Goal Lemma 'rec_iota': -Assume Lemmas: 'rec_iota_gt0' 'rec_iota_le0' 'iota_ind0' - 'indirect_equal_ghost' 'indirect_in_ghost' 'indirect_not_equal_logical' - 'indirect_equal_logical' 'indirect_not_in_logical' 'indirect_in_logical' - 'indirect_not_equal_constants' 'indirect_equal_constants' - 'indirect_not_in_constants' 'indirect_in_constants' 'direct_in_singleton' - 'direct_in' -Assume { Have: mem(i, L_iota(n)). } -Prove: (n = i) \/ mem(i, L_iota(n - 1)). - ------------------------------------------------------------- - -Goal Lemma 'rec_iota_gt0': -Assume Lemmas: 'rec_iota_le0' 'iota_ind0' 'indirect_equal_ghost' - 'indirect_in_ghost' 'indirect_not_equal_logical' 'indirect_equal_logical' - 'indirect_not_in_logical' 'indirect_in_logical' - 'indirect_not_equal_constants' 'indirect_equal_constants' - 'indirect_not_in_constants' 'indirect_in_constants' 'direct_in_singleton' - 'direct_in' -Assume { Have: 0 < n. Have: mem(i, L_iota(n)). } -Prove: (n = i) \/ mem(i, L_iota(n - 1)). - ------------------------------------------------------------- - -Goal Lemma 'rec_iota_le0': -Assume Lemmas: 'iota_ind0' 'indirect_equal_ghost' 'indirect_in_ghost' - 'indirect_not_equal_logical' 'indirect_equal_logical' - 'indirect_not_in_logical' 'indirect_in_logical' - 'indirect_not_equal_constants' 'indirect_equal_constants' - 'indirect_not_in_constants' 'indirect_in_constants' 'direct_in_singleton' - 'direct_in' -Assume { Have: n <= 0. Have: mem(i, L_iota(n)). } -Prove: i = 0. - ------------------------------------------------------------- diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/vset.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/vset.res.oracle index 43212023105..389e0d1d4cc 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/vset.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/vset.res.oracle @@ -1,33 +1,23 @@ # frama-c -wp [...] [kernel] Parsing vset.i (no preprocessing) [wp] Running WP plugin... -[wp] 21 goals scheduled -[wp] [Valid] typed_lemma_direct_in (Qed) -[wp] [Valid] typed_lemma_direct_in_singleton (Qed) -[wp] [Valid] typed_lemma_indirect_equal_constants (Alt-Ergo) (Cached) -[wp] [Valid] typed_lemma_indirect_equal_ghost (Alt-Ergo) (Cached) -[wp] [Valid] typed_lemma_indirect_equal_logical (Alt-Ergo) (Cached) -[wp] [Valid] typed_lemma_indirect_in_constants (Alt-Ergo) (Cached) -[wp] [Valid] typed_lemma_indirect_in_ghost (Alt-Ergo) (Cached) -[wp] [Valid] typed_lemma_indirect_in_logical (Alt-Ergo) (Cached) -[wp] [Valid] typed_lemma_indirect_not_equal_constants (Alt-Ergo) (Cached) -[wp] [Valid] typed_lemma_indirect_not_equal_logical (Alt-Ergo) (Cached) -[wp] [Valid] typed_lemma_indirect_not_in_constants (Alt-Ergo) (Cached) -[wp] [Valid] typed_lemma_indirect_not_in_logical (Alt-Ergo) (Cached) -[wp] [Valid] typed_lemma_iota0_compute_0in_constants (Alt-Ergo) (Cached) -[wp] [Valid] typed_lemma_iota1_compute_equal_constants (Alt-Ergo) (Cached) -[wp] [Valid] typed_lemma_iota3_compute_0in_constants (Alt-Ergo) (Cached) -[wp] [Valid] typed_lemma_iota3_compute_2in_constants (Alt-Ergo) (Cached) -[wp] [Valid] typed_lemma_iota3_compute_equal_constants (Alt-Ergo) (Cached) -[wp] [Unsuccess] typed_lemma_iota_ind0 (Tactic) (Alt-Ergo) (Cached) -[wp] [Valid] typed_lemma_rec_iota (Alt-Ergo) (Cached) -[wp] [Unsuccess] typed_lemma_rec_iota_gt0 (Alt-Ergo) (Cached) -[wp] [Valid] typed_lemma_rec_iota_le0 (Alt-Ergo) (Cached) -[wp] Proved goals: 19 / 21 +[wp] 12 goals scheduled +[wp] [Valid] typed_check_lemma_direct_in (Qed) +[wp] [Valid] typed_check_lemma_direct_in_singleton (Qed) +[wp] [Valid] typed_check_lemma_indirect_equal_constants (Alt-Ergo) (Cached) +[wp] [Valid] typed_check_lemma_indirect_equal_ghost (Alt-Ergo) (Cached) +[wp] [Valid] typed_check_lemma_indirect_equal_logical (Alt-Ergo) (Cached) +[wp] [Valid] typed_check_lemma_indirect_in_constants (Alt-Ergo) (Cached) +[wp] [Valid] typed_check_lemma_indirect_in_ghost (Alt-Ergo) (Cached) +[wp] [Valid] typed_check_lemma_indirect_in_logical (Alt-Ergo) (Cached) +[wp] [Valid] typed_check_lemma_indirect_not_equal_constants (Alt-Ergo) (Cached) +[wp] [Valid] typed_check_lemma_indirect_not_equal_logical (Alt-Ergo) (Cached) +[wp] [Valid] typed_check_lemma_indirect_not_in_constants (Alt-Ergo) (Cached) +[wp] [Valid] typed_check_lemma_indirect_not_in_logical (Alt-Ergo) (Cached) +[wp] Proved goals: 12 / 12 Qed: 2 - Alt-Ergo: 17 - Unsuccess: 2 + Alt-Ergo: 10 ------------------------------------------------------------ Axiomatics WP Alt-Ergo Total Success - Lemma 2 17 21 90.5% + Lemma 2 10 12 100% ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/vset.i b/src/plugins/wp/tests/wp_acsl/vset.i index efe4e4e52c7..8fb1f69586b 100644 --- a/src/plugins/wp/tests/wp_acsl/vset.i +++ b/src/plugins/wp/tests/wp_acsl/vset.i @@ -5,55 +5,26 @@ OPT:-wp-auto wp:split */ -//@ lemma direct_in: 2 \in {1,2,3}; -//@ lemma direct_in_singleton: 2 \in {2}; +//@ check lemma direct_in: 2 \in {1,2,3}; +//@ check lemma direct_in_singleton: 2 \in {2}; //@ logic set<integer> Set1 = {1,2,3}; -//@ lemma indirect_in_constants: 2 \in Set1; -//@ lemma indirect_not_in_constants: ! (4 \in Set1); -//@ lemma indirect_equal_constants: Set1 == {1,2,3}; -//@ lemma indirect_not_equal_constants: Set1 != {0,1,2}; +//@ check lemma indirect_in_constants: 2 \in Set1; +//@ check lemma indirect_not_in_constants: ! (4 \in Set1); +//@ check lemma indirect_equal_constants: Set1 == {1,2,3}; +//@ check lemma indirect_not_equal_constants: Set1 != {0,1,2}; //@ logic integer i0 = 0; //@ logic integer i1 = 1; //@ logic integer i2 = 2; //@ logic set<integer> Set3 = {i1,i2}; -//@ lemma indirect_in_logical: i2 \in Set3; -//@ lemma indirect_not_in_logical: ! (i0 \in Set3); -//@ lemma indirect_equal_logical: Set3 == {i1,i2}; -//@ lemma indirect_not_equal_logical: Set3 != {i0,i1}; +//@ check lemma indirect_in_logical: i2 \in Set3; +//@ check lemma indirect_not_in_logical: ! (i0 \in Set3); +//@ check lemma indirect_equal_logical: Set3 == {i1,i2}; +//@ check lemma indirect_not_equal_logical: Set3 != {i0,i1}; //@ ghost int int1 = 1; //@ ghost int int2 = 2; //@ logic set<int> Set2 = {int1,int2}; -//@ lemma indirect_in_ghost: int2 \in Set2; -//@ lemma indirect_equal_ghost: Set2 == {int1,int2}; - -/*@ - logic set<integer> iota(integer n) = - (n <= 0) ? {0} : \union({n}, iota(n-1)) ; - - lemma iota_ind0: - \forall integer n; - n <= 0 ==> iota(n) == {0}; - lemma rec_iota_le0: - \forall integer i, n; - i \in iota(n) ==> - n <= 0 ==> - i==0; - lemma rec_iota_gt0: - \forall integer i, n; - i \in iota(n) ==> - 0 < n ==> - i==n || i \in iota(n-1); - lemma rec_iota: - \forall integer i, n; - i \in iota(n) ==> i==n || i \in iota(n-1); - - lemma iota0_compute_0in_constants: 0 \in iota(0); - lemma iota3_compute_0in_constants: 0 \in iota(3); - lemma iota3_compute_2in_constants: 2 \in iota(3); - lemma iota3_compute_equal_constants: iota(3) == { 0, 1, 2, 3 }; - lemma iota1_compute_equal_constants: iota(1) == { 0, 1 }; - -*/ +//@ check lemma indirect_in_ghost: int2 \in Set2; +//@ check lemma indirect_equal_ghost: Set2 == {int1,int2}; -- GitLab