diff --git a/src/plugins/e-acsl/doc/Changelog b/src/plugins/e-acsl/doc/Changelog
index 022f7f94c48a7b130f084747ea95af70a73102f8..6a8454d1f870128ebd5abfa85b2cc9a1daefc381 100644
--- a/src/plugins/e-acsl/doc/Changelog
+++ b/src/plugins/e-acsl/doc/Changelog
@@ -26,6 +26,7 @@ Plugin E-ACSL <next-release>
 ############################
 
 - E-ACSL        [2022-19-07] Improve typing precision of variables appearing in comparisons
+-* E-ACSL       [2022-09-08] Fix typing of recursive predicates (frama-c/e-acsl#198)
 -* E-ACSL       [2022-17-06] Fix wrong cast from pointer to integer (frama-c/frama-c#1119)
 
 ##############################
diff --git a/src/plugins/e-acsl/src/analyses/analyses_datatype.ml b/src/plugins/e-acsl/src/analyses/analyses_datatype.ml
index ff6fc08f5e8d05749968825aaf6463db4c5df880..ee5f4bee348d8bc186c54f7bd0c0534b4d9d0860 100644
--- a/src/plugins/e-acsl/src/analyses/analyses_datatype.ml
+++ b/src/plugins/e-acsl/src/analyses/analyses_datatype.ml
@@ -420,6 +420,9 @@ module LF_env
 
   let add li profile ival = LFProf.Hashtbl.add tbl (li,profile) ival
 
+  let add_pred li profile =
+    LFProf.Hashtbl.add tbl (li,profile) (Ival Ival.zero_or_one)
+
   exception Recursive
 
   let contain li = object
diff --git a/src/plugins/e-acsl/src/analyses/analyses_datatype.mli b/src/plugins/e-acsl/src/analyses/analyses_datatype.mli
index 9cafe69c93a70301e49ffe2d73ccf84a3d6120c4..a68b6880da6e645ae0fc22b2fbfc4ee87526fd19 100644
--- a/src/plugins/e-acsl/src/analyses/analyses_datatype.mli
+++ b/src/plugins/e-acsl/src/analyses/analyses_datatype.mli
@@ -105,14 +105,23 @@ end
 (** Imperative environment to perform the fixpoint algorithm for recursive
     functions *)
 module LF_env : sig
+  (** find the currently inferred interval for a call to a logic function *)
   val find : logic_info -> Profile.t -> ival
 
+  (** clear the table of intervals for logic function (to do between typing )
+      each logic function calls *)
   val clear : unit -> unit
 
+  (** add an interval as the current one for a logic function call *)
   val add : logic_info -> Profile.t -> ival -> unit
 
+  (** add 0..1 as the current interval for a predicate call *)
+  val add_pred : logic_info -> Profile.t -> unit
+
+  (** determine whether a logic function or predicate is recursive *)
   val is_rec : logic_info -> bool
 
+  (** replace the current interval for a logic function call *)
   val replace : logic_info -> Profile.t -> ival -> unit
 end
 
diff --git a/src/plugins/e-acsl/src/analyses/interval.ml b/src/plugins/e-acsl/src/analyses/interval.ml
index 833d84ed21d5755e1b3763d8da9ac37b62d9d232..f2937821bc68e16241c86164a9964f1a9e12c215 100644
--- a/src/plugins/e-acsl/src/analyses/interval.ml
+++ b/src/plugins/e-acsl/src/analyses/interval.ml
@@ -739,28 +739,36 @@ let rec infer ~force ~logic_env t =
                 (fun arg -> get_res (infer ~force ~logic_env arg))
                 args)
          in
-         (match li.l_body with
-          | LBpred p ->
-            let logic_env = Logic_env.make profile in
-            ignore (infer_predicate ~logic_env p);
-            Ival Ival.zero_or_one
-          | LBterm t' when LF_env.is_rec li ->
-            let widened_profile = widen_profile profile in
-            Widened_profile.add profile li widened_profile;
-            (try LF_env.find li widened_profile
-             with Not_found ->
-               fixpoint ~infer li widened_profile t' (Ival Ival.bottom))
-          | LBterm t' ->
-            let logic_env = Logic_env.make profile in
-            (* If the logic function returns a C type, then its application
-               ranges inside this C type *)
-            (match li.l_type with
-             | Some (Ctype typ) ->
-               ignore ((infer ~force ~logic_env t'));
-               interv_of_typ typ;
-             | None | Some (Linteger | Lreal | Ltype _ | Lvar _ | Larrow _) ->
-               get_res (infer ~force ~logic_env t'))
-          | _ -> assert false)
+         if LF_env.is_rec li then
+           let widened_profile = widen_profile profile in
+           Widened_profile.add profile li widened_profile;
+           (match li.l_body with
+            | LBpred p ->
+              LF_env.add_pred li widened_profile;
+              infer_predicate
+                ~logic_env:(Logic_env.make widened_profile) p;
+              Ival Ival.zero_or_one
+            | LBterm t' ->
+              (try LF_env.find li widened_profile
+               with Not_found ->
+                 fixpoint ~infer li widened_profile t' (Ival Ival.bottom))
+            | _ -> assert false)
+         else
+           let logic_env = Logic_env.make profile in
+           (match li.l_body with
+            | LBpred p ->
+              ignore (infer_predicate ~logic_env p);
+              Ival Ival.zero_or_one
+            | LBterm t' ->
+              (* If the logic function returns a C type, then its application
+                 ranges inside this C type *)
+              (match li.l_type with
+               | Some (Ctype typ) ->
+                 ignore ((infer ~force ~logic_env t'));
+                 interv_of_typ typ;
+               | None | Some (Linteger | Lreal | Ltype _ | Lvar _ | Larrow _) ->
+                 get_res (infer ~force ~logic_env t'))
+            | _ -> assert false)
        | LBnone when li.l_var_info.lv_name = "\\sum" ||
                      li.l_var_info.lv_name = "\\product" ->
          (match args with
@@ -1011,15 +1019,22 @@ and infer_predicate ~logic_env p =
   match p.pred_content with
   | Pfalse | Ptrue -> ()
   | Papp(li, _, args) ->
+    let profile =
+      Profile.make
+        li.l_profile
+        (List.map
+           (fun arg -> get_res (infer ~force:false ~logic_env arg))
+           args)
+    in
     (match li.l_body with
+     | LBpred p when LF_env.is_rec li ->
+       let widened_profile = widen_profile profile in
+       Widened_profile.add profile li widened_profile;
+       (try ignore (LF_env.find li widened_profile)
+        with Not_found ->
+          LF_env.add_pred li widened_profile;
+          infer_predicate ~logic_env:(Logic_env.make widened_profile) p)
      | LBpred p ->
-       let profile =
-         Profile.make
-           li.l_profile
-           (List.map
-              (fun arg -> get_res (infer ~force:false ~logic_env arg))
-              args)
-       in
        let logic_env = Logic_env.make profile in
        ignore (infer_predicate ~logic_env p)
      | LBnone -> ()
diff --git a/src/plugins/e-acsl/src/analyses/typing.ml b/src/plugins/e-acsl/src/analyses/typing.ml
index 88a168eb010bc49502d7fa635c930a9e3f5092fa..a0c223cb540acb2432f3cbd39c65f3917e98066f 100644
--- a/src/plugins/e-acsl/src/analyses/typing.ml
+++ b/src/plugins/e-acsl/src/analyses/typing.ml
@@ -208,6 +208,19 @@ end = struct
 
 end
 
+module Recursive_pred : sig
+  val add: Profile.t -> logic_info -> unit
+  val is_done: Profile.t -> logic_info -> bool
+end = struct
+  let known = ref LFProf.Set.empty
+
+  let add profile li =
+    known := LFProf.Set.add (li, profile) !known
+
+  let is_done profile li = LFProf.Set.mem (li, profile) !known
+
+end
+
 (******************************************************************************)
 (** {2 Coercion rules} *)
 (******************************************************************************)
@@ -558,6 +571,7 @@ let rec type_term
               li.l_profile
               (List.map (Interval.get_from_profile ~profile) args)
           in
+          let new_profile = Interval.get_widened_profile new_profile li in
           Stack.push
             (fun () ->
                ignore (type_predicate ~profile:new_profile p))
@@ -776,7 +790,11 @@ and type_predicate ~profile p =
             li.l_profile
             (List.map (Interval.get_from_profile ~profile) args)
         in
-        type_predicate ~profile:new_profile p;
+        let new_profile = Interval.get_widened_profile new_profile li in
+        if not (Recursive_pred.is_done new_profile li)
+        then
+          (Recursive_pred.add new_profile li;
+           ignore (type_predicate ~profile:new_profile p))
       | LBnone -> ()
       | LBreads _ -> ()
       | LBinductive _ -> ()
diff --git a/src/plugins/e-acsl/tests/arith/functions_rec.c b/src/plugins/e-acsl/tests/arith/functions_rec.c
index 8e39fbc3c6bcb44024412eb1d4c7cb59386a0a5f..e4908775642fe3d3693adbd84352b3e1d5eef3df 100644
--- a/src/plugins/e-acsl/tests/arith/functions_rec.c
+++ b/src/plugins/e-acsl/tests/arith/functions_rec.c
@@ -6,6 +6,18 @@
   STDOPT: +"-eva-unroll-recursive-calls 100"
 */
 
+/*@ predicate even (integer n) =
+      n == 0 ? \true :
+      n > 0 ? ! even (n - 1) :
+      ! even (n + 1);
+*/
+
+/*@ predicate even_and_not_negative (integer n) =
+      n == 0 ? \true :
+      n > 0 ? ! even (n - 1) :
+      \false;
+*/
+
 /*@ logic integer f1(integer n) =
     n <= 0 ? 0 : f1(n - 1) + n; */
 
@@ -25,9 +37,12 @@
   n >= 0 ? 0 : f5(n + 1) + n; */
 
 int main(void) {
+  /*@ assert even(10); @*/;
+  /*@ assert even(-6); @*/;
+  /*@ assert even_and_not_negative(10); */;
   /*@ assert f1(0) == 0; */;
   /*@ assert f1(1) == 1; */;
-  /*@ assert f1(100) == 5050; */;
+  /*@ assert f1(10) == 55; */;
 
   /*@ assert f2(7) == 1; */;
 
diff --git a/src/plugins/e-acsl/tests/arith/oracle/functions_rec.res.oracle b/src/plugins/e-acsl/tests/arith/oracle/functions_rec.res.oracle
index d064060bb6adc24506499219f6f10a0afa5ffc35..6332bd48d4b8d961b978cbf1ee83e7f3f568e931 100644
--- a/src/plugins/e-acsl/tests/arith/oracle/functions_rec.res.oracle
+++ b/src/plugins/e-acsl/tests/arith/oracle/functions_rec.res.oracle
@@ -1,32 +1,61 @@
 [e-acsl] beginning translation.
 [e-acsl] translation done in project "e-acsl".
-[eva:alarm] functions_rec.c:28: Warning: 
+[eva:alarm] functions_rec.c:11: Warning: 
+  accessing uninitialized left-value.
+  assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub);
+[eva:alarm] functions_rec.c:11: Warning: 
+  accessing uninitialized left-value.
+  assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_2);
+[eva] functions_rec.c:11: Warning: 
+  Using specification of function __gen_e_acsl_even_3 for recursive calls.
+  Analysis of function __gen_e_acsl_even_3 is thus incomplete and its soundness
+  relies on the written specification.
+[eva:alarm] functions_rec.c:12: Warning: 
+  accessing uninitialized left-value.
+  assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_add);
+[eva] functions_rec.c:12: Warning: 
+  Using specification of function __gen_e_acsl_even_3 for recursive calls.
+  Analysis of function __gen_e_acsl_even_3 is thus incomplete and its soundness
+  relies on the written specification.
+[eva:alarm] functions_rec.c:40: Warning: 
+  function __e_acsl_assert, behavior blocking: precondition got status unknown.
+[eva:alarm] functions_rec.c:40: Warning: assertion got status unknown.
+[eva:alarm] functions_rec.c:12: Warning: 
+  accessing uninitialized left-value.
+  assert \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_add_2);
+[eva:alarm] functions_rec.c:41: Warning: 
+  function __e_acsl_assert, behavior blocking: precondition got status unknown.
+[eva:alarm] functions_rec.c:41: Warning: assertion got status unknown.
+[eva:alarm] functions_rec.c:42: Warning: 
+  function __e_acsl_assert, behavior blocking: precondition got status unknown.
+[eva:alarm] functions_rec.c:42: Warning: assertion got status unknown.
+[eva:alarm] functions_rec.c:43: Warning: 
   function __e_acsl_assert, behavior blocking: precondition got status unknown.
-[eva:alarm] functions_rec.c:28: Warning: assertion got status unknown.
-[eva] functions_rec.c:10: Warning: 
+[eva:alarm] functions_rec.c:43: Warning: assertion got status unknown.
+[eva] functions_rec.c:22: Warning: 
   Using specification of function __gen_e_acsl_f1 for recursive calls.
   Analysis of function __gen_e_acsl_f1 is thus incomplete and its soundness
   relies on the written specification.
-[eva:alarm] functions_rec.c:29: Warning: 
+[eva:alarm] functions_rec.c:44: Warning: 
   function __e_acsl_assert, behavior blocking: precondition got status unknown.
-[eva:alarm] functions_rec.c:29: Warning: assertion got status unknown.
-[eva:alarm] functions_rec.c:30: Warning: 
+[eva:alarm] functions_rec.c:44: Warning: assertion got status unknown.
+[eva:alarm] functions_rec.c:45: Warning: 
   function __e_acsl_assert, behavior blocking: precondition got status unknown.
-[eva:alarm] functions_rec.c:30: Warning: assertion got status unknown.
-[eva] functions_rec.c:13: Warning: 
+[eva:alarm] functions_rec.c:45: Warning: assertion got status unknown.
+[eva] functions_rec.c:25: Warning: 
   Using specification of function __gen_e_acsl_f2 for recursive calls.
   Analysis of function __gen_e_acsl_f2 is thus incomplete and its soundness
   relies on the written specification.
-[eva] functions_rec.c:13: Warning: 
+[eva] functions_rec.c:25: Warning: 
   Using specification of function __gen_e_acsl_f2 for recursive calls.
   Analysis of function __gen_e_acsl_f2 is thus incomplete and its soundness
   relies on the written specification.
-[eva] functions_rec.c:13: Warning: 
+[eva] functions_rec.c:25: Warning: 
   Using specification of function __gen_e_acsl_f2 for recursive calls.
   Analysis of function __gen_e_acsl_f2 is thus incomplete and its soundness
   relies on the written specification.
-[eva:alarm] functions_rec.c:13: Warning: assertion 'E_ACSL' got status unknown.
-[eva:alarm] functions_rec.c:13: Warning: 
+[eva:alarm] functions_rec.c:25: Warning: assertion 'E_ACSL' got status unknown.
+[eva:alarm] functions_rec.c:25: Warning: 
   function __e_acsl_assert, behavior blocking: precondition got status unknown.
-[eva:alarm] functions_rec.c:13: Warning: 
+[eva:alarm] functions_rec.c:25: Warning: 
   accessing uninitialized left-value. assert \initialized(&n);
diff --git a/src/plugins/e-acsl/tests/arith/oracle/gen_functions_rec.c b/src/plugins/e-acsl/tests/arith/oracle/gen_functions_rec.c
index 95fb94d1c880ce5ac7c7313803b6647c83428c95..7c2bcabacd397e0c75e4c589de4872c23e20b9ff 100644
--- a/src/plugins/e-acsl/tests/arith/oracle/gen_functions_rec.c
+++ b/src/plugins/e-acsl/tests/arith/oracle/gen_functions_rec.c
@@ -8,6 +8,23 @@
 #include "time.h"
 extern  __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict;
 
+/*@
+predicate even(integer n) =
+  n == 0? \true: (n > 0? !even(n - 1): !even(n + 1));
+
+*/
+int __gen_e_acsl_even_2(long n);
+
+int __gen_e_acsl_even(int n);
+
+int __gen_e_acsl_even_3(__e_acsl_mpz_struct * n);
+
+/*@
+predicate even_and_not_negative(integer n) =
+  n == 0? \true: (n > 0? !even(n - 1): \false);
+ */
+int __gen_e_acsl_even_and_not_negative(int n);
+
 /*@ logic integer f1(integer n) = n <= 0? 0: f1(n - 1) + n;
  */
 void __gen_e_acsl_f1(__e_acsl_mpz_t *__retres_arg, int n);
@@ -45,188 +62,242 @@ int main(void)
   int __retres;
   __e_acsl_memory_init((int *)0,(char ***)0,8UL);
   {
-    __e_acsl_mpz_t __gen_e_acsl_f1_4;
-    __e_acsl_mpz_t __gen_e_acsl__2;
-    int __gen_e_acsl_eq;
+    int __gen_e_acsl_even_14;
     __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0};
-    __gen_e_acsl_f1(& __gen_e_acsl_f1_4,0);
-    __gmpz_init_set_si(__gen_e_acsl__2,0L);
-    __gen_e_acsl_eq = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_4),
-                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl__2));
-    __e_acsl_assert_register_mpz(& __gen_e_acsl_assert_data,"f1(0)",0,
-                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_4));
+    __gen_e_acsl_even_14 = __gen_e_acsl_even(10);
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data,"even(10)",0,
+                                 __gen_e_acsl_even_14);
     __gen_e_acsl_assert_data.blocking = 1;
     __gen_e_acsl_assert_data.kind = "Assertion";
-    __gen_e_acsl_assert_data.pred_txt = "f1(0) == 0";
+    __gen_e_acsl_assert_data.pred_txt = "even(10)";
     __gen_e_acsl_assert_data.file = "functions_rec.c";
     __gen_e_acsl_assert_data.fct = "main";
-    __gen_e_acsl_assert_data.line = 28;
-    __e_acsl_assert(__gen_e_acsl_eq == 0,& __gen_e_acsl_assert_data);
+    __gen_e_acsl_assert_data.line = 40;
+    __e_acsl_assert(__gen_e_acsl_even_14,& __gen_e_acsl_assert_data);
     __e_acsl_assert_clean(& __gen_e_acsl_assert_data);
-    __gmpz_clear(__gen_e_acsl_f1_4);
-    __gmpz_clear(__gen_e_acsl__2);
   }
-  /*@ assert f1(0) == 0; */ ;
+  /*@ assert even(10); */ ;
   {
-    __e_acsl_mpz_t __gen_e_acsl_f1_6;
-    __e_acsl_mpz_t __gen_e_acsl__3;
-    int __gen_e_acsl_eq_2;
+    int __gen_e_acsl_even_16;
     __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 =
       {.values = (void *)0};
-    __gen_e_acsl_f1(& __gen_e_acsl_f1_6,1);
-    __gmpz_init_set_si(__gen_e_acsl__3,1L);
-    __gen_e_acsl_eq_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_6),
-                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__3));
-    __e_acsl_assert_register_mpz(& __gen_e_acsl_assert_data_2,"f1(1)",0,
-                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_6));
+    __gen_e_acsl_even_16 = __gen_e_acsl_even(-6);
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"even(-6)",0,
+                                 __gen_e_acsl_even_16);
     __gen_e_acsl_assert_data_2.blocking = 1;
     __gen_e_acsl_assert_data_2.kind = "Assertion";
-    __gen_e_acsl_assert_data_2.pred_txt = "f1(1) == 1";
+    __gen_e_acsl_assert_data_2.pred_txt = "even(-6)";
     __gen_e_acsl_assert_data_2.file = "functions_rec.c";
     __gen_e_acsl_assert_data_2.fct = "main";
-    __gen_e_acsl_assert_data_2.line = 29;
-    __e_acsl_assert(__gen_e_acsl_eq_2 == 0,& __gen_e_acsl_assert_data_2);
+    __gen_e_acsl_assert_data_2.line = 41;
+    __e_acsl_assert(__gen_e_acsl_even_16,& __gen_e_acsl_assert_data_2);
     __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2);
-    __gmpz_clear(__gen_e_acsl_f1_6);
-    __gmpz_clear(__gen_e_acsl__3);
   }
-  /*@ assert f1(1) == 1; */ ;
+  /*@ assert even(-6); */ ;
   {
-    __e_acsl_mpz_t __gen_e_acsl_f1_8;
-    __e_acsl_mpz_t __gen_e_acsl__4;
-    int __gen_e_acsl_eq_3;
+    int __gen_e_acsl_even_and_not_negative_2;
     __e_acsl_assert_data_t __gen_e_acsl_assert_data_3 =
       {.values = (void *)0};
-    __gen_e_acsl_f1(& __gen_e_acsl_f1_8,100);
-    __gmpz_init_set_si(__gen_e_acsl__4,5050L);
-    __gen_e_acsl_eq_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_8),
-                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__4));
-    __e_acsl_assert_register_mpz(& __gen_e_acsl_assert_data_3,"f1(100)",0,
-                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_8));
+    __gen_e_acsl_even_and_not_negative_2 = __gen_e_acsl_even_and_not_negative
+    (10);
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_3,
+                                 "even_and_not_negative(10)",0,
+                                 __gen_e_acsl_even_and_not_negative_2);
     __gen_e_acsl_assert_data_3.blocking = 1;
     __gen_e_acsl_assert_data_3.kind = "Assertion";
-    __gen_e_acsl_assert_data_3.pred_txt = "f1(100) == 5050";
+    __gen_e_acsl_assert_data_3.pred_txt = "even_and_not_negative(10)";
     __gen_e_acsl_assert_data_3.file = "functions_rec.c";
     __gen_e_acsl_assert_data_3.fct = "main";
-    __gen_e_acsl_assert_data_3.line = 30;
-    __e_acsl_assert(__gen_e_acsl_eq_3 == 0,& __gen_e_acsl_assert_data_3);
+    __gen_e_acsl_assert_data_3.line = 42;
+    __e_acsl_assert(__gen_e_acsl_even_and_not_negative_2,
+                    & __gen_e_acsl_assert_data_3);
     __e_acsl_assert_clean(& __gen_e_acsl_assert_data_3);
-    __gmpz_clear(__gen_e_acsl_f1_8);
-    __gmpz_clear(__gen_e_acsl__4);
   }
-  /*@ assert f1(100) == 5050; */ ;
+  /*@ assert even_and_not_negative(10); */ ;
   {
-    __e_acsl_mpz_t __gen_e_acsl_f2_8;
-    __e_acsl_mpz_t __gen_e_acsl__7;
-    int __gen_e_acsl_eq_4;
+    __e_acsl_mpz_t __gen_e_acsl_f1_4;
+    __e_acsl_mpz_t __gen_e_acsl__8;
+    int __gen_e_acsl_eq_2;
     __e_acsl_assert_data_t __gen_e_acsl_assert_data_4 =
       {.values = (void *)0};
-    __gen_e_acsl_f2(& __gen_e_acsl_f2_8,7);
-    __gmpz_init_set_si(__gen_e_acsl__7,1L);
-    __gen_e_acsl_eq_4 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_8),
-                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__7));
-    /*@ assert Eva: initialization: \initialized(&n); */
-    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_5,"n",0,n);
-    __e_acsl_assert_register_mpz(& __gen_e_acsl_assert_data_5,"f2(n - 3)",0,
-                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_7));
-    __e_acsl_assert_register_mpz(& __gen_e_acsl_assert_data_4,"f2(7)",0,
-                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_8));
+    __gen_e_acsl_f1(& __gen_e_acsl_f1_4,0);
+    __gmpz_init_set_si(__gen_e_acsl__8,0L);
+    __gen_e_acsl_eq_2 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_4),
+                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__8));
+    __e_acsl_assert_register_mpz(& __gen_e_acsl_assert_data_4,"f1(0)",0,
+                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_4));
     __gen_e_acsl_assert_data_4.blocking = 1;
     __gen_e_acsl_assert_data_4.kind = "Assertion";
-    __gen_e_acsl_assert_data_4.pred_txt = "f2(7) == 1";
+    __gen_e_acsl_assert_data_4.pred_txt = "f1(0) == 0";
     __gen_e_acsl_assert_data_4.file = "functions_rec.c";
     __gen_e_acsl_assert_data_4.fct = "main";
-    __gen_e_acsl_assert_data_4.line = 32;
-    __e_acsl_assert(__gen_e_acsl_eq_4 == 0,& __gen_e_acsl_assert_data_4);
+    __gen_e_acsl_assert_data_4.line = 43;
+    __e_acsl_assert(__gen_e_acsl_eq_2 == 0,& __gen_e_acsl_assert_data_4);
     __e_acsl_assert_clean(& __gen_e_acsl_assert_data_4);
-    __gmpz_clear(__gen_e_acsl_f2_8);
-    __gmpz_clear(__gen_e_acsl__7);
+    __gmpz_clear(__gen_e_acsl_f1_4);
+    __gmpz_clear(__gen_e_acsl__8);
   }
-  /*@ assert f2(7) == 1; */ ;
+  /*@ assert f1(0) == 0; */ ;
   {
-    int __gen_e_acsl_f3_4;
+    __e_acsl_mpz_t __gen_e_acsl_f1_6;
+    __e_acsl_mpz_t __gen_e_acsl__9;
+    int __gen_e_acsl_eq_3;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_5 =
+      {.values = (void *)0};
+    __gen_e_acsl_f1(& __gen_e_acsl_f1_6,1);
+    __gmpz_init_set_si(__gen_e_acsl__9,1L);
+    __gen_e_acsl_eq_3 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_6),
+                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__9));
+    __e_acsl_assert_register_mpz(& __gen_e_acsl_assert_data_5,"f1(1)",0,
+                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_6));
+    __gen_e_acsl_assert_data_5.blocking = 1;
+    __gen_e_acsl_assert_data_5.kind = "Assertion";
+    __gen_e_acsl_assert_data_5.pred_txt = "f1(1) == 1";
+    __gen_e_acsl_assert_data_5.file = "functions_rec.c";
+    __gen_e_acsl_assert_data_5.fct = "main";
+    __gen_e_acsl_assert_data_5.line = 44;
+    __e_acsl_assert(__gen_e_acsl_eq_3 == 0,& __gen_e_acsl_assert_data_5);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_5);
+    __gmpz_clear(__gen_e_acsl_f1_6);
+    __gmpz_clear(__gen_e_acsl__9);
+  }
+  /*@ assert f1(1) == 1; */ ;
+  {
+    __e_acsl_mpz_t __gen_e_acsl_f1_8;
+    __e_acsl_mpz_t __gen_e_acsl__10;
+    int __gen_e_acsl_eq_4;
     __e_acsl_assert_data_t __gen_e_acsl_assert_data_6 =
       {.values = (void *)0};
-    __gen_e_acsl_f3_4 = __gen_e_acsl_f3(6);
-    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_6,"f3(6)",0,
-                                 __gen_e_acsl_f3_4);
+    __gen_e_acsl_f1(& __gen_e_acsl_f1_8,10);
+    __gmpz_init_set_si(__gen_e_acsl__10,55L);
+    __gen_e_acsl_eq_4 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_8),
+                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__10));
+    __e_acsl_assert_register_mpz(& __gen_e_acsl_assert_data_6,"f1(10)",0,
+                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_8));
     __gen_e_acsl_assert_data_6.blocking = 1;
     __gen_e_acsl_assert_data_6.kind = "Assertion";
-    __gen_e_acsl_assert_data_6.pred_txt = "f3(6) == -5";
+    __gen_e_acsl_assert_data_6.pred_txt = "f1(10) == 55";
     __gen_e_acsl_assert_data_6.file = "functions_rec.c";
     __gen_e_acsl_assert_data_6.fct = "main";
-    __gen_e_acsl_assert_data_6.line = 34;
-    __e_acsl_assert(__gen_e_acsl_f3_4 == -5,& __gen_e_acsl_assert_data_6);
+    __gen_e_acsl_assert_data_6.line = 45;
+    __e_acsl_assert(__gen_e_acsl_eq_4 == 0,& __gen_e_acsl_assert_data_6);
     __e_acsl_assert_clean(& __gen_e_acsl_assert_data_6);
+    __gmpz_clear(__gen_e_acsl_f1_8);
+    __gmpz_clear(__gen_e_acsl__10);
   }
-  /*@ assert f3(6) == -5; */ ;
+  /*@ assert f1(10) == 55; */ ;
   {
-    unsigned long __gen_e_acsl_f4_4;
+    __e_acsl_mpz_t __gen_e_acsl_f2_8;
+    __e_acsl_mpz_t __gen_e_acsl__13;
+    int __gen_e_acsl_eq_5;
     __e_acsl_assert_data_t __gen_e_acsl_assert_data_7 =
       {.values = (void *)0};
-    __gen_e_acsl_f4_4 = __gen_e_acsl_f4(9);
-    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_7,"f4(9)",0,
-                                   __gen_e_acsl_f4_4);
+    __gen_e_acsl_f2(& __gen_e_acsl_f2_8,7);
+    __gmpz_init_set_si(__gen_e_acsl__13,1L);
+    __gen_e_acsl_eq_5 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_8),
+                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__13));
+    /*@ assert Eva: initialization: \initialized(&n); */
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_8,"n",0,n);
+    __e_acsl_assert_register_mpz(& __gen_e_acsl_assert_data_8,"f2(n - 3)",0,
+                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_7));
+    __e_acsl_assert_register_mpz(& __gen_e_acsl_assert_data_7,"f2(7)",0,
+                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_8));
     __gen_e_acsl_assert_data_7.blocking = 1;
     __gen_e_acsl_assert_data_7.kind = "Assertion";
-    __gen_e_acsl_assert_data_7.pred_txt = "f4(9) > 0";
+    __gen_e_acsl_assert_data_7.pred_txt = "f2(7) == 1";
     __gen_e_acsl_assert_data_7.file = "functions_rec.c";
     __gen_e_acsl_assert_data_7.fct = "main";
-    __gen_e_acsl_assert_data_7.line = 36;
-    __e_acsl_assert(__gen_e_acsl_f4_4 > 0UL,& __gen_e_acsl_assert_data_7);
+    __gen_e_acsl_assert_data_7.line = 47;
+    __e_acsl_assert(__gen_e_acsl_eq_5 == 0,& __gen_e_acsl_assert_data_7);
     __e_acsl_assert_clean(& __gen_e_acsl_assert_data_7);
+    __gmpz_clear(__gen_e_acsl_f2_8);
+    __gmpz_clear(__gen_e_acsl__13);
+  }
+  /*@ assert f2(7) == 1; */ ;
+  {
+    int __gen_e_acsl_f3_4;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_9 =
+      {.values = (void *)0};
+    __gen_e_acsl_f3_4 = __gen_e_acsl_f3(6);
+    __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_9,"f3(6)",0,
+                                 __gen_e_acsl_f3_4);
+    __gen_e_acsl_assert_data_9.blocking = 1;
+    __gen_e_acsl_assert_data_9.kind = "Assertion";
+    __gen_e_acsl_assert_data_9.pred_txt = "f3(6) == -5";
+    __gen_e_acsl_assert_data_9.file = "functions_rec.c";
+    __gen_e_acsl_assert_data_9.fct = "main";
+    __gen_e_acsl_assert_data_9.line = 49;
+    __e_acsl_assert(__gen_e_acsl_f3_4 == -5,& __gen_e_acsl_assert_data_9);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_9);
+  }
+  /*@ assert f3(6) == -5; */ ;
+  {
+    unsigned long __gen_e_acsl_f4_4;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_10 =
+      {.values = (void *)0};
+    __gen_e_acsl_f4_4 = __gen_e_acsl_f4(9);
+    __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data_10,"f4(9)",0,
+                                   __gen_e_acsl_f4_4);
+    __gen_e_acsl_assert_data_10.blocking = 1;
+    __gen_e_acsl_assert_data_10.kind = "Assertion";
+    __gen_e_acsl_assert_data_10.pred_txt = "f4(9) > 0";
+    __gen_e_acsl_assert_data_10.file = "functions_rec.c";
+    __gen_e_acsl_assert_data_10.fct = "main";
+    __gen_e_acsl_assert_data_10.line = 51;
+    __e_acsl_assert(__gen_e_acsl_f4_4 > 0UL,& __gen_e_acsl_assert_data_10);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_10);
   }
   /*@ assert f4(9) > 0; */ ;
   {
     __e_acsl_mpz_t __gen_e_acsl_f5_4;
-    __e_acsl_mpz_t __gen_e_acsl__9;
-    int __gen_e_acsl_eq_5;
-    __e_acsl_assert_data_t __gen_e_acsl_assert_data_8 =
+    __e_acsl_mpz_t __gen_e_acsl__15;
+    int __gen_e_acsl_eq_6;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_11 =
       {.values = (void *)0};
     __gen_e_acsl_f5(& __gen_e_acsl_f5_4,0);
-    __gmpz_init_set_si(__gen_e_acsl__9,0L);
-    __gen_e_acsl_eq_5 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f5_4),
-                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__9));
-    __e_acsl_assert_register_mpz(& __gen_e_acsl_assert_data_8,"f5(0)",0,
+    __gmpz_init_set_si(__gen_e_acsl__15,0L);
+    __gen_e_acsl_eq_6 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f5_4),
+                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__15));
+    __e_acsl_assert_register_mpz(& __gen_e_acsl_assert_data_11,"f5(0)",0,
                                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_f5_4));
-    __gen_e_acsl_assert_data_8.blocking = 1;
-    __gen_e_acsl_assert_data_8.kind = "Assertion";
-    __gen_e_acsl_assert_data_8.pred_txt = "f5(0) == 0";
-    __gen_e_acsl_assert_data_8.file = "functions_rec.c";
-    __gen_e_acsl_assert_data_8.fct = "main";
-    __gen_e_acsl_assert_data_8.line = 38;
-    __e_acsl_assert(__gen_e_acsl_eq_5 == 0,& __gen_e_acsl_assert_data_8);
-    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_8);
+    __gen_e_acsl_assert_data_11.blocking = 1;
+    __gen_e_acsl_assert_data_11.kind = "Assertion";
+    __gen_e_acsl_assert_data_11.pred_txt = "f5(0) == 0";
+    __gen_e_acsl_assert_data_11.file = "functions_rec.c";
+    __gen_e_acsl_assert_data_11.fct = "main";
+    __gen_e_acsl_assert_data_11.line = 53;
+    __e_acsl_assert(__gen_e_acsl_eq_6 == 0,& __gen_e_acsl_assert_data_11);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_11);
     __gmpz_clear(__gen_e_acsl_f5_4);
-    __gmpz_clear(__gen_e_acsl__9);
+    __gmpz_clear(__gen_e_acsl__15);
   }
   /*@ assert f5(0) == 0; */ ;
   {
-    long __gen_e_acsl_n_3;
+    long __gen_e_acsl_n_5;
     __e_acsl_mpz_t __gen_e_acsl_f5_8;
-    __e_acsl_mpz_t __gen_e_acsl__11;
-    int __gen_e_acsl_eq_6;
-    __e_acsl_assert_data_t __gen_e_acsl_assert_data_9 =
+    __e_acsl_mpz_t __gen_e_acsl__17;
+    int __gen_e_acsl_eq_7;
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_12 =
       {.values = (void *)0};
-    __gen_e_acsl_n_3 = 9223372036854775807L;
-    __gen_e_acsl_f5_5(& __gen_e_acsl_f5_8,__gen_e_acsl_n_3);
-    __gmpz_init_set_si(__gen_e_acsl__11,0L);
-    __gen_e_acsl_eq_6 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f5_8),
-                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__11));
-    __e_acsl_assert_register_long(& __gen_e_acsl_assert_data_9,"n",0,
-                                  __gen_e_acsl_n_3);
-    __e_acsl_assert_register_mpz(& __gen_e_acsl_assert_data_9,"f5(n)",0,
+    __gen_e_acsl_n_5 = 9223372036854775807L;
+    __gen_e_acsl_f5_5(& __gen_e_acsl_f5_8,__gen_e_acsl_n_5);
+    __gmpz_init_set_si(__gen_e_acsl__17,0L);
+    __gen_e_acsl_eq_7 = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f5_8),
+                                   (__e_acsl_mpz_struct const *)(__gen_e_acsl__17));
+    __e_acsl_assert_register_long(& __gen_e_acsl_assert_data_12,"n",0,
+                                  __gen_e_acsl_n_5);
+    __e_acsl_assert_register_mpz(& __gen_e_acsl_assert_data_12,"f5(n)",0,
                                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_f5_8));
-    __gen_e_acsl_assert_data_9.blocking = 1;
-    __gen_e_acsl_assert_data_9.kind = "Assertion";
-    __gen_e_acsl_assert_data_9.pred_txt = "\\let n = 0 == 0? 0x7fffffffffffffffL: -1; f5(n) == 0";
-    __gen_e_acsl_assert_data_9.file = "functions_rec.c";
-    __gen_e_acsl_assert_data_9.fct = "main";
-    __gen_e_acsl_assert_data_9.line = 40;
-    __e_acsl_assert(__gen_e_acsl_eq_6 == 0,& __gen_e_acsl_assert_data_9);
-    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_9);
+    __gen_e_acsl_assert_data_12.blocking = 1;
+    __gen_e_acsl_assert_data_12.kind = "Assertion";
+    __gen_e_acsl_assert_data_12.pred_txt = "\\let n = 0 == 0? 0x7fffffffffffffffL: -1; f5(n) == 0";
+    __gen_e_acsl_assert_data_12.file = "functions_rec.c";
+    __gen_e_acsl_assert_data_12.fct = "main";
+    __gen_e_acsl_assert_data_12.line = 55;
+    __e_acsl_assert(__gen_e_acsl_eq_7 == 0,& __gen_e_acsl_assert_data_12);
+    __e_acsl_assert_clean(& __gen_e_acsl_assert_data_12);
     __gmpz_clear(__gen_e_acsl_f5_8);
-    __gmpz_clear(__gen_e_acsl__11);
+    __gmpz_clear(__gen_e_acsl__17);
   }
   /*@ assert \let n = 0 == 0? 0x7fffffffffffffffL: -1; f5(n) == 0; */ ;
   __retres = 0;
@@ -234,37 +305,193 @@ int main(void)
   return __retres;
 }
 
+/*@ assigns \result;
+    assigns \result \from n; */
+int __gen_e_acsl_even_2(long n)
+{
+  int __gen_e_acsl_if_4;
+  if (n == 0L) __gen_e_acsl_if_4 = 1;
+  else {
+    int __gen_e_acsl_if_3;
+    if (n > 0L) {
+      __e_acsl_mpz_t __gen_e_acsl_n;
+      __e_acsl_mpz_t __gen_e_acsl_;
+      __e_acsl_mpz_t __gen_e_acsl_sub;
+      int __gen_e_acsl_even_8;
+      __gmpz_init_set_si(__gen_e_acsl_n,n);
+      __gmpz_init_set_si(__gen_e_acsl_,1L);
+      __gmpz_init(__gen_e_acsl_sub);
+      __gmpz_sub(__gen_e_acsl_sub,
+                 (__e_acsl_mpz_struct const *)(__gen_e_acsl_n),
+                 (__e_acsl_mpz_struct const *)(__gen_e_acsl_));
+      /*@ assert
+          Eva: initialization:
+            \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub);
+      */
+      __gen_e_acsl_even_8 = __gen_e_acsl_even_3((__e_acsl_mpz_struct *)__gen_e_acsl_sub);
+      __gen_e_acsl_if_3 = ! __gen_e_acsl_even_8;
+      __gmpz_clear(__gen_e_acsl_n);
+      __gmpz_clear(__gen_e_acsl_);
+      __gmpz_clear(__gen_e_acsl_sub);
+    }
+    else {
+      __e_acsl_mpz_t __gen_e_acsl_n_2;
+      __e_acsl_mpz_t __gen_e_acsl__6;
+      __e_acsl_mpz_t __gen_e_acsl_add_2;
+      int __gen_e_acsl_even_10;
+      __gmpz_init_set_si(__gen_e_acsl_n_2,n);
+      __gmpz_init_set_si(__gen_e_acsl__6,1L);
+      __gmpz_init(__gen_e_acsl_add_2);
+      __gmpz_add(__gen_e_acsl_add_2,
+                 (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_2),
+                 (__e_acsl_mpz_struct const *)(__gen_e_acsl__6));
+      /*@ assert
+          Eva: initialization:
+            \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_add_2);
+      */
+      __gen_e_acsl_even_10 = __gen_e_acsl_even_3((__e_acsl_mpz_struct *)__gen_e_acsl_add_2);
+      __gen_e_acsl_if_3 = ! __gen_e_acsl_even_10;
+      __gmpz_clear(__gen_e_acsl_n_2);
+      __gmpz_clear(__gen_e_acsl__6);
+      __gmpz_clear(__gen_e_acsl_add_2);
+    }
+    __gen_e_acsl_if_4 = __gen_e_acsl_if_3;
+  }
+  return __gen_e_acsl_if_4;
+}
+
+/*@ assigns \result;
+    assigns \result \from n; */
+int __gen_e_acsl_even(int n)
+{
+  int __gen_e_acsl_if_6;
+  if (n == 0) __gen_e_acsl_if_6 = 1;
+  else {
+    int __gen_e_acsl_if_5;
+    if (n > 0) {
+      int __gen_e_acsl_even_11;
+      __gen_e_acsl_even_11 = __gen_e_acsl_even_2(n - 1L);
+      __gen_e_acsl_if_5 = ! __gen_e_acsl_even_11;
+    }
+    else {
+      int __gen_e_acsl_even_13;
+      __gen_e_acsl_even_13 = __gen_e_acsl_even_2(n + 1L);
+      __gen_e_acsl_if_5 = ! __gen_e_acsl_even_13;
+    }
+    __gen_e_acsl_if_6 = __gen_e_acsl_if_5;
+  }
+  return __gen_e_acsl_if_6;
+}
+
+/*@ assigns \result;
+    assigns \result \from *((__e_acsl_mpz_struct *)n); */
+int __gen_e_acsl_even_3(__e_acsl_mpz_struct * n)
+{
+  __e_acsl_mpz_t __gen_e_acsl__2;
+  int __gen_e_acsl_eq;
+  int __gen_e_acsl_if_2;
+  __gmpz_init_set_si(__gen_e_acsl__2,0L);
+  __gen_e_acsl_eq = __gmpz_cmp((__e_acsl_mpz_struct const *)(n),
+                               (__e_acsl_mpz_struct const *)(__gen_e_acsl__2));
+  if (__gen_e_acsl_eq == 0) __gen_e_acsl_if_2 = 1;
+  else {
+    __e_acsl_mpz_t __gen_e_acsl__3;
+    int __gen_e_acsl_gt;
+    int __gen_e_acsl_if;
+    __gmpz_init_set_si(__gen_e_acsl__3,0L);
+    __gen_e_acsl_gt = __gmpz_cmp((__e_acsl_mpz_struct const *)(n),
+                                 (__e_acsl_mpz_struct const *)(__gen_e_acsl__3));
+    if (__gen_e_acsl_gt > 0) {
+      __e_acsl_mpz_t __gen_e_acsl__4;
+      __e_acsl_mpz_t __gen_e_acsl_sub_2;
+      int __gen_e_acsl_even_5;
+      __gmpz_init_set_si(__gen_e_acsl__4,1L);
+      __gmpz_init(__gen_e_acsl_sub_2);
+      __gmpz_sub(__gen_e_acsl_sub_2,(__e_acsl_mpz_struct const *)(n),
+                 (__e_acsl_mpz_struct const *)(__gen_e_acsl__4));
+      /*@ assert
+          Eva: initialization:
+            \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_sub_2);
+      */
+      __gen_e_acsl_even_5 = __gen_e_acsl_even_3((__e_acsl_mpz_struct *)__gen_e_acsl_sub_2);
+      __gen_e_acsl_if = ! __gen_e_acsl_even_5;
+      __gmpz_clear(__gen_e_acsl__4);
+      __gmpz_clear(__gen_e_acsl_sub_2);
+    }
+    else {
+      __e_acsl_mpz_t __gen_e_acsl__5;
+      __e_acsl_mpz_t __gen_e_acsl_add;
+      int __gen_e_acsl_even_7;
+      __gmpz_init_set_si(__gen_e_acsl__5,1L);
+      __gmpz_init(__gen_e_acsl_add);
+      __gmpz_add(__gen_e_acsl_add,(__e_acsl_mpz_struct const *)(n),
+                 (__e_acsl_mpz_struct const *)(__gen_e_acsl__5));
+      /*@ assert
+          Eva: initialization:
+            \initialized((__e_acsl_mpz_struct *)__gen_e_acsl_add);
+      */
+      __gen_e_acsl_even_7 = __gen_e_acsl_even_3((__e_acsl_mpz_struct *)__gen_e_acsl_add);
+      __gen_e_acsl_if = ! __gen_e_acsl_even_7;
+      __gmpz_clear(__gen_e_acsl__5);
+      __gmpz_clear(__gen_e_acsl_add);
+    }
+    __gen_e_acsl_if_2 = __gen_e_acsl_if;
+    __gmpz_clear(__gen_e_acsl__3);
+  }
+  __gmpz_clear(__gen_e_acsl__2);
+  return __gen_e_acsl_if_2;
+}
+
+/*@ assigns \result;
+    assigns \result \from n; */
+int __gen_e_acsl_even_and_not_negative(int n)
+{
+  int __gen_e_acsl_if_8;
+  if (n == 0) __gen_e_acsl_if_8 = 1;
+  else {
+    int __gen_e_acsl_if_7;
+    if (n > 0) {
+      int __gen_e_acsl_even_18;
+      __gen_e_acsl_even_18 = __gen_e_acsl_even(n - 1);
+      __gen_e_acsl_if_7 = ! __gen_e_acsl_even_18;
+    }
+    else __gen_e_acsl_if_7 = 0;
+    __gen_e_acsl_if_8 = __gen_e_acsl_if_7;
+  }
+  return __gen_e_acsl_if_8;
+}
+
 /*@ assigns (*__retres_arg)[0];
     assigns (*__retres_arg)[0] \from n; */
 void __gen_e_acsl_f1(__e_acsl_mpz_t *__retres_arg, int n)
 {
-  __e_acsl_mpz_t __gen_e_acsl_if;
+  __e_acsl_mpz_t __gen_e_acsl_if_9;
   if (n <= 0) {
-    __e_acsl_mpz_t __gen_e_acsl_;
-    __gmpz_init_set_si(__gen_e_acsl_,0L);
-    __gmpz_init_set(__gen_e_acsl_if,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_));
-    __gmpz_clear(__gen_e_acsl_);
+    __e_acsl_mpz_t __gen_e_acsl__7;
+    __gmpz_init_set_si(__gen_e_acsl__7,0L);
+    __gmpz_init_set(__gen_e_acsl_if_9,
+                    (__e_acsl_mpz_struct const *)(__gen_e_acsl__7));
+    __gmpz_clear(__gen_e_acsl__7);
   }
   else {
     __e_acsl_mpz_t __gen_e_acsl_f1_3;
-    __e_acsl_mpz_t __gen_e_acsl_n;
-    __e_acsl_mpz_t __gen_e_acsl_add;
+    __e_acsl_mpz_t __gen_e_acsl_n_3;
+    __e_acsl_mpz_t __gen_e_acsl_add_3;
     __gen_e_acsl_f1(& __gen_e_acsl_f1_3,n - 1);
-    __gmpz_init_set_si(__gen_e_acsl_n,(long)n);
-    __gmpz_init(__gen_e_acsl_add);
-    __gmpz_add(__gen_e_acsl_add,
+    __gmpz_init_set_si(__gen_e_acsl_n_3,(long)n);
+    __gmpz_init(__gen_e_acsl_add_3);
+    __gmpz_add(__gen_e_acsl_add_3,
                (__e_acsl_mpz_struct const *)(__gen_e_acsl_f1_3),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n));
-    __gmpz_init_set(__gen_e_acsl_if,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_add));
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_3));
+    __gmpz_init_set(__gen_e_acsl_if_9,
+                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_3));
     __gmpz_clear(__gen_e_acsl_f1_3);
-    __gmpz_clear(__gen_e_acsl_n);
-    __gmpz_clear(__gen_e_acsl_add);
+    __gmpz_clear(__gen_e_acsl_n_3);
+    __gmpz_clear(__gen_e_acsl_add_3);
   }
   __gmpz_init_set(*__retres_arg,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_if));
-  __gmpz_clear(__gen_e_acsl_if);
+                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_9));
+  __gmpz_clear(__gen_e_acsl_if_9);
   return;
 }
 
@@ -272,20 +499,20 @@ void __gen_e_acsl_f1(__e_acsl_mpz_t *__retres_arg, int n)
     assigns (*__retres_arg)[0] \from n; */
 void __gen_e_acsl_f2(__e_acsl_mpz_t *__retres_arg, int n)
 {
-  __e_acsl_mpz_t __gen_e_acsl_if_2;
+  __e_acsl_mpz_t __gen_e_acsl_if_10;
   if (n < 0) {
-    __e_acsl_mpz_t __gen_e_acsl__5;
-    __gmpz_init_set_si(__gen_e_acsl__5,1L);
-    __gmpz_init_set(__gen_e_acsl_if_2,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl__5));
-    __gmpz_clear(__gen_e_acsl__5);
+    __e_acsl_mpz_t __gen_e_acsl__11;
+    __gmpz_init_set_si(__gen_e_acsl__11,1L);
+    __gmpz_init_set(__gen_e_acsl_if_10,
+                    (__e_acsl_mpz_struct const *)(__gen_e_acsl__11));
+    __gmpz_clear(__gen_e_acsl__11);
   }
   else {
     __e_acsl_mpz_t __gen_e_acsl_f2_3;
     __e_acsl_mpz_t __gen_e_acsl_f2_5;
     __e_acsl_mpz_t __gen_e_acsl_mul;
     __e_acsl_mpz_t __gen_e_acsl_f2_7;
-    __e_acsl_mpz_t __gen_e_acsl__6;
+    __e_acsl_mpz_t __gen_e_acsl__12;
     int __gen_e_acsl_div_guard;
     __e_acsl_mpz_t __gen_e_acsl_div;
     __gen_e_acsl_f2(& __gen_e_acsl_f2_3,n - 1);
@@ -294,40 +521,40 @@ void __gen_e_acsl_f2(__e_acsl_mpz_t *__retres_arg, int n)
     __gmpz_mul(__gen_e_acsl_mul,
                (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_3),
                (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_5));
-    __e_acsl_assert_data_t __gen_e_acsl_assert_data_5 =
+    __e_acsl_assert_data_t __gen_e_acsl_assert_data_8 =
       {.values = (void *)0};
     __gen_e_acsl_f2(& __gen_e_acsl_f2_7,n - 3);
-    __gmpz_init_set_si(__gen_e_acsl__6,0L);
+    __gmpz_init_set_si(__gen_e_acsl__12,0L);
     __gen_e_acsl_div_guard = __gmpz_cmp((__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_7),
-                                        (__e_acsl_mpz_struct const *)(__gen_e_acsl__6));
+                                        (__e_acsl_mpz_struct const *)(__gen_e_acsl__12));
     __gmpz_init(__gen_e_acsl_div);
     /*@ assert E_ACSL: f2(n - 3) != 0; */
     {
-      __gen_e_acsl_assert_data_5.blocking = 1;
-      __gen_e_acsl_assert_data_5.kind = "Assertion";
-      __gen_e_acsl_assert_data_5.pred_txt = "f2(n - 3) != 0";
-      __gen_e_acsl_assert_data_5.file = "functions_rec.c";
-      __gen_e_acsl_assert_data_5.fct = "f2";
-      __gen_e_acsl_assert_data_5.line = 13;
+      __gen_e_acsl_assert_data_8.blocking = 1;
+      __gen_e_acsl_assert_data_8.kind = "Assertion";
+      __gen_e_acsl_assert_data_8.pred_txt = "f2(n - 3) != 0";
+      __gen_e_acsl_assert_data_8.file = "functions_rec.c";
+      __gen_e_acsl_assert_data_8.fct = "f2";
+      __gen_e_acsl_assert_data_8.line = 25;
       __e_acsl_assert(__gen_e_acsl_div_guard != 0,
-                      & __gen_e_acsl_assert_data_5);
-      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_5);
+                      & __gen_e_acsl_assert_data_8);
+      __e_acsl_assert_clean(& __gen_e_acsl_assert_data_8);
     }
     __gmpz_tdiv_q(__gen_e_acsl_div,
                   (__e_acsl_mpz_struct const *)(__gen_e_acsl_mul),
                   (__e_acsl_mpz_struct const *)(__gen_e_acsl_f2_7));
-    __gmpz_init_set(__gen_e_acsl_if_2,
+    __gmpz_init_set(__gen_e_acsl_if_10,
                     (__e_acsl_mpz_struct const *)(__gen_e_acsl_div));
     __gmpz_clear(__gen_e_acsl_f2_3);
     __gmpz_clear(__gen_e_acsl_f2_5);
     __gmpz_clear(__gen_e_acsl_mul);
     __gmpz_clear(__gen_e_acsl_f2_7);
-    __gmpz_clear(__gen_e_acsl__6);
+    __gmpz_clear(__gen_e_acsl__12);
     __gmpz_clear(__gen_e_acsl_div);
   }
   __gmpz_init_set(*__retres_arg,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_2));
-  __gmpz_clear(__gen_e_acsl_if_2);
+                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_10));
+  __gmpz_clear(__gen_e_acsl_if_10);
   return;
 }
 
@@ -351,72 +578,72 @@ int __gen_e_acsl_g(unsigned int n)
     assigns \result \from n; */
 int __gen_e_acsl_f3(int n)
 {
-  int __gen_e_acsl_if_3;
+  int __gen_e_acsl_if_11;
   if (n > 0) {
     int __gen_e_acsl_g_2;
     int __gen_e_acsl_f3_3;
     __gen_e_acsl_g_2 = __gen_e_acsl_g((unsigned int)n);
     __gen_e_acsl_f3_3 = __gen_e_acsl_f3(n - 1);
-    __gen_e_acsl_if_3 = __gen_e_acsl_g_2 * __gen_e_acsl_f3_3 - 5;
+    __gen_e_acsl_if_11 = __gen_e_acsl_g_2 * __gen_e_acsl_f3_3 - 5;
   }
   else {
     int __gen_e_acsl_g_4;
     __gen_e_acsl_g_4 = __gen_e_acsl_g_3(n + 1);
-    __gen_e_acsl_if_3 = __gen_e_acsl_g_4;
+    __gen_e_acsl_if_11 = __gen_e_acsl_g_4;
   }
-  return __gen_e_acsl_if_3;
+  return __gen_e_acsl_if_11;
 }
 
 /*@ assigns \result;
     assigns \result \from n; */
 unsigned long __gen_e_acsl_f4(int n)
 {
-  unsigned long __gen_e_acsl_if_5;
+  unsigned long __gen_e_acsl_if_13;
   if (n < 100) {
     unsigned long __gen_e_acsl_f4_3;
     __gen_e_acsl_f4_3 = __gen_e_acsl_f4(n + 1);
-    __gen_e_acsl_if_5 = __gen_e_acsl_f4_3;
+    __gen_e_acsl_if_13 = __gen_e_acsl_f4_3;
   }
   else {
-    unsigned long __gen_e_acsl_if_4;
-    if ((unsigned long)n < 9223372036854775807UL) __gen_e_acsl_if_4 = 9223372036854775807UL;
-    else __gen_e_acsl_if_4 = 6UL;
-    __gen_e_acsl_if_5 = __gen_e_acsl_if_4;
+    unsigned long __gen_e_acsl_if_12;
+    if ((unsigned long)n < 9223372036854775807UL) __gen_e_acsl_if_12 = 9223372036854775807UL;
+    else __gen_e_acsl_if_12 = 6UL;
+    __gen_e_acsl_if_13 = __gen_e_acsl_if_12;
   }
-  return __gen_e_acsl_if_5;
+  return __gen_e_acsl_if_13;
 }
 
 /*@ assigns (*__retres_arg)[0];
     assigns (*__retres_arg)[0] \from n; */
 void __gen_e_acsl_f5_5(__e_acsl_mpz_t *__retres_arg, long n)
 {
-  __e_acsl_mpz_t __gen_e_acsl_if_7;
+  __e_acsl_mpz_t __gen_e_acsl_if_15;
   if (n >= 0L) {
-    __e_acsl_mpz_t __gen_e_acsl__10;
-    __gmpz_init_set_si(__gen_e_acsl__10,0L);
-    __gmpz_init_set(__gen_e_acsl_if_7,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl__10));
-    __gmpz_clear(__gen_e_acsl__10);
+    __e_acsl_mpz_t __gen_e_acsl__16;
+    __gmpz_init_set_si(__gen_e_acsl__16,0L);
+    __gmpz_init_set(__gen_e_acsl_if_15,
+                    (__e_acsl_mpz_struct const *)(__gen_e_acsl__16));
+    __gmpz_clear(__gen_e_acsl__16);
   }
   else {
     __e_acsl_mpz_t __gen_e_acsl_f5_7;
-    __e_acsl_mpz_t __gen_e_acsl_n_4;
-    __e_acsl_mpz_t __gen_e_acsl_add_3;
+    __e_acsl_mpz_t __gen_e_acsl_n_6;
+    __e_acsl_mpz_t __gen_e_acsl_add_5;
     __gen_e_acsl_f5_5(& __gen_e_acsl_f5_7,n + 1L);
-    __gmpz_init_set_si(__gen_e_acsl_n_4,n);
-    __gmpz_init(__gen_e_acsl_add_3);
-    __gmpz_add(__gen_e_acsl_add_3,
+    __gmpz_init_set_si(__gen_e_acsl_n_6,n);
+    __gmpz_init(__gen_e_acsl_add_5);
+    __gmpz_add(__gen_e_acsl_add_5,
                (__e_acsl_mpz_struct const *)(__gen_e_acsl_f5_7),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_4));
-    __gmpz_init_set(__gen_e_acsl_if_7,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_3));
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_6));
+    __gmpz_init_set(__gen_e_acsl_if_15,
+                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_5));
     __gmpz_clear(__gen_e_acsl_f5_7);
-    __gmpz_clear(__gen_e_acsl_n_4);
-    __gmpz_clear(__gen_e_acsl_add_3);
+    __gmpz_clear(__gen_e_acsl_n_6);
+    __gmpz_clear(__gen_e_acsl_add_5);
   }
   __gmpz_init_set(*__retres_arg,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_7));
-  __gmpz_clear(__gen_e_acsl_if_7);
+                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_15));
+  __gmpz_clear(__gen_e_acsl_if_15);
   return;
 }
 
@@ -424,33 +651,33 @@ void __gen_e_acsl_f5_5(__e_acsl_mpz_t *__retres_arg, long n)
     assigns (*__retres_arg)[0] \from n; */
 void __gen_e_acsl_f5(__e_acsl_mpz_t *__retres_arg, int n)
 {
-  __e_acsl_mpz_t __gen_e_acsl_if_6;
+  __e_acsl_mpz_t __gen_e_acsl_if_14;
   if (n >= 0) {
-    __e_acsl_mpz_t __gen_e_acsl__8;
-    __gmpz_init_set_si(__gen_e_acsl__8,0L);
-    __gmpz_init_set(__gen_e_acsl_if_6,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl__8));
-    __gmpz_clear(__gen_e_acsl__8);
+    __e_acsl_mpz_t __gen_e_acsl__14;
+    __gmpz_init_set_si(__gen_e_acsl__14,0L);
+    __gmpz_init_set(__gen_e_acsl_if_14,
+                    (__e_acsl_mpz_struct const *)(__gen_e_acsl__14));
+    __gmpz_clear(__gen_e_acsl__14);
   }
   else {
     __e_acsl_mpz_t __gen_e_acsl_f5_3;
-    __e_acsl_mpz_t __gen_e_acsl_n_2;
-    __e_acsl_mpz_t __gen_e_acsl_add_2;
+    __e_acsl_mpz_t __gen_e_acsl_n_4;
+    __e_acsl_mpz_t __gen_e_acsl_add_4;
     __gen_e_acsl_f5(& __gen_e_acsl_f5_3,n + 1);
-    __gmpz_init_set_si(__gen_e_acsl_n_2,(long)n);
-    __gmpz_init(__gen_e_acsl_add_2);
-    __gmpz_add(__gen_e_acsl_add_2,
+    __gmpz_init_set_si(__gen_e_acsl_n_4,(long)n);
+    __gmpz_init(__gen_e_acsl_add_4);
+    __gmpz_add(__gen_e_acsl_add_4,
                (__e_acsl_mpz_struct const *)(__gen_e_acsl_f5_3),
-               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_2));
-    __gmpz_init_set(__gen_e_acsl_if_6,
-                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_2));
+               (__e_acsl_mpz_struct const *)(__gen_e_acsl_n_4));
+    __gmpz_init_set(__gen_e_acsl_if_14,
+                    (__e_acsl_mpz_struct const *)(__gen_e_acsl_add_4));
     __gmpz_clear(__gen_e_acsl_f5_3);
-    __gmpz_clear(__gen_e_acsl_n_2);
-    __gmpz_clear(__gen_e_acsl_add_2);
+    __gmpz_clear(__gen_e_acsl_n_4);
+    __gmpz_clear(__gen_e_acsl_add_4);
   }
   __gmpz_init_set(*__retres_arg,
-                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_6));
-  __gmpz_clear(__gen_e_acsl_if_6);
+                  (__e_acsl_mpz_struct const *)(__gen_e_acsl_if_14));
+  __gmpz_clear(__gen_e_acsl_if_14);
   return;
 }