diff --git a/Makefile.in b/Makefile.in
index 6ad00dc4c89f88a3dea67d98709ea360a86656e2..37a125f8d380796947774d2c59e2b39fddc272ad 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -181,8 +181,7 @@ LIB_MLW = ity expr dexpr pdecl pmodule
 LIB_PARSER = ptree glob parser typing lexer
 
 LIB_TRANSFORM = simplify_formula inlining split_goal induction \
-		detect_polymorphism \
-		reduction_engine compute \
+		detect_polymorphism reduction_engine compute \
 		eliminate_definition eliminate_algebraic \
 		eliminate_inductive eliminate_let eliminate_if \
 		libencoding discriminate encoding encoding_select \
@@ -193,7 +192,7 @@ LIB_TRANSFORM = simplify_formula inlining split_goal induction \
 		eliminate_epsilon intro_projections_counterexmp \
 		intro_vc_vars_counterexmp prepare_for_counterexmp \
 		eval_match instantiate_predicate smoke_detector \
-		induction_pr prop_curry
+		induction_pr prop_curry eliminate_literal
 
 LIB_PRINTER = cntexmp_printer alt_ergo why3printer smtv1 smtv2 coq pvs isabelle \
 	      simplify gappa cvc3 yices mathematica
diff --git a/drivers/alt_ergo_common.drv b/drivers/alt_ergo_common.drv
index 8274543cfe76e6812219916b5165432863b2693b..ffb91d3d7016ea884d3829ad2d989b4e5c136feb 100644
--- a/drivers/alt_ergo_common.drv
+++ b/drivers/alt_ergo_common.drv
@@ -20,13 +20,13 @@ steps "Valid (\\([0-9]+.?[0-9]*\\)) (\\([0-9]+.?[0-9]*\\))" 2
 steps "Valid (\\([0-9]+.?[0-9]*\\)) (\\([0-9]+.?[0-9]*\\) steps)" 2
 time "why3cpulimit time : %s s"
 
-(* À discuter *)
 transformation "inline_trivial"
 
 transformation "eliminate_builtin"
 transformation "eliminate_recursion"
 transformation "eliminate_inductive"
 transformation "eliminate_algebraic"
+transformation "eliminate_literal"
 transformation "eliminate_epsilon"
 transformation "eliminate_if"
 transformation "eliminate_let"
diff --git a/drivers/coq-common.gen b/drivers/coq-common.gen
index 9460ba9bfa78c0dc96d759a6f7b73c03bc9b681b..539c98e757c5e2a1e3ceb6ebfde2eaf047ce8d07 100644
--- a/drivers/coq-common.gen
+++ b/drivers/coq-common.gen
@@ -4,9 +4,9 @@ unknown "Error: \\(.*\\)$" "\\1"
 fail "Syntax error: \\(.*\\)$" "\\1"
 time "why3cpulimit time : %s s"
 
-(* À discuter *)
 transformation "eliminate_non_struct_recursion"
 transformation "eliminate_if"
+transformation "eliminate_literal"
 transformation "eliminate_non_lambda_set_epsilon"
 
 transformation "eliminate_projections"
diff --git a/drivers/cvc3.drv b/drivers/cvc3.drv
index 7de510a32db751da196ce962a5fd0bdbf9844a9e..a818afb8159b00d7b20d1f94d47eafdae3843ded 100644
--- a/drivers/cvc3.drv
+++ b/drivers/cvc3.drv
@@ -14,13 +14,12 @@ outofmemory "Out of memory\\|std::bad_alloc\\|GNU MP: Cannot allocate memory"
 timeout "self-timeout"
 time "why3cpulimit time : %s s"
 
-(* À discuter *)
 transformation "inline_trivial"
-
 transformation "eliminate_builtin"
 transformation "eliminate_definition"
 transformation "eliminate_inductive"
 transformation "eliminate_algebraic"
+transformation "eliminate_literal"
 transformation "eliminate_epsilon"
 
 transformation "simplify_formula"
diff --git a/drivers/cvc4.drv b/drivers/cvc4.drv
index 29c3532fca81f72c891912f713921134e130259e..b45834db200e5b641e535d8aaffa72371e12eec2 100644
--- a/drivers/cvc4.drv
+++ b/drivers/cvc4.drv
@@ -16,6 +16,7 @@ transformation "eliminate_builtin"
 transformation "eliminate_definition"
 transformation "eliminate_inductive"
 transformation "eliminate_algebraic"
+transformation "eliminate_literal"
 transformation "eliminate_epsilon"
 
 transformation "simplify_formula"
diff --git a/drivers/cvc4_14.drv b/drivers/cvc4_14.drv
index 0d0be3a9f1bc728fe510cba9d3f35ca4c95134d8..fa5ef7ab3a8f048c7df0e662e2013071e60cf75c 100644
--- a/drivers/cvc4_14.drv
+++ b/drivers/cvc4_14.drv
@@ -27,6 +27,7 @@ transformation "eliminate_definition"
 *)
 transformation "eliminate_inductive"
 transformation "eliminate_algebraic_if_poly"
+transformation "eliminate_literal"
 transformation "eliminate_epsilon"
 
 transformation "simplify_formula"
diff --git a/drivers/cvc4_bv.gen b/drivers/cvc4_bv.gen
index b28a7bdd8845ff237f1d24eebd6f6465d8ca37c3..861dc3e13794b3fda6013b54369bfdb5e16a72c0 100644
--- a/drivers/cvc4_bv.gen
+++ b/drivers/cvc4_bv.gen
@@ -3,20 +3,20 @@
 
 theory bv.BV64
   syntax converter of_int "(_ bv%1 64)"
-  syntax function to_uint "(bv2nat %1)"
+  syntax function t'int "(bv2nat %1)"
 end
 
 theory bv.BV32
   syntax converter of_int "(_ bv%1 32)"
-  syntax function to_uint "(bv2nat %1)"
+  syntax function t'int "(bv2nat %1)"
 end
 
 theory bv.BV16
   syntax converter of_int "(_ bv%1 16)"
-  syntax function to_uint "(bv2nat %1)"
+  syntax function t'int "(bv2nat %1)"
 end
 
 theory bv.BV8
   syntax converter of_int "(_ bv%1 8)"
-  syntax function to_uint "(bv2nat %1)"
+  syntax function t'int "(bv2nat %1)"
 end
diff --git a/drivers/isabelle-common.gen b/drivers/isabelle-common.gen
index 17a1c82ae54673a96ff8741ab013634eaa9c7f5f..2860cbed9945b734b7fad7e7d68008da430315c3 100644
--- a/drivers/isabelle-common.gen
+++ b/drivers/isabelle-common.gen
@@ -6,6 +6,7 @@ valid "Finished Why3 theory"
 fail "\\*\\*\\* \\(.*\\)$" "\\1"
 time "why3cpulimit time : %s s"
 
+transformation "eliminate_literal"
 transformation "eliminate_epsilon"
 transformation "eliminate_if_fmla"
 transformation "eliminate_let_fmla"
diff --git a/drivers/mathsat.drv b/drivers/mathsat.drv
index a3998b42872e1818b33e148e8805887643d20118..ba21f909bc5ac4587dc9381388319886f3bf6590 100644
--- a/drivers/mathsat.drv
+++ b/drivers/mathsat.drv
@@ -12,9 +12,7 @@ outofmemory "(error \".*out of memory\")\\|Cannot allocate memory"
 time "why3cpulimit time : %s s"
 
 
-(* À discuter *)
 transformation "inline_trivial"
-
 transformation "eliminate_builtin"
 transformation "eliminate_definition"
 transformation "eliminate_inductive"
diff --git a/drivers/psyche.drv b/drivers/psyche.drv
index 101b6c99fe9906411cd4e397d0c7ba0f965d2547..6cd7020f2512319673027eba08ea5e6792e75df5 100644
--- a/drivers/psyche.drv
+++ b/drivers/psyche.drv
@@ -10,9 +10,7 @@ invalid "^NOT PROVABLE"
 timeout "interrupted by timeout"
 time "why3cpulimit time : %s s"
 
-(* À discuter *)
 transformation "inline_trivial"
-
 transformation "eliminate_builtin"
 transformation "eliminate_definition"
 transformation "eliminate_inductive"
diff --git a/drivers/smt-libv2-bv-realization.gen b/drivers/smt-libv2-bv-realization.gen
index 6c3dc18124ebe86181a5fb31a938ab59f0330efe..cc378b90dfc709fcab8d8db2d9f22ae0e7deadb9 100644
--- a/drivers/smt-libv2-bv-realization.gen
+++ b/drivers/smt-libv2-bv-realization.gen
@@ -62,8 +62,10 @@ theory bv.BV_Gen
   remove prop to_uint_bounds
   remove prop to_uint_of_int
 
-  remove prop Of_int_zeros
-  remove prop Of_int_ones
+  remove prop to_uint_size_bv
+  remove prop to_uint_zeros
+  remove prop to_uint_ones
+  remove prop to_uint_one
 
   (** Arithmetic operators *)
 
diff --git a/drivers/smt-libv2-bv.gen b/drivers/smt-libv2-bv.gen
index fcb56f8db67cd9feb2584a324caf5c272d55a095..49e5215e2f0f0c5f989cd31dbfb948e58f8bd6ee 100644
--- a/drivers/smt-libv2-bv.gen
+++ b/drivers/smt-libv2-bv.gen
@@ -48,8 +48,10 @@ theory bv.BV_Gen
   remove prop to_uint_bounds
   remove prop to_int_extensionality
 
-  remove prop Of_int_zeros
-  remove prop Of_int_ones
+  remove prop to_uint_size_bv
+  remove prop to_uint_zeros
+  remove prop to_uint_ones
+  remove prop to_uint_one
 
   remove prop to_uint_add
   remove prop to_uint_add_bounded
@@ -76,40 +78,60 @@ theory bv.BV_Gen
 end
 
 theory bv.BV64
+  meta "literal:keep" type t
+
+  syntax literal t "#x%16x"
   syntax type t "(_ BitVec 64)"
 
   syntax function zeros "#x0000000000000000"
-  syntax function ones "#xFFFFFFFFFFFFFFFF"
+  syntax function one   "#x0000000000000001"
+  syntax function ones  "#xFFFFFFFFFFFFFFFF"
+  syntax function size_bv "(_ bv64 64)"
 
   syntax function rotate_left_bv "(bvor (bvshl %1 (bvurem %2 (_ bv64 64))) (bvlshr %1 (bvsub (_ bv64 64) (bvurem %2 (_ bv64 64)))))"
   syntax function rotate_right_bv "(bvor (bvlshr %1 (bvurem %2 (_ bv64 64))) (bvshl %1 (bvsub (_ bv64 64) (bvurem %2 (_ bv64 64)))))"
 end
 
 theory bv.BV32
+  meta "literal:keep" type t
+
+  syntax literal t "#x%8x"
   syntax type t "(_ BitVec 32)"
 
   syntax function zeros "#x00000000"
-  syntax function ones "#xFFFFFFFF"
+  syntax function one   "#x00000001"
+  syntax function ones  "#xFFFFFFFF"
+  syntax function size_bv "(_ bv32 32)"
 
   syntax function rotate_left_bv "(bvor (bvshl %1 (bvurem %2 (_ bv32 32))) (bvlshr %1 (bvsub (_ bv32 32) (bvurem %2 (_ bv32 32)))))"
   syntax function rotate_right_bv "(bvor (bvlshr %1 (bvurem %2 (_ bv32 32))) (bvshl %1 (bvsub (_ bv32 32) (bvurem %2 (_ bv32 32)))))"
 end
 
 theory bv.BV16
+  meta "literal:keep" type t
+
+  syntax literal t "#x%4x"
   syntax type t "(_ BitVec 16)"
 
   syntax function zeros "#x0000"
-  syntax function ones "#xFFFF"
+  syntax function one   "#x0001"
+  syntax function ones  "#xFFFF"
+  syntax function size_bv "(_ bv16 16)"
 
   syntax function rotate_left_bv "(bvor (bvshl %1 (bvurem %2 (_ bv16 16))) (bvlshr %1 (bvsub (_ bv16 16) (bvurem %2 (_ bv16 16)))))"
   syntax function rotate_right_bv "(bvor (bvlshr %1 (bvurem %2 (_ bv16 16))) (bvshl %1 (bvsub (_ bv16 16) (bvurem %2 (_ bv16 16)))))"
 end
 
 theory bv.BV8
+  meta "literal:keep" type t
+
+  syntax literal t (* "#b%8b"  *) "#x%2x"
   syntax type t "(_ BitVec 8)"
 
   syntax function zeros "#x00"
-  syntax function ones "#xFF"
+  syntax function one   "#x01"
+  syntax function ones  "#xFF"
+  syntax function size_bv "(_ bv8 8)"
 
   syntax function rotate_left_bv "(bvor (bvshl %1 (bvurem %2 (_ bv8 8))) (bvlshr %1 (bvsub (_ bv8 8) (bvurem %2 (_ bv8 8)))))"
   syntax function rotate_right_bv "(bvor (bvlshr %1 (bvurem %2 (_ bv8 8))) (bvshl %1 (bvsub (_ bv8 8) (bvurem %2 (_ bv8 8)))))"
diff --git a/drivers/yices.drv b/drivers/yices.drv
index 9c99c6dbaa564878c3ba8dd5b37dcf811e66e847..d1e42fc39b66f314d50beff7c8619e4cb4760fb5 100644
--- a/drivers/yices.drv
+++ b/drivers/yices.drv
@@ -11,9 +11,7 @@ unknown "\\bunknown\\b\\|\\bsat\\b" ""
 unknown "feature not supported: non linear problem" "non linear arith"
 time "why3cpulimit time : %s s"
 
-(* À discuter *)
 transformation "inline_trivial"
-
 transformation "eliminate_builtin"
 transformation "eliminate_definition"
 transformation "eliminate_inductive"
diff --git a/drivers/z3-realize.drv b/drivers/z3-realize.drv
deleted file mode 100644
index af1d615d330de06012784fcfbeade899f1ffb92c..0000000000000000000000000000000000000000
--- a/drivers/z3-realize.drv
+++ /dev/null
@@ -1,100 +0,0 @@
-(** Why3 driver for Z3 >= 4.3.2 *)
-
-(* Do not set any logic, let z3 choose by itself
-   prelude "(set-logic AUFNIRA)"
-*)
-
-(* Counterexamples: set model parser *)
-model_parser "smtv2"
-
-
-import "smt-libv2.drv"
-import "smt-libv2-bv-realization.gen"
-import "discrimination.gen"
-
-transformation "inline_trivial"
-transformation "eliminate_builtin"
-transformation "detect_polymorphism"
-transformation "eliminate_definition"
-(* We could keep more definitions by using
-   transformation "eliminate_definition_if_poly"
-   instead, but some proofs are lost
-   (examples/logic/triangle_inequality.why)
-*)
-transformation "eliminate_inductive"
-transformation "eliminate_algebraic_if_poly"
-transformation "eliminate_epsilon"
-
-transformation "simplify_formula"
-(*transformation "simplify_trivial_quantification"*)
-
-(* Prepare for counter-example query: get rid of some quantifiers (makes it
-possible to query model values of the variables in premises) and introduce
-counter-example projections  *)
-transformation "prepare_for_counterexmp"
-
-transformation "discriminate_if_poly"
-transformation "encoding_smt_if_poly"
-
-
-(** Error messages specific to Z3 *)
-
-outofmemory "(error \".*out of memory\")\\|Cannot allocate memory"
-timeout "interrupted by timeout"
-
-(** Extra theories supported by Z3 *)
-
-(* div/mod of Z3 seems to be Euclidean Division *)
-theory int.EuclideanDivision
-   syntax function div "(div %1 %2)"
-   syntax function mod "(mod %1 %2)"
-   remove prop Mod_bound
-   remove prop Div_mod
-   remove prop Mod_1
-   remove prop Div_1
-end
-
-theory real.FromInt
-  syntax function from_int "(to_real %1)"
-  remove prop Zero
-  remove prop One
-  remove prop Add
-  remove prop Sub
-  remove prop Mul
-  remove prop Neg
-end
-
-(* does not work: Z3 segfaults
-theory real.Trigonometry
-
-  syntax function cos "(cos %1)"
-  syntax function sin "(sin %1)"
-  syntax function pi "pi"
-  syntax function tan "(tan %1)"
-  syntax function atan "(atan %1)"
-
-end
-*)
-
-
-(* bitvector modules, is not in smt-libv2.drv since cvc4 and z3 don't
-   have the same name for the function to_uint *)
-theory bv.BV64
-  syntax converter of_int "((_ int2bv 64) %1)"
-  syntax function to_uint "(bv2int %1)"
-end
-
-theory bv.BV32
-  syntax converter of_int "((_ int2bv 32) %1)"
-  syntax function to_uint "(bv2int %1)"
-end
-
-theory bv.BV16
-  syntax converter of_int "((_ int2bv 16) %1)"
-  syntax function to_uint "(bv2int %1)"
-end
-
-theory bv.BV8
-  syntax converter of_int "((_ int2bv 8) %1)"
-  syntax function to_uint "(bv2int %1)"
-end
diff --git a/drivers/z3_432.drv b/drivers/z3_432.drv
index 045298015875b70a76411cff0da4ddb82ee077ca..9bfef9fa1bd580fae09bdcea2327d4a25e148366 100644
--- a/drivers/z3_432.drv
+++ b/drivers/z3_432.drv
@@ -7,7 +7,6 @@
 (* Counterexamples: set model parser *)
 model_parser "smtv2"
 
-
 import "smt-libv2.drv"
 import "no-bv.gen"
 import "discrimination.gen"
@@ -23,6 +22,7 @@ transformation "eliminate_definition"
 *)
 transformation "eliminate_inductive"
 transformation "eliminate_algebraic_if_poly"
+transformation "eliminate_literal"
 transformation "eliminate_epsilon"
 
 transformation "simplify_formula"
diff --git a/drivers/z3_440.drv b/drivers/z3_440.drv
index f73169df01a80e9a304c025642017f6d4e6264e6..bfbf8fa77f7a190024871bffdf113a127381e57b 100644
--- a/drivers/z3_440.drv
+++ b/drivers/z3_440.drv
@@ -23,6 +23,7 @@ transformation "eliminate_definition"
 *)
 transformation "eliminate_inductive"
 transformation "eliminate_algebraic_if_poly"
+transformation "eliminate_literal"
 transformation "eliminate_epsilon"
 
 transformation "simplify_formula"
@@ -81,7 +82,7 @@ end
    have the same name for the function to_uint *)
 theory bv.BV64
   syntax converter of_int "((_ int2bv 64) %1)"
-  syntax function to_uint "(bv2int %1)"
+  syntax function t'int "(bv2int %1)"
 
   remove prop Nth_bv_is_nth
   remove prop Nth_bv_is_nth2
@@ -89,7 +90,7 @@ end
 
 theory bv.BV32
   syntax converter of_int "((_ int2bv 32) %1)"
-  syntax function to_uint "(bv2int %1)"
+  syntax function t'int "(bv2int %1)"
 
   remove prop Nth_bv_is_nth
   remove prop Nth_bv_is_nth2
@@ -97,7 +98,7 @@ end
 
 theory bv.BV16
   syntax converter of_int "((_ int2bv 16) %1)"
-  syntax function to_uint "(bv2int %1)"
+  syntax function t'int "(bv2int %1)"
 
   remove prop Nth_bv_is_nth
   remove prop Nth_bv_is_nth2
@@ -105,7 +106,7 @@ end
 
 theory bv.BV8
   syntax converter of_int "((_ int2bv 8) %1)"
-  syntax function to_uint "(bv2int %1)"
+  syntax function t'int "(bv2int %1)"
 
   remove prop Nth_bv_is_nth
   remove prop Nth_bv_is_nth2
diff --git a/drivers/z3_smtv1.drv b/drivers/z3_smtv1.drv
index be4fb8ba36b880f826fe831717c69ff5f33b0dd1..a81059a24e42131f3701fd30b6bb3614019619c0 100644
--- a/drivers/z3_smtv1.drv
+++ b/drivers/z3_smtv1.drv
@@ -10,9 +10,7 @@ unknown "^\\(unknown\\|sat\\|Fail\\)" ""
 time "why3cpulimit time : %s s"
 
 
-(* À discuter *)
 transformation "inline_trivial"
-
 transformation "eliminate_builtin"
 transformation "eliminate_definition"
 transformation "eliminate_inductive"
diff --git a/examples/binary_search/why3session.xml b/examples/binary_search/why3session.xml
index de5456ddb815fb2b692681b6e8a861e55a8cd3b9..e566dac0f5a5bdf05e79091de1a3fc62a069b50a 100644
--- a/examples/binary_search/why3session.xml
+++ b/examples/binary_search/why3session.xml
@@ -21,87 +21,87 @@
  <proof prover="5" timelimit="10"><result status="valid" time="0.02" steps="44"/></proof>
  </goal>
 </theory>
-<theory name="BinarySearchInt32" sum="e1d44ffe67ec79d3738d89b5a90b5f4e" expanded="true">
+<theory name="BinarySearchInt32" sum="f5215003128fd45477d65ffa703ca26d" expanded="true">
  <goal name="WP_parameter binary_search" expl="VC for binary_search" expanded="true">
  <transf name="split_goal_wp" expanded="true">
   <goal name="WP_parameter binary_search.1" expl="1. integer overflow">
-  <proof prover="5"><result status="valid" time="0.02" steps="69"/></proof>
+  <proof prover="5"><result status="valid" time="0.02" steps="71"/></proof>
   </goal>
   <goal name="WP_parameter binary_search.2" expl="2. integer overflow">
-  <proof prover="5"><result status="valid" time="0.01" steps="73"/></proof>
+  <proof prover="5"><result status="valid" time="0.01" steps="75"/></proof>
   </goal>
   <goal name="WP_parameter binary_search.3" expl="3. integer overflow">
-  <proof prover="5"><result status="valid" time="0.12" steps="93"/></proof>
+  <proof prover="5"><result status="valid" time="0.12" steps="105"/></proof>
   </goal>
   <goal name="WP_parameter binary_search.4" expl="4. loop invariant init">
-  <proof prover="5"><result status="valid" time="0.01" steps="74"/></proof>
+  <proof prover="5"><result status="valid" time="0.01" steps="76"/></proof>
   </goal>
   <goal name="WP_parameter binary_search.5" expl="5. loop invariant init">
-  <proof prover="5"><result status="valid" time="0.01" steps="77"/></proof>
+  <proof prover="5"><result status="valid" time="0.01" steps="79"/></proof>
   </goal>
   <goal name="WP_parameter binary_search.6" expl="6. integer overflow">
-  <proof prover="5"><result status="valid" time="0.02" steps="85"/></proof>
+  <proof prover="5"><result status="valid" time="0.02" steps="87"/></proof>
   </goal>
   <goal name="WP_parameter binary_search.7" expl="7. integer overflow">
-  <proof prover="5"><result status="valid" time="0.02" steps="89"/></proof>
+  <proof prover="5"><result status="valid" time="0.02" steps="91"/></proof>
   </goal>
   <goal name="WP_parameter binary_search.8" expl="8. division by zero">
-  <proof prover="5"><result status="valid" time="0.01" steps="82"/></proof>
+  <proof prover="5"><result status="valid" time="0.01" steps="84"/></proof>
   </goal>
   <goal name="WP_parameter binary_search.9" expl="9. integer overflow">
-  <proof prover="5"><result status="valid" time="0.04" steps="97"/></proof>
+  <proof prover="5"><result status="valid" time="0.04" steps="99"/></proof>
   </goal>
   <goal name="WP_parameter binary_search.10" expl="10. integer overflow">
-  <proof prover="5"><result status="valid" time="0.11" steps="113"/></proof>
+  <proof prover="5"><result status="valid" time="0.11" steps="127"/></proof>
   </goal>
   <goal name="WP_parameter binary_search.11" expl="11. assertion">
-  <proof prover="5"><result status="valid" time="0.27" steps="132"/></proof>
+  <proof prover="5"><result status="valid" time="0.27" steps="158"/></proof>
   </goal>
   <goal name="WP_parameter binary_search.12" expl="12. index in array bounds">
-  <proof prover="5"><result status="valid" time="0.01" steps="89"/></proof>
+  <proof prover="5"><result status="valid" time="0.01" steps="91"/></proof>
   </goal>
   <goal name="WP_parameter binary_search.13" expl="13. integer overflow">
-  <proof prover="5"><result status="valid" time="0.01" steps="93"/></proof>
+  <proof prover="5"><result status="valid" time="0.01" steps="95"/></proof>
   </goal>
   <goal name="WP_parameter binary_search.14" expl="14. integer overflow">
-  <proof prover="5"><result status="valid" time="0.03" steps="110"/></proof>
+  <proof prover="5"><result status="valid" time="0.03" steps="112"/></proof>
   </goal>
   <goal name="WP_parameter binary_search.15" expl="15. loop invariant preservation">
-  <proof prover="5"><result status="valid" time="0.02" steps="97"/></proof>
+  <proof prover="5"><result status="valid" time="0.02" steps="99"/></proof>
   </goal>
   <goal name="WP_parameter binary_search.16" expl="16. loop invariant preservation">
   <proof prover="0"><result status="valid" time="0.04"/></proof>
   <proof prover="2"><result status="valid" time="3.48"/></proof>
-  <proof prover="5"><result status="valid" time="1.34" steps="176"/></proof>
+  <proof prover="5"><result status="valid" time="1.34" steps="202"/></proof>
   </goal>
   <goal name="WP_parameter binary_search.17" expl="17. loop variant decrease">
-  <proof prover="5"><result status="valid" time="0.02" steps="97"/></proof>
+  <proof prover="5"><result status="valid" time="0.02" steps="99"/></proof>
   </goal>
   <goal name="WP_parameter binary_search.18" expl="18. index in array bounds">
-  <proof prover="5"><result status="valid" time="0.01" steps="93"/></proof>
+  <proof prover="5"><result status="valid" time="0.01" steps="95"/></proof>
   </goal>
   <goal name="WP_parameter binary_search.19" expl="19. integer overflow">
-  <proof prover="5"><result status="valid" time="0.01" steps="95"/></proof>
+  <proof prover="5"><result status="valid" time="0.01" steps="97"/></proof>
   </goal>
   <goal name="WP_parameter binary_search.20" expl="20. integer overflow">
-  <proof prover="5"><result status="valid" time="0.02" steps="111"/></proof>
+  <proof prover="5"><result status="valid" time="0.02" steps="113"/></proof>
   </goal>
   <goal name="WP_parameter binary_search.21" expl="21. loop invariant preservation">
-  <proof prover="5"><result status="valid" time="0.02" steps="99"/></proof>
+  <proof prover="5"><result status="valid" time="0.02" steps="101"/></proof>
   </goal>
   <goal name="WP_parameter binary_search.22" expl="22. loop invariant preservation">
   <proof prover="0"><result status="valid" time="0.04"/></proof>
   <proof prover="2"><result status="valid" time="3.46"/></proof>
-  <proof prover="5"><result status="valid" time="1.35" steps="177"/></proof>
+  <proof prover="5"><result status="valid" time="1.35" steps="203"/></proof>
   </goal>
   <goal name="WP_parameter binary_search.23" expl="23. loop variant decrease">
-  <proof prover="5"><result status="valid" time="0.02" steps="99"/></proof>
+  <proof prover="5"><result status="valid" time="0.02" steps="101"/></proof>
   </goal>
   <goal name="WP_parameter binary_search.24" expl="24. postcondition">
-  <proof prover="5"><result status="valid" time="0.08" steps="123"/></proof>
+  <proof prover="5"><result status="valid" time="0.08" steps="137"/></proof>
   </goal>
   <goal name="WP_parameter binary_search.25" expl="25. exceptional postcondition">
-  <proof prover="5"><result status="valid" time="0.01" steps="88"/></proof>
+  <proof prover="5"><result status="valid" time="0.01" steps="90"/></proof>
   </goal>
  </transf>
  </goal>
diff --git a/examples/binary_search/why3shapes.gz b/examples/binary_search/why3shapes.gz
index a7a2fbcc3dbc2c0cd59f648d4a3dbeb3c38c8f10..63d1cbb025df5a8dbe3c88d870fa3d86f81ed5a7 100644
Binary files a/examples/binary_search/why3shapes.gz and b/examples/binary_search/why3shapes.gz differ
diff --git a/examples/bitcount.mlw b/examples/bitcount.mlw
index 73e9c423e564e06851214db72ec9a88b4b5d16b7..c5a1bd3d09772a04d04531ad7173bfb39a86093b 100644
--- a/examples/bitcount.mlw
+++ b/examples/bitcount.mlw
@@ -7,7 +7,7 @@ module BitCount8bit_fact
 
   function nth_as_bv (a i : t) : t =
     if nth_bv a i
-    then (of_int 1)
+    then (1 : t)
     else zeros
 
   function nth_as_int (a : t) (i : int) : int =
@@ -16,81 +16,81 @@ module BitCount8bit_fact
     else 0
 
   lemma nth_as_bv_is_int : forall a i.
-    to_uint (nth_as_bv a i) = nth_as_int a (to_uint i)
+    t'int (nth_as_bv a i) = nth_as_int a (t'int i)
 
     use import int.EuclideanDivision
 
   let ghost step1 (n x1 : t) (i : int) : unit
     requires { 0 <= i < 4 }
-    requires { x1 = sub n (bw_and (lsr_bv n (of_int 1)) (of_int 0x55)) }
-    ensures { to_uint (bw_and (lsr x1 (2*i)) (of_int 0x03))
+    requires { x1 = sub n (bw_and (lsr_bv n (1 : t)) (0x55 : t)) }
+    ensures { t'int (bw_and (lsr x1 (2*i)) (0x03 : t))
             = numof (nth n) (2*i) (2*i + 2) }
-    ensures { ule (bw_and (lsr x1 (2*i)) (of_int 0x03)) (of_int 2) }
+    ensures { ule (bw_and (lsr x1 (2*i)) (0x03 : t)) (2 : t) }
   =
     assert { let i' = of_int i in
-             let twoi = mul (of_int 2) i' in
-                 bw_and (lsr_bv x1 twoi) (of_int 0x03)
-               = add (nth_as_bv n twoi) (nth_as_bv n (add twoi (of_int 1)))
+             let twoi = mul (2 : t) i' in
+                 bw_and (lsr_bv x1 twoi) (0x03 : t)
+               = add (nth_as_bv n twoi) (nth_as_bv n (add twoi (1 : t)))
              &&
-                 to_uint (bw_and (lsr_bv x1 twoi) (of_int 0x03))
-               = numof (nth n) (to_uint twoi) (to_uint twoi + 2) }
+                 t'int (bw_and (lsr_bv x1 twoi) (0x03 : t))
+               = numof (nth n) (t'int twoi) (t'int twoi + 2) }
 
   let ghost step2 (n x1 x2 : t) (i : int) : unit
     requires { 0 <= i < 2 }
-    requires { x1 = sub n (bw_and (lsr_bv n (of_int 1)) (of_int 0x55)) }
+    requires { x1 = sub n (bw_and (lsr_bv n (1 : t)) (0x55 : t)) }
     requires { x2 = add
-               (bw_and x1 (of_int 0x33))
-               (bw_and (lsr_bv x1 (of_int 2)) (of_int (0x33))) }
-    ensures  { to_uint (bw_and (lsr x2 (4*i)) (of_int 0x0F))
+               (bw_and x1 (0x33 : t))
+               (bw_and (lsr_bv x1 (2 : t)) (0x33 : t)) }
+    ensures  { t'int (bw_and (lsr x2 (4*i)) (0x0F : t))
              = numof (nth n) (4*i) (4*i+4) }
-    ensures  { ule (bw_and (lsr_bv x2 (of_int (4*i))) (of_int 0x0F))
-                   (of_int 4) }
+    ensures  { ule (bw_and (lsr_bv x2 (of_int (4*i))) (0x0F : t))
+                   (4 : t) }
   =
      step1 n x1 (2*i);
      step1 n x1 (2*i+1);
 
      assert { let i' = of_int i in
-                  ult i' (of_int 2)
+                  ult i' (2 : t)
                 &&
-                  of_int (4*i) = mul (of_int 4) i'
+                  of_int (4*i) = mul (4 : t) i'
                 &&
-                  to_uint (bw_and (lsr x2 (4*i)) (of_int 0x0F))
-                = to_uint (bw_and (lsr_bv x2 (mul (of_int 4) i')) (of_int 0x0F))
-                = to_uint (add (bw_and (lsr_bv x1 (mul (of_int 4) i')) (of_int 0x03))
-                           (bw_and (lsr_bv x1 (add (mul (of_int 4) i') (of_int 2))) (of_int (0x03))))
-                = to_uint (add (bw_and (lsr x1 (4*i)) (of_int 0x03))
-                               (bw_and (lsr x1 ((4*i)+2)) (of_int (0x03))))}
+                  t'int (bw_and (lsr x2 (4*i)) (0x0F : t))
+                = t'int (bw_and (lsr_bv x2 (mul (4 : t) i')) (0x0F : t))
+                = t'int (add (bw_and (lsr_bv x1 (mul (4 : t) i')) (0x03 : t))
+                           (bw_and (lsr_bv x1 (add (mul (4 : t) i') (2 : t))) (0x03 : t)))
+                = t'int (add (bw_and (lsr x1 (4*i)) (0x03 : t))
+                               (bw_and (lsr x1 ((4*i)+2)) (0x03 : t)))}
 
   let ghost prove (n x1 x2 x3 : t) : unit
-    requires { x1 = sub n (bw_and (lsr_bv n (of_int 1)) (of_int 0x55)) }
+    requires { x1 = sub n (bw_and (lsr_bv n (1 : t)) (0x55 : t)) }
     requires { x2 = add
-               (bw_and x1 (of_int 0x33))
-               (bw_and (lsr_bv x1 (of_int 2)) (of_int (0x33))) }
-    requires { x3 = bw_and (add x2 (lsr_bv x2 (of_int 4))) (of_int 0x0F) }
-    ensures { to_uint x3 = numof (nth n) 0 8 }
+               (bw_and x1 (0x33 : t))
+               (bw_and (lsr_bv x1 (2 : t)) (0x33 : t)) }
+    requires { x3 = bw_and (add x2 (lsr_bv x2 (4 : t))) (0x0F : t) }
+    ensures { t'int x3 = numof (nth n) 0 8 }
   =
     step2 n x1 x2 0;
     step2 n x1 x2 1;
 
-    assert {  to_uint (bw_and x2 (of_int 0x0F)) +
-              to_uint (bw_and (lsr_bv x2 (of_int 4)) (of_int 0x0F))
-            = to_uint (bw_and (lsr x2 0) (of_int 0x0F)) +
-              to_uint (bw_and (lsr x2 4) (of_int 0x0F)) }
+    assert {  t'int (bw_and x2 (0x0F : t)) +
+              t'int (bw_and (lsr_bv x2 (4 : t)) (0x0F : t))
+            = t'int (bw_and (lsr x2 0) (0x0F : t)) +
+              t'int (bw_and (lsr x2 4) (0x0F : t)) }
 
   let count (n : t) : t
-    ensures { to_uint result = numof (nth n) 0 8 }
+    ensures { t'int result = numof (nth n) 0 8 }
   =
     let x = ref n in
 
-    x := sub !x (bw_and (lsr_bv !x (of_int 1)) (of_int 0x55));
+    x := sub !x (bw_and (lsr_bv !x (1 : t)) (0x55 : t));
     let ghost x1 = !x in
 
     x := add
-               (bw_and !x (of_int 0x33))
-               (bw_and (lsr_bv !x (of_int 2)) (of_int (0x33)));
+               (bw_and !x (0x33 : t))
+               (bw_and (lsr_bv !x (2 : t)) (0x33 : t));
     let ghost x2 = !x in
 
-    x := bw_and (add !x (lsr_bv !x (of_int 4))) (of_int 0x0F);
+    x := bw_and (add !x (lsr_bv !x (4 : t))) (0x0F : t);
 
     prove n x1 x2 !x;
 
@@ -106,75 +106,75 @@ module BitCounting32
   use import ref.Ref
 
   predicate step0 (n x1 : t) =
-    x1 = sub n (bw_and (lsr_bv n (of_int 1)) (of_int 0x55555555))
+    x1 = sub n (bw_and (lsr_bv n (1 : t)) (0x55555555 : t))
 
   let ghost proof0 (n x1 : t) (i : int) : unit
     requires { 0 <= i < 16 }
     requires { step0 n x1 }
-    ensures { to_uint (bw_and (lsr x1 (2*i)) (of_int 0x03))
+    ensures { t'int (bw_and (lsr x1 (2*i)) (0x03 : t))
               = numof (nth n) (2*i) (2*i + 2) }
   =
     let i' = of_int i in
-    let twoi = mul (of_int 2) i' in
-    assert { to_uint twoi = 2 * i };
-    assert { to_uint (add twoi (of_int 1)) = to_uint twoi + 1 };
-    assert { to_uint (bw_and (lsr_bv x1 twoi) (of_int 0x03))
+    let twoi = mul (2 : t) i' in
+    assert { t'int twoi = 2 * i };
+    assert { t'int (add twoi (1 : t)) = t'int twoi + 1 };
+    assert { t'int (bw_and (lsr_bv x1 twoi) (0x03 : t))
              = (if nth_bv n twoi then 1 else 0) +
-               (if nth_bv n (add twoi (of_int 1)) then 1 else 0)
-             = (if nth n (to_uint twoi) then 1 else 0) +
-               (if nth n (to_uint twoi + 1) then 1 else 0)
-             = numof (nth n) (to_uint twoi) (to_uint twoi + 2) }
+               (if nth_bv n (add twoi (1 : t)) then 1 else 0)
+             = (if nth n (t'int twoi) then 1 else 0) +
+               (if nth n (t'int twoi + 1) then 1 else 0)
+             = numof (nth n) (t'int twoi) (t'int twoi + 2) }
 
   predicate step1 (x1 x2 : t) =
-    x2 = add (bw_and x1 (of_int 0x33333333))
-             (bw_and (lsr_bv x1 (of_int 2)) (of_int (0x33333333)))
+    x2 = add (bw_and x1 (0x33333333 : t))
+             (bw_and (lsr_bv x1 (2 : t)) (0x33333333 : t))
 
   let ghost proof1 (n x1 x2 : t) (i : int) : unit
     requires { 0 <= i < 8 }
     requires { step0 n x1  }
     requires { step1 x1 x2 }
-    ensures  { to_uint (bw_and (lsr x2 (4*i)) (of_int 0x07))
+    ensures  { t'int (bw_and (lsr x2 (4*i)) (0x07 : t))
                = numof (nth n) (4*i) (4*i+4) }
   =
      proof0 n x1 (2*i);
      proof0 n x1 (2*i+1);
      let i' = of_int i in
-     assert { ult i' (of_int 8) };
-     assert { to_uint (mul (of_int 4) i') = 4*i };
-     assert { bw_and (lsr x2 (4*i)) (of_int 0x07)
-              = bw_and (lsr_bv x2 (mul (of_int 4) i')) (of_int 0x07)
-              = add (bw_and (lsr_bv x1 (mul (of_int 4) i')) (of_int 0x03))
-                      (bw_and (lsr_bv x1 (add (mul (of_int 4) i') (of_int 2)))
-                              (of_int (0x03)))
-              = add (bw_and (lsr x1 (4*i)) (of_int 0x03))
-                      (bw_and (lsr x1 ((4*i)+2)) (of_int (0x03))) }
+     assert { ult i' (8 : t) };
+     assert { t'int (mul (4 : t) i') = 4*i };
+     assert { bw_and (lsr x2 (4*i)) (0x07 : t)
+              = bw_and (lsr_bv x2 (mul (4 : t) i')) (0x07 : t)
+              = add (bw_and (lsr_bv x1 (mul (4 : t) i')) (0x03 : t))
+                      (bw_and (lsr_bv x1 (add (mul (4 : t) i') (2 : t)))
+                              (0x03 : t))
+              = add (bw_and (lsr x1 (4*i)) (0x03 : t))
+                      (bw_and (lsr x1 ((4*i)+2)) (0x03 : t)) }
 
   predicate step2 (x2:t) (x3:t) =
-    x3 = bw_and (add x2 (lsr_bv x2 (of_int 4))) (of_int 0x0F0F0F0F)
+    x3 = bw_and (add x2 (lsr_bv x2 (4 : t))) (0x0F0F0F0F : t)
 
   let ghost proof2 (n x1 x2 x3 : t) (i : int) : unit
     requires { 0 <= i < 4 }
     requires { step0 n x1 }
     requires { step1 x1 x2 }
     requires { step2 x2 x3 }
-    ensures  { to_uint (bw_and (lsr x3 (8*i)) (of_int 0x0F))
+    ensures  { t'int (bw_and (lsr x3 (8*i)) (0x0F : t))
              = numof (nth n) (8*i) (8*i+8) }
   =
     proof1 n x1 x2 (2*i);
     proof1 n x1 x2 (2*i+1);
     let i' = of_int i in
-    assert { ult i' (of_int 4) };
-    assert { to_uint (mul (of_int 8) i') = 8*i };
-    assert { to_uint (add (mul (of_int 8) i') (of_int 4)) = 8*i+4 };
-    assert { bw_and (lsr x3 (8*i)) (of_int 0x0F)
-             = bw_and (lsr_bv x3 (mul (of_int 8) i')) (of_int 0x0F)
-             = add (bw_and (lsr_bv x2 (mul (of_int 8) i')) (of_int 0x07))
-                   (bw_and (lsr_bv x2 (add (mul (of_int 8) i') (of_int 4))) (of_int (0x07)))
-             = add (bw_and (lsr x2 (8*i)) (of_int 0x07))
-                   (bw_and (lsr x2 ((8*i)+4)) (of_int (0x07))) }
+    assert { ult i' (4 : t) };
+    assert { t'int (mul (8 : t) i') = 8*i };
+    assert { t'int (add (mul (8 : t) i') (4 : t)) = 8*i+4 };
+    assert { bw_and (lsr x3 (8*i)) (0x0F : t)
+             = bw_and (lsr_bv x3 (mul (8 : t) i')) (0x0F : t)
+             = add (bw_and (lsr_bv x2 (mul (8 : t) i')) (0x07 : t))
+                   (bw_and (lsr_bv x2 (add (mul (8 : t) i') (4 : t))) (0x07 : t))
+             = add (bw_and (lsr x2 (8*i)) (0x07 : t))
+                   (bw_and (lsr x2 ((8*i)+4)) (0x07 : t)) }
 
   predicate step3 (x3:t) (x4:t) =
-    x4 = add x3 (lsr_bv x3 (of_int 8))
+    x4 = add x3 (lsr_bv x3 (8 : t))
 
   let ghost proof3 (n x1 x2 x3 x4 : t) (i : int) : unit
     requires { 0 <= i < 2 }
@@ -182,24 +182,24 @@ module BitCounting32
     requires { step1 x1 x2 }
     requires { step2 x2 x3 }
     requires { step3 x3 x4 }
-    ensures  { to_uint (bw_and (lsr x4 (16*i)) (of_int 0x1F))
+    ensures  { t'int (bw_and (lsr x4 (16*i)) (0x1F : t))
                = numof (nth n) (16*i) (16*i+16) }
   =
     proof2 n x1 x2 x3 (2*i);
     proof2 n x1 x2 x3 (2*i+1);
     let i' = of_int i in
-    assert { ult i' (of_int 2) };
-    assert { to_uint (mul (of_int 16) i') = 16*i };
-    assert { to_uint (add (mul (of_int 16) i') (of_int 8)) = 16*i+8 };
-    assert { bw_and (lsr x4 (16*i)) (of_int 0x1F)
-             = bw_and (lsr_bv x4 (mul (of_int 16) i')) (of_int 0x1F)
-             = add (bw_and (lsr_bv x3 (mul (of_int 16) i')) (of_int 0x0F))
-                   (bw_and (lsr_bv x3 (add (mul (of_int 16) i') (of_int 8))) (of_int (0x0F)))
-             = add (bw_and (lsr x3 (16*i)) (of_int 0x0F))
-                   (bw_and (lsr x3 ((16*i)+8)) (of_int (0x0F))) }
+    assert { ult i' (2 : t) };
+    assert { t'int (mul (16 : t) i') = 16*i };
+    assert { t'int (add (mul (16 : t) i') (8 : t)) = 16*i+8 };
+    assert { bw_and (lsr x4 (16*i)) (0x1F : t)
+             = bw_and (lsr_bv x4 (mul (16 : t) i')) (0x1F : t)
+             = add (bw_and (lsr_bv x3 (mul (16 : t) i')) (0x0F : t))
+                   (bw_and (lsr_bv x3 (add (mul (16 : t) i') (8 : t))) (0x0F : t))
+             = add (bw_and (lsr x3 (16*i)) (0x0F : t))
+                   (bw_and (lsr x3 ((16*i)+8)) (0x0F : t)) }
 
   predicate step4 (x4:t) (x5:t) =
-    x5 = add x4 (lsr_bv x4 (of_int 16))
+    x5 = add x4 (lsr_bv x4 (16 : t))
 
   let ghost prove (n x1 x2 x3 x4 x5 : t) : unit
     requires { step0 n x1 }
@@ -207,43 +207,43 @@ module BitCounting32
     requires { step2 x2 x3 }
     requires { step3 x3 x4 }
     requires { step4 x4 x5 }
-    ensures { to_uint (bw_and x5 (of_int 0x3F)) = numof (nth n) 0 32 }
+    ensures { t'int (bw_and x5 (0x3F : t)) = numof (nth n) 0 32 }
   =
     proof3 n x1 x2 x3 x4 0;
     proof3 n x1 x2 x3 x4 1;
 (* moved to the stdlib
     assert { x4 = lsr x4 0 };
 *)
-    assert { bw_and x5 (of_int 0x3F)
-             = add (bw_and x4 (of_int 0x1F)) (bw_and (lsr_bv x4 (of_int 16)) (of_int 0x1F))
-             = add (bw_and (lsr x4 0) (of_int 0x1F)) (bw_and (lsr x4 16) (of_int 0x1F)) }
+    assert { bw_and x5 (0x3F : t)
+             = add (bw_and x4 (0x1F : t)) (bw_and (lsr_bv x4 (16 : t)) (0x1F : t))
+             = add (bw_and (lsr x4 0) (0x1F : t)) (bw_and (lsr x4 16) (0x1F : t)) }
 
   function count_logic (n:t) : int = numof (nth n) 0 32
 
   let count (n : t) : t
-    ensures { to_uint result = count_logic n }
+    ensures { t'int result = count_logic n }
   =
     let x = ref n in
     (* x = x - ( (x >> 1) & 0x55555555) *)
-    x := sub !x (bw_and (lsr_bv !x (of_int 1)) (of_int 0x55555555));
+    x := sub !x (bw_and (lsr_bv !x (1 : t)) (0x55555555 : t));
     let ghost x1 = !x in
     (* x = (x & 0x33333333) + ((x >> 2) & 0x33333333) *)
-    x := add (bw_and !x (of_int 0x33333333))
-             (bw_and (lsr_bv !x (of_int 2)) (of_int (0x33333333)));
+    x := add (bw_and !x (0x33333333 : t))
+             (bw_and (lsr_bv !x (2 : t)) (0x33333333 : t));
     let ghost x2 = !x in
     (* x = (x + (x >> 4)) & 0x0F0F0F0F *)
-    x := bw_and (add !x (lsr_bv !x (of_int 4))) (of_int 0x0F0F0F0F);
+    x := bw_and (add !x (lsr_bv !x (4 : t))) (0x0F0F0F0F : t);
     let ghost x3 = !x in
     (* x = x + (x >> 8) *)
-    x := add !x (lsr_bv !x (of_int 8));
+    x := add !x (lsr_bv !x (8 : t));
     let ghost x4 = !x in
     (* x = x + (x >> 16) *)
-    x := add !x (lsr_bv !x (of_int 16));
+    x := add !x (lsr_bv !x (16 : t));
 
     prove n x1 x2 x3 x4 !x;
 
     (* return (x & 0x0000003F) *)
-    bw_and !x (of_int 0x0000003F)
+    bw_and !x (0x0000003F : t)
 
 end
 
@@ -260,7 +260,7 @@ module Hamming
   function hammingD_logic (a b : t) : int = NumOf.numof (nth_diff a b) 0 32
 
   let hammingD (a b : t) : t
-    ensures { to_uint result = hammingD_logic a b }
+    ensures { t'int result = hammingD_logic a b }
   =
     assert { forall i. 0 <= i < 32 -> nth (bw_xor a b) i <-> (nth_diff a b i) };
     count (bw_xor a b)
@@ -305,7 +305,7 @@ module AsciiCode
   use import mach.bv.BVCheck32
   use import BitCounting32
 
-  constant one : t = of_int 1
+  constant one : t = 1 : t
   constant lastbit : t = sub size_bv one
 
   (* let lastbit () = (sub_check size_bv one) : t *)
@@ -326,14 +326,14 @@ module AsciiCode
   predicate validAscii (b : t) = even (count_logic b)
 
   let lemma bv_even (b:t)
-    ensures { even (to_uint b) <-> not (nth b 0) }
+    ensures { even (t'int b) <-> not (nth b 0) }
   =
-    assert { not (nth_bv b zeros) <-> b = mul (of_int 2) (lsr_bv b one) };
-    assert { (exists k. b = mul (of_int 2) k) -> not (nth_bv b zeros) };
-    assert { (exists k. to_uint b = 2 * k) -> (exists k. b = mul (of_int 2) k) };
-    assert { not (nth b 0) <-> to_uint b = 2 * to_uint (lsr b 1) }
+    assert { not (nth_bv b zeros) <-> b = mul (2 : t) (lsr_bv b one) };
+    assert { (exists k. b = mul (2 : t) k) -> not (nth_bv b zeros) };
+    assert { (exists k. t'int b = 2 * k) -> (exists k. b = mul (2 : t) k) };
+    assert { not (nth b 0) <-> t'int b = 2 * t'int (lsr b 1) }
 
-  lemma bv_odd : forall b : t. odd (to_uint b) <-> nth b 0
+  lemma bv_odd : forall b : t. odd (t'int b) <-> nth b 0
 
   (* use Numofbit *)
 
@@ -371,10 +371,10 @@ module AsciiCode
     let c = count b in
     let maskbit = lsl_check c lastbit in
     assert { bw_and b maskbit = zeros };
-    assert { even (to_uint c) ->
+    assert { even (t'int c) ->
                not (nth_bv c zeros)
             && count_logic maskbit    = 0 };
-    assert { odd  (to_uint c) ->
+    assert { odd  (t'int c) ->
                nth_bv c zeros
             && nth maskbit 31
             && (forall i. 0 <= i < 31 -> not (nth maskbit i))
@@ -418,7 +418,7 @@ module GrayCode
   use import BitCounting32
   use Hamming
 
-  constant one : t = of_int 1
+  constant one : t = 1 : t
   constant lastbit : t = sub size_bv one
 
   (** {2 Gray code}
@@ -436,11 +436,11 @@ module GrayCode
     bw_xor bv (lsr_bv bv one)
 
   function fromGray (gr : t) : t =
-    let b = bw_xor gr (lsr_bv gr (of_int 1)) in
-    let b = bw_xor b (lsr_bv b (of_int 2)) in
-    let b = bw_xor b (lsr_bv b (of_int 4)) in
-    let b = bw_xor b (lsr_bv b (of_int 8)) in
-      bw_xor b (lsr_bv b (of_int 16))
+    let b = bw_xor gr (lsr_bv gr (1 : t)) in
+    let b = bw_xor b (lsr_bv b (2 : t)) in
+    let b = bw_xor b (lsr_bv b (4 : t)) in
+    let b = bw_xor b (lsr_bv b (8 : t)) in
+      bw_xor b (lsr_bv b (16 : t))
 
   (** Which define an isomorphism. *)
 
@@ -458,7 +458,7 @@ module GrayCode
     assert { b <> ones -> toGray (add b one) = bw_xor (toGray b) (bw_and (bw_not b) (add b one)) };
     assert { b <> ones -> exists k. (bw_and (bw_not b) (add b one)) = lsl one k };
     assert { b <> ones -> count_logic (bw_and (bw_not b) (add b one)) = 1 };
-    assert { b = ones -> (toGray b) = of_int 0x80000000 /\ (toGray (add b one)) = zeros }
+    assert { b = ones -> (toGray b) = 0x80000000 : t /\ (toGray (add b one)) = zeros }
 
   (** Now, a couple of property between the Gray code and the binary
       representation.
diff --git a/examples/bitcount/why3session.xml b/examples/bitcount/why3session.xml
index 55005f6321b71997f53a617c368731d25cf1c359..abfcb287f548f55f065a7bd8e8a9d6e679ca4cb9 100644
--- a/examples/bitcount/why3session.xml
+++ b/examples/bitcount/why3session.xml
@@ -2,114 +2,202 @@
 <!DOCTYPE why3session PUBLIC "-//Why3//proof session v5//EN"
 "http://why3.lri.fr/why3session.dtd">
 <why3session shape_version="4">
-<prover id="0" name="Alt-Ergo" version="0.99.1" timelimit="5" steplimit="0" memlimit="1000"/>
-<prover id="1" name="CVC3" version="2.4.1" timelimit="30" steplimit="0" memlimit="1000"/>
-<prover id="2" name="CVC4" version="1.4" timelimit="5" steplimit="0" memlimit="1000"/>
-<prover id="3" name="Alt-Ergo" version="1.01" timelimit="1" steplimit="0" memlimit="1000"/>
-<prover id="4" name="Z3" version="4.4.0" timelimit="5" steplimit="0" memlimit="1000"/>
-<prover id="5" name="CVC4" version="1.4" alternative="noBV" timelimit="30" steplimit="0" memlimit="1000"/>
+<prover id="0" name="Z3" version="4.5.0" alternative="noBV" timelimit="5" steplimit="0" memlimit="4000"/>
+<prover id="1" name="Z3" version="4.4.1" timelimit="5" steplimit="0" memlimit="1000"/>
+<prover id="2" name="CVC4" version="1.4" timelimit="5" steplimit="0" memlimit="4000"/>
+<prover id="3" name="Alt-Ergo" version="1.01" timelimit="6" steplimit="0" memlimit="4000"/>
+<prover id="4" name="Z3" version="4.5.0" timelimit="5" steplimit="0" memlimit="4000"/>
+<prover id="5" name="CVC4" version="1.4" alternative="noBV" timelimit="5" steplimit="0" memlimit="4000"/>
+<prover id="6" name="Alt-Ergo" version="1.30" timelimit="5" steplimit="0" memlimit="4000"/>
+<prover id="7" name="Z3" version="4.3.2" timelimit="6" steplimit="0" memlimit="4000"/>
 <file name="../bitcount.mlw" expanded="true">
-<theory name="BitCount8bit_fact" sum="eb4b1bf6da7b0da8d18857818ce50281">
+<theory name="BitCount8bit_fact" sum="476b3eb457557c47229e7aecfbd25d56" expanded="true">
  <goal name="nth_as_bv_is_int">
- <proof prover="0"><result status="valid" time="0.18" steps="90"/></proof>
+ <proof prover="2"><result status="valid" time="0.05"/></proof>
+ <proof prover="5"><result status="valid" time="0.08"/></proof>
+ <proof prover="6"><result status="valid" time="0.16" steps="166"/></proof>
  </goal>
  <goal name="WP_parameter step1" expl="VC for step1">
  <transf name="split_goal_wp">
   <goal name="WP_parameter step1.1" expl="1. assertion">
   <transf name="split_goal_wp">
    <goal name="WP_parameter step1.1.1" expl="1. assertion">
-   <proof prover="2"><result status="valid" time="0.03"/></proof>
+   <proof prover="1"><result status="valid" time="0.02"/></proof>
+   <proof prover="4"><result status="valid" time="0.06"/></proof>
    </goal>
    <goal name="WP_parameter step1.1.2" expl="2. assertion">
-   <proof prover="2"><result status="valid" time="0.59"/></proof>
+   <proof prover="2"><result status="valid" time="0.56"/></proof>
+   <proof prover="4"><result status="valid" time="0.11"/></proof>
    </goal>
   </transf>
   </goal>
   <goal name="WP_parameter step1.2" expl="2. postcondition">
-  <proof prover="0"><result status="valid" time="2.88" steps="671"/></proof>
+  <proof prover="4"><result status="valid" time="0.08"/></proof>
+  <proof prover="6"><result status="valid" time="0.20" steps="207"/></proof>
   </goal>
   <goal name="WP_parameter step1.3" expl="3. postcondition">
-  <proof prover="0"><result status="valid" time="0.50" steps="187"/></proof>
+  <proof prover="3"><result status="valid" time="0.17" steps="294"/></proof>
+  <proof prover="4"><result status="valid" time="0.08"/></proof>
+  <proof prover="6"><result status="valid" time="0.17" steps="151"/></proof>
   </goal>
  </transf>
  </goal>
- <goal name="WP_parameter step2" expl="VC for step2">
- <transf name="split_goal_wp">
+ <goal name="WP_parameter step2" expl="VC for step2" expanded="true">
+ <transf name="split_goal_wp" expanded="true">
   <goal name="WP_parameter step2.1" expl="1. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="71"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.04"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="77"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.07"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="78"/></proof>
   </goal>
   <goal name="WP_parameter step2.2" expl="2. precondition">
-  <transf name="split_goal_wp">
-   <goal name="WP_parameter step2.2.1" expl="1. precondition">
-   <proof prover="0"><result status="valid" time="0.02" steps="71"/></proof>
-   </goal>
-  </transf>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.04"/></proof>
+  <proof prover="3"><result status="valid" time="0.02" steps="77"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.07"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="78"/></proof>
   </goal>
   <goal name="WP_parameter step2.3" expl="3. precondition">
   <transf name="split_goal_wp">
    <goal name="WP_parameter step2.3.1" expl="1. VC for step2">
-   <proof prover="0"><result status="valid" time="0.05" steps="75"/></proof>
+   <proof prover="0"><result status="valid" time="0.02"/></proof>
+   <proof prover="2"><result status="valid" time="0.04"/></proof>
+   <proof prover="3"><result status="valid" time="0.05" steps="82"/></proof>
+   <proof prover="4"><result status="valid" time="0.02"/></proof>
+   <proof prover="5"><result status="valid" time="0.07"/></proof>
+   <proof prover="6"><result status="valid" time="0.03" steps="83"/></proof>
    </goal>
    <goal name="WP_parameter step2.3.2" expl="2. VC for step2">
-   <proof prover="0"><result status="valid" time="0.04" steps="75"/></proof>
+   <proof prover="0"><result status="valid" time="0.02"/></proof>
+   <proof prover="2"><result status="valid" time="0.04"/></proof>
+   <proof prover="3"><result status="valid" time="0.04" steps="82"/></proof>
+   <proof prover="4"><result status="valid" time="0.02"/></proof>
+   <proof prover="5"><result status="valid" time="0.07"/></proof>
+   <proof prover="6"><result status="valid" time="0.03" steps="83"/></proof>
    </goal>
   </transf>
   </goal>
   <goal name="WP_parameter step2.4" expl="4. precondition">
-  <proof prover="0"><result status="valid" time="0.02" steps="75"/></proof>
-  </goal>
-  <goal name="WP_parameter step2.5" expl="5. assertion">
   <transf name="split_goal_wp">
+   <goal name="WP_parameter step2.4.1" expl="1. precondition">
+   <proof prover="0"><result status="valid" time="0.01"/></proof>
+   <proof prover="2"><result status="valid" time="0.04"/></proof>
+   <proof prover="3"><result status="valid" time="0.02" steps="82"/></proof>
+   <proof prover="4"><result status="valid" time="0.02"/></proof>
+   <proof prover="5"><result status="valid" time="0.07"/></proof>
+   <proof prover="6"><result status="valid" time="0.03" steps="83"/></proof>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="WP_parameter step2.5" expl="5. assertion" expanded="true">
+  <transf name="split_goal_wp" expanded="true">
    <goal name="WP_parameter step2.5.1" expl="1. assertion">
-   <proof prover="0"><result status="valid" time="0.10" steps="89"/></proof>
+   <proof prover="0"><result status="valid" time="0.66"/></proof>
+   <proof prover="2"><result status="valid" time="0.11"/></proof>
+   <proof prover="3"><result status="valid" time="0.10" steps="118"/></proof>
+   <proof prover="4"><result status="valid" time="0.04"/></proof>
+   <proof prover="5"><result status="valid" time="0.10"/></proof>
+   <proof prover="6"><result status="valid" time="0.05" steps="105"/></proof>
    </goal>
    <goal name="WP_parameter step2.5.2" expl="2. assertion">
-   <proof prover="0"><result status="valid" time="0.65" steps="147"/></proof>
+   <proof prover="2"><result status="valid" time="0.16"/></proof>
+   <proof prover="3"><result status="valid" time="0.10" steps="151"/></proof>
+   <proof prover="4"><result status="valid" time="0.04"/></proof>
+   <proof prover="6"><result status="valid" time="0.12" steps="153"/></proof>
    </goal>
    <goal name="WP_parameter step2.5.3" expl="3. assertion">
-   <proof prover="0"><result status="valid" time="0.65" steps="148"/></proof>
+   <proof prover="3"><result status="valid" time="0.73" steps="358"/></proof>
+   <proof prover="4"><result status="valid" time="0.07"/></proof>
+   <proof prover="5"><result status="valid" time="0.12"/></proof>
+   <proof prover="6"><result status="valid" time="0.84" steps="252"/></proof>
    </goal>
-   <goal name="WP_parameter step2.5.4" expl="4. assertion">
-   <proof prover="2"><result status="valid" time="0.07"/></proof>
+   <goal name="WP_parameter step2.5.4" expl="4. assertion" expanded="true">
+   <proof prover="2"><result status="valid" time="0.04"/></proof>
+   <proof prover="4"><result status="valid" time="0.08"/></proof>
    </goal>
    <goal name="WP_parameter step2.5.5" expl="5. assertion">
-   <proof prover="5"><result status="valid" time="6.12"/></proof>
+   <proof prover="2"><result status="valid" time="2.74"/></proof>
+   <proof prover="4"><result status="valid" time="0.08"/></proof>
    </goal>
   </transf>
   </goal>
   <goal name="WP_parameter step2.6" expl="6. postcondition">
   <proof prover="2"><result status="valid" time="0.05"/></proof>
+  <proof prover="4"><result status="valid" time="0.04"/></proof>
+  <proof prover="5"><result status="valid" time="0.12"/></proof>
+  <proof prover="6" memlimit="1000"><result status="valid" time="3.14" steps="1615"/></proof>
   </goal>
   <goal name="WP_parameter step2.7" expl="7. postcondition">
-  <proof prover="0"><result status="valid" time="0.32" steps="140"/></proof>
+  <proof prover="2"><result status="valid" time="0.10"/></proof>
+  <proof prover="3"><result status="valid" time="0.53" steps="272"/></proof>
+  <proof prover="4"><result status="valid" time="0.04"/></proof>
+  <proof prover="5"><result status="valid" time="0.12"/></proof>
+  <proof prover="6"><result status="valid" time="0.54" steps="495"/></proof>
   </goal>
  </transf>
  </goal>
  <goal name="WP_parameter prove" expl="VC for prove">
  <transf name="split_goal_wp">
   <goal name="WP_parameter prove.1" expl="1. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="70"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.03"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="78"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.04"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="79"/></proof>
   </goal>
   <goal name="WP_parameter prove.2" expl="2. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="70"/></proof>
+  <proof prover="0"><result status="valid" time="0.01"/></proof>
+  <proof prover="2"><result status="valid" time="0.04"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="78"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.06"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="79"/></proof>
   </goal>
   <goal name="WP_parameter prove.3" expl="3. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="70"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.04"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="78"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.06"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="79"/></proof>
   </goal>
   <goal name="WP_parameter prove.4" expl="4. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="74"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.03"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="82"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.04"/></proof>
+  <proof prover="6"><result status="valid" time="0.04" steps="83"/></proof>
   </goal>
   <goal name="WP_parameter prove.5" expl="5. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="74"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.03"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="82"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.06"/></proof>
+  <proof prover="6"><result status="valid" time="0.04" steps="83"/></proof>
   </goal>
   <goal name="WP_parameter prove.6" expl="6. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="74"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.04"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="82"/></proof>
+  <proof prover="4"><result status="valid" time="0.01"/></proof>
+  <proof prover="5"><result status="valid" time="0.06"/></proof>
+  <proof prover="6"><result status="valid" time="0.04" steps="83"/></proof>
   </goal>
   <goal name="WP_parameter prove.7" expl="7. assertion">
-  <proof prover="0"><result status="valid" time="1.10" steps="199"/></proof>
+  <proof prover="3"><result status="valid" time="0.12" steps="89"/></proof>
+  <proof prover="4"><result status="valid" time="0.18"/></proof>
+  <proof prover="5"><result status="valid" time="0.10"/></proof>
+  <proof prover="6"><result status="valid" time="0.16" steps="155"/></proof>
   </goal>
   <goal name="WP_parameter prove.8" expl="8. postcondition">
-  <proof prover="2"><result status="valid" time="0.14"/></proof>
+  <proof prover="2"><result status="valid" time="0.20"/></proof>
+  <proof prover="4"><result status="valid" time="0.06"/></proof>
   </goal>
  </transf>
  </goal>
@@ -118,431 +206,792 @@
   <goal name="WP_parameter count.1" expl="1. precondition">
   <transf name="split_goal_wp">
    <goal name="WP_parameter count.1.1" expl="1. precondition">
-   <proof prover="0"><result status="valid" time="0.04" steps="70"/></proof>
+   <proof prover="0"><result status="valid" time="0.02"/></proof>
+   <proof prover="2"><result status="valid" time="0.04"/></proof>
+   <proof prover="3"><result status="valid" time="0.04" steps="78"/></proof>
+   <proof prover="4"><result status="valid" time="0.01"/></proof>
+   <proof prover="5"><result status="valid" time="0.07"/></proof>
+   <proof prover="6"><result status="valid" time="0.02" steps="79"/></proof>
    </goal>
   </transf>
   </goal>
   <goal name="WP_parameter count.2" expl="2. precondition">
-  <proof prover="0"><result status="valid" time="0.05" steps="70"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.04"/></proof>
+  <proof prover="3"><result status="valid" time="0.05" steps="78"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.07"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="79"/></proof>
   </goal>
   <goal name="WP_parameter count.3" expl="3. precondition">
   <transf name="split_goal_wp">
    <goal name="WP_parameter count.3.1" expl="1. precondition">
-   <proof prover="0"><result status="valid" time="0.05" steps="70"/></proof>
+   <proof prover="0"><result status="valid" time="0.02"/></proof>
+   <proof prover="2"><result status="valid" time="0.04"/></proof>
+   <proof prover="3"><result status="valid" time="0.05" steps="78"/></proof>
+   <proof prover="4"><result status="valid" time="0.02"/></proof>
+   <proof prover="5"><result status="valid" time="0.06"/></proof>
+   <proof prover="6"><result status="valid" time="0.02" steps="79"/></proof>
    </goal>
   </transf>
   </goal>
   <goal name="WP_parameter count.4" expl="4. postcondition">
-  <proof prover="0"><result status="valid" time="0.05" steps="71"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.04"/></proof>
+  <proof prover="3"><result status="valid" time="0.05" steps="79"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.05"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="80"/></proof>
   </goal>
  </transf>
  </goal>
 </theory>
-<theory name="BitCounting32" sum="26d2716fa6dd73aaa13932d1cc094aa4">
- <goal name="WP_parameter proof0" expl="VC for proof0">
- <transf name="split_goal_wp">
-  <goal name="WP_parameter proof0.1" expl="1. assertion">
-  <proof prover="0"><result status="valid" time="0.04" steps="80"/></proof>
+<theory name="BitCounting32" sum="7925406e0d68ff12c1657367a352ec1c" expanded="true">
+ <goal name="WP_parameter proof0" expl="VC for proof0" expanded="true">
+ <transf name="split_goal_wp" expanded="true">
+  <goal name="WP_parameter proof0.1" expl="1. assertion" expanded="true">
+  <proof prover="3"><result status="valid" time="0.03" steps="89"/></proof>
+  <proof prover="4"><result status="valid" time="0.04"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="89"/></proof>
   </goal>
   <goal name="WP_parameter proof0.2" expl="2. assertion">
-  <proof prover="0"><result status="valid" time="0.03" steps="79"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="82"/></proof>
+  <proof prover="4"><result status="valid" time="0.07"/></proof>
+  <proof prover="6"><result status="valid" time="0.04" steps="82"/></proof>
   </goal>
   <goal name="WP_parameter proof0.3" expl="3. assertion">
   <transf name="split_goal_wp">
    <goal name="WP_parameter proof0.3.1" expl="1. VC for proof0">
    <transf name="introduce_premises">
     <goal name="WP_parameter proof0.3.1.1" expl="1. VC for proof0">
-    <proof prover="2"><result status="valid" time="0.17"/></proof>
+    <proof prover="2"><result status="valid" time="0.19"/></proof>
+    <proof prover="4"><result status="valid" time="0.12"/></proof>
     </goal>
    </transf>
    </goal>
    <goal name="WP_parameter proof0.3.2" expl="2. VC for proof0">
-   <proof prover="0"><result status="valid" time="0.04" steps="109"/></proof>
+   <proof prover="3"><result status="valid" time="0.41" steps="348"/></proof>
+   <proof prover="5"><result status="valid" time="0.12"/></proof>
+   <proof prover="6"><result status="valid" time="0.05" steps="130"/></proof>
    </goal>
    <goal name="WP_parameter proof0.3.3" expl="3. VC for proof0">
-   <proof prover="0"><result status="valid" time="0.83" steps="187"/></proof>
+   <proof prover="3"><result status="valid" time="0.30" steps="395"/></proof>
+   <proof prover="4"><result status="valid" time="0.14"/></proof>
+   <proof prover="5"><result status="valid" time="0.12"/></proof>
+   <proof prover="6"><result status="valid" time="0.20" steps="356"/></proof>
    </goal>
   </transf>
   </goal>
   <goal name="WP_parameter proof0.4" expl="4. postcondition">
-  <proof prover="0"><result status="valid" time="0.29" steps="304"/></proof>
+  <proof prover="3"><result status="valid" time="0.16" steps="472"/></proof>
+  <proof prover="4"><result status="valid" time="0.23"/></proof>
+  <proof prover="5"><result status="valid" time="0.11"/></proof>
+  <proof prover="6"><result status="valid" time="0.18" steps="332"/></proof>
   </goal>
  </transf>
  </goal>
  <goal name="WP_parameter proof1" expl="VC for proof1">
  <transf name="split_goal_wp">
   <goal name="WP_parameter proof1.1" expl="1. precondition">
-  <proof prover="0"><result status="valid" time="0.03" steps="71"/></proof>
+  <proof prover="0"><result status="valid" time="0.04"/></proof>
+  <proof prover="2"><result status="valid" time="0.05"/></proof>
+  <proof prover="3"><result status="valid" time="0.03" steps="77"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.06"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="78"/></proof>
   </goal>
   <goal name="WP_parameter proof1.2" expl="2. precondition">
-  <proof prover="0"><result status="valid" time="0.02" steps="71"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.05"/></proof>
+  <proof prover="3"><result status="valid" time="0.02" steps="77"/></proof>
+  <proof prover="4"><result status="valid" time="0.01"/></proof>
+  <proof prover="5"><result status="valid" time="0.06"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="78"/></proof>
   </goal>
   <goal name="WP_parameter proof1.3" expl="3. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="74"/></proof>
+  <proof prover="0"><result status="valid" time="0.03"/></proof>
+  <proof prover="2"><result status="valid" time="0.05"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="81"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.07"/></proof>
+  <proof prover="6"><result status="valid" time="0.02" steps="82"/></proof>
   </goal>
   <goal name="WP_parameter proof1.4" expl="4. precondition">
-  <proof prover="0"><result status="valid" time="0.03" steps="74"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.05"/></proof>
+  <proof prover="3"><result status="valid" time="0.03" steps="81"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.06"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="82"/></proof>
   </goal>
   <goal name="WP_parameter proof1.5" expl="5. assertion">
-  <proof prover="0"><result status="valid" time="0.04" steps="87"/></proof>
+  <proof prover="0"><result status="valid" time="0.61"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="109"/></proof>
+  <proof prover="4"><result status="valid" time="0.06"/></proof>
+  <proof prover="5"><result status="valid" time="0.10"/></proof>
+  <proof prover="6"><result status="valid" time="0.04" steps="105"/></proof>
   </goal>
   <goal name="WP_parameter proof1.6" expl="6. assertion">
-  <proof prover="0"><result status="valid" time="0.63" steps="144"/></proof>
+  <proof prover="2"><result status="valid" time="0.12"/></proof>
+  <proof prover="3"><result status="valid" time="0.10" steps="155"/></proof>
+  <proof prover="4"><result status="valid" time="0.04"/></proof>
+  <proof prover="6"><result status="valid" time="0.13" steps="155"/></proof>
   </goal>
   <goal name="WP_parameter proof1.7" expl="7. assertion">
   <transf name="split_goal_wp">
    <goal name="WP_parameter proof1.7.1" expl="1. VC for proof1">
-   <proof prover="0"><result status="valid" time="0.03" steps="84"/></proof>
+   <proof prover="3"><result status="valid" time="0.03" steps="93"/></proof>
+   <proof prover="4"><result status="valid" time="0.06"/></proof>
+   <proof prover="5"><result status="valid" time="0.10"/></proof>
+   <proof prover="6"><result status="valid" time="0.04" steps="94"/></proof>
    </goal>
    <goal name="WP_parameter proof1.7.2" expl="2. VC for proof1">
    <proof prover="2"><result status="valid" time="0.05"/></proof>
+   <proof prover="4"><result status="valid" time="0.12"/></proof>
    </goal>
    <goal name="WP_parameter proof1.7.3" expl="3. VC for proof1">
-   <proof prover="0"><result status="valid" time="0.04" steps="90"/></proof>
+   <proof prover="3"><result status="valid" time="0.04" steps="96"/></proof>
+   <proof prover="4"><result status="valid" time="0.09"/></proof>
+   <proof prover="5"><result status="valid" time="1.00"/></proof>
+   <proof prover="6"><result status="valid" time="0.04" steps="97"/></proof>
    </goal>
   </transf>
   </goal>
   <goal name="WP_parameter proof1.8" expl="8. postcondition">
   <proof prover="2"><result status="valid" time="0.05"/></proof>
+  <proof prover="4"><result status="valid" time="0.06"/></proof>
+  <proof prover="5"><result status="valid" time="0.13"/></proof>
   </goal>
  </transf>
  </goal>
- <goal name="WP_parameter proof2" expl="VC for proof2">
- <transf name="split_goal_wp">
+ <goal name="WP_parameter proof2" expl="VC for proof2" expanded="true">
+ <transf name="split_goal_wp" expanded="true">
   <goal name="WP_parameter proof2.1" expl="1. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="72"/></proof>
+  <proof prover="0"><result status="valid" time="0.03"/></proof>
+  <proof prover="2"><result status="valid" time="0.05"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="80"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.07"/></proof>
+  <proof prover="6"><result status="valid" time="0.02" steps="81"/></proof>
   </goal>
   <goal name="WP_parameter proof2.2" expl="2. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="72"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.05"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="80"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.07"/></proof>
+  <proof prover="6"><result status="valid" time="0.02" steps="81"/></proof>
   </goal>
   <goal name="WP_parameter proof2.3" expl="3. precondition">
-  <proof prover="0"><result status="valid" time="0.03" steps="72"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.05"/></proof>
+  <proof prover="3"><result status="valid" time="0.03" steps="80"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.07"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="81"/></proof>
   </goal>
   <goal name="WP_parameter proof2.4" expl="4. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="75"/></proof>
+  <proof prover="0"><result status="valid" time="0.03"/></proof>
+  <proof prover="2"><result status="valid" time="0.05"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="84"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.06"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="85"/></proof>
   </goal>
   <goal name="WP_parameter proof2.5" expl="5. precondition">
-  <proof prover="0"><result status="valid" time="0.03" steps="75"/></proof>
+  <proof prover="0"><result status="valid" time="0.01"/></proof>
+  <proof prover="2"><result status="valid" time="0.05"/></proof>
+  <proof prover="3"><result status="valid" time="0.03" steps="84"/></proof>
+  <proof prover="4"><result status="valid" time="0.01"/></proof>
+  <proof prover="5"><result status="valid" time="0.06"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="85"/></proof>
   </goal>
   <goal name="WP_parameter proof2.6" expl="6. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="75"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.05"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="84"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.06"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="85"/></proof>
   </goal>
   <goal name="WP_parameter proof2.7" expl="7. assertion">
-  <proof prover="0"><result status="valid" time="0.06" steps="91"/></proof>
+  <proof prover="0"><result status="valid" time="0.62"/></proof>
+  <proof prover="3"><result status="valid" time="0.06" steps="113"/></proof>
+  <proof prover="4"><result status="valid" time="0.06"/></proof>
+  <proof prover="5"><result status="valid" time="0.11"/></proof>
+  <proof prover="6"><result status="valid" time="0.05" steps="109"/></proof>
   </goal>
-  <goal name="WP_parameter proof2.8" expl="8. assertion">
-  <proof prover="0"><result status="valid" time="0.58" steps="150"/></proof>
+  <goal name="WP_parameter proof2.8" expl="8. assertion" expanded="true">
+  <proof prover="2"><result status="valid" time="0.06"/></proof>
+  <proof prover="3"><result status="valid" time="0.14" steps="162"/></proof>
+  <proof prover="4"><result status="valid" time="0.04"/></proof>
+  <proof prover="6"><result status="valid" time="0.04" steps="162"/></proof>
   </goal>
   <goal name="WP_parameter proof2.9" expl="9. assertion">
-  <proof prover="2" timelimit="1"><result status="valid" time="0.06"/></proof>
-  <proof prover="3"><result status="valid" time="0.23" steps="164"/></proof>
+  <proof prover="2"><result status="valid" time="0.11"/></proof>
+  <proof prover="3"><result status="valid" time="0.11" steps="99"/></proof>
+  <proof prover="4"><result status="valid" time="0.04"/></proof>
+  <proof prover="6"><result status="valid" time="0.02" steps="99"/></proof>
   </goal>
   <goal name="WP_parameter proof2.10" expl="10. assertion">
   <transf name="split_goal_wp">
    <goal name="WP_parameter proof2.10.1" expl="1. VC for proof2">
-   <proof prover="0"><result status="valid" time="0.03" steps="87"/></proof>
+   <proof prover="3"><result status="valid" time="0.03" steps="97"/></proof>
+   <proof prover="4"><result status="valid" time="0.09"/></proof>
+   <proof prover="5"><result status="valid" time="0.10"/></proof>
+   <proof prover="6"><result status="valid" time="0.04" steps="98"/></proof>
    </goal>
    <goal name="WP_parameter proof2.10.2" expl="2. VC for proof2">
+   <proof prover="1"><result status="valid" time="0.02"/></proof>
    <proof prover="2"><result status="valid" time="0.07"/></proof>
+   <proof prover="4"><result status="valid" time="0.11"/></proof>
    </goal>
    <goal name="WP_parameter proof2.10.3" expl="3. VC for proof2">
-   <proof prover="0"><result status="valid" time="0.03" steps="89"/></proof>
+   <proof prover="3"><result status="valid" time="0.03" steps="96"/></proof>
+   <proof prover="4"><result status="valid" time="0.09"/></proof>
+   <proof prover="5"><result status="valid" time="0.10"/></proof>
+   <proof prover="6"><result status="valid" time="0.04" steps="97"/></proof>
    </goal>
   </transf>
   </goal>
   <goal name="WP_parameter proof2.11" expl="11. postcondition">
-  <proof prover="2"><result status="valid" time="0.07"/></proof>
+  <proof prover="2"><result status="valid" time="0.18"/></proof>
+  <proof prover="4"><result status="valid" time="0.10"/></proof>
+  <proof prover="5"><result status="valid" time="0.14"/></proof>
   </goal>
  </transf>
  </goal>
- <goal name="WP_parameter proof3" expl="VC for proof3">
- <transf name="split_goal_wp">
+ <goal name="WP_parameter proof3" expl="VC for proof3" expanded="true">
+ <transf name="split_goal_wp" expanded="true">
   <goal name="WP_parameter proof3.1" expl="1. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="73"/></proof>
+  <proof prover="0"><result status="valid" time="0.03"/></proof>
+  <proof prover="2"><result status="valid" time="0.05"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="82"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.06"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="83"/></proof>
   </goal>
   <goal name="WP_parameter proof3.2" expl="2. precondition">
-  <proof prover="0"><result status="valid" time="0.03" steps="73"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.06"/></proof>
+  <proof prover="3"><result status="valid" time="0.03" steps="82"/></proof>
+  <proof prover="4"><result status="valid" time="0.01"/></proof>
+  <proof prover="5"><result status="valid" time="0.07"/></proof>
+  <proof prover="6"><result status="valid" time="0.02" steps="83"/></proof>
   </goal>
   <goal name="WP_parameter proof3.3" expl="3. precondition">
-  <proof prover="0"><result status="valid" time="0.03" steps="73"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.05"/></proof>
+  <proof prover="3"><result status="valid" time="0.03" steps="82"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.06"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="83"/></proof>
   </goal>
   <goal name="WP_parameter proof3.4" expl="4. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="73"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.06"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="82"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.07"/></proof>
+  <proof prover="6"><result status="valid" time="0.02" steps="83"/></proof>
   </goal>
   <goal name="WP_parameter proof3.5" expl="5. precondition">
-  <proof prover="0"><result status="valid" time="0.03" steps="76"/></proof>
+  <proof prover="0"><result status="valid" time="0.03"/></proof>
+  <proof prover="2"><result status="valid" time="0.06"/></proof>
+  <proof prover="3"><result status="valid" time="0.03" steps="86"/></proof>
+  <proof prover="4"><result status="valid" time="0.03"/></proof>
+  <proof prover="5"><result status="valid" time="0.06"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="87"/></proof>
   </goal>
   <goal name="WP_parameter proof3.6" expl="6. precondition">
-  <proof prover="0"><result status="valid" time="0.03" steps="76"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.07"/></proof>
+  <proof prover="3"><result status="valid" time="0.03" steps="86"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.07"/></proof>
+  <proof prover="6"><result status="valid" time="0.02" steps="87"/></proof>
   </goal>
   <goal name="WP_parameter proof3.7" expl="7. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="76"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.06"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="86"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.06"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="87"/></proof>
   </goal>
   <goal name="WP_parameter proof3.8" expl="8. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="76"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.06"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="86"/></proof>
+  <proof prover="4"><result status="valid" time="0.01"/></proof>
+  <proof prover="5"><result status="valid" time="0.07"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="87"/></proof>
   </goal>
   <goal name="WP_parameter proof3.9" expl="9. assertion">
-  <proof prover="0"><result status="valid" time="0.05" steps="93"/></proof>
-  </goal>
-  <goal name="WP_parameter proof3.10" expl="10. assertion">
-  <proof prover="0"><result status="valid" time="0.57" steps="156"/></proof>
+  <proof prover="0"><result status="valid" time="0.65"/></proof>
+  <proof prover="3"><result status="valid" time="0.05" steps="117"/></proof>
+  <proof prover="4"><result status="valid" time="0.06"/></proof>
+  <proof prover="5"><result status="valid" time="0.10"/></proof>
+  <proof prover="6"><result status="valid" time="0.04" steps="113"/></proof>
+  </goal>
+  <goal name="WP_parameter proof3.10" expl="10. assertion" expanded="true">
+  <proof prover="2"><result status="valid" time="0.12"/></proof>
+  <proof prover="3"><result status="valid" time="0.26" steps="246"/></proof>
+  <proof prover="4"><result status="valid" time="0.04"/></proof>
+  <proof prover="6"><result status="valid" time="0.04" steps="238"/></proof>
   </goal>
   <goal name="WP_parameter proof3.11" expl="11. assertion">
-  <proof prover="0"><result status="valid" time="0.06" steps="93"/></proof>
+  <proof prover="2"><result status="valid" time="0.14"/></proof>
+  <proof prover="3"><result status="valid" time="0.03" steps="102"/></proof>
+  <proof prover="4"><result status="valid" time="0.04"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="102"/></proof>
   </goal>
   <goal name="WP_parameter proof3.12" expl="12. assertion">
   <transf name="split_goal_wp">
    <goal name="WP_parameter proof3.12.1" expl="1. VC for proof3">
-   <proof prover="0"><result status="valid" time="0.04" steps="89"/></proof>
+   <proof prover="3"><result status="valid" time="0.04" steps="100"/></proof>
+   <proof prover="4"><result status="valid" time="0.03"/></proof>
+   <proof prover="5"><result status="valid" time="0.10"/></proof>
+   <proof prover="6"><result status="valid" time="0.04" steps="101"/></proof>
    </goal>
    <goal name="WP_parameter proof3.12.2" expl="2. VC for proof3">
    <proof prover="2"><result status="valid" time="0.07"/></proof>
+   <proof prover="4"><result status="valid" time="0.15"/></proof>
    </goal>
    <goal name="WP_parameter proof3.12.3" expl="3. VC for proof3">
-   <proof prover="0"><result status="valid" time="0.03" steps="91"/></proof>
+   <proof prover="3"><result status="valid" time="0.03" steps="99"/></proof>
+   <proof prover="4"><result status="valid" time="0.18"/></proof>
+   <proof prover="5"><result status="valid" time="0.08"/></proof>
+   <proof prover="6"><result status="valid" time="0.04" steps="100"/></proof>
    </goal>
   </transf>
   </goal>
   <goal name="WP_parameter proof3.13" expl="13. postcondition">
   <proof prover="2"><result status="valid" time="0.17"/></proof>
+  <proof prover="4"><result status="valid" time="0.16"/></proof>
+  <proof prover="5"><result status="valid" time="0.12"/></proof>
   </goal>
  </transf>
  </goal>
  <goal name="WP_parameter prove" expl="VC for prove">
  <transf name="split_goal_wp">
   <goal name="WP_parameter prove.1" expl="1. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="72"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.04"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="82"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.04"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="83"/></proof>
   </goal>
   <goal name="WP_parameter prove.2" expl="2. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="72"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.05"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="82"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.06"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="83"/></proof>
   </goal>
   <goal name="WP_parameter prove.3" expl="3. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="72"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.05"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="82"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.06"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="83"/></proof>
   </goal>
   <goal name="WP_parameter prove.4" expl="4. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="72"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.06"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="82"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.06"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="83"/></proof>
   </goal>
   <goal name="WP_parameter prove.5" expl="5. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="72"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.05"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="82"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.06"/></proof>
+  <proof prover="6"><result status="valid" time="0.04" steps="83"/></proof>
   </goal>
   <goal name="WP_parameter prove.6" expl="6. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="75"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.04"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="86"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.04"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="87"/></proof>
   </goal>
   <goal name="WP_parameter prove.7" expl="7. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="75"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.06"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="86"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.06"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="87"/></proof>
   </goal>
   <goal name="WP_parameter prove.8" expl="8. precondition">
-  <proof prover="0"><result status="valid" time="0.05" steps="75"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.06"/></proof>
+  <proof prover="3"><result status="valid" time="0.05" steps="86"/></proof>
+  <proof prover="4"><result status="valid" time="0.01"/></proof>
+  <proof prover="5"><result status="valid" time="0.06"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="87"/></proof>
   </goal>
   <goal name="WP_parameter prove.9" expl="9. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="75"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.05"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="86"/></proof>
+  <proof prover="4"><result status="valid" time="0.01"/></proof>
+  <proof prover="5"><result status="valid" time="0.06"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="87"/></proof>
   </goal>
   <goal name="WP_parameter prove.10" expl="10. precondition">
-  <proof prover="0"><result status="valid" time="0.05" steps="75"/></proof>
+  <proof prover="0"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.05"/></proof>
+  <proof prover="3"><result status="valid" time="0.05" steps="86"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.06"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="87"/></proof>
   </goal>
   <goal name="WP_parameter prove.11" expl="11. assertion">
   <transf name="split_goal_wp">
    <goal name="WP_parameter prove.11.1" expl="1. VC for prove">
    <proof prover="2"><result status="valid" time="0.04"/></proof>
+   <proof prover="4"><result status="valid" time="0.03"/></proof>
+   <proof prover="7"><result status="timeout" time="6.00"/></proof>
    </goal>
    <goal name="WP_parameter prove.11.2" expl="2. VC for prove">
-   <proof prover="0"><result status="valid" time="0.04" steps="87"/></proof>
+   <proof prover="0"><result status="valid" time="0.23"/></proof>
+   <proof prover="3"><result status="valid" time="0.04" steps="95"/></proof>
+   <proof prover="5"><result status="valid" time="0.09"/></proof>
+   <proof prover="6"><result status="valid" time="0.06" steps="101"/></proof>
    </goal>
   </transf>
   </goal>
   <goal name="WP_parameter prove.12" expl="12. postcondition">
-  <proof prover="2"><result status="valid" time="0.18"/></proof>
+  <proof prover="2"><result status="valid" time="0.21"/></proof>
+  <proof prover="4"><result status="valid" time="0.21"/></proof>
+  <proof prover="5"><result status="valid" time="0.11"/></proof>
   </goal>
  </transf>
  </goal>
  <goal name="WP_parameter count" expl="VC for count">
  <transf name="split_goal_wp">
   <goal name="WP_parameter count.1" expl="1. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="73"/></proof>
+  <proof prover="0"><result status="valid" time="0.23"/></proof>
   <proof prover="2"><result status="valid" time="0.02"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="83"/></proof>
+  <proof prover="4"><result status="valid" time="0.04"/></proof>
+  <proof prover="5"><result status="valid" time="0.08"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="84"/></proof>
   </goal>
   <goal name="WP_parameter count.2" expl="2. precondition">
-  <proof prover="0"><result status="valid" time="0.03" steps="73"/></proof>
+  <proof prover="0"><result status="valid" time="0.62"/></proof>
   <proof prover="2"><result status="valid" time="0.03"/></proof>
+  <proof prover="3"><result status="valid" time="0.03" steps="83"/></proof>
+  <proof prover="4"><result status="valid" time="0.39"/></proof>
+  <proof prover="5"><result status="valid" time="0.08"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="84"/></proof>
   </goal>
   <goal name="WP_parameter count.3" expl="3. precondition">
-  <proof prover="0"><result status="valid" time="0.05" steps="73"/></proof>
+  <proof prover="0"><result status="valid" time="0.64"/></proof>
   <proof prover="2"><result status="valid" time="0.02"/></proof>
+  <proof prover="3"><result status="valid" time="0.05" steps="83"/></proof>
+  <proof prover="4"><result status="valid" time="0.12"/></proof>
+  <proof prover="5"><result status="valid" time="0.08"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="84"/></proof>
   </goal>
   <goal name="WP_parameter count.4" expl="4. precondition">
-  <proof prover="0"><result status="valid" time="0.03" steps="73"/></proof>
+  <proof prover="0"><result status="valid" time="0.61"/></proof>
   <proof prover="2"><result status="valid" time="0.03"/></proof>
+  <proof prover="3"><result status="valid" time="0.03" steps="83"/></proof>
+  <proof prover="4"><result status="valid" time="0.08"/></proof>
+  <proof prover="5"><result status="valid" time="0.08"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="84"/></proof>
   </goal>
   <goal name="WP_parameter count.5" expl="5. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="73"/></proof>
+  <proof prover="0"><result status="valid" time="0.59"/></proof>
   <proof prover="2"><result status="valid" time="0.03"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="83"/></proof>
+  <proof prover="4"><result status="valid" time="0.25"/></proof>
+  <proof prover="5"><result status="valid" time="0.09"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="84"/></proof>
   </goal>
   <goal name="WP_parameter count.6" expl="6. postcondition">
-  <proof prover="0"><result status="valid" time="0.05" steps="79"/></proof>
+  <proof prover="0"><result status="valid" time="0.22"/></proof>
   <proof prover="2"><result status="valid" time="0.05"/></proof>
+  <proof prover="3"><result status="valid" time="0.05" steps="164"/></proof>
+  <proof prover="4"><result status="valid" time="0.04"/></proof>
+  <proof prover="5"><result status="valid" time="0.09"/></proof>
+  <proof prover="6"><result status="valid" time="0.11" steps="164"/></proof>
   </goal>
  </transf>
  </goal>
 </theory>
-<theory name="Hamming" sum="2cd12bdbec0aedf67a99c522df3c7f59">
+<theory name="Hamming" sum="210a1b46c3cddb38fb5cb6db3ab64d4e" expanded="true">
  <goal name="WP_parameter hammingD" expl="VC for hammingD">
  <transf name="split_goal_wp">
   <goal name="WP_parameter hammingD.1" expl="1. assertion">
-  <proof prover="0"><result status="valid" time="1.00" steps="382"/></proof>
+  <proof prover="3"><result status="valid" time="0.83" steps="423"/></proof>
+  <proof prover="5"><result status="valid" time="0.07"/></proof>
+  <proof prover="6"><result status="valid" time="3.20" steps="516"/></proof>
   </goal>
   <goal name="WP_parameter hammingD.2" expl="2. postcondition">
-  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="3"><result status="timeout" time="6.00"/></proof>
+  <proof prover="4"><result status="valid" time="0.08"/></proof>
+  <proof prover="6"><result status="valid" time="1.02" steps="810"/></proof>
   </goal>
  </transf>
  </goal>
  <goal name="symmetric">
- <proof prover="4"><result status="valid" time="0.05"/></proof>
+ <proof prover="3"><result status="valid" time="2.29" steps="1634"/></proof>
+ <proof prover="4"><result status="valid" time="0.12"/></proof>
+ <proof prover="6"><result status="valid" time="0.39" steps="599"/></proof>
  </goal>
  <goal name="numof_ytpmE">
- <proof prover="2"><result status="valid" time="1.04"/></proof>
+ <proof prover="2"><result status="valid" time="1.20"/></proof>
+ <proof prover="5"><result status="valid" time="1.30"/></proof>
  </goal>
  <goal name="WP_parameter separation" expl="VC for separation">
  <transf name="split_goal_wp">
   <goal name="WP_parameter separation.1" expl="1. assertion">
-  <proof prover="0"><result status="valid" time="1.00" steps="447"/></proof>
+  <proof prover="3"><result status="valid" time="0.47" steps="452"/></proof>
+  <proof prover="4"><result status="valid" time="0.08"/></proof>
+  <proof prover="6"><result status="valid" time="0.20" steps="432"/></proof>
   </goal>
   <goal name="WP_parameter separation.2" expl="2. postcondition">
   <transf name="split_goal_wp">
    <goal name="WP_parameter separation.2.1" expl="1. VC for separation">
-   <proof prover="0"><result status="valid" time="0.04" steps="72"/></proof>
+   <proof prover="0"><result status="valid" time="0.22"/></proof>
+   <proof prover="3"><result status="valid" time="0.04" steps="119"/></proof>
+   <proof prover="5"><result status="valid" time="0.08"/></proof>
+   <proof prover="6"><result status="valid" time="0.05" steps="119"/></proof>
    </goal>
    <goal name="WP_parameter separation.2.2" expl="2. VC for separation">
-   <proof prover="0"><result status="valid" time="0.65" steps="322"/></proof>
+   <proof prover="3"><result status="valid" time="0.14" steps="176"/></proof>
+   <proof prover="4"><result status="valid" time="0.03"/></proof>
+   <proof prover="6"><result status="valid" time="0.16" steps="243"/></proof>
    </goal>
   </transf>
   </goal>
  </transf>
  </goal>
  <goal name="WP_parameter numof_or" expl="VC for numof_or">
- <proof prover="2"><result status="valid" time="0.32"/></proof>
+ <proof prover="2"><result status="valid" time="0.34"/></proof>
+ <proof prover="3"><result status="timeout" time="6.00"/></proof>
+ <proof prover="4"><result status="valid" time="0.06"/></proof>
+ <proof prover="5"><result status="valid" time="0.39"/></proof>
+ <proof prover="6"><result status="valid" time="2.81" steps="1908"/></proof>
  </goal>
  <goal name="WP_parameter triangleInequalityInt" expl="VC for triangleInequalityInt">
- <proof prover="1"><result status="valid" time="7.31"/></proof>
+ <transf name="split_goal_wp">
+  <goal name="WP_parameter triangleInequalityInt.1" expl="1. assertion">
+  <transf name="split_goal_wp">
+   <goal name="WP_parameter triangleInequalityInt.1.1" expl="1. VC for triangleInequalityInt">
+   <proof prover="0"><result status="valid" time="0.22"/></proof>
+   <proof prover="1"><result status="valid" time="0.02"/></proof>
+   <proof prover="2"><result status="valid" time="0.07"/></proof>
+   <proof prover="3"><result status="valid" time="0.03" steps="78"/></proof>
+   <proof prover="4" memlimit="1000"><result status="valid" time="0.04"/></proof>
+   <proof prover="5"><result status="valid" time="0.09"/></proof>
+   <proof prover="6"><result status="valid" time="0.02" steps="79"/></proof>
+   </goal>
+   <goal name="WP_parameter triangleInequalityInt.1.2" expl="2. VC for triangleInequalityInt">
+   <proof prover="1"><result status="valid" time="0.08"/></proof>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="WP_parameter triangleInequalityInt.2" expl="2. postcondition">
+  <proof prover="0"><result status="valid" time="0.65"/></proof>
+  <proof prover="1"><result status="valid" time="0.02"/></proof>
+  <proof prover="2"><result status="valid" time="0.08"/></proof>
+  <proof prover="3"><result status="valid" time="0.03" steps="80"/></proof>
+  <proof prover="4" memlimit="1000"><result status="valid" time="0.05"/></proof>
+  <proof prover="5"><result status="valid" time="0.04"/></proof>
+  <proof prover="6"><result status="valid" time="0.04" steps="81"/></proof>
+  </goal>
+ </transf>
  </goal>
  <goal name="triangleInequality">
- <proof prover="0"><result status="valid" time="0.05" steps="68"/></proof>
+ <proof prover="0"><result status="valid" time="0.01"/></proof>
  <proof prover="2"><result status="valid" time="0.04"/></proof>
+ <proof prover="3"><result status="valid" time="0.05" steps="78"/></proof>
+ <proof prover="4"><result status="valid" time="0.03"/></proof>
+ <proof prover="5"><result status="valid" time="0.10"/></proof>
+ <proof prover="6"><result status="valid" time="0.03" steps="79"/></proof>
  </goal>
 </theory>
-<theory name="AsciiCode" sum="40cee207ec73f2774d5dda1e1960e191">
+<theory name="AsciiCode" sum="15d3dd0d94109f980fe09e104ebd90b6" expanded="true">
  <goal name="WP_parameter bv_even" expl="VC for bv_even">
  <transf name="split_goal_wp">
   <goal name="WP_parameter bv_even.1" expl="1. assertion">
-  <proof prover="2"><result status="valid" time="0.04"/></proof>
+  <proof prover="2"><result status="valid" time="0.06"/></proof>
+  <proof prover="4"><result status="valid" time="0.04"/></proof>
   </goal>
   <goal name="WP_parameter bv_even.2" expl="2. assertion">
   <proof prover="2"><result status="valid" time="0.04"/></proof>
+  <proof prover="4"><result status="valid" time="0.04"/></proof>
   </goal>
   <goal name="WP_parameter bv_even.3" expl="3. assertion">
-  <proof prover="1"><result status="valid" time="3.21"/></proof>
+  <proof prover="3"><result status="valid" time="1.21" steps="1800"/></proof>
+  <proof prover="6"><result status="valid" time="0.43" steps="1005"/></proof>
   </goal>
   <goal name="WP_parameter bv_even.4" expl="4. assertion">
-  <proof prover="1"><result status="valid" time="0.42"/></proof>
+  <transf name="split_goal_wp">
+   <goal name="WP_parameter bv_even.4.1" expl="1. VC for bv_even">
+   <proof prover="6"><result status="valid" time="1.50" steps="1317"/></proof>
+   </goal>
+   <goal name="WP_parameter bv_even.4.2" expl="2. VC for bv_even">
+   <proof prover="6"><result status="valid" time="0.06" steps="142"/></proof>
+   </goal>
+  </transf>
   </goal>
   <goal name="WP_parameter bv_even.5" expl="5. postcondition">
-  <proof prover="0"><result status="valid" time="0.09" steps="115"/></proof>
+  <proof prover="3"><result status="valid" time="0.14" steps="149"/></proof>
+  <proof prover="6"><result status="valid" time="0.14" steps="216"/></proof>
   </goal>
  </transf>
  </goal>
  <goal name="bv_odd">
- <proof prover="0"><result status="valid" time="0.05" steps="84"/></proof>
  <proof prover="2"><result status="valid" time="0.03"/></proof>
+ <proof prover="3"><result status="valid" time="0.05" steps="164"/></proof>
+ <proof prover="4"><result status="valid" time="0.04"/></proof>
+ <proof prover="5"><result status="valid" time="0.09"/></proof>
+ <proof prover="6"><result status="valid" time="0.04" steps="113"/></proof>
  </goal>
- <goal name="WP_parameter numof_or" expl="VC for numof_or">
- <proof prover="2"><result status="valid" time="0.22"/></proof>
+ <goal name="WP_parameter numof_or" expl="VC for numof_or" expanded="true">
+ <proof prover="2"><result status="valid" time="0.25"/></proof>
+ <proof prover="4"><result status="valid" time="0.06"/></proof>
+ <proof prover="5"><result status="valid" time="0.36"/></proof>
  </goal>
  <goal name="WP_parameter count_or" expl="VC for count_or">
  <transf name="split_goal_wp">
   <goal name="WP_parameter count_or.1" expl="1. assertion">
-  <proof prover="2"><result status="valid" time="0.06"/></proof>
+  <proof prover="2"><result status="valid" time="0.09"/></proof>
+  <proof prover="4"><result status="valid" time="0.05"/></proof>
   </goal>
   <goal name="WP_parameter count_or.2" expl="2. assertion">
-  <proof prover="0"><result status="valid" time="0.03" steps="80"/></proof>
+  <proof prover="0"><result status="valid" time="0.23"/></proof>
+  <proof prover="3"><result status="valid" time="0.03" steps="88"/></proof>
+  <proof prover="5"><result status="valid" time="0.10"/></proof>
+  <proof prover="6"><result status="valid" time="0.04" steps="89"/></proof>
   </goal>
   <goal name="WP_parameter count_or.3" expl="3. assertion">
-  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="4"><result status="valid" time="0.04"/></proof>
   </goal>
   <goal name="WP_parameter count_or.4" expl="4. assertion">
-  <proof prover="5" timelimit="5"><result status="valid" time="1.43"/></proof>
+  <proof prover="5"><result status="valid" time="1.81"/></proof>
   </goal>
   <goal name="WP_parameter count_or.5" expl="5. postcondition">
-  <proof prover="0"><result status="valid" time="0.06" steps="73"/></proof>
   <proof prover="2"><result status="valid" time="0.08"/></proof>
+  <proof prover="3"><result status="valid" time="0.06" steps="81"/></proof>
+  <proof prover="4"><result status="valid" time="0.05"/></proof>
+  <proof prover="5"><result status="valid" time="0.13"/></proof>
+  <proof prover="6"><result status="valid" time="0.04" steps="82"/></proof>
   </goal>
  </transf>
  </goal>
  <goal name="WP_parameter ascii" expl="VC for ascii">
  <transf name="split_goal_wp">
   <goal name="WP_parameter ascii.1" expl="1. precondition">
-  <proof prover="0"><result status="valid" time="0.30" steps="235"/></proof>
-  <proof prover="2"><result status="valid" time="0.04"/></proof>
+  <proof prover="2"><result status="valid" time="0.05"/></proof>
+  <proof prover="4"><result status="valid" time="0.01"/></proof>
+  <proof prover="5"><result status="valid" time="0.11"/></proof>
+  <proof prover="6"><result status="valid" time="0.09" steps="151"/></proof>
   </goal>
   <goal name="WP_parameter ascii.2" expl="2. assertion">
-  <proof prover="2"><result status="valid" time="0.07"/></proof>
+  <proof prover="2"><result status="valid" time="0.10"/></proof>
+  <proof prover="4"><result status="valid" time="0.04"/></proof>
   </goal>
   <goal name="WP_parameter ascii.3" expl="3. assertion">
   <transf name="split_goal_wp">
    <goal name="WP_parameter ascii.3.1" expl="1. assertion">
-   <proof prover="0"><result status="valid" time="0.07" steps="91"/></proof>
+   <proof prover="0"><result status="valid" time="0.25"/></proof>
+   <proof prover="5"><result status="valid" time="0.10"/></proof>
+   <proof prover="6"><result status="valid" time="0.08" steps="134"/></proof>
    </goal>
    <goal name="WP_parameter ascii.3.2" expl="2. assertion">
-   <proof prover="2"><result status="valid" time="0.09"/></proof>
+   <proof prover="2"><result status="valid" time="0.13"/></proof>
    </goal>
   </transf>
   </goal>
   <goal name="WP_parameter ascii.4" expl="4. assertion">
   <transf name="split_goal_wp">
    <goal name="WP_parameter ascii.4.1" expl="1. assertion">
-   <proof prover="0"><result status="valid" time="0.08" steps="93"/></proof>
+   <proof prover="0"><result status="valid" time="0.24"/></proof>
+   <proof prover="5"><result status="valid" time="0.10"/></proof>
+   <proof prover="6"><result status="valid" time="0.17" steps="181"/></proof>
    </goal>
    <goal name="WP_parameter ascii.4.2" expl="2. assertion">
-   <proof prover="0"><result status="valid" time="0.19" steps="116"/></proof>
+   <proof prover="5"><result status="valid" time="0.27"/></proof>
+   <proof prover="6"><result status="valid" time="0.16" steps="159"/></proof>
    </goal>
    <goal name="WP_parameter ascii.4.3" expl="3. assertion">
-   <proof prover="0"><result status="valid" time="0.84" steps="194"/></proof>
+   <proof prover="2"><result status="valid" time="0.17"/></proof>
+   <proof prover="5"><result status="valid" time="0.11"/></proof>
+   <proof prover="6"><result status="valid" time="0.24" steps="178"/></proof>
    </goal>
    <goal name="WP_parameter ascii.4.4" expl="4. assertion">
-   <proof prover="4"><result status="valid" time="0.03"/></proof>
+   <proof prover="4"><result status="valid" time="0.09"/></proof>
    </goal>
   </transf>
   </goal>
   <goal name="WP_parameter ascii.5" expl="5. assertion">
-  <proof prover="0"><result status="valid" time="0.05" steps="76"/></proof>
+  <proof prover="3"><result status="valid" time="0.05" steps="86"/></proof>
+  <proof prover="5"><result status="valid" time="0.11"/></proof>
+  <proof prover="6"><result status="valid" time="0.04" steps="87"/></proof>
   </goal>
   <goal name="WP_parameter ascii.6" expl="6. postcondition">
-  <proof prover="2"><result status="valid" time="0.10"/></proof>
+  <proof prover="2"><result status="valid" time="0.11"/></proof>
+  <proof prover="4"><result status="valid" time="0.04"/></proof>
+  <proof prover="5"><result status="valid" time="1.55"/></proof>
   </goal>
   <goal name="WP_parameter ascii.7" expl="7. postcondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="102"/></proof>
+  <proof prover="3"><result status="valid" time="0.20" steps="148"/></proof>
+  <proof prover="4"><result status="valid" time="0.06"/></proof>
+  <proof prover="5"><result status="valid" time="0.52"/></proof>
+  <proof prover="6"><result status="valid" time="0.18" steps="206"/></proof>
   </goal>
  </transf>
  </goal>
- <goal name="WP_parameter tmp" expl="VC for tmp">
- <transf name="split_goal_wp">
+ <goal name="WP_parameter tmp" expl="VC for tmp" expanded="true">
+ <transf name="split_goal_wp" expanded="true">
   <goal name="WP_parameter tmp.1" expl="1. variant decrease">
-  <proof prover="0"><result status="valid" time="0.02" steps="69"/></proof>
+  <proof prover="0"><result status="valid" time="0.04"/></proof>
   <proof prover="2"><result status="valid" time="0.04"/></proof>
+  <proof prover="3"><result status="valid" time="0.02" steps="79"/></proof>
+  <proof prover="4"><result status="valid" time="0.04"/></proof>
+  <proof prover="5"><result status="valid" time="0.07"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="80"/></proof>
   </goal>
   <goal name="WP_parameter tmp.2" expl="2. precondition">
-  <proof prover="0"><result status="valid" time="0.02" steps="69"/></proof>
+  <proof prover="0"><result status="valid" time="0.01"/></proof>
   <proof prover="2"><result status="valid" time="0.02"/></proof>
+  <proof prover="3"><result status="valid" time="0.02" steps="79"/></proof>
+  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="5"><result status="valid" time="0.08"/></proof>
+  <proof prover="6"><result status="valid" time="0.03" steps="80"/></proof>
   </goal>
   <goal name="WP_parameter tmp.3" expl="3. postcondition">
-  <proof prover="4"><result status="valid" time="0.38"/></proof>
+  <proof prover="4"><result status="valid" time="0.73"/></proof>
   </goal>
-  <goal name="WP_parameter tmp.4" expl="4. postcondition">
-  <proof prover="0"><result status="valid" time="1.38" steps="570"/></proof>
+  <goal name="WP_parameter tmp.4" expl="4. postcondition" expanded="true">
+  <proof prover="1"><result status="valid" time="0.26"/></proof>
+  <proof prover="2"><result status="valid" time="4.31"/></proof>
+  <proof prover="4" memlimit="1000"><result status="valid" time="5.75"/></proof>
+  <proof prover="5"><result status="valid" time="1.42"/></proof>
+  <proof prover="6" memlimit="1000"><result status="valid" time="2.06" steps="3155"/></proof>
   </goal>
  </transf>
  </goal>
  <goal name="asciiProp">
- <proof prover="0"><result status="valid" time="0.24" steps="230"/></proof>
  <proof prover="2"><result status="valid" time="0.05"/></proof>
+ <proof prover="3"><result status="valid" time="1.51" steps="3019"/></proof>
+ <proof prover="4"><result status="valid" time="0.06"/></proof>
+ <proof prover="5"><result status="valid" time="0.13"/></proof>
+ <proof prover="6"><result status="valid" time="0.26" steps="514"/></proof>
  </goal>
 </theory>
 </file>
diff --git a/examples/bitcount/why3shapes.gz b/examples/bitcount/why3shapes.gz
index e533c64d6ab1178a7ce7a12cbf5fc00fc6e18528..deda8e75cbb85a0c7395c364b29c72a24a629650 100644
Binary files a/examples/bitcount/why3shapes.gz and b/examples/bitcount/why3shapes.gz differ
diff --git a/examples/bitvector_examples.mlw b/examples/bitvector_examples.mlw
index 83e1896268b190b029286d373004fa4c013abfc7..9a0f8cf42508cb438879f5091325858c78f3f620 100644
--- a/examples/bitvector_examples.mlw
+++ b/examples/bitvector_examples.mlw
@@ -8,13 +8,13 @@ module Test_proofinuse
   (* Shift is div example -------------------  *)
 
   let shift_is_div ( x : t ) ( y : t ) : t =
-    requires{ 0 <= to_uint y < 32 }
-    let res = lsr_bv x ( of_int 1 ) in
-    assert{ res = ( udiv x (of_int 2) ) };
-    assert{ to_uint res = div (to_uint x) 2 };
-    let res = lsr_bv res ( of_int 2 ) in
-    assert{ res = ( udiv x (of_int 8) ) };
-    assert{ to_uint res = div (to_uint x) 8 };
+    requires{ 0 <= t'int y < 32 }
+    let res = lsr_bv x one in
+    assert{ res = ( udiv x (2:t) ) };
+    assert{ t'int res = div (t'int x) 2 };
+    let res = lsr_bv res (2:t) in
+    assert{ res = ( udiv x (8:t) ) };
+    assert{ t'int res = div (t'int x) 8 };
     res
 
  (* Mask example --------------------- *)
@@ -29,14 +29,14 @@ module Test_proofinuse
   type bitvec64 = BV64.t
 
   let mask ( x : t ) =
-    ensures{ BV8.eq result (BV8.of_int 1) }
+    ensures{ BV8.eq result BV8.one }
     (* ensures{ not ( BV8.eq result (BV8.of_int 1) ) } *)
     let res = C8_32.toSmall(
                 bw_and
-                  ( bw_or
-                    ( bw_and x (of_int 0xFFFF_FF00) )
-                    (of_int 1) )
-                  ( of_int 0x0000_00FF ) )
+                  (bw_or
+                    (bw_and x (0xFFFF_FF00:t))
+                    one)
+                  (0x0000_00FF:t))
     in res
 
   (* test invariant from frama-c ---------------- *)
@@ -45,7 +45,7 @@ module Test_proofinuse
 
   let testVariant( n : t ) =
     let i = ref n in
-    let two = of_int 2 in
+    let two = 2:t in
 
     while uge !i two do
     variant{ !i with ult }
@@ -54,7 +54,7 @@ module Test_proofinuse
 
   (* testssss *)
 
-  predicate in_range (n : t) = (ule (of_int 0) n) /\ (ule n (of_int 0x0000_00FF))
+  predicate in_range (n : t) = (ule (0:t) n) /\ (ule n (0x0000_00FF:t))
 
   predicate add_over (x y : t) = (uge (add x y) x) /\ (uge (add x y) y)
 
@@ -76,13 +76,13 @@ theory Hackers_delight
     bw_not( bw_or x y ) = bw_and (bw_not x) (bw_not y)
 
   goal DM3: forall x.
-    bw_not( add x (of_int 1) ) = sub (bw_not x) (of_int 1)
+    bw_not (add x one) = sub (bw_not x) one
 
   goal DM4: forall x.
-    bw_not( sub x (of_int 1) ) = add (bw_not x) (of_int 1)
+    bw_not (sub x one) = add (bw_not x) one
 
   goal DM5: forall x.
-    bw_not( neg x ) = sub x (of_int 1)
+    bw_not (neg x) = sub x one
 
   goal DM6: forall x y.
     bw_not( bw_xor x y ) = bw_xor (bw_not x) y (* = eq x y *)
@@ -94,7 +94,7 @@ theory Hackers_delight
     bw_not( sub x y ) = add (bw_not x) y
 
   goal DMtest: forall x.
-    zeros = bw_not( bw_or x (neg( add x (of_int 1))))
+    zeros = bw_not( bw_or x (neg( add x one)))
 
   (* inequality  *)
 
@@ -112,17 +112,17 @@ theory Hackers_delight
 
   (* shift right and arithmetic shift right *)
 
-  goal SR1: forall x n. ( ule zeros n /\ ule n (of_int 31)) ->
-    bw_or (lsr_bv x n) (lsl_bv (neg( lsr_bv x (of_int 31) )) (sub (of_int 31) n))
+  goal SR1: forall x n. ( ule zeros n /\ ule n (31:t)) ->
+    bw_or (lsr_bv x n) (lsl_bv (neg( lsr_bv x (31:t) )) (sub (31:t) n))
   = asr_bv x n
 
   (* rotate en shift *)
 
   goal RS_left: forall x.
-    bw_or (lsl_bv x (of_int 1)) (lsr_bv x (of_int 31)) = rotate_left_bv x (of_int 1)
+    bw_or (lsl_bv x one) (lsr_bv x (31:t)) = rotate_left_bv x one
 
   goal RS_right: forall x.
-    bw_or (lsr_bv x (of_int 1)) (lsl_bv x (of_int 31)) = rotate_right_bv x (of_int 1)
+    bw_or (lsr_bv x one) (lsl_bv x (31:t)) = rotate_right_bv x one
 
   (* bound propagation *)
 
@@ -157,15 +157,15 @@ module Hackers_delight_mod
     bw_not( bw_or x y )
 
   let dm3 (x : t) =
-    ensures{ result = sub (bw_not x) (of_int 1) }
-    bw_not( add x (of_int 1) )
+    ensures{ result = sub (bw_not x) one }
+    bw_not( add x one )
 
   let dm4 (x : t) =
-    ensures{ result = add (bw_not x) (of_int 1) }
-    bw_not( sub x (of_int 1) )
+    ensures{ result = add (bw_not x) one }
+    bw_not( sub x one )
 
   let dm5 (x : t) =
-    ensures{ result = sub x (of_int 1) }
+    ensures{ result = sub x one }
     bw_not( neg x )
 
   let dm6 (x : t) (y : t) =
@@ -182,7 +182,7 @@ module Hackers_delight_mod
 
   let dmtest (x : t) =
     ensures{ result = zeros }
-    bw_not( bw_or x (neg( add x (of_int 1))))
+    bw_not( bw_or x (neg( add x one)))
 
   (* inequality  *)
 
@@ -207,19 +207,19 @@ module Hackers_delight_mod
   (* shift right and arithmetic shift right *)
 
   let sr1 (x : t) (n : t) =
-    requires{ ule zeros n /\ ule n (of_int 31) }
+    requires{ ule zeros n /\ ule n (31:t) }
     ensures{ result = asr_bv x n }
-    bw_or (lsr_bv x n) (lsl_bv (neg( lsr_bv x (of_int 31) )) (sub (of_int 31) n))
+    bw_or (lsr_bv x n) (lsl_bv (neg( lsr_bv x (31:t) )) (sub (31:t) n))
 
   (* rotate en shift *)
 
   let rs_left (x : t) =
-  ensures{ result = rotate_left_bv x (of_int 1) }
-    bw_or (lsl_bv x (of_int 1)) (lsr_bv x (of_int 31))
+  ensures{ result = rotate_left_bv x one }
+    bw_or (lsl_bv x one) (lsr_bv x (31:t))
 
   let rs_right (x : t) =
-  ensures{ result = rotate_right_bv x (of_int 1) }
-    bw_or (lsr_bv x (of_int 1)) (lsl_bv x (of_int 31))
+  ensures{ result = rotate_right_bv x one }
+    bw_or (lsr_bv x one) (lsl_bv x (31:t))
 
   (* bound propagation *)
 
@@ -267,31 +267,31 @@ module Test_imperial_violet
     forall b. ule zeros b /\ ule b ones
 
   lemma to_int_ule:
-    forall b c. ule b c -> to_uint b <= to_uint c
+    forall b c. ule b c -> t'int b <= t'int c
 
   lemma to_int_ult:
-    forall b c. ult b c -> to_uint b < to_uint c
+    forall b c. ult b c -> t'int b < t'int c
 
   lemma bv32_bounds_0:
-    forall b. 0 <= to_uint b
+    forall b. 0 <= t'int b
 
   lemma bv32_bounds:
-    forall b. 0 <= to_uint b < 0x1_0000_0000
+    forall b. 0 <= t'int b < 0x1_0000_0000
 
   (* bounded add of array of t *)
 
   let add (a : array t ) (b : array t) =
     requires{ length a = length b }
     requires{ forall i. 0 <= i < length a ->
-                ult a[i] (of_int 0x8000_0000) }
+                ult a[i] (0x8000_0000:t) }
     requires{ forall i. 0 <= i < length b ->
-                ult b[i] (of_int 0x8000_0000) }
+                ult b[i] (0x8000_0000:t) }
     ensures{ forall i. 0 <= i < length result ->
-               to_uint result[i] = to_uint a[i] + to_uint b[i] }
+               t'int result[i] = t'int a[i] + t'int b[i] }
     let sum = make (length a) zeros in
     for i = 0 to length a - 1 do
       invariant{ forall j. 0 <= j < i -> sum[j] = add a[j] b[j] }
-      invariant{ forall j. 0 <= j < i -> to_uint sum[j] = to_uint a[j] + to_uint b[j] }
+      invariant{ forall j. 0 <= j < i -> t'int sum[j] = t'int a[j] + t'int b[j] }
       sum[i] <- add a[i] b[i]
     done;
     sum
@@ -304,123 +304,123 @@ module Test_from_bitvector_example
   use import bv.BV32
 
   goal Test1:
-    let b = bw_and zeros ones in nth_bv b (of_int 1) = False
+    let b = bw_and zeros ones in nth_bv b one = False
 
   goal Test2:
-    let b = lsr_bv ones (of_int 16) in nth_bv b (of_int 15) = True
+    let b = lsr_bv ones (16:t) in nth_bv b (15:t) = True
 
   goal Test3:
-    let b = lsr_bv ones (of_int 16) in nth_bv b (of_int 16) = False
+    let b = lsr_bv ones (16:t) in nth_bv b (16:t) = False
 
   goal Test4:
-    let b = asr_bv ones (of_int 16) in nth_bv b (of_int 15) = True
+    let b = asr_bv ones (16:t) in nth_bv b (15:t) = True
 
   goal Test5:
-    let b = asr_bv ones (of_int 16) in nth_bv b (of_int 16) = True
+    let b = asr_bv ones (16:t) in nth_bv b (16:t) = True
 
   goal Test6:
-    let b = asr_bv (lsr_bv ones (of_int 1)) (of_int 16) in nth_bv b (of_int 16) = False
+    let b = asr_bv (lsr_bv ones one) (16:t) in nth_bv b (16:t) = False
 
   let lsr31 () =
-    ensures{ result = of_int 1 }
-    lsr_bv ones (of_int 31)
+    ensures{ result = one }
+    lsr_bv ones (31:t)
 
   let lsr30 () =
-    ensures{ result = of_int 3 }
-    lsr_bv ones (of_int 30)
+    ensures{ result = (3:t) }
+    lsr_bv ones (30:t)
 
   let lsr29 () =
-    ensures{ to_uint result = 7 }
-    lsr_bv ones (of_int 29)
+    ensures{ t'int result = 7 }
+    lsr_bv ones (29:t)
 
   let lsr28 () =
-    ensures{ to_uint result = 15 }
-    lsr_bv ones (of_int 28)
+    ensures{ t'int result = 15 }
+    lsr_bv ones (28:t)
 
   let lsr27 () =
-    ensures{ to_uint result = 31 }
-    lsr_bv ones (of_int 27)
+    ensures{ t'int result = 31 }
+    lsr_bv ones (27:t)
 
   let lsr26 () =
-    ensures{ to_uint result = 63 }
-    lsr_bv ones (of_int 26)
+    ensures{ t'int result = 63 }
+    lsr_bv ones (26:t)
 
   let lsr20 () =
-    ensures{ to_uint result = 4095 }
-    lsr_bv ones (of_int 20)
+    ensures{ t'int result = 4095 }
+    lsr_bv ones (20:t)
 
   let lsr13 () =
-    ensures{ to_uint result = 524287 }
-    lsr_bv ones (of_int 13)
+    ensures{ t'int result = 524287 }
+    lsr_bv ones (13:t)
 
   let lsr8 () =
-    ensures{ to_uint result = 16777215 }
-    lsr_bv ones (of_int 8)
+    ensures{ t'int result = 16777215 }
+    lsr_bv ones (8:t)
 
   goal to_int_0x00000001:
-    to_uint (lsr_bv ones (of_int 31)) = 1
+    t'int (lsr_bv ones (31:t)) = 1
 
   goal to_int_0x00000003:
-    to_uint (lsr_bv ones (of_int 30)) = 3
+    t'int (lsr_bv ones (30:t)) = 3
 
   goal to_int_0x00000007:
-    to_uint (lsr_bv ones (of_int 29)) = 7
+    t'int (lsr_bv ones (29:t)) = 7
 
   goal to_int_0x0000000F:
-    to_uint (lsr_bv ones (of_int 28)) = 15
+    t'int (lsr_bv ones (28:t)) = 15
 
   goal to_int_0x0000001F:
-    to_uint (lsr_bv ones (of_int 27)) = 31
+    t'int (lsr_bv ones (27:t)) = 31
 
   goal to_int_0x0000003F:
-    to_uint (lsr_bv ones (of_int 26)) = 63
+    t'int (lsr_bv ones (26:t)) = 63
 
   goal to_int_0x0000007F:
-    to_uint (lsr_bv ones (of_int 25)) = 127
+    t'int (lsr_bv ones (25:t)) = 127
 
   goal to_int_0x000000FF:
-    to_uint (lsr_bv ones (of_int 24)) = 255
+    t'int (lsr_bv ones (24:t)) = 255
 
   goal to_int_0x000001FF:
-    to_uint (lsr_bv ones (of_int 23)) = 511
+    t'int (lsr_bv ones (23:t)) = 511
 
   goal to_int_0x000003FF:
-    to_uint (lsr_bv ones (of_int 22)) = 1023
+    t'int (lsr_bv ones (22:t)) = 1023
 
   goal to_int_0x000007FF:
-    to_uint (lsr_bv ones (of_int 21)) = 2047
+    t'int (lsr_bv ones (21:t)) = 2047
 
   goal to_int_0x00000FFF:
-    to_uint (lsr_bv ones (of_int 20)) = 4095
+    t'int (lsr_bv ones (20:t)) = 4095
 
   goal to_int_0x00001FFF:
-    to_uint (lsr_bv ones (of_int 19)) = 8191
+    t'int (lsr_bv ones (19:t)) = 8191
 
   goal to_int_0x00003FFF:
-    to_uint (lsr_bv ones (of_int 18)) = 16383
+    t'int (lsr_bv ones (18:t)) = 16383
 
   goal to_int_0x00007FFF:
-    to_uint (lsr_bv ones (of_int 17)) = 32767
+    t'int (lsr_bv ones (17:t)) = 32767
 
   goal to_int_0x0000FFFF:
-    to_uint (lsr_bv ones (of_int 16)) = 65535
+    t'int (lsr_bv ones (16:t)) = 65535
 
   goal to_int_0x0001FFFF:
-    to_uint (lsr_bv ones (of_int 15)) = 131071
+    t'int (lsr_bv ones (15:t)) = 131071
 
   goal to_int_0x0003FFFF:
-    to_uint (lsr_bv ones (of_int 14)) = 262143
+    t'int (lsr_bv ones (14:t)) = 262143
 
   goal to_int_0x0007FFFF:
-    to_uint (lsr_bv ones (of_int 13)) = 524287
+    t'int (lsr_bv ones (13:t)) = 524287
 
   goal to_int_0x000FFFFF:
-    to_uint (lsr_bv ones (of_int 12)) = 1048575
+    t'int (lsr_bv ones (12:t)) = 1048575
 
   goal to_int_0x00FFFFFF:
-    to_uint (lsr_bv ones (of_int 8)) = 16777215
+    t'int (lsr_bv ones (8:t)) = 16777215
 
   goal to_int_0xFFFFFFFF:
-    to_uint ones = 4294967295
+    t'int ones = 4294967295
 
 end
diff --git a/examples/bitvector_examples/why3session.xml b/examples/bitvector_examples/why3session.xml
index 7c7b0ccdefa3bccbf101ead8b0aee436f9100971..a3e24601d35dedea235cb3b52bc8461ccb1a8443 100644
--- a/examples/bitvector_examples/why3session.xml
+++ b/examples/bitvector_examples/why3session.xml
@@ -2,24 +2,24 @@
 <!DOCTYPE why3session PUBLIC "-//Why3//proof session v5//EN"
 "http://why3.lri.fr/why3session.dtd">
 <why3session shape_version="4">
-<prover id="0" name="Alt-Ergo" version="0.99.1" timelimit="5" steplimit="0" memlimit="1000"/>
+<prover id="1" name="Alt-Ergo" version="1.01" timelimit="5" steplimit="0" memlimit="1000"/>
 <prover id="2" name="CVC4" version="1.4" timelimit="5" steplimit="0" memlimit="1000"/>
 <prover id="4" name="CVC4" version="1.4" alternative="noBV" timelimit="5" steplimit="0" memlimit="1000"/>
 <file name="../bitvector_examples.mlw" expanded="true">
-<theory name="Test_proofinuse" sum="01976ddc6bd80d04acbe32f98fd3ce49">
+<theory name="Test_proofinuse" sum="5bde1903c1b69c92052601f6d31b5f22">
  <goal name="WP_parameter shift_is_div" expl="VC for shift_is_div">
  <transf name="split_goal_wp">
   <goal name="WP_parameter shift_is_div.1" expl="1. assertion">
   <proof prover="2"><result status="valid" time="0.01"/></proof>
   </goal>
   <goal name="WP_parameter shift_is_div.2" expl="2. assertion">
-  <proof prover="0"><result status="valid" time="0.48" steps="136"/></proof>
+  <proof prover="1"><result status="valid" time="0.04" steps="74"/></proof>
   </goal>
   <goal name="WP_parameter shift_is_div.3" expl="3. assertion">
   <proof prover="2"><result status="valid" time="0.01"/></proof>
   </goal>
   <goal name="WP_parameter shift_is_div.4" expl="4. assertion">
-  <proof prover="0"><result status="valid" time="1.22" steps="203"/></proof>
+  <proof prover="1"><result status="valid" time="0.04" steps="77"/></proof>
   </goal>
  </transf>
  </goal>
@@ -33,7 +33,7 @@
  <proof prover="2"><result status="valid" time="0.08"/></proof>
  </goal>
 </theory>
-<theory name="Hackers_delight" sum="a0944cec62c66f9386bc79e4c44a0f16">
+<theory name="Hackers_delight" sum="c50333188a840b73cd04235a9ac766f1">
  <goal name="DM1">
  <proof prover="2"><result status="valid" time="0.04"/></proof>
  </goal>
@@ -92,7 +92,7 @@
  <proof prover="2"><result status="valid" time="0.04"/></proof>
  </goal>
 </theory>
-<theory name="Hackers_delight_mod" sum="32d38cd9c48389171edd12feea17b382">
+<theory name="Hackers_delight_mod" sum="1274bffd68f6f4d9efa70dbd6241a6d0">
  <goal name="WP_parameter dm1" expl="VC for dm1">
  <proof prover="2"><result status="valid" time="0.04"/></proof>
  </goal>
@@ -154,27 +154,27 @@
  <proof prover="2"><result status="valid" time="0.07"/></proof>
  </goal>
 </theory>
-<theory name="Test_imperial_violet" sum="3b53ccfb24b0e5076075a7389a6e49e5">
+<theory name="Test_imperial_violet" sum="d7bf5e13c415174631ea81c38f82c8ba">
  <goal name="bv32_bounds_bv">
  <proof prover="2"><result status="valid" time="0.04"/></proof>
  </goal>
  <goal name="to_int_ule">
- <proof prover="0"><result status="valid" time="0.04" steps="69"/></proof>
+ <proof prover="1"><result status="valid" time="0.04" steps="71"/></proof>
  </goal>
  <goal name="to_int_ult">
- <proof prover="0"><result status="valid" time="0.04" steps="69"/></proof>
+ <proof prover="1"><result status="valid" time="0.04" steps="71"/></proof>
  </goal>
  <goal name="bv32_bounds_0">
- <proof prover="0"><result status="valid" time="0.04" steps="69"/></proof>
+ <proof prover="1"><result status="valid" time="0.04" steps="70"/></proof>
  </goal>
  <goal name="bv32_bounds">
- <proof prover="0"><result status="valid" time="0.03" steps="70"/></proof>
+ <proof prover="1"><result status="valid" time="0.03" steps="72"/></proof>
  </goal>
  <goal name="WP_parameter add" expl="VC for add">
- <proof prover="4"><result status="valid" time="0.16"/></proof>
+ <proof prover="4"><result status="valid" time="0.25"/></proof>
  </goal>
 </theory>
-<theory name="Test_from_bitvector_example" sum="6b18dfa01a56b248764549f53590545a">
+<theory name="Test_from_bitvector_example" sum="af2209426a7d6045bf220a700eaccb25">
  <goal name="Test1">
  <proof prover="2"><result status="valid" time="0.03"/></proof>
  </goal>
diff --git a/examples/bitvector_examples/why3shapes.gz b/examples/bitvector_examples/why3shapes.gz
index 061f815dbaed7c452e181aa7af855d5c08d9d634..7763d0f5e773e15329325d53dc1db0b90721a66e 100644
Binary files a/examples/bitvector_examples/why3shapes.gz and b/examples/bitvector_examples/why3shapes.gz differ
diff --git a/examples/bitwalker.mlw b/examples/bitwalker.mlw
index 1f304ae7ab0e6925b80b96f4e2109284e9c5e75a..bec2e314944205cea029b8d9d044b4300f4f7941 100644
--- a/examples/bitwalker.mlw
+++ b/examples/bitwalker.mlw
@@ -31,9 +31,9 @@ module Bitwalker
   function maxvalue (len : BV32.t) : BV64.t = BV64.lsl_bv (BV64.of_int 1) (C32_64.toBig len)
 
   let lemma nth_ultpre0 (x:BV64.t) (len:BV32.t)
-    requires { BV32.to_uint len < 64}
-    ensures { BV64.eq_sub x BV64.zeros (BV32.to_uint len) (64 - BV32.to_uint len)
-          <-> BV64.to_uint x < BV64.to_uint (maxvalue len) }
+    requires { BV32.t'int len < 64}
+    ensures { BV64.eq_sub x BV64.zeros (BV32.t'int len) (64 - BV32.t'int len)
+          <-> BV64.t'int x < BV64.t'int (maxvalue len) }
   =
     assert { BV32.ult len (BV32.of_int 64) };
     assert { BV64.eq_sub_bv x BV64.zeros (C32_64.toBig len) (BV64.sub (BV64.of_int 64) (C32_64.toBig len))
@@ -41,10 +41,10 @@ module Bitwalker
 
  (** return [value] with the bit of index [left] from the left set to [flag] *)
   let poke_64bit_bv (value : BV64.t) (left : BV32.t) (flag : bool) : BV64.t
-    requires { BV32.to_uint left < 64 }
-    ensures  { forall i. 0 <= i < 64 /\ i <> 63 - BV32.to_uint left ->
+    requires { BV32.t'int left < 64 }
+    ensures  { forall i. 0 <= i < 64 /\ i <> 63 - BV32.t'int left ->
                  BV64.nth result i = BV64.nth value i }
-    ensures  { flag = BV64.nth result (63 - BV32.to_uint left) }
+    ensures  { flag = BV64.nth result (63 - BV32.t'int left) }
   =
     assert { BV32.ult left (BV32.of_int 64) };
     abstract
@@ -95,8 +95,8 @@ module Bitwalker
   left *)
 
   let peek_8bit_bv (byte : BV8.t) (left : BV32.t) : bool
-    requires { 0 <= BV32.to_uint left < 8 }
-    ensures  { result = BV8.nth byte (7 - BV32.to_uint left) }
+    requires { 0 <= BV32.t'int left < 8 }
+    ensures  { result = BV8.nth byte (7 - BV32.t'int left) }
   =
     assert {BV32.ult left (BV32.of_int 8)};
     abstract
@@ -112,27 +112,27 @@ module Bitwalker
   (* return the bit of the [left]/8 element of [addr] at position mod [left] 8 starting from the left *)
   let peek_8bit_array (addr : array BV8.t) (left : BV32.t) : bool
     requires { 8 * (length addr) < BV32.two_power_size }
-    requires { BV32.to_uint left < 8 * length addr }
-    ensures  { result = nth8_stream addr (BV32.to_uint left) }
+    requires { BV32.t'int left < 8 * length addr }
+    ensures  { result = nth8_stream addr (BV32.t'int left) }
   =
-    peek_8bit_bv (addr[ BV32.to_uint (BV32.udiv_check left (BV32.int_check 8)) ]) (BV32.urem_check left (BV32.int_check 8))
+    peek_8bit_bv (addr[ BV32.t'int (BV32.udiv_check left (BV32.int_check 8)) ]) (BV32.urem_check left (BV32.int_check 8))
 
   (* return a bitvector of 64 bits with its [len] bits of the right
     set to the bits between [start] and [start] + [len] of [addr] *)
   let peek (start : BV32.t) (len : BV32.t) (addr : array BV8.t) : BV64.t
-    requires { BV32.to_uint len <= 64 }
-    requires { BV32.to_uint start + BV32.to_uint len < BV32.two_power_size }
+    requires { BV32.t'int len <= 64 }
+    requires { BV32.t'int start + BV32.t'int len < BV32.two_power_size }
     requires { 8 * length addr < BV32.two_power_size }
-    ensures  { BV32.to_uint start + BV32.to_uint len > (8 * length addr) ->
+    ensures  { BV32.t'int start + BV32.t'int len > (8 * length addr) ->
       result = BV64.zeros }
-    ensures  { BV32.to_uint start + BV32.to_uint len <= (8 * length addr) ->
-      (forall i:int. 0 <= i < BV32.to_uint len ->
+    ensures  { BV32.t'int start + BV32.t'int len <= (8 * length addr) ->
+      (forall i:int. 0 <= i < BV32.t'int len ->
          BV64.nth result i
-         = nth8_stream addr (BV32.to_uint start + BV32.to_uint len - i - 1))
+         = nth8_stream addr (BV32.t'int start + BV32.t'int len - i - 1))
       /\
-      (forall i:int. BV32.to_uint len <= i < 64 -> BV64.nth result i = False) }
+      (forall i:int. BV32.t'int len <= i < 64 -> BV64.nth result i = False) }
   =
-    if (BV32.to_uint (BV32.add_check start len) > ( 8 *length addr ))
+    if (BV32.t'int (BV32.add_check start len) > ( 8 *length addr ))
     then
       BV64.zeros
     else
@@ -142,14 +142,14 @@ module Bitwalker
     let lstart = BV32.sub_check (BV32.of_int 64) len in
 
     while BV32.ult !i len do variant{ !i with BV32.ugt }
-    invariant {0 <= BV32.to_uint !i <= BV32.to_uint len}
-    invariant {forall j:int. BV32.to_uint len - BV32.to_uint !i <= j < BV32.to_uint len ->
+    invariant {0 <= BV32.t'int !i <= BV32.t'int len}
+    invariant {forall j:int. BV32.t'int len - BV32.t'int !i <= j < BV32.t'int len ->
                  BV64.nth !retval j
-               = nth8_stream addr (BV32.to_uint start + BV32.to_uint len - j - 1)}
-    invariant {forall j:int. 0 <= j < BV32.to_uint len - BV32.to_uint !i ->
+               = nth8_stream addr (BV32.t'int start + BV32.t'int len - j - 1)}
+    invariant {forall j:int. 0 <= j < BV32.t'int len - BV32.t'int !i ->
                  BV64.nth !retval j
                = False}
-    invariant {forall j:int. BV32.to_uint len <= j < 64 ->
+    invariant {forall j:int. BV32.t'int len <= j < 64 ->
                  BV64.nth !retval j
                = False}
 
@@ -163,8 +163,8 @@ module Bitwalker
     !retval
 
   let peek_64bit (value : BV64.t) (left : BV32.t) : bool
-    requires {BV32.to_uint left < 64}
-    ensures {result = BV64.nth value (63 - BV32.to_uint left)}
+    requires {BV32.t'int left < 64}
+    ensures {result = BV64.nth value (63 - BV32.t'int left)}
   =
      assert {BV32.ult left (BV32.of_int 64)};
      abstract
@@ -186,10 +186,10 @@ module Bitwalker
 
   (* return [byte] with the bit at index [left] from the left set to [flag] *)
   let poke_8bit (byte : BV8.t) (left : BV32.t) (flag : bool) : BV8.t
-    requires { BV32.to_uint left < 8 }
-    ensures  { forall i:int. 0 <= i < 8 -> i <> 7 - BV32.to_uint left ->
+    requires { BV32.t'int left < 8 }
+    ensures  { forall i:int. 0 <= i < 8 -> i <> 7 - BV32.t'int left ->
                BV8.nth result i = BV8.nth byte i }
-    ensures  { BV8.nth result (7 - BV32.to_uint left) = flag }
+    ensures  { BV8.nth result (7 - BV32.t'int left) = flag }
   =
     assert { BV32.ult left (BV32.of_int 8) };
     abstract
@@ -209,38 +209,38 @@ module Bitwalker
   let poke_8bit_array (addr : array BV8.t) (left : BV32.t) (flag : bool)
     writes {addr}
     requires { 8 * (length addr) < BV32.two_power_size }
-    requires { BV32.to_uint left < 8 * length addr }
-    ensures  { forall i:int. 0 <= i < 8 * length addr -> i <> BV32.to_uint left ->
+    requires { BV32.t'int left < 8 * length addr }
+    ensures  { forall i:int. 0 <= i < 8 * length addr -> i <> BV32.t'int left ->
                nth8_stream addr i = nth8_stream (old addr) i}
-    ensures  { nth8_stream addr (BV32.to_uint left) = flag }
+    ensures  { nth8_stream addr (BV32.t'int left) = flag }
   =
     let i = BV32.udiv_check left (BV32.int_check 8) in
     let k = BV32.urem_check left (BV32.int_check 8) in
-    addr[BV32.to_uint i] <- poke_8bit addr[BV32.to_uint i] k flag
+    addr[BV32.t'int i] <- poke_8bit addr[BV32.t'int i] k flag
 
   let poke (start : BV32.t) (len : BV32.t) (addr : array BV8.t) (value : BV64.t)
     writes  { addr }
-    requires{ BV32.to_uint len < 64 } (* could be lower or equal if maxvalue and the condition to return -2 is corrected *)
-    requires{ BV32.to_uint start + BV32.to_uint len < BV32.two_power_size }
+    requires{ BV32.t'int len < 64 } (* could be lower or equal if maxvalue and the condition to return -2 is corrected *)
+    requires{ BV32.t'int start + BV32.t'int len < BV32.two_power_size }
     requires{ 8 * length addr < BV32.two_power_size }
     ensures { -2 <= result <= 0 }
-    ensures { result = -1 <-> BV32.to_uint start + BV32.to_uint len > 8 * length addr }
-    ensures { result = -2 <-> BV64.to_uint (maxvalue len) <= BV64.to_uint value /\ BV32.to_uint start + BV32.to_uint len <= 8 * length addr }
-    ensures { result =  0 <-> BV64.to_uint (maxvalue len) > BV64.to_uint value /\ BV32.to_uint start + BV32.to_uint len <= 8 * length addr }
+    ensures { result = -1 <-> BV32.t'int start + BV32.t'int len > 8 * length addr }
+    ensures { result = -2 <-> BV64.t'int (maxvalue len) <= BV64.t'int value /\ BV32.t'int start + BV32.t'int len <= 8 * length addr }
+    ensures { result =  0 <-> BV64.t'int (maxvalue len) > BV64.t'int value /\ BV32.t'int start + BV32.t'int len <= 8 * length addr }
     ensures { result =  0 ->
-              (forall i:int. 0 <= i < BV32.to_uint start ->
+              (forall i:int. 0 <= i < BV32.t'int start ->
                 nth8_stream (old addr) i
               = nth8_stream addr i)
            /\
-              (forall i:int. BV32.to_uint start <= i < BV32.to_uint start + BV32.to_uint len ->
+              (forall i:int. BV32.t'int start <= i < BV32.t'int start + BV32.t'int len ->
                 nth8_stream addr i
-              = BV64.nth value (BV32.to_uint len - i - 1 + BV32.to_uint start))
+              = BV64.nth value (BV32.t'int len - i - 1 + BV32.t'int start))
            /\
-              (forall i:int. BV32.to_uint start + BV32.to_uint len <= i < 8 * length addr ->
+              (forall i:int. BV32.t'int start + BV32.t'int len <= i < 8 * length addr ->
                 nth8_stream addr i
               = nth8_stream (old addr) i) }
   =
-    if BV32.to_uint (BV32.add_check start len) > 8 * length addr
+    if BV32.t'int (BV32.add_check start len) > 8 * length addr
     then
       -1                        (*error: invalid_bit_sequence*)
     else
@@ -255,14 +255,14 @@ module Bitwalker
 
     'Init:
     while BV32.ult !i len do variant { !i with BV32.ugt }
-    invariant {0 <= BV32.to_uint !i <= BV32.to_uint len}
-    invariant {forall j:int. 0 <= j < BV32.to_uint start ->
+    invariant {0 <= BV32.t'int !i <= BV32.t'int len}
+    invariant {forall j:int. 0 <= j < BV32.t'int start ->
                  nth8_stream (at addr 'Init) j
                = nth8_stream addr j}
-    invariant {forall j:int. BV32.to_uint start <= j < BV32.to_uint start + BV32.to_uint !i ->
+    invariant {forall j:int. BV32.t'int start <= j < BV32.t'int start + BV32.t'int !i ->
                  nth8_stream addr j
-               = BV64.nth value (BV32.to_uint len - j - 1 + BV32.to_uint start) }
-    invariant {forall j:int. BV32.to_uint start + BV32.to_uint !i <= j < 8 * length addr ->
+               = BV64.nth value (BV32.t'int len - j - 1 + BV32.t'int start) }
+    invariant {forall j:int. BV32.t'int start + BV32.t'int !i <= j < 8 * length addr ->
                  nth8_stream addr j
                = nth8_stream (at addr 'Init) j }
 
@@ -270,13 +270,13 @@ module Bitwalker
 
       poke_8bit_array addr (BV32.add_check start !i) flag;
 
-      assert {nth8_stream addr (BV32.to_uint start + BV32.to_uint !i)
-            = BV64.nth value ((BV32.to_uint len - BV32.to_uint !i - 1))};
-      assert { forall k. BV32.to_uint start <= k < BV32.to_uint start + BV32.to_uint !i ->
-               k <> BV32.to_uint start + BV32.to_uint !i &&
+      assert {nth8_stream addr (BV32.t'int start + BV32.t'int !i)
+            = BV64.nth value ((BV32.t'int len - BV32.t'int !i - 1))};
+      assert { forall k. BV32.t'int start <= k < BV32.t'int start + BV32.t'int !i ->
+               k <> BV32.t'int start + BV32.t'int !i &&
                0 <= k < 8 * length addr &&
                    nth8_stream addr k
-                 = BV64.nth value (BV32.to_uint start + BV32.to_uint len - k - 1)};
+                 = BV64.nth value (BV32.t'int start + BV32.t'int len - k - 1)};
 
       i := BV32.add_check !i (BV32.int_check 1);
     done;
@@ -285,8 +285,8 @@ module Bitwalker
 
   let peekthenpoke (start len : BV32.t) (addr : array BV8.t)
     requires {8 * length addr < BV32.two_power_size}
-    requires {0 <= BV32.to_uint len < 64}
-    requires {BV32.to_uint start + BV32.to_uint len <= 8 * length addr}
+    requires {0 <= BV32.t'int len < 64}
+    requires {BV32.t'int start + BV32.t'int len <= 8 * length addr}
     ensures {result = 0}
     ensures {forall i. 0 <= i < 8 * length addr ->
                nth8_stream addr i = nth8_stream (old addr) i}
@@ -297,7 +297,7 @@ module Bitwalker
 
     assert {res = 0};
 
-    assert {forall i. BV32.to_uint start <= i < BV32.to_uint start + BV32.to_uint len ->
+    assert {forall i. BV32.t'int start <= i < BV32.t'int start + BV32.t'int len ->
          nth8_stream addr i
        = nth8_stream (at addr 'Init) i};
 
@@ -306,12 +306,12 @@ module Bitwalker
   let pokethenpeek (start len : BV32.t) (addr : array BV8.t) (value : BV64.t)
     writes   {addr}
     requires {8 * length addr < BV32.two_power_size}
-    requires {0 <= BV32.to_uint len < 64}
-    requires {BV32.to_uint start + BV32.to_uint len <= 8 * length addr}
-    requires {BV64.to_uint value < BV64.to_uint (maxvalue len)}
+    requires {0 <= BV32.t'int len < 64}
+    requires {BV32.t'int start + BV32.t'int len <= 8 * length addr}
+    requires {BV64.t'int value < BV64.t'int (maxvalue len)}
     ensures  {result = value}
   =
-    assert { forall i:int. BV32.to_uint len <= i < 64 -> BV64.nth value i = False };
+    assert { forall i:int. BV32.t'int len <= i < 64 -> BV64.nth value i = False };
     let poke_result = poke start len addr value in
     assert {poke_result = 0};
     let peek_result = peek start len addr in
diff --git a/examples/bitwalker/why3session.xml b/examples/bitwalker/why3session.xml
index 878b603e46ef0956581abf59afab26eb451bb505..692e81270e3a5c64c7d91397d018eea9db385918 100644
--- a/examples/bitwalker/why3session.xml
+++ b/examples/bitwalker/why3session.xml
@@ -11,43 +11,44 @@
 <prover id="6" name="CVC4" version="1.4" alternative="noBV" timelimit="5" steplimit="0" memlimit="1000"/>
 <prover id="7" name="Alt-Ergo" version="1.01" timelimit="5" steplimit="0" memlimit="1000"/>
 <prover id="8" name="Z3" version="4.4.1" timelimit="1" steplimit="0" memlimit="1000"/>
+<prover id="9" name="Z3" version="4.5.0" alternative="noBV" timelimit="5" steplimit="0" memlimit="1000"/>
 <file name="../bitwalker.mlw" expanded="true">
-<theory name="Bitwalker" sum="6755724df7c462879051ab2676cc5753" expanded="true">
+<theory name="Bitwalker" sum="5502bd36797ca7e2395041b75019e0f3" expanded="true">
  <goal name="nth64">
- <proof prover="0"><result status="valid" time="0.10" steps="85"/></proof>
+ <proof prover="0"><result status="valid" time="0.10" steps="93"/></proof>
  </goal>
  <goal name="nth8">
- <proof prover="0"><result status="valid" time="0.30" steps="194"/></proof>
+ <proof prover="0"><result status="valid" time="0.30" steps="222"/></proof>
  </goal>
  <goal name="WP_parameter nth_ultpre0" expl="VC for nth_ultpre0">
  <transf name="split_goal_wp">
   <goal name="WP_parameter nth_ultpre0.1" expl="1. assertion">
-  <proof prover="0"><result status="valid" time="0.03" steps="77"/></proof>
+  <proof prover="0"><result status="valid" time="0.03" steps="86"/></proof>
   </goal>
   <goal name="WP_parameter nth_ultpre0.2" expl="2. assertion">
   <proof prover="1"><result status="valid" time="0.16"/></proof>
   </goal>
   <goal name="WP_parameter nth_ultpre0.3" expl="3. postcondition">
-  <proof prover="0"><result status="valid" time="0.36" steps="191"/></proof>
-  <proof prover="6"><result status="valid" time="0.12"/></proof>
+  <proof prover="0"><result status="valid" time="4.38" steps="1023"/></proof>
+  <proof prover="6"><result status="valid" time="0.34"/></proof>
   </goal>
  </transf>
  </goal>
  <goal name="WP_parameter poke_64bit_bv" expl="VC for poke_64bit_bv">
  <transf name="split_goal_wp">
   <goal name="WP_parameter poke_64bit_bv.1" expl="1. assertion">
-  <proof prover="0"><result status="valid" time="0.04" steps="77"/></proof>
+  <proof prover="0"><result status="valid" time="0.04" steps="86"/></proof>
   </goal>
   <goal name="WP_parameter poke_64bit_bv.2" expl="2. precondition">
-  <proof prover="0"><result status="valid" time="0.02" steps="73"/></proof>
+  <proof prover="0"><result status="valid" time="0.02" steps="81"/></proof>
   <proof prover="1"><result status="valid" time="0.01"/></proof>
   </goal>
   <goal name="WP_parameter poke_64bit_bv.3" expl="3. precondition">
-  <proof prover="0"><result status="valid" time="0.02" steps="83"/></proof>
+  <proof prover="0"><result status="valid" time="0.02" steps="119"/></proof>
   <proof prover="1"><result status="valid" time="0.02"/></proof>
   </goal>
   <goal name="WP_parameter poke_64bit_bv.4" expl="4. precondition">
-  <proof prover="0"><result status="valid" time="0.03" steps="79"/></proof>
+  <proof prover="0"><result status="valid" time="0.03" steps="87"/></proof>
   <proof prover="1"><result status="valid" time="0.01"/></proof>
   </goal>
   <goal name="WP_parameter poke_64bit_bv.5" expl="5. VC for poke_64bit_bv">
@@ -63,25 +64,25 @@
   <proof prover="1"><result status="valid" time="0.06"/></proof>
   </goal>
   <goal name="WP_parameter poke_64bit_bv.9" expl="9. postcondition">
-  <proof prover="0"><result status="valid" time="0.34" steps="179"/></proof>
-  <proof prover="6"><result status="valid" time="0.09"/></proof>
+  <proof prover="0"><result status="valid" time="0.61" steps="333"/></proof>
+  <proof prover="6"><result status="valid" time="0.40"/></proof>
   </goal>
   <goal name="WP_parameter poke_64bit_bv.10" expl="10. postcondition">
-  <proof prover="0"><result status="valid" time="0.29" steps="156"/></proof>
-  <proof prover="6"><result status="valid" time="0.12"/></proof>
+  <proof prover="0"><result status="valid" time="0.52" steps="273"/></proof>
+  <proof prover="6"><result status="valid" time="0.41"/></proof>
   </goal>
  </transf>
  </goal>
  <goal name="WP_parameter poke_64bit" expl="VC for poke_64bit">
  <transf name="split_goal_wp">
   <goal name="WP_parameter poke_64bit.1" expl="1. assertion">
-  <proof prover="0"><result status="valid" time="0.04" steps="81"/></proof>
+  <proof prover="0"><result status="valid" time="0.04" steps="91"/></proof>
   </goal>
   <goal name="WP_parameter poke_64bit.2" expl="2. assertion">
-  <proof prover="0"><result status="valid" time="0.27" steps="139"/></proof>
+  <proof prover="0"><result status="valid" time="0.64" steps="351"/></proof>
   </goal>
   <goal name="WP_parameter poke_64bit.3" expl="3. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="75"/></proof>
+  <proof prover="0"><result status="valid" time="0.04" steps="83"/></proof>
   </goal>
   <goal name="WP_parameter poke_64bit.4" expl="4. VC for poke_64bit">
   <proof prover="1"><result status="valid" time="0.31"/></proof>
@@ -96,161 +97,163 @@
   <proof prover="1"><result status="valid" time="0.07"/></proof>
   </goal>
   <goal name="WP_parameter poke_64bit.8" expl="8. postcondition">
-  <proof prover="0"><result status="valid" time="0.48" steps="216"/></proof>
+  <proof prover="0"><result status="valid" time="0.77" steps="344"/></proof>
   </goal>
   <goal name="WP_parameter poke_64bit.9" expl="9. postcondition">
-  <proof prover="0"><result status="valid" time="0.08" steps="88"/></proof>
+  <proof prover="0"><result status="valid" time="0.08" steps="96"/></proof>
   </goal>
  </transf>
  </goal>
  <goal name="WP_parameter peek_8bit_bv" expl="VC for peek_8bit_bv">
  <transf name="split_goal_wp">
   <goal name="WP_parameter peek_8bit_bv.1" expl="1. assertion">
-  <proof prover="0"><result status="valid" time="0.03" steps="78"/></proof>
+  <proof prover="0"><result status="valid" time="0.03" steps="87"/></proof>
   </goal>
   <goal name="WP_parameter peek_8bit_bv.2" expl="2. precondition">
-  <proof prover="0"><result status="valid" time="0.05" steps="74"/></proof>
+  <proof prover="0"><result status="valid" time="0.05" steps="82"/></proof>
   <proof prover="1"><result status="valid" time="0.02"/></proof>
   </goal>
   <goal name="WP_parameter peek_8bit_bv.3" expl="3. precondition">
-  <proof prover="0"><result status="valid" time="0.06" steps="77"/></proof>
+  <proof prover="0"><result status="valid" time="0.06" steps="85"/></proof>
   <proof prover="1"><result status="valid" time="0.02"/></proof>
   </goal>
   <goal name="WP_parameter peek_8bit_bv.4" expl="4. precondition">
-  <proof prover="0"><result status="valid" time="0.06" steps="80"/></proof>
+  <proof prover="0"><result status="valid" time="0.06" steps="88"/></proof>
   <proof prover="1"><result status="valid" time="0.01"/></proof>
   </goal>
   <goal name="WP_parameter peek_8bit_bv.5" expl="5. VC for peek_8bit_bv">
   <proof prover="1"><result status="valid" time="0.09"/></proof>
   </goal>
   <goal name="WP_parameter peek_8bit_bv.6" expl="6. postcondition">
-  <proof prover="0"><result status="valid" time="1.22" steps="584"/></proof>
+  <proof prover="0"><result status="valid" time="1.22" steps="550"/></proof>
   </goal>
  </transf>
  </goal>
  <goal name="WP_parameter peek_8bit_array" expl="VC for peek_8bit_array">
  <transf name="split_goal_wp">
   <goal name="WP_parameter peek_8bit_array.1" expl="1. precondition">
-  <proof prover="0"><result status="valid" time="0.02" steps="74"/></proof>
+  <proof prover="0"><result status="valid" time="0.02" steps="82"/></proof>
   <proof prover="1"><result status="valid" time="0.04"/></proof>
   <proof prover="3"><result status="valid" time="0.06"/></proof>
   </goal>
   <goal name="WP_parameter peek_8bit_array.2" expl="2. precondition">
-  <proof prover="0"><result status="valid" time="0.06" steps="86"/></proof>
+  <proof prover="0"><result status="valid" time="0.06" steps="85"/></proof>
   <proof prover="1"><result status="valid" time="0.04"/></proof>
   <proof prover="3"><result status="valid" time="0.04"/></proof>
   </goal>
   <goal name="WP_parameter peek_8bit_array.3" expl="3. precondition">
-  <proof prover="0"><result status="valid" time="0.03" steps="79"/></proof>
+  <proof prover="0"><result status="valid" time="0.03" steps="87"/></proof>
   <proof prover="1"><result status="valid" time="0.04"/></proof>
   <proof prover="3"><result status="valid" time="0.04"/></proof>
   </goal>
   <goal name="WP_parameter peek_8bit_array.4" expl="4. precondition">
-  <proof prover="0"><result status="valid" time="0.05" steps="79"/></proof>
+  <proof prover="0"><result status="valid" time="0.05" steps="87"/></proof>
   <proof prover="1"><result status="valid" time="0.04"/></proof>
   <proof prover="3"><result status="valid" time="0.04"/></proof>
   </goal>
   <goal name="WP_parameter peek_8bit_array.5" expl="5. index in array bounds">
-  <proof prover="0"><result status="valid" time="0.26" steps="127"/></proof>
+  <proof prover="0"><result status="valid" time="0.26" steps="222"/></proof>
   <proof prover="3"><result status="valid" time="0.05"/></proof>
   </goal>
   <goal name="WP_parameter peek_8bit_array.6" expl="6. precondition">
-  <proof prover="0"><result status="valid" time="0.35" steps="193"/></proof>
+  <proof prover="0"><result status="valid" time="0.35" steps="242"/></proof>
   <proof prover="1"><result status="valid" time="0.08"/></proof>
-  <proof prover="3"><result status="valid" time="0.53"/></proof>
+  <proof prover="3"><result status="valid" time="2.22"/></proof>
   </goal>
   <goal name="WP_parameter peek_8bit_array.7" expl="7. postcondition">
-  <proof prover="0"><result status="valid" time="0.14" steps="106"/></proof>
+  <proof prover="0"><result status="valid" time="0.33" steps="114"/></proof>
   </goal>
  </transf>
  </goal>
- <goal name="WP_parameter peek" expl="VC for peek">
- <transf name="split_goal_wp">
+ <goal name="WP_parameter peek" expl="VC for peek" expanded="true">
+ <transf name="split_goal_wp" expanded="true">
   <goal name="WP_parameter peek.1" expl="1. precondition">
-  <proof prover="0"><result status="valid" time="0.06" steps="79"/></proof>
-  <proof prover="3"><result status="valid" time="0.03"/></proof>
+  <proof prover="0"><result status="valid" time="0.11" steps="114"/></proof>
+  <proof prover="3"><result status="valid" time="0.13"/></proof>
+  <proof prover="6"><result status="valid" time="0.07"/></proof>
+  <proof prover="9"><result status="valid" time="0.12"/></proof>
   </goal>
   <goal name="WP_parameter peek.2" expl="2. postcondition">
-  <proof prover="0"><result status="valid" time="0.03" steps="71"/></proof>
+  <proof prover="0"><result status="valid" time="0.03" steps="79"/></proof>
   <proof prover="1"><result status="valid" time="0.04"/></proof>
   <proof prover="3"><result status="valid" time="0.07"/></proof>
   </goal>
   <goal name="WP_parameter peek.3" expl="3. postcondition">
-  <proof prover="0"><result status="valid" time="0.03" steps="78"/></proof>
+  <proof prover="0"><result status="valid" time="0.03" steps="86"/></proof>
   <proof prover="1"><result status="valid" time="0.10"/></proof>
   <proof prover="3"><result status="valid" time="0.09"/></proof>
   </goal>
   <goal name="WP_parameter peek.4" expl="4. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="91"/></proof>
+  <proof prover="0"><result status="valid" time="0.04" steps="128"/></proof>
   <proof prover="3"><result status="valid" time="0.04"/></proof>
   </goal>
   <goal name="WP_parameter peek.5" expl="5. loop invariant init">
-  <proof prover="0"><result status="valid" time="0.05" steps="102"/></proof>
+  <proof prover="0"><result status="valid" time="0.05" steps="129"/></proof>
   <proof prover="3"><result status="valid" time="0.09"/></proof>
   </goal>
   <goal name="WP_parameter peek.6" expl="6. loop invariant init">
-  <proof prover="0"><result status="valid" time="4.64" steps="228"/></proof>
+  <proof prover="0"><result status="valid" time="0.03" steps="90"/></proof>
   <proof prover="3"><result status="valid" time="0.04"/></proof>
   </goal>
   <goal name="WP_parameter peek.7" expl="7. loop invariant init">
-  <proof prover="2"><result status="valid" time="0.03" steps="84"/></proof>
+  <proof prover="2"><result status="valid" time="0.03" steps="92"/></proof>
   <proof prover="3"><result status="valid" time="0.05"/></proof>
   <proof prover="5"><result status="valid" time="0.01"/></proof>
   <proof prover="6"><result status="valid" time="0.06"/></proof>
   </goal>
   <goal name="WP_parameter peek.8" expl="8. loop invariant init">
-  <proof prover="0"><result status="valid" time="0.03" steps="84"/></proof>
+  <proof prover="0"><result status="valid" time="0.03" steps="92"/></proof>
   <proof prover="3"><result status="valid" time="0.04"/></proof>
   </goal>
   <goal name="WP_parameter peek.9" expl="9. precondition">
-  <proof prover="0"><result status="valid" time="0.05" steps="94"/></proof>
-  <proof prover="3"><result status="valid" time="0.06"/></proof>
+  <proof prover="3"><result status="valid" time="0.05"/></proof>
   </goal>
   <goal name="WP_parameter peek.10" expl="10. precondition">
-  <proof prover="0"><result status="valid" time="0.06" steps="87"/></proof>
+  <proof prover="0"><result status="valid" time="0.06" steps="95"/></proof>
   <proof prover="1"><result status="valid" time="0.18"/></proof>
   <proof prover="3"><result status="valid" time="0.09"/></proof>
   </goal>
   <goal name="WP_parameter peek.11" expl="11. precondition">
-  <proof prover="0"><result status="valid" time="0.06" steps="88"/></proof>
-  <proof prover="3"><result status="valid" time="0.12"/></proof>
+  <proof prover="3"><result status="valid" time="0.08"/></proof>
   </goal>
   <goal name="WP_parameter peek.12" expl="12. precondition">
-  <proof prover="3"><result status="valid" time="0.05"/></proof>
+  <proof prover="0"><result status="valid" time="0.05" steps="116"/></proof>
+  <proof prover="3"><result status="valid" time="0.06"/></proof>
   </goal>
-  <goal name="WP_parameter peek.13" expl="13. precondition">
-  <proof prover="3"><result status="valid" time="0.72"/></proof>
+  <goal name="WP_parameter peek.13" expl="13. precondition" expanded="true">
+  <proof prover="3"><result status="valid" time="2.14"/></proof>
+  <proof prover="6"><result status="valid" time="0.09"/></proof>
+  <proof prover="9"><result status="valid" time="0.12"/></proof>
   </goal>
   <goal name="WP_parameter peek.14" expl="14. precondition">
-  <proof prover="0"><result status="valid" time="0.10" steps="93"/></proof>
+  <proof prover="0"><result status="valid" time="0.10" steps="101"/></proof>
   <proof prover="1"><result status="valid" time="0.06"/></proof>
   <proof prover="3"><result status="valid" time="0.12"/></proof>
   </goal>
   <goal name="WP_parameter peek.15" expl="15. precondition">
-  <proof prover="0"><result status="valid" time="0.11" steps="96"/></proof>
-  <proof prover="1"><result status="valid" time="0.10"/></proof>
-  <proof prover="3"><result status="valid" time="0.13"/></proof>
+  <proof prover="0"><result status="valid" time="0.06" steps="104"/></proof>
+  <proof prover="3"><result status="valid" time="0.03"/></proof>
   </goal>
   <goal name="WP_parameter peek.16" expl="16. loop invariant preservation">
-  <proof prover="0"><result status="valid" time="0.19" steps="101"/></proof>
+  <proof prover="0"><result status="valid" time="0.19" steps="109"/></proof>
   <proof prover="3"><result status="valid" time="0.12"/></proof>
   </goal>
   <goal name="WP_parameter peek.17" expl="17. loop invariant preservation">
-  <proof prover="4"><result status="valid" time="1.65" steps="447"/></proof>
+  <proof prover="4"><result status="valid" time="3.08" steps="710"/></proof>
   </goal>
   <goal name="WP_parameter peek.18" expl="18. loop invariant preservation">
   <proof prover="5"><result status="valid" time="0.01"/></proof>
   </goal>
   <goal name="WP_parameter peek.19" expl="19. loop invariant preservation">
   <proof prover="5"><result status="valid" time="0.02"/></proof>
-  <proof prover="6"><result status="valid" time="0.11"/></proof>
+  <proof prover="6"><result status="valid" time="0.33"/></proof>
   </goal>
   <goal name="WP_parameter peek.20" expl="20. loop variant decrease">
-  <proof prover="0"><result status="valid" time="0.14" steps="101"/></proof>
-  <proof prover="3"><result status="valid" time="0.14"/></proof>
+  <proof prover="0"><result status="valid" time="0.14" steps="109"/></proof>
+  <proof prover="3"><result status="valid" time="1.96"/></proof>
   </goal>
   <goal name="WP_parameter peek.21" expl="21. postcondition">
-  <proof prover="0"><result status="valid" time="0.05" steps="84"/></proof>
+  <proof prover="0"><result status="valid" time="0.05" steps="92"/></proof>
   <proof prover="1"><result status="valid" time="0.14"/></proof>
   <proof prover="3"><result status="valid" time="0.08"/></proof>
   </goal>
@@ -262,21 +265,21 @@
  <goal name="WP_parameter peek_64bit" expl="VC for peek_64bit">
  <transf name="split_goal_wp">
   <goal name="WP_parameter peek_64bit.1" expl="1. assertion">
-  <proof prover="0"><result status="valid" time="0.03" steps="77"/></proof>
+  <proof prover="0"><result status="valid" time="0.03" steps="86"/></proof>
   <proof prover="3"><result status="valid" time="0.04"/></proof>
   </goal>
   <goal name="WP_parameter peek_64bit.2" expl="2. precondition">
-  <proof prover="0"><result status="valid" time="0.02" steps="73"/></proof>
+  <proof prover="0"><result status="valid" time="0.02" steps="81"/></proof>
   <proof prover="1"><result status="valid" time="0.06"/></proof>
   <proof prover="3"><result status="valid" time="0.08"/></proof>
   </goal>
   <goal name="WP_parameter peek_64bit.3" expl="3. precondition">
-  <proof prover="0"><result status="valid" time="0.05" steps="83"/></proof>
+  <proof prover="0"><result status="valid" time="0.05" steps="119"/></proof>
   <proof prover="1"><result status="valid" time="0.12"/></proof>
   <proof prover="3"><result status="valid" time="0.04"/></proof>
   </goal>
   <goal name="WP_parameter peek_64bit.4" expl="4. precondition">
-  <proof prover="0"><result status="valid" time="0.02" steps="79"/></proof>
+  <proof prover="0"><result status="valid" time="0.02" steps="87"/></proof>
   <proof prover="1"><result status="valid" time="0.06"/></proof>
   <proof prover="3"><result status="valid" time="0.07"/></proof>
   </goal>
@@ -284,28 +287,28 @@
   <proof prover="1"><result status="valid" time="0.22"/></proof>
   </goal>
   <goal name="WP_parameter peek_64bit.6" expl="6. postcondition">
-  <proof prover="0"><result status="valid" time="0.07" steps="130"/></proof>
+  <proof prover="0"><result status="valid" time="0.07" steps="141"/></proof>
   </goal>
  </transf>
  </goal>
  <goal name="WP_parameter poke_8bit" expl="VC for poke_8bit">
  <transf name="split_goal_wp">
   <goal name="WP_parameter poke_8bit.1" expl="1. assertion">
-  <proof prover="0"><result status="valid" time="0.03" steps="77"/></proof>
+  <proof prover="0"><result status="valid" time="0.03" steps="86"/></proof>
   <proof prover="3"><result status="valid" time="0.04"/></proof>
   </goal>
   <goal name="WP_parameter poke_8bit.2" expl="2. precondition">
-  <proof prover="0"><result status="valid" time="0.02" steps="73"/></proof>
+  <proof prover="0"><result status="valid" time="0.02" steps="81"/></proof>
   <proof prover="1"><result status="valid" time="0.06"/></proof>
   <proof prover="3"><result status="valid" time="0.08"/></proof>
   </goal>
   <goal name="WP_parameter poke_8bit.3" expl="3. precondition">
-  <proof prover="0"><result status="valid" time="0.10" steps="98"/></proof>
+  <proof prover="0"><result status="valid" time="0.10" steps="96"/></proof>
   <proof prover="1"><result status="valid" time="0.10"/></proof>
-  <proof prover="3"><result status="valid" time="0.12"/></proof>
+  <proof prover="3"><result status="valid" time="0.77"/></proof>
   </goal>
   <goal name="WP_parameter poke_8bit.4" expl="4. precondition">
-  <proof prover="0"><result status="valid" time="0.02" steps="79"/></proof>
+  <proof prover="0"><result status="valid" time="0.02" steps="87"/></proof>
   <proof prover="1"><result status="valid" time="0.06"/></proof>
   <proof prover="3"><result status="valid" time="0.08"/></proof>
   </goal>
@@ -322,51 +325,51 @@
   <proof prover="1"><result status="valid" time="0.08"/></proof>
   </goal>
   <goal name="WP_parameter poke_8bit.9" expl="9. postcondition">
-  <proof prover="3"><result status="valid" time="0.83"/></proof>
+  <proof prover="3"><result status="valid" time="2.82"/></proof>
   </goal>
   <goal name="WP_parameter poke_8bit.10" expl="10. postcondition">
-  <proof prover="3"><result status="valid" time="0.09"/></proof>
+  <proof prover="3"><result status="valid" time="0.78"/></proof>
   </goal>
  </transf>
  </goal>
  <goal name="WP_parameter poke_8bit_array" expl="VC for poke_8bit_array">
  <transf name="split_goal_wp">
   <goal name="WP_parameter poke_8bit_array.1" expl="1. precondition">
-  <proof prover="0"><result status="valid" time="0.03" steps="74"/></proof>
+  <proof prover="0"><result status="valid" time="0.03" steps="82"/></proof>
   <proof prover="1"><result status="valid" time="0.03"/></proof>
   <proof prover="3"><result status="valid" time="0.08"/></proof>
   <proof prover="5"><result status="valid" time="0.00"/></proof>
   </goal>
   <goal name="WP_parameter poke_8bit_array.2" expl="2. precondition">
-  <proof prover="0"><result status="valid" time="0.05" steps="86"/></proof>
+  <proof prover="0"><result status="valid" time="0.05" steps="85"/></proof>
   <proof prover="1"><result status="valid" time="0.04"/></proof>
   <proof prover="3"><result status="valid" time="0.04"/></proof>
   <proof prover="5"><result status="valid" time="0.00"/></proof>
   </goal>
   <goal name="WP_parameter poke_8bit_array.3" expl="3. precondition">
-  <proof prover="0"><result status="valid" time="0.02" steps="79"/></proof>
+  <proof prover="0"><result status="valid" time="0.02" steps="87"/></proof>
   <proof prover="1"><result status="valid" time="0.04"/></proof>
   <proof prover="3"><result status="valid" time="0.06"/></proof>
   <proof prover="5"><result status="valid" time="0.00"/></proof>
   </goal>
   <goal name="WP_parameter poke_8bit_array.4" expl="4. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="79"/></proof>
+  <proof prover="0"><result status="valid" time="0.04" steps="87"/></proof>
   <proof prover="1"><result status="valid" time="0.03"/></proof>
   <proof prover="3"><result status="valid" time="0.04"/></proof>
   <proof prover="5"><result status="valid" time="0.00"/></proof>
   </goal>
   <goal name="WP_parameter poke_8bit_array.5" expl="5. index in array bounds">
-  <proof prover="0"><result status="valid" time="0.27" steps="127"/></proof>
+  <proof prover="0"><result status="valid" time="0.27" steps="222"/></proof>
   <proof prover="3"><result status="valid" time="0.05"/></proof>
   </goal>
   <goal name="WP_parameter poke_8bit_array.6" expl="6. precondition">
-  <proof prover="0"><result status="valid" time="0.34" steps="187"/></proof>
+  <proof prover="0"><result status="valid" time="0.34" steps="194"/></proof>
   <proof prover="1"><result status="valid" time="0.08"/></proof>
-  <proof prover="3"><result status="valid" time="1.26"/></proof>
+  <proof prover="3"><result status="valid" time="1.95"/></proof>
   <proof prover="5"><result status="valid" time="0.01"/></proof>
   </goal>
   <goal name="WP_parameter poke_8bit_array.7" expl="7. index in array bounds">
-  <proof prover="0"><result status="valid" time="0.03" steps="83"/></proof>
+  <proof prover="0"><result status="valid" time="0.03" steps="91"/></proof>
   <proof prover="1"><result status="valid" time="0.09"/></proof>
   <proof prover="3"><result status="valid" time="0.09"/></proof>
   <proof prover="5"><result status="valid" time="0.01"/></proof>
@@ -375,71 +378,75 @@
   <proof prover="5"><result status="valid" time="0.01"/></proof>
   </goal>
   <goal name="WP_parameter poke_8bit_array.9" expl="9. postcondition">
-  <proof prover="0"><result status="valid" time="0.08" steps="92"/></proof>
+  <proof prover="0"><result status="valid" time="0.08" steps="100"/></proof>
   <proof prover="5"><result status="valid" time="0.01"/></proof>
   </goal>
  </transf>
  </goal>
- <goal name="WP_parameter poke" expl="VC for poke">
- <transf name="split_goal_wp">
-  <goal name="WP_parameter poke.1" expl="1. precondition">
-  <proof prover="0"><result status="valid" time="0.06" steps="79"/></proof>
-  <proof prover="3"><result status="valid" time="0.04"/></proof>
+ <goal name="WP_parameter poke" expl="VC for poke" expanded="true">
+ <transf name="split_goal_wp" expanded="true">
+  <goal name="WP_parameter poke.1" expl="1. precondition" expanded="true">
+  <proof prover="0"><result status="valid" time="0.05" steps="114"/></proof>
+  <proof prover="3"><result status="valid" time="0.15"/></proof>
+  <proof prover="6"><result status="valid" time="0.08"/></proof>
+  <proof prover="9"><result status="valid" time="0.12"/></proof>
   </goal>
   <goal name="WP_parameter poke.2" expl="2. postcondition">
-  <proof prover="0"><result status="valid" time="0.03" steps="78"/></proof>
+  <proof prover="0"><result status="valid" time="0.03" steps="86"/></proof>
   <proof prover="1"><result status="valid" time="0.05"/></proof>
   <proof prover="3"><result status="valid" time="0.07"/></proof>
   </goal>
   <goal name="WP_parameter poke.3" expl="3. postcondition">
-  <proof prover="0"><result status="valid" time="0.05" steps="78"/></proof>
-  <proof prover="1"><result status="valid" time="0.07"/></proof>
-  <proof prover="3"><result status="valid" time="0.10"/></proof>
+  <proof prover="0"><result status="valid" time="0.05" steps="86"/></proof>
+  <proof prover="1"><result status="valid" time="0.12"/></proof>
+  <proof prover="3"><result status="valid" time="0.08"/></proof>
   </goal>
   <goal name="WP_parameter poke.4" expl="4. postcondition">
-  <proof prover="0"><result status="valid" time="0.06" steps="79"/></proof>
-  <proof prover="1"><result status="valid" time="0.05"/></proof>
+  <proof prover="0"><result status="valid" time="0.04" steps="87"/></proof>
   <proof prover="3"><result status="valid" time="0.09"/></proof>
   </goal>
   <goal name="WP_parameter poke.5" expl="5. postcondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="79"/></proof>
-  <proof prover="1"><result status="valid" time="0.10"/></proof>
-  <proof prover="3"><result status="valid" time="0.09"/></proof>
+  <proof prover="0"><result status="valid" time="0.04" steps="87"/></proof>
+  <proof prover="3"><result status="valid" time="0.05"/></proof>
   </goal>
   <goal name="WP_parameter poke.6" expl="6. postcondition">
-  <proof prover="0"><result status="valid" time="0.03" steps="80"/></proof>
-  <proof prover="1"><result status="valid" time="0.06"/></proof>
-  <proof prover="3"><result status="valid" time="0.10"/></proof>
+  <proof prover="0"><result status="valid" time="0.03" steps="88"/></proof>
+  <proof prover="1"><result status="valid" time="0.02"/></proof>
+  <proof prover="3"><result status="valid" time="0.09"/></proof>
   </goal>
   <goal name="WP_parameter poke.7" expl="7. postcondition">
-  <proof prover="0"><result status="valid" time="0.03" steps="79"/></proof>
+  <proof prover="0"><result status="valid" time="0.03" steps="87"/></proof>
   <proof prover="1"><result status="valid" time="0.06"/></proof>
   <proof prover="3"><result status="valid" time="0.09"/></proof>
   </goal>
   <goal name="WP_parameter poke.8" expl="8. postcondition">
-  <proof prover="0"><result status="valid" time="0.05" steps="79"/></proof>
+  <proof prover="0"><result status="valid" time="0.05" steps="87"/></proof>
   <proof prover="1"><result status="valid" time="0.10"/></proof>
   <proof prover="3"><result status="valid" time="0.07"/></proof>
   </goal>
-  <goal name="WP_parameter poke.9" expl="9. postcondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="80"/></proof>
-  <proof prover="3"><result status="valid" time="0.05"/></proof>
+  <goal name="WP_parameter poke.9" expl="9. postcondition" expanded="true">
+  <proof prover="0"><result status="valid" time="0.04" steps="88"/></proof>
+  <proof prover="3"><result status="valid" time="0.09"/></proof>
+  <proof prover="6"><result status="valid" time="0.07"/></proof>
+  <proof prover="9"><result status="valid" time="0.12"/></proof>
   </goal>
-  <goal name="WP_parameter poke.10" expl="10. postcondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="81"/></proof>
+  <goal name="WP_parameter poke.10" expl="10. postcondition" expanded="true">
+  <proof prover="0"><result status="valid" time="0.06" steps="89"/></proof>
   <proof prover="3"><result status="valid" time="0.09"/></proof>
+  <proof prover="6"><result status="valid" time="0.08"/></proof>
+  <proof prover="9"><result status="valid" time="0.11"/></proof>
   </goal>
   <goal name="WP_parameter poke.11" expl="11. postcondition">
-  <proof prover="0"><result status="valid" time="0.03" steps="81"/></proof>
-  <proof prover="1"><result status="valid" time="0.02"/></proof>
-  <proof prover="3"><result status="valid" time="0.09"/></proof>
+  <proof prover="0"><result status="valid" time="0.03" steps="89"/></proof>
+  <proof prover="1"><result status="valid" time="0.06"/></proof>
+  <proof prover="3"><result status="valid" time="0.10"/></proof>
   </goal>
   <goal name="WP_parameter poke.12" expl="12. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="98"/></proof>
+  <proof prover="0"><result status="valid" time="0.04" steps="137"/></proof>
   <proof prover="3"><result status="valid" time="0.04"/></proof>
   </goal>
   <goal name="WP_parameter poke.13" expl="13. loop invariant init">
-  <proof prover="0"><result status="valid" time="0.06" steps="109"/></proof>
+  <proof prover="0"><result status="valid" time="0.06" steps="138"/></proof>
   <proof prover="3"><result status="valid" time="0.09"/></proof>
   </goal>
   <goal name="WP_parameter poke.14" expl="14. loop invariant init">
@@ -447,37 +454,38 @@
   <proof prover="3"><result status="valid" time="0.05"/></proof>
   </goal>
   <goal name="WP_parameter poke.15" expl="15. precondition">
-  <proof prover="0"><result status="valid" time="0.05" steps="95"/></proof>
-  <proof prover="3"><result status="valid" time="0.05"/></proof>
+  <proof prover="3"><result status="valid" time="0.07"/></proof>
   </goal>
-  <goal name="WP_parameter poke.16" expl="16. precondition">
-  <proof prover="3"><result status="valid" time="1.03"/></proof>
+  <goal name="WP_parameter poke.16" expl="16. precondition" expanded="true">
+  <proof prover="3"><result status="valid" time="2.01"/></proof>
+  <proof prover="6"><result status="valid" time="0.09"/></proof>
+  <proof prover="9"><result status="valid" time="0.13"/></proof>
   </goal>
   <goal name="WP_parameter poke.17" expl="17. precondition">
-  <proof prover="3"><result status="valid" time="0.07"/></proof>
+  <proof prover="0"><result status="valid" time="0.20" steps="149"/></proof>
+  <proof prover="3"><result status="valid" time="0.05"/></proof>
   </goal>
   <goal name="WP_parameter poke.18" expl="18. type invariant">
-  <proof prover="0"><result status="valid" time="0.06" steps="92"/></proof>
+  <proof prover="0"><result status="valid" time="0.06" steps="100"/></proof>
   <proof prover="1"><result status="valid" time="0.16"/></proof>
   <proof prover="3"><result status="valid" time="0.10"/></proof>
   </goal>
   <goal name="WP_parameter poke.19" expl="19. precondition">
-  <proof prover="0"><result status="valid" time="0.06" steps="92"/></proof>
+  <proof prover="0"><result status="valid" time="0.06" steps="100"/></proof>
   <proof prover="1"><result status="valid" time="0.16"/></proof>
   <proof prover="3"><result status="valid" time="0.09"/></proof>
   </goal>
   <goal name="WP_parameter poke.20" expl="20. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="93"/></proof>
-  <proof prover="3"><result status="valid" time="0.11"/></proof>
+  <proof prover="3"><result status="valid" time="0.07"/></proof>
   </goal>
   <goal name="WP_parameter poke.21" expl="21. assertion">
   <proof prover="3"><result status="valid" time="0.06"/></proof>
-  <proof prover="4"><result status="valid" time="0.44" steps="217"/></proof>
+  <proof prover="4"><result status="valid" time="0.82" steps="323"/></proof>
   </goal>
   <goal name="WP_parameter poke.22" expl="22. assertion">
   <transf name="split_goal_wp">
    <goal name="WP_parameter poke.22.1" expl="1. assertion">
-   <proof prover="0"><result status="valid" time="0.05" steps="95"/></proof>
+   <proof prover="0"><result status="valid" time="0.05" steps="103"/></proof>
    <proof prover="1"><result status="valid" time="0.06"/></proof>
    <proof prover="3"><result status="valid" time="0.13"/></proof>
    </goal>
@@ -485,77 +493,76 @@
    <proof prover="3"><result status="valid" time="0.06"/></proof>
    </goal>
    <goal name="WP_parameter poke.22.3" expl="3. assertion">
-   <proof prover="0"><result status="valid" time="0.13" steps="96"/></proof>
+   <proof prover="0"><result status="valid" time="0.13" steps="104"/></proof>
    <proof prover="1"><result status="valid" time="0.10"/></proof>
    <proof prover="3"><result status="valid" time="0.12"/></proof>
    </goal>
    <goal name="WP_parameter poke.22.4" expl="4. assertion">
    <proof prover="5"><result status="valid" time="0.02"/></proof>
-   <proof prover="6"><result status="valid" time="0.10"/></proof>
+   <proof prover="6"><result status="valid" time="0.32"/></proof>
    </goal>
   </transf>
   </goal>
   <goal name="WP_parameter poke.23" expl="23. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="93"/></proof>
+  <proof prover="0"><result status="valid" time="0.04" steps="101"/></proof>
   <proof prover="1"><result status="valid" time="0.02"/></proof>
   <proof prover="3"><result status="valid" time="0.05"/></proof>
   </goal>
   <goal name="WP_parameter poke.24" expl="24. precondition">
-  <proof prover="0"><result status="valid" time="0.05" steps="96"/></proof>
-  <proof prover="1"><result status="valid" time="0.22"/></proof>
-  <proof prover="3"><result status="valid" time="0.15"/></proof>
+  <proof prover="0"><result status="valid" time="0.06" steps="104"/></proof>
+  <proof prover="3"><result status="valid" time="0.04"/></proof>
   </goal>
   <goal name="WP_parameter poke.25" expl="25. loop invariant preservation">
-  <proof prover="0"><result status="valid" time="0.22" steps="101"/></proof>
+  <proof prover="0"><result status="valid" time="0.22" steps="109"/></proof>
   <proof prover="3"><result status="valid" time="0.06"/></proof>
   </goal>
   <goal name="WP_parameter poke.26" expl="26. loop invariant preservation">
-  <proof prover="0"><result status="valid" time="0.29" steps="126"/></proof>
+  <proof prover="0"><result status="valid" time="0.96" steps="134"/></proof>
   </goal>
   <goal name="WP_parameter poke.27" expl="27. loop invariant preservation">
-  <proof prover="0"><result status="valid" time="1.16" steps="122"/></proof>
+  <proof prover="0"><result status="valid" time="2.43" steps="130"/></proof>
   </goal>
   <goal name="WP_parameter poke.28" expl="28. loop invariant preservation">
-  <proof prover="0"><result status="valid" time="0.49" steps="116"/></proof>
+  <proof prover="0"><result status="valid" time="1.57" steps="124"/></proof>
   </goal>
   <goal name="WP_parameter poke.29" expl="29. loop variant decrease">
-  <proof prover="0"><result status="valid" time="0.20" steps="101"/></proof>
-  <proof prover="3"><result status="valid" time="0.86"/></proof>
+  <proof prover="0"><result status="valid" time="0.20" steps="109"/></proof>
+  <proof prover="3"><result status="valid" time="2.01"/></proof>
   </goal>
   <goal name="WP_parameter poke.30" expl="30. type invariant">
-  <proof prover="0"><result status="valid" time="0.05" steps="85"/></proof>
+  <proof prover="0"><result status="valid" time="0.05" steps="93"/></proof>
   <proof prover="1"><result status="valid" time="0.08"/></proof>
   <proof prover="3"><result status="valid" time="0.08"/></proof>
   </goal>
   <goal name="WP_parameter poke.31" expl="31. postcondition">
-  <proof prover="0"><result status="valid" time="0.03" steps="85"/></proof>
+  <proof prover="0"><result status="valid" time="0.03" steps="93"/></proof>
   <proof prover="1"><result status="valid" time="0.04"/></proof>
   <proof prover="3"><result status="valid" time="0.08"/></proof>
   </goal>
   <goal name="WP_parameter poke.32" expl="32. postcondition">
-  <proof prover="0"><result status="valid" time="0.05" steps="85"/></proof>
-  <proof prover="1"><result status="valid" time="0.12"/></proof>
-  <proof prover="3"><result status="valid" time="0.08"/></proof>
+  <proof prover="0"><result status="valid" time="0.05" steps="93"/></proof>
+  <proof prover="1"><result status="valid" time="0.07"/></proof>
+  <proof prover="3"><result status="valid" time="0.10"/></proof>
   </goal>
   <goal name="WP_parameter poke.33" expl="33. postcondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="87"/></proof>
+  <proof prover="0"><result status="valid" time="0.03" steps="95"/></proof>
   <proof prover="3"><result status="valid" time="0.08"/></proof>
   </goal>
   <goal name="WP_parameter poke.34" expl="34. postcondition">
-  <proof prover="0"><result status="valid" time="0.03" steps="86"/></proof>
+  <proof prover="0"><result status="valid" time="0.04" steps="94"/></proof>
   <proof prover="3"><result status="valid" time="0.08"/></proof>
   </goal>
   <goal name="WP_parameter poke.35" expl="35. postcondition">
   <transf name="split_goal_wp">
    <goal name="WP_parameter poke.35.1" expl="1. VC for poke">
-   <proof prover="0"><result status="valid" time="0.08" steps="95"/></proof>
+   <proof prover="0"><result status="valid" time="0.27" steps="103"/></proof>
    <proof prover="3"><result status="valid" time="0.07"/></proof>
    </goal>
    <goal name="WP_parameter poke.35.2" expl="2. VC for poke">
-   <proof prover="0"><result status="valid" time="0.19" steps="115"/></proof>
+   <proof prover="0"><result status="valid" time="0.60" steps="123"/></proof>
    </goal>
    <goal name="WP_parameter poke.35.3" expl="3. VC for poke">
-   <proof prover="0"><result status="valid" time="0.16" steps="96"/></proof>
+   <proof prover="0"><result status="valid" time="0.45" steps="104"/></proof>
    </goal>
   </transf>
   </goal>
@@ -564,32 +571,32 @@
  <goal name="WP_parameter peekthenpoke" expl="VC for peekthenpoke">
  <transf name="split_goal_wp">
   <goal name="WP_parameter peekthenpoke.1" expl="1. precondition">
-  <proof prover="0"><result status="valid" time="0.03" steps="76"/></proof>
+  <proof prover="0"><result status="valid" time="0.03" steps="84"/></proof>
   <proof prover="1"><result status="valid" time="0.11"/></proof>
   <proof prover="3"><result status="valid" time="0.08"/></proof>
   </goal>
   <goal name="WP_parameter peekthenpoke.2" expl="2. precondition">
-  <proof prover="0"><result status="valid" time="0.02" steps="76"/></proof>
-  <proof prover="1"><result status="valid" time="0.11"/></proof>
+  <proof prover="0"><result status="valid" time="0.02" steps="84"/></proof>
+  <proof prover="1"><result status="valid" time="0.13"/></proof>
   <proof prover="3"><result status="valid" time="0.09"/></proof>
   </goal>
   <goal name="WP_parameter peekthenpoke.3" expl="3. precondition">
-  <proof prover="0"><result status="valid" time="0.02" steps="76"/></proof>
+  <proof prover="0"><result status="valid" time="0.02" steps="84"/></proof>
   <proof prover="1"><result status="valid" time="0.11"/></proof>
   <proof prover="3"><result status="valid" time="0.08"/></proof>
   </goal>
   <goal name="WP_parameter peekthenpoke.4" expl="4. precondition">
-  <proof prover="0"><result status="valid" time="0.02" steps="78"/></proof>
+  <proof prover="0"><result status="valid" time="0.02" steps="86"/></proof>
   <proof prover="1"><result status="valid" time="0.13"/></proof>
   <proof prover="3"><result status="valid" time="0.09"/></proof>
   </goal>
   <goal name="WP_parameter peekthenpoke.5" expl="5. precondition">
-  <proof prover="0"><result status="valid" time="0.02" steps="78"/></proof>
-  <proof prover="1"><result status="valid" time="0.13"/></proof>
+  <proof prover="0"><result status="valid" time="0.02" steps="86"/></proof>
+  <proof prover="1"><result status="valid" time="0.11"/></proof>
   <proof prover="3"><result status="valid" time="0.09"/></proof>
   </goal>
   <goal name="WP_parameter peekthenpoke.6" expl="6. precondition">
-  <proof prover="0"><result status="valid" time="0.02" steps="78"/></proof>
+  <proof prover="0"><result status="valid" time="0.02" steps="86"/></proof>
   <proof prover="1"><result status="valid" time="0.13"/></proof>
   <proof prover="3"><result status="valid" time="0.10"/></proof>
   </goal>
@@ -597,15 +604,15 @@
   <proof prover="5"><result status="valid" time="0.00"/></proof>
   </goal>
   <goal name="WP_parameter peekthenpoke.8" expl="8. assertion">
-  <proof prover="3"><result status="valid" time="0.76"/></proof>
+  <proof prover="3"><result status="valid" time="0.99"/></proof>
   </goal>
   <goal name="WP_parameter peekthenpoke.9" expl="9. postcondition">
-  <proof prover="0"><result status="valid" time="0.02" steps="83"/></proof>
+  <proof prover="0"><result status="valid" time="0.02" steps="91"/></proof>
   <proof prover="1"><result status="valid" time="0.07"/></proof>
   <proof prover="3"><result status="valid" time="0.04"/></proof>
   </goal>
   <goal name="WP_parameter peekthenpoke.10" expl="10. postcondition">
-  <proof prover="0"><result status="valid" time="0.08" steps="106"/></proof>
+  <proof prover="0"><result status="valid" time="0.48" steps="114"/></proof>
   <proof prover="3"><result status="valid" time="0.08"/></proof>
   </goal>
  </transf>
@@ -616,46 +623,46 @@
   <proof prover="5"><result status="valid" time="0.01"/></proof>
   </goal>
   <goal name="WP_parameter pokethenpeek.2" expl="2. precondition">
-  <proof prover="0"><result status="valid" time="0.02" steps="77"/></proof>
+  <proof prover="0"><result status="valid" time="0.02" steps="85"/></proof>
   <proof prover="1"><result status="valid" time="0.15"/></proof>
   <proof prover="3"><result status="valid" time="0.08"/></proof>
   </goal>
   <goal name="WP_parameter pokethenpeek.3" expl="3. precondition">
-  <proof prover="0"><result status="valid" time="0.02" steps="77"/></proof>
-  <proof prover="1"><result status="valid" time="0.11"/></proof>
-  <proof prover="3"><result status="valid" time="0.05"/></proof>
+  <proof prover="0"><result status="valid" time="0.03" steps="85"/></proof>
+  <proof prover="1"><result status="valid" time="0.13"/></proof>
+  <proof prover="3"><result status="valid" time="0.08"/></proof>
   </goal>
   <goal name="WP_parameter pokethenpeek.4" expl="4. precondition">
-  <proof prover="0"><result status="valid" time="0.02" steps="77"/></proof>
+  <proof prover="0"><result status="valid" time="0.02" steps="85"/></proof>
   <proof prover="1"><result status="valid" time="0.11"/></proof>
   <proof prover="3"><result status="valid" time="0.05"/></proof>
   </goal>
   <goal name="WP_parameter pokethenpeek.5" expl="5. assertion">
-  <proof prover="0"><result status="valid" time="0.02" steps="82"/></proof>
+  <proof prover="0"><result status="valid" time="0.02" steps="90"/></proof>
   <proof prover="1"><result status="valid" time="0.14"/></proof>
   <proof prover="3"><result status="valid" time="0.07"/></proof>
   </goal>
   <goal name="WP_parameter pokethenpeek.6" expl="6. precondition">
-  <proof prover="0"><result status="valid" time="0.02" steps="82"/></proof>
+  <proof prover="0"><result status="valid" time="0.02" steps="90"/></proof>
   <proof prover="1"><result status="valid" time="0.14"/></proof>
   <proof prover="3"><result status="valid" time="0.06"/></proof>
   </goal>
   <goal name="WP_parameter pokethenpeek.7" expl="7. precondition">
-  <proof prover="0"><result status="valid" time="0.03" steps="82"/></proof>
-  <proof prover="1"><result status="valid" time="0.13"/></proof>
-  <proof prover="3"><result status="valid" time="0.08"/></proof>
+  <proof prover="0"><result status="valid" time="0.02" steps="90"/></proof>
+  <proof prover="1"><result status="valid" time="0.11"/></proof>
+  <proof prover="3"><result status="valid" time="0.05"/></proof>
   </goal>
   <goal name="WP_parameter pokethenpeek.8" expl="8. precondition">
-  <proof prover="0"><result status="valid" time="0.03" steps="82"/></proof>
+  <proof prover="0"><result status="valid" time="0.03" steps="90"/></proof>
   <proof prover="1"><result status="valid" time="0.13"/></proof>
   <proof prover="3"><result status="valid" time="0.08"/></proof>
   </goal>
   <goal name="WP_parameter pokethenpeek.9" expl="9. assertion">
-  <proof prover="7"><result status="valid" time="3.54" steps="212"/></proof>
+  <proof prover="7"><result status="valid" time="0.93" steps="677"/></proof>
   <proof prover="8"><result status="valid" time="0.02"/></proof>
   </goal>
   <goal name="WP_parameter pokethenpeek.10" expl="10. postcondition">
-  <proof prover="0"><result status="valid" time="0.18" steps="94"/></proof>
+  <proof prover="0"><result status="valid" time="0.18" steps="148"/></proof>
   <proof prover="3"><result status="valid" time="0.05"/></proof>
   </goal>
  </transf>
diff --git a/examples/bitwalker/why3shapes.gz b/examples/bitwalker/why3shapes.gz
index c268f6dec0e4c893b188486e1bcedbf0eb12e4d5..cb78a7b194deb91c7a1dd5ca4aa92f6ea01c8ee7 100644
Binary files a/examples/bitwalker/why3shapes.gz and b/examples/bitwalker/why3shapes.gz differ
diff --git a/examples/esterel/why3session.xml b/examples/esterel/why3session.xml
index 5a36baf300b54688e6d7dabf3dca738977da24d8..0600866135efe9ccff2856f05687528a923dd6a6 100644
--- a/examples/esterel/why3session.xml
+++ b/examples/esterel/why3session.xml
@@ -4,66 +4,65 @@
 <why3session shape_version="4">
 <prover id="0" name="CVC4" version="1.4" timelimit="5" steplimit="4000" memlimit="4000"/>
 <prover id="1" name="Alt-Ergo" version="1.01" timelimit="5" steplimit="4000" memlimit="4000"/>
-<prover id="2" name="Z3" version="4.4.1" timelimit="5" steplimit="4000" memlimit="4000"/>
+<prover id="3" name="Z3" version="4.5.0" timelimit="5" steplimit="4000" memlimit="4000"/>
 <file name="../esterel.mlw" expanded="true">
-<theory name="Esterel" sum="5ed3b4e094b8d2ed11fbc86ef3db67b1" expanded="true">
+<theory name="Esterel" sum="b5654a3b416ee9b28a1f031f0d6389bf" expanded="true">
  <goal name="WP_parameter union" expl="VC for union" expanded="true">
- <proof prover="1"><result status="valid" time="0.20" steps="219"/></proof>
+ <proof prover="1"><result status="valid" time="0.16" steps="220"/></proof>
  </goal>
  <goal name="WP_parameter intersection" expl="VC for intersection" expanded="true">
- <proof prover="1"><result status="valid" time="0.18" steps="186"/></proof>
+ <proof prover="1"><result status="valid" time="0.18" steps="198"/></proof>
  </goal>
  <goal name="WP_parameter aboveMin" expl="VC for aboveMin" expanded="true">
  <transf name="split_goal_wp" expanded="true">
-  <goal name="WP_parameter aboveMin.1" expl="1. assertion">
-  <proof prover="1"><result status="valid" time="0.15" steps="206"/></proof>
+  <goal name="WP_parameter aboveMin.1" expl="1. assertion" expanded="true">
+  <proof prover="1"><result status="valid" time="0.15" steps="225"/></proof>
   </goal>
-  <goal name="WP_parameter aboveMin.2" expl="2. assertion">
+  <goal name="WP_parameter aboveMin.2" expl="2. assertion" expanded="true">
   <proof prover="0"><result status="valid" time="0.22"/></proof>
-  <proof prover="2"><result status="valid" time="0.28"/></proof>
+  <proof prover="3"><result status="valid" time="0.28"/></proof>
   </goal>
-  <goal name="WP_parameter aboveMin.3" expl="3. assertion">
-  <proof prover="0"><result status="valid" time="0.36"/></proof>
+  <goal name="WP_parameter aboveMin.3" expl="3. assertion" expanded="true">
+  <proof prover="0"><result status="valid" time="0.42"/></proof>
   </goal>
-  <goal name="WP_parameter aboveMin.4" expl="4. type invariant">
-  <proof prover="1"><result status="valid" time="0.45" steps="326"/></proof>
+  <goal name="WP_parameter aboveMin.4" expl="4. type invariant" expanded="true">
+  <proof prover="1"><result status="valid" time="0.30" steps="336"/></proof>
   </goal>
-  <goal name="WP_parameter aboveMin.5" expl="5. postcondition">
+  <goal name="WP_parameter aboveMin.5" expl="5. postcondition" expanded="true">
   <proof prover="0"><result status="valid" time="0.03"/></proof>
-  <proof prover="1"><result status="valid" time="0.02" steps="68"/></proof>
-  <proof prover="2"><result status="valid" time="0.01"/></proof>
+  <proof prover="1"><result status="valid" time="0.02" steps="70"/></proof>
+  <proof prover="3"><result status="valid" time="0.01"/></proof>
   </goal>
  </transf>
  </goal>
  <goal name="WP_parameter maxUnion" expl="VC for maxUnion" expanded="true">
  <transf name="split_goal_wp" expanded="true">
-  <goal name="WP_parameter maxUnion.1" expl="1. precondition">
+  <goal name="WP_parameter maxUnion.1" expl="1. precondition" expanded="true">
   <proof prover="0"><result status="valid" time="0.05"/></proof>
-  <proof prover="1"><result status="valid" time="0.01" steps="70"/></proof>
-  <proof prover="2"><result status="valid" time="0.01"/></proof>
+  <proof prover="1"><result status="valid" time="0.01" steps="72"/></proof>
+  <proof prover="3"><result status="valid" time="0.01"/></proof>
   </goal>
-  <goal name="WP_parameter maxUnion.2" expl="2. precondition">
+  <goal name="WP_parameter maxUnion.2" expl="2. precondition" expanded="true">
   <proof prover="0"><result status="valid" time="0.05"/></proof>
-  <proof prover="1"><result status="valid" time="0.02" steps="71"/></proof>
-  <proof prover="2"><result status="valid" time="0.02"/></proof>
+  <proof prover="1"><result status="valid" time="0.02" steps="73"/></proof>
+  <proof prover="3"><result status="valid" time="0.02"/></proof>
   </goal>
-  <goal name="WP_parameter maxUnion.3" expl="3. assertion">
-  <proof prover="0"><result status="valid" time="0.12"/></proof>
-  <proof prover="1"><result status="valid" time="0.30" steps="379"/></proof>
-  <proof prover="2"><result status="valid" time="0.28"/></proof>
+  <goal name="WP_parameter maxUnion.3" expl="3. assertion" expanded="true">
+  <proof prover="0"><result status="valid" time="0.13"/></proof>
+  <proof prover="3"><result status="valid" time="0.33"/></proof>
   </goal>
-  <goal name="WP_parameter maxUnion.4" expl="4. postcondition">
-  <proof prover="0"><result status="valid" time="0.12"/></proof>
-  <proof prover="1"><result status="valid" time="1.28" steps="1518"/></proof>
+  <goal name="WP_parameter maxUnion.4" expl="4. postcondition" expanded="true">
+  <proof prover="0"><result status="valid" time="0.14"/></proof>
+  <proof prover="1"><result status="valid" time="1.27" steps="1464"/></proof>
   </goal>
-  <goal name="WP_parameter maxUnion.5" expl="5. postcondition">
-  <transf name="split_goal_wp">
-   <goal name="WP_parameter maxUnion.5.1" expl="1. postcondition">
+  <goal name="WP_parameter maxUnion.5" expl="5. postcondition" expanded="true">
+  <transf name="split_goal_wp" expanded="true">
+   <goal name="WP_parameter maxUnion.5.1" expl="1. postcondition" expanded="true">
    <proof prover="0"><result status="valid" time="0.06"/></proof>
    </goal>
-   <goal name="WP_parameter maxUnion.5.2" expl="2. postcondition">
-   <proof prover="0"><result status="valid" time="0.15"/></proof>
-   <proof prover="1"><result status="valid" time="0.23" steps="412"/></proof>
+   <goal name="WP_parameter maxUnion.5.2" expl="2. postcondition" expanded="true">
+   <proof prover="0"><result status="valid" time="0.16"/></proof>
+   <proof prover="1"><result status="valid" time="0.23" steps="388"/></proof>
    </goal>
   </transf>
   </goal>
diff --git a/examples/esterel/why3shapes.gz b/examples/esterel/why3shapes.gz
index e61834e88d177324dae9ac4fecf5e812742476a5..a661846e856032a9498c298c4c18d461071034b5 100644
Binary files a/examples/esterel/why3shapes.gz and b/examples/esterel/why3shapes.gz differ
diff --git a/examples/hackers-delight.mlw b/examples/hackers-delight.mlw
index 5c737f78b64140c193d2936954abcd6fadad65fb..4a5d2c20639e19f1d58b5240f6e33658dd66e6ab 100644
--- a/examples/hackers-delight.mlw
+++ b/examples/hackers-delight.mlw
@@ -10,8 +10,8 @@ theory Utils
 
   use import bv.BV32
 
-  constant one : t = of_int 1
-  constant two : t = of_int 2
+  constant one : t = 1
+  constant two : t = 2
   constant lastbit : t = sub size_bv one
 
   function max (x y : t) : t = (if ult x y then y else x)
@@ -21,14 +21,14 @@ theory Utils
       1-bit in a bitvector (p.82) *)
 
   function count (bv : t) : t =
-    let x = sub bv (bw_and (lsr_bv bv one) (of_int 0x55555555)) in
-    let x = add (bw_and x (of_int 0x33333333))
-                (bw_and (lsr_bv x (of_int 2)) (of_int (0x33333333))) in
-    let x = bw_and (add x (lsr_bv x (of_int 4)))
-                   (of_int 0x0F0F0F0F) in
-    let x = add x (lsr_bv x (of_int 8)) in
-    let x = add x (lsr_bv x (of_int 16)) in
-    bw_and x (of_int 0x0000003F)
+    let x = sub bv (bw_and (lsr_bv bv one) (0x55555555:t)) in
+    let x = add (bw_and x (0x33333333:t))
+                (bw_and (lsr_bv x two) (0x33333333:t)) in
+    let x = bw_and (add x (lsr_bv x (4:t)))
+                   (0x0F0F0F0F:t) in
+    let x = add x (lsr_bv x (8:t)) in
+    let x = add x (lsr_bv x (16:t)) in
+    bw_and x (0x0000003F:t)
 
   (** We then define the associated notion of distance, namely
       "Hamming distance", that counts the number of bits that differ
@@ -76,7 +76,7 @@ module Utils_Spec
 
   let rec lemma countSpec_Aux (bv : t) : unit
   variant {bv with ult}
-  ensures {to_uint (count bv) = NumOf.numof (nth bv) 0 32}
+  ensures {t'int (count bv) = NumOf.numof (nth bv) 0 32}
   =
     if bv = zeros then ()
     else
@@ -97,7 +97,7 @@ module Utils_Spec
   (** With these lemmas, we can now prove the correctness property of
   count: *)
 
-  lemma countSpec: forall b. to_uint (count b) = NumOf.numof
+  lemma countSpec: forall b. t'int (count b) = NumOf.numof
         (nth b) 0 32
 
   (** {6 hammingD correctness } *)
@@ -108,7 +108,7 @@ module Utils_Spec
 
   (** The correctness property can be express as the following: *)
   let lemma hamming_spec (a b : t) : unit
-  ensures {to_uint (hammingD a b) = NumOf.numof (nth_diff a b) 0 32}
+  ensures {t'int (hammingD a b) = NumOf.numof (nth_diff a b) 0 32}
   =
    assert { forall i. 0 <= i < 32 -> nth (bw_xor a b) i <-> (nth_diff a b i) }
 
@@ -129,7 +129,7 @@ module Utils_Spec
     numof_or p q a (b-1)
 
   let lemma triangleInequalityInt (a b c : t) : unit
-    ensures {to_uint (hammingD a b) + to_uint (hammingD b c) >= to_uint (hammingD a c)}
+    ensures {t'int (hammingD a b) + t'int (hammingD b c) >= t'int (hammingD a c)}
   =
     assert {numof (fun_or (nth_diff a b) (nth_diff b c)) 0 32 >= numof (nth_diff a c) 0 32
              by
@@ -198,11 +198,11 @@ module Hackers_delight
     bw_xor bv (lsr_bv bv one)
 
   function fromGray (gr : t) : t =
-    let b = bw_xor gr (lsr_bv gr (of_int 1)) in
-    let b = bw_xor b (lsr_bv b (of_int 2)) in
-    let b = bw_xor b (lsr_bv b (of_int 4)) in
-    let b = bw_xor b (lsr_bv b (of_int 8)) in
-      bw_xor b (lsr_bv b (of_int 16))
+    let b = bw_xor gr (lsr_bv gr one) in
+    let b = bw_xor b (lsr_bv b (2:t)) in
+    let b = bw_xor b (lsr_bv b (4:t)) in
+    let b = bw_xor b (lsr_bv b (8:t)) in
+      bw_xor b (lsr_bv b (16:t))
 
   (** Which define an isomorphism. *)
 
@@ -261,13 +261,13 @@ module Hackers_delight
     bw_not( bw_or x y ) = bw_and (bw_not x) (bw_not y)
 
   lemma DM3: forall x.
-    bw_not( add x (of_int 1) ) = sub (bw_not x) (of_int 1)
+    bw_not (add x one) = sub (bw_not x) one
 
   lemma DM4: forall x.
-    bw_not( sub x (of_int 1) ) = add (bw_not x) (of_int 1)
+    bw_not( sub x one) = add (bw_not x) one
 
   lemma DM5: forall x.
-    bw_not( neg x ) = sub x (of_int 1)
+    bw_not( neg x ) = sub x one
 
   lemma DM6: forall x y.
     bw_not( bw_xor x y ) = bw_xor (bw_not x) y
@@ -279,7 +279,7 @@ module Hackers_delight
     bw_not( sub x y ) = add (bw_not x) y
 
   lemma DMtest: forall x.
-    zeros = bw_not( bw_or x (neg( add x (of_int 1))))
+    zeros = bw_not( bw_or x (neg(add x one)))
 
   (** {6 Addition Combined with Logical Operations (p.16)} *)
 
@@ -343,16 +343,16 @@ module Hackers_delight
   (** shift right and arithmetic shift right (p.20)*)
 
   lemma SR1: forall x n. ult n size_bv ->
-    bw_or (lsr_bv x n) (lsl_bv (neg( lsr_bv x (of_int 31) )) (sub (of_int 31) n))
+    bw_or (lsr_bv x n) (lsl_bv (neg( lsr_bv x (31:t) )) (sub (31:t) n))
   = asr_bv x n
 
   (** rotate vs shift (p.37)*)
 
   lemma RS_left: forall x.
-    bw_or (lsl_bv x (of_int 1)) (lsr_bv x (of_int 31)) = rotate_left_bv x one
+    bw_or (lsl_bv x one) (lsr_bv x (31:t)) = rotate_left_bv x one
 
   lemma RS_right: forall x.
-    bw_or (lsr_bv x (of_int 1)) (lsl_bv x (of_int 31)) = rotate_right_bv x one
+    bw_or (lsr_bv x one) (lsl_bv x (31:t)) = rotate_right_bv x one
 
   (** {6 bound propagation (p.73)} *)
 
diff --git a/examples/hackers-delight/why3session.xml b/examples/hackers-delight/why3session.xml
index 64526c70678ea035f01d40b3ff5784b9f5d61298..2196cb4beffa4ec9d7538e914f5fca383f9493aa 100644
--- a/examples/hackers-delight/why3session.xml
+++ b/examples/hackers-delight/why3session.xml
@@ -2,59 +2,63 @@
 <!DOCTYPE why3session PUBLIC "-//Why3//proof session v5//EN"
 "http://why3.lri.fr/why3session.dtd">
 <why3session shape_version="4">
-<prover id="0" name="Alt-Ergo" version="0.99.1" timelimit="5" steplimit="0" memlimit="1000"/>
+<prover id="0" name="Alt-Ergo" version="1.30" timelimit="1" steplimit="0" memlimit="4000"/>
 <prover id="1" name="CVC4" version="1.4" timelimit="5" steplimit="0" memlimit="1000"/>
-<prover id="2" name="Z3" version="4.4.0" alternative="noBV" timelimit="5" steplimit="0" memlimit="1000"/>
-<prover id="3" name="Alt-Ergo" version="1.10.prv" timelimit="5" steplimit="0" memlimit="1000"/>
-<prover id="4" name="Z3" version="4.4.0" timelimit="5" steplimit="0" memlimit="1000"/>
+<prover id="2" name="Z3" version="4.5.0" timelimit="5" steplimit="0" memlimit="1000"/>
+<prover id="3" name="Z3" version="4.4.0" timelimit="5" steplimit="0" memlimit="1000"/>
+<prover id="4" name="Z3" version="4.4.1" timelimit="5" steplimit="0" memlimit="1000"/>
 <prover id="5" name="CVC4" version="1.4" alternative="noBV" timelimit="5" steplimit="0" memlimit="1000"/>
+<prover id="6" name="Z3" version="4.5.0" alternative="noBV" timelimit="5" steplimit="0" memlimit="1000"/>
+<prover id="7" name="Alt-Ergo" version="1.01" timelimit="5" steplimit="0" memlimit="1000"/>
+<prover id="8" name="Z3" version="4.3.2" timelimit="5" steplimit="0" memlimit="1000"/>
 <file name="../hackers-delight.mlw" expanded="true">
 <theory name="Utils" sum="d41d8cd98f00b204e9800998ecf8427e">
 </theory>
-<theory name="Utils_Spec" sum="b1d2e3d07b9e6cc8c94261984c153613" expanded="true">
+<theory name="Utils_Spec" sum="e236f93a7d10ad9c6a7310dd1c8d741a" expanded="true">
  <goal name="countZero">
  <proof prover="1"><result status="valid" time="0.03"/></proof>
  </goal>
  <goal name="numOfZero">
- <proof prover="0"><result status="valid" time="0.70" steps="245"/></proof>
+ <proof prover="7"><result status="valid" time="0.18" steps="206"/></proof>
  </goal>
  <goal name="countStep">
- <proof prover="1"><result status="valid" time="3.07"/></proof>
+ <proof prover="1"><result status="valid" time="3.12"/></proof>
  </goal>
  <goal name="WP_parameter numof_shift" expl="VC for numof_shift">
  <proof prover="1"><result status="valid" time="0.24"/></proof>
  </goal>
- <goal name="WP_parameter countSpec_Aux" expl="VC for countSpec_Aux">
- <transf name="split_goal_wp">
+ <goal name="WP_parameter countSpec_Aux" expl="VC for countSpec_Aux" expanded="true">
+ <transf name="split_goal_wp" expanded="true">
   <goal name="WP_parameter countSpec_Aux.1" expl="1. postcondition">
-  <proof prover="0"><result status="valid" time="0.03" steps="75"/></proof>
+  <proof prover="1"><result status="valid" time="0.02"/></proof>
   </goal>
   <goal name="WP_parameter countSpec_Aux.2" expl="2. variant decrease">
-  <proof prover="0"><result status="valid" time="0.71" steps="277"/></proof>
+  <proof prover="7"><result status="valid" time="0.23" steps="253"/></proof>
   </goal>
   <goal name="WP_parameter countSpec_Aux.3" expl="3. assertion">
   <transf name="split_goal_wp">
    <goal name="WP_parameter countSpec_Aux.3.1" expl="1. assertion">
-   <proof prover="0"><result status="valid" time="0.20" steps="149"/></proof>
+   <proof prover="7"><result status="valid" time="0.45" steps="454"/></proof>
    </goal>
    <goal name="WP_parameter countSpec_Aux.3.2" expl="2. assertion">
-   <proof prover="0"><result status="valid" time="2.59" steps="534"/></proof>
+   <proof prover="7"><result status="valid" time="0.54" steps="532"/></proof>
    </goal>
    <goal name="WP_parameter countSpec_Aux.3.3" expl="3. assertion">
-   <proof prover="0"><result status="valid" time="0.51" steps="153"/></proof>
+   <proof prover="7"><result status="valid" time="0.83" steps="541"/></proof>
    </goal>
    <goal name="WP_parameter countSpec_Aux.3.4" expl="4. assertion">
-   <proof prover="5"><result status="valid" time="2.29"/></proof>
+   <proof prover="5" timelimit="6" memlimit="4500"><result status="valid" time="2.50"/></proof>
    </goal>
   </transf>
   </goal>
   <goal name="WP_parameter countSpec_Aux.4" expl="4. postcondition">
   <proof prover="1"><result status="valid" time="0.31"/></proof>
+  <proof prover="2"><result status="valid" time="0.11"/></proof>
   </goal>
  </transf>
  </goal>
  <goal name="countSpec">
- <proof prover="0"><result status="valid" time="0.05" steps="70"/></proof>
+ <proof prover="7"><result status="valid" time="0.05" steps="81"/></proof>
  </goal>
  <goal name="WP_parameter hamming_spec" expl="VC for hamming_spec">
  <transf name="split_goal_wp">
@@ -62,7 +66,8 @@
   <proof prover="5"><result status="valid" time="0.04"/></proof>
   </goal>
   <goal name="WP_parameter hamming_spec.2" expl="2. postcondition">
-  <proof prover="4"><result status="valid" time="0.02"/></proof>
+  <proof prover="3"><result status="valid" time="0.02"/></proof>
+  <proof prover="4"><result status="valid" time="0.03"/></proof>
   </goal>
  </transf>
  </goal>
@@ -73,39 +78,39 @@
  <proof prover="1"><result status="valid" time="0.19"/></proof>
  </goal>
  <goal name="WP_parameter numof_or" expl="VC for numof_or">
- <proof prover="1"><result status="valid" time="0.45"/></proof>
+ <proof prover="1"><result status="valid" time="0.48"/></proof>
  </goal>
- <goal name="WP_parameter triangleInequalityInt" expl="VC for triangleInequalityInt" expanded="true">
- <transf name="split_goal_wp" expanded="true">
-  <goal name="WP_parameter triangleInequalityInt.1" expl="1. assertion" expanded="true">
-  <transf name="split_goal_wp" expanded="true">
-   <goal name="WP_parameter triangleInequalityInt.1.1" expl="1. VC for triangleInequalityInt" expanded="true">
-   <proof prover="3"><result status="valid" time="0.06" steps="132"/></proof>
-   <proof prover="5"><result status="valid" time="0.39"/></proof>
+ <goal name="WP_parameter triangleInequalityInt" expl="VC for triangleInequalityInt">
+ <transf name="split_goal_wp">
+  <goal name="WP_parameter triangleInequalityInt.1" expl="1. assertion">
+  <transf name="split_goal_wp">
+   <goal name="WP_parameter triangleInequalityInt.1.1" expl="1. VC for triangleInequalityInt">
+   <proof prover="5"><result status="valid" time="0.49"/></proof>
+   <proof prover="7"><result status="valid" time="0.17" steps="219"/></proof>
    </goal>
-   <goal name="WP_parameter triangleInequalityInt.1.2" expl="2. VC for triangleInequalityInt" expanded="true">
-   <proof prover="2"><result status="valid" time="0.56"/></proof>
-   <proof prover="3"><result status="valid" time="0.28" steps="257"/></proof>
-   <proof prover="4"><result status="valid" time="0.02"/></proof>
+   <goal name="WP_parameter triangleInequalityInt.1.2" expl="2. VC for triangleInequalityInt">
    <proof prover="5"><result status="valid" time="0.21"/></proof>
+   <proof prover="6"><result status="valid" time="0.64"/></proof>
+   <proof prover="7"><result status="valid" time="0.70" steps="468"/></proof>
+   <proof prover="8"><result status="valid" time="0.65"/></proof>
    </goal>
   </transf>
   </goal>
   <goal name="WP_parameter triangleInequalityInt.2" expl="2. postcondition">
-  <proof prover="0"><result status="valid" time="0.05" steps="108"/></proof>
+  <proof prover="7"><result status="valid" time="0.05" steps="146"/></proof>
   </goal>
  </transf>
  </goal>
- <goal name="triangleInequality">
- <proof prover="0"><result status="valid" time="4.49" steps="724"/></proof>
+ <goal name="triangleInequality" expanded="true">
+ <proof prover="0"><result status="valid" time="0.39" steps="723"/></proof>
  </goal>
 </theory>
-<theory name="Hackers_delight" sum="84e0d744dbc0570b981d4bb3668fa3de" expanded="true">
+<theory name="Hackers_delight" sum="de3a7fcb4f4b9eef556a26cea89b7380" expanded="true">
  <goal name="WP_parameter ascii" expl="VC for ascii">
  <proof prover="1"><result status="valid" time="0.09"/></proof>
  </goal>
  <goal name="asciiProp">
- <proof prover="1"><result status="valid" time="0.83"/></proof>
+ <proof prover="1"><result status="valid" time="0.73"/></proof>
  </goal>
  <goal name="iso">
  <proof prover="1"><result status="valid" time="0.43"/></proof>
@@ -114,7 +119,7 @@
  <proof prover="1"><result status="valid" time="0.09"/></proof>
  </goal>
  <goal name="nthGray">
- <proof prover="0"><result status="valid" time="1.23" steps="532"/></proof>
+ <proof prover="7"><result status="valid" time="0.76" steps="870"/></proof>
  </goal>
  <goal name="lastNthGray">
  <proof prover="1"><result status="valid" time="0.04"/></proof>
@@ -156,13 +161,13 @@
  <proof prover="1"><result status="valid" time="0.06"/></proof>
  </goal>
  <goal name="Ac">
- <proof prover="0"><result status="valid" time="0.47" steps="308"/></proof>
+ <proof prover="7"><result status="valid" time="0.41" steps="454"/></proof>
  </goal>
  <goal name="Ad">
  <proof prover="1"><result status="valid" time="0.06"/></proof>
  </goal>
  <goal name="Ae">
- <proof prover="0"><result status="valid" time="0.05" steps="70"/></proof>
+ <proof prover="7"><result status="valid" time="0.05" steps="79"/></proof>
  </goal>
  <goal name="Af">
  <proof prover="1"><result status="valid" time="0.03"/></proof>
diff --git a/examples/hackers-delight/why3shapes.gz b/examples/hackers-delight/why3shapes.gz
index 30c0eed5dfa3356d546417e4a74c7a70a5ba9e47..400c412df8e781600ab3fc881425d1d02091a4fd 100644
Binary files a/examples/hackers-delight/why3shapes.gz and b/examples/hackers-delight/why3shapes.gz differ
diff --git a/examples/in_progress/gmp_square_root.mlw b/examples/in_progress/gmp_square_root.mlw
index 4d5ff506d7bb59774cdb7baba0e304581c50dbcd..6c8452de41d353e2ff937ae582ab99d5137c31ec 100644
--- a/examples/in_progress/gmp_square_root.mlw
+++ b/examples/in_progress/gmp_square_root.mlw
@@ -21,7 +21,7 @@ module GmpModel
   use export array.Array
 
   constant beta' : int
-  axiom beta'_gt_1: 1 < beta'
+  axiom one_lt_beta' : 1 < beta'
   constant beta : int = 2 * beta'
 
   type memory = array int
@@ -154,7 +154,7 @@ module GmpAuxiliaryfunctions
   if (nat_eq_bool !l !h) then
      c := !c - !b
   else
-     begin 
+     begin
        (mpn_sub_1 (plus np (mult (S (S O)) !l))
                   (plus np (mult (S (S O)) !l))
                   (S O) !b);
diff --git a/examples/logic/bitvectors.why b/examples/logic/bitvectors.why
index 73f66f3f26bcdbe79ca42b143af0c16499d60852..5070af768995b3e92095ab1ace77f049077c33ac 100644
--- a/examples/logic/bitvectors.why
+++ b/examples/logic/bitvectors.why
@@ -45,8 +45,8 @@ theory TestBV
   goal g5aa : asr b0111 2 = b0001
   goal g5bb : asr ones 31 = ones
 
-  goal g6a : to_uint b11100 = 28
-  goal g6b : to_uint ones = 0xFFFFFFFF
+  goal g6a : t'int b11100 = 28
+  goal g6b : t'int ones = 0xFFFFFFFF
 
   goal g7a : to_int b11100 = 28
   goal g7b : to_int ones = -1
@@ -57,8 +57,8 @@ theory TestBV
   goal g8aa : nth b0110 2 = True
   goal g8bb : nth b0110 3 = False
 
-  goal gtt : to_uint (lsl_bv (of_int 3) (of_int 30)) > 0 (* = 0xC0000000 *)
-  goal gttt : to_uint (lsl (of_int 3) 30) > 0 (* = 0xC0000000 *)
+  goal gtt : t'int (lsl_bv (of_int 3) (of_int 30)) > 0 (* = 0xC0000000 *)
+  goal gttt : t'int (lsl (of_int 3) 30) > 0 (* = 0xC0000000 *)
 
   goal not_not : forall v:t. bw_not (bw_not v) = v
 
diff --git a/examples/logic/bitvectors/why3session.xml b/examples/logic/bitvectors/why3session.xml
index 0f342d5c8809a1b8e206e0e27c3116d16063886f..f94aa191e85eb9aaca4913f4b9318508ea680591 100644
--- a/examples/logic/bitvectors/why3session.xml
+++ b/examples/logic/bitvectors/why3session.xml
@@ -6,7 +6,7 @@
 <prover id="2" name="CVC4" version="1.4" timelimit="5" steplimit="0" memlimit="1000"/>
 <prover id="4" name="Z3" version="4.4.0" timelimit="5" steplimit="0" memlimit="1000"/>
 <file name="../bitvectors.why" expanded="true">
-<theory name="TestBV" sum="6c2c5b15e24e53abc1436fd01209978b" expanded="true">
+<theory name="TestBV" sum="ee9c7b455f76c1ebb7bbf393b2e0b957" expanded="true">
  <goal name="g1">
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
@@ -62,12 +62,12 @@
  <proof prover="4" timelimit="1"><result status="timeout" time="1.00"/></proof>
  </goal>
  <goal name="g4a">
- <proof prover="0" timelimit="5"><result status="valid" time="0.14" steps="84"/></proof>
+ <proof prover="0" timelimit="5"><result status="valid" time="0.14" steps="100"/></proof>
  <proof prover="2"><result status="valid" time="0.02"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="g4b">
- <proof prover="0" timelimit="5"><result status="valid" time="0.06" steps="84"/></proof>
+ <proof prover="0" timelimit="5"><result status="valid" time="0.06" steps="100"/></proof>
  <proof prover="2"><result status="valid" time="0.02"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
@@ -100,12 +100,12 @@
  <proof prover="4" timelimit="1"><result status="timeout" time="1.00"/></proof>
  </goal>
  <goal name="g6a">
- <proof prover="0" timelimit="5"><result status="valid" time="0.03" steps="71"/></proof>
+ <proof prover="0" timelimit="5"><result status="valid" time="0.03" steps="74"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="g6b">
- <proof prover="0" timelimit="5"><result status="valid" time="0.02" steps="71"/></proof>
+ <proof prover="0" timelimit="5"><result status="valid" time="0.02" steps="69"/></proof>
  <proof prover="2"><result status="valid" time="0.00"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
@@ -129,14 +129,14 @@
  </goal>
  <goal name="g8aa">
  <proof prover="0"><result status="timeout" time="1.00"/></proof>
- <proof prover="2" timelimit="1"><result status="unknown" time="1.01"/></proof>
+ <proof prover="2" timelimit="1"><result status="unknown" time="1.95"/></proof>
  <proof prover="4" timelimit="1"><result status="timeout" time="1.00"/></proof>
  </goal>
  <goal name="g8bb">
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  </goal>
  <goal name="gtt">
- <proof prover="0" timelimit="5"><result status="valid" time="0.13" steps="79"/></proof>
+ <proof prover="0" timelimit="5"><result status="valid" time="0.13" steps="78"/></proof>
  <proof prover="2"><result status="valid" time="0.00"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
diff --git a/examples/logic/bitvectors/why3shapes.gz b/examples/logic/bitvectors/why3shapes.gz
index 2beae1a8326d2ebbf7fe4a2ab4e15bf565b47f92..28358128cd1b2e3c63f23983a5f27561225018c1 100644
Binary files a/examples/logic/bitvectors/why3shapes.gz and b/examples/logic/bitvectors/why3shapes.gz differ
diff --git a/examples/queens_bv.mlw b/examples/queens_bv.mlw
index b23a07870ae9c8351785cc0d5b7f58746c74575d..1355fd5b1ddd3bafb6e4553b5ffd7aa6114faa38 100644
--- a/examples/queens_bv.mlw
+++ b/examples/queens_bv.mlw
@@ -130,8 +130,8 @@ module BitsSpec
 
   use bv.BV32
   val below (n: BV32.t) : t
-    requires { BV32.ule n (BV32.of_int 32) }
-    ensures  { result.mdl = interval 0 (BV32.to_uint n) }
+    requires { BV32.ule n (32:BV32.t) }
+    ensures  { result.mdl = interval 0 (BV32.t'int n) }
 end
 
 module Bits "the 1-bits of an integer, as a set of integers"
@@ -182,12 +182,12 @@ module Bits "the 1-bits of an integer, as a set of integers"
   let mul2 (a: t) : t
     ensures { result.mdl = remove size (succ a.mdl) }
   =
-    { bv = lsl_bv a.bv (of_int 1); mdl = remove size (succ a.mdl) }
+    { bv = lsl_bv a.bv (1:BV32.t); mdl = remove size (succ a.mdl) }
 
   let div2 (a: t) : t
     ensures { result.mdl = pred a.mdl }
   =
-    { bv = lsr_bv a.bv (of_int 1); mdl = pred a.mdl }
+    { bv = lsr_bv a.bv (1:BV32.t); mdl = pred a.mdl }
 
   let diff (a b: t) : t
     ensures { result.mdl = diff a.mdl b.mdl }
@@ -218,17 +218,17 @@ module Bits "the 1-bits of an integer, as a set of integers"
     assert {nth_bv (neg a.bv) n_bv};
     let res = bw_and a.bv (neg a.bv) in
     assert {forall i. 0 <= i < n -> not (nth res i)};
-    assert {bits_interval_is_zeros_bv res (add n_bv (of_int 1)) (sub (of_int 31) n_bv )};
+    assert {bits_interval_is_zeros_bv res (add n_bv (1:BV32.t)) (sub (31:BV32.t) n_bv )};
     assert {bits_interval_is_zeros res (n + 1) (31 - n)};
     { bv = res;
       mdl = singleton n }
 
   let below (n: BV32.t) : t
-    requires { BV32.ule n (BV32.of_int 32) }
-    ensures  { result.mdl = interval 0 (to_uint n) }
+    requires { BV32.ule n (32:BV32.t) }
+    ensures  { result.mdl = interval 0 (t'int n) }
   =
     { bv = bw_not (lsl_bv ones n);
-      mdl = interval 0 (to_uint n) }
+      mdl = interval 0 (t'int n) }
 
 end
 
@@ -331,7 +331,7 @@ module NQueensBits
     end
 
   let queens (q: BV32.t)
-    requires { BV32.to_uint q = n }
+    requires { BV32.t'int q = n }
     requires { BV32.ule q BV32.size_bv }
     requires { !s = 0 }
     ensures  { result = !s }
diff --git a/examples/queens_bv/why3session.xml b/examples/queens_bv/why3session.xml
index e1a2ae9feaae242efee9109797ba6fd6b1e2793d..afa6ebbc05a358142d30e7b311cd7b50cecc20bf 100644
--- a/examples/queens_bv/why3session.xml
+++ b/examples/queens_bv/why3session.xml
@@ -4,10 +4,8 @@
 <why3session shape_version="4">
 <prover id="0" name="Alt-Ergo" version="0.99.1" timelimit="5" steplimit="0" memlimit="1000"/>
 <prover id="1" name="CVC3" version="2.4.1" timelimit="5" steplimit="0" memlimit="1000"/>
-<prover id="2" name="Z3" version="4.4.0" alternative="noBV" timelimit="5" steplimit="0" memlimit="1000"/>
 <prover id="3" name="CVC4" version="1.4" timelimit="5" steplimit="0" memlimit="1000"/>
 <prover id="4" name="Alt-Ergo" version="1.10.prv" timelimit="5" steplimit="0" memlimit="1000"/>
-<prover id="5" name="Z3" version="4.4.0" timelimit="5" steplimit="0" memlimit="1000"/>
 <prover id="6" name="CVC4" version="1.4" alternative="noBV" timelimit="5" steplimit="0" memlimit="1000"/>
 <file name="../queens_bv.mlw" expanded="true">
 <theory name="S" sum="d41d8cd98f00b204e9800998ecf8427e" expanded="true">
@@ -23,15 +21,15 @@
 </theory>
 <theory name="BitsSpec" sum="d41d8cd98f00b204e9800998ecf8427e" expanded="true">
 </theory>
-<theory name="Bits" sum="ab73af341fce2744d7706c34468b434b" expanded="true">
+<theory name="Bits" sum="b8bb5c14ccf2ffdb2c6234d5e2ebe5e6" expanded="true">
  <goal name="WP_parameter empty" expl="VC for empty">
- <proof prover="0"><result status="valid" time="0.03" steps="79"/></proof>
+ <proof prover="0"><result status="valid" time="0.03" steps="80"/></proof>
  </goal>
  <goal name="WP_parameter is_empty" expl="VC for is_empty">
- <proof prover="0"><result status="valid" time="0.11" steps="110"/></proof>
+ <proof prover="0"><result status="valid" time="0.11" steps="140"/></proof>
  </goal>
  <goal name="WP_parameter remove_singleton" expl="VC for remove_singleton">
- <proof prover="0"><result status="valid" time="1.20" steps="761"/></proof>
+ <proof prover="0"><result status="valid" time="1.20" steps="710"/></proof>
  </goal>
  <goal name="WP_parameter add_singleton" expl="VC for add_singleton">
  <proof prover="6"><result status="valid" time="0.08"/></proof>
@@ -41,7 +39,7 @@
   <goal name="WP_parameter mul2.1" expl="1. type invariant" expanded="true">
   <transf name="split_goal_wp" expanded="true">
    <goal name="WP_parameter mul2.1.1" expl="1. type invariant">
-   <proof prover="0"><result status="valid" time="0.20" steps="204"/></proof>
+   <proof prover="0"><result status="valid" time="0.20" steps="196"/></proof>
    </goal>
    <goal name="WP_parameter mul2.1.2" expl="2. type invariant">
    <proof prover="3"><result status="valid" time="0.07"/></proof>
@@ -50,7 +48,7 @@
    <proof prover="3"><result status="valid" time="0.11"/></proof>
    </goal>
    <goal name="WP_parameter mul2.1.4" expl="4. type invariant" expanded="true">
-   <proof prover="4"><result status="valid" time="0.28" steps="338"/></proof>
+   <proof prover="4"><result status="valid" time="0.48" steps="537"/></proof>
    <proof prover="6"><result status="valid" time="0.14"/></proof>
    </goal>
   </transf>
@@ -58,10 +56,10 @@
  </transf>
  </goal>
  <goal name="WP_parameter div2" expl="VC for div2">
- <proof prover="0"><result status="valid" time="0.13" steps="128"/></proof>
+ <proof prover="0"><result status="valid" time="0.36" steps="192"/></proof>
  </goal>
  <goal name="WP_parameter diff" expl="VC for diff">
- <proof prover="0"><result status="valid" time="0.46" steps="295"/></proof>
+ <proof prover="0"><result status="valid" time="0.46" steps="314"/></proof>
  </goal>
  <goal name="WP_parameter rightmost_bit_trick" expl="VC for rightmost_bit_trick">
  <transf name="split_goal_wp">
@@ -69,24 +67,24 @@
   <proof prover="6"><result status="valid" time="0.08"/></proof>
   </goal>
   <goal name="WP_parameter rightmost_bit_trick.2" expl="2. assertion">
-  <proof prover="0"><result status="valid" time="0.16" steps="135"/></proof>
+  <proof prover="0"><result status="valid" time="0.16" steps="168"/></proof>
   </goal>
   <goal name="WP_parameter rightmost_bit_trick.3" expl="3. assertion">
   <proof prover="3"><result status="valid" time="0.08"/></proof>
   </goal>
   <goal name="WP_parameter rightmost_bit_trick.4" expl="4. assertion">
-  <proof prover="0"><result status="valid" time="0.16" steps="171"/></proof>
+  <proof prover="0"><result status="valid" time="0.16" steps="174"/></proof>
   </goal>
   <goal name="WP_parameter rightmost_bit_trick.5" expl="5. assertion">
   <proof prover="3"><result status="valid" time="0.13"/></proof>
   </goal>
   <goal name="WP_parameter rightmost_bit_trick.6" expl="6. assertion">
-  <proof prover="0"><result status="valid" time="0.56" steps="362"/></proof>
+  <proof prover="0"><result status="valid" time="0.56" steps="343"/></proof>
   </goal>
   <goal name="WP_parameter rightmost_bit_trick.7" expl="7. type invariant">
   <transf name="split_goal_wp">
    <goal name="WP_parameter rightmost_bit_trick.7.1" expl="1. type invariant">
-   <proof prover="0"><result status="valid" time="0.11" steps="166"/></proof>
+   <proof prover="0"><result status="valid" time="0.11" steps="171"/></proof>
    </goal>
    <goal name="WP_parameter rightmost_bit_trick.7.2" expl="2. type invariant">
    <proof prover="3"><result status="valid" time="0.12"/></proof>
@@ -95,7 +93,7 @@
    <proof prover="3"><result status="valid" time="0.12"/></proof>
    </goal>
    <goal name="WP_parameter rightmost_bit_trick.7.4" expl="4. type invariant">
-   <proof prover="0"><result status="valid" time="0.52" steps="630"/></proof>
+   <proof prover="0"><result status="valid" time="0.52" steps="561"/></proof>
    </goal>
   </transf>
   </goal>
@@ -108,7 +106,7 @@
  <proof prover="6"><result status="valid" time="0.06"/></proof>
  </goal>
 </theory>
-<theory name="NQueensBits" sum="270e9faee6a7bd55cf6eae064f2a50f6" expanded="true">
+<theory name="NQueensBits" sum="e6ce77a09d0119aa54c11e903423f97b" expanded="true">
  <goal name="WP_parameter t" expl="VC for t">
  <transf name="split_goal_wp">
   <goal name="WP_parameter t.1" expl="1. assertion">
@@ -131,19 +129,19 @@
     <ip_library name="Unit"/>
     <ip_qualid name="unit"/>
    </ts_pos>
-   <ts_pos name="solution" arity="0" id="3738"
+   <ts_pos name="solution" arity="0" id="3736"
     ip_theory="Solution">
     <ip_qualid name="solution"/>
    </ts_pos>
-   <ts_pos name="solutions" arity="0" id="3803"
+   <ts_pos name="solutions" arity="0" id="3801"
     ip_theory="Solution">
     <ip_qualid name="solutions"/>
    </ts_pos>
-   <ts_pos name="t" arity="0" id="3836"
+   <ts_pos name="t" arity="0" id="3834"
     ip_theory="BitsSpec">
     <ip_qualid name="t"/>
    </ts_pos>
-   <ts_pos name="ref" arity="1" id="3892"
+   <ts_pos name="ref" arity="1" id="3890"
     ip_theory="Ref">
     <ip_library name="ref"/>
     <ip_qualid name="ref"/>
@@ -154,1198 +152,1193 @@
     <ip_library name="BuiltIn"/>
     <ip_qualid name="infix ="/>
    </ls_pos>
-   <ls_pos name="zero" id="779"
+   <ls_pos name="zero" id="777"
     ip_theory="Int">
     <ip_library name="int"/>
     <ip_qualid name="zero"/>
    </ls_pos>
-   <ls_pos name="one" id="780"
+   <ls_pos name="one" id="778"
     ip_theory="Int">
     <ip_library name="int"/>
     <ip_qualid name="one"/>
    </ls_pos>
-   <ls_pos name="infix &lt;" id="781"
+   <ls_pos name="infix &lt;" id="779"
     ip_theory="Int">
     <ip_library name="int"/>
     <ip_qualid name="infix &lt;"/>
    </ls_pos>
-   <ls_pos name="infix +" id="1950"
+   <ls_pos name="infix +" id="1948"
     ip_theory="Int">
     <ip_library name="int"/>
     <ip_qualid name="infix +"/>
    </ls_pos>
-   <ls_pos name="prefix -" id="1951"
+   <ls_pos name="prefix -" id="1949"
     ip_theory="Int">
     <ip_library name="int"/>
     <ip_qualid name="prefix -"/>
    </ls_pos>
-   <ls_pos name="infix *" id="1952"
+   <ls_pos name="infix *" id="1950"
     ip_theory="Int">
     <ip_library name="int"/>
     <ip_qualid name="infix *"/>
    </ls_pos>
-   <ls_pos name="abs" id="2065"
+   <ls_pos name="abs" id="2063"
     ip_theory="Abs">
     <ip_library name="int"/>
     <ip_qualid name="abs"/>
    </ls_pos>
-   <ls_pos name="div" id="2190"
+   <ls_pos name="div" id="2188"
     ip_theory="EuclideanDivision">
     <ip_library name="int"/>
     <ip_qualid name="div"/>
    </ls_pos>
-   <ls_pos name="mod" id="2193"
+   <ls_pos name="mod" id="2191"
     ip_theory="EuclideanDivision">
     <ip_library name="int"/>
     <ip_qualid name="mod"/>
    </ls_pos>
-   <ls_pos name="mem" id="2814"
+   <ls_pos name="mem" id="2812"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="mem"/>
    </ls_pos>
-   <ls_pos name="infix ==" id="2817"
+   <ls_pos name="infix ==" id="2815"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="infix =="/>
    </ls_pos>
-   <ls_pos name="subset" id="2835"
+   <ls_pos name="subset" id="2833"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="subset"/>
    </ls_pos>
-   <ls_pos name="empty" id="2856"
+   <ls_pos name="empty" id="2854"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="empty"/>
    </ls_pos>
-   <ls_pos name="add" id="2868"
+   <ls_pos name="add" id="2866"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="add"/>
    </ls_pos>
-   <ls_pos name="singleton" id="2874"
+   <ls_pos name="singleton" id="2872"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="singleton"/>
    </ls_pos>
-   <ls_pos name="remove" id="2879"
+   <ls_pos name="remove" id="2877"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="remove"/>
    </ls_pos>
-   <ls_pos name="union" id="2897"
+   <ls_pos name="union" id="2895"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="union"/>
    </ls_pos>
-   <ls_pos name="inter" id="2904"
+   <ls_pos name="inter" id="2902"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="inter"/>
    </ls_pos>
-   <ls_pos name="diff" id="2911"
+   <ls_pos name="diff" id="2909"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="diff"/>
    </ls_pos>
-   <ls_pos name="choose" id="2923"
+   <ls_pos name="choose" id="2921"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="choose"/>
    </ls_pos>
-   <ls_pos name="cardinal" id="2927"
+   <ls_pos name="cardinal" id="2925"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="cardinal"/>
    </ls_pos>
-   <ls_pos name="min_elt" id="3032"
+   <ls_pos name="min_elt" id="3030"
     ip_theory="Fsetint">
     <ip_library name="set"/>
     <ip_qualid name="min_elt"/>
    </ls_pos>
-   <ls_pos name="max_elt" id="3042"
+   <ls_pos name="max_elt" id="3040"
     ip_theory="Fsetint">
     <ip_library name="set"/>
     <ip_qualid name="max_elt"/>
    </ls_pos>
-   <ls_pos name="interval" id="3052"
+   <ls_pos name="interval" id="3050"
     ip_theory="Fsetint">
     <ip_library name="set"/>
     <ip_qualid name="interval"/>
    </ls_pos>
-   <ls_pos name="get" id="3137"
+   <ls_pos name="get" id="3135"
     ip_theory="Map">
     <ip_library name="map"/>
     <ip_qualid name="get"/>
    </ls_pos>
-   <ls_pos name="set" id="3140"
+   <ls_pos name="set" id="3138"
     ip_theory="Map">
     <ip_library name="map"/>
     <ip_qualid name="set"/>
    </ls_pos>
-   <ls_pos name="mixfix [&lt;-]" id="3160"
+   <ls_pos name="mixfix [&lt;-]" id="3158"
     ip_theory="Map">
     <ip_library name="map"/>
     <ip_qualid name="mixfix [&lt;-]"/>
    </ls_pos>
-   <ls_pos name="andb" id="3564"
+   <ls_pos name="andb" id="3562"
     ip_theory="Bool">
     <ip_library name="bool"/>
     <ip_qualid name="andb"/>
    </ls_pos>
-   <ls_pos name="orb" id="3573"
+   <ls_pos name="orb" id="3571"
     ip_theory="Bool">
     <ip_library name="bool"/>
     <ip_qualid name="orb"/>
    </ls_pos>
-   <ls_pos name="notb" id="3582"
+   <ls_pos name="notb" id="3580"
     ip_theory="Bool">
     <ip_library name="bool"/>
     <ip_qualid name="notb"/>
    </ls_pos>
-   <ls_pos name="xorb" id="3587"
+   <ls_pos name="xorb" id="3585"
     ip_theory="Bool">
     <ip_library name="bool"/>
     <ip_qualid name="xorb"/>
    </ls_pos>
-   <ls_pos name="implb" id="3596"
+   <ls_pos name="implb" id="3594"
     ip_theory="Bool">
     <ip_library name="bool"/>
     <ip_qualid name="implb"/>
    </ls_pos>
-   <ls_pos name="succ" id="3722" ip_theory="S">
+   <ls_pos name="succ" id="3720" ip_theory="S">
     <ip_qualid name="succ"/>
    </ls_pos>
-   <ls_pos name="pred" id="3729" ip_theory="S">
+   <ls_pos name="pred" id="3727" ip_theory="S">
     <ip_qualid name="pred"/>
    </ls_pos>
-   <ls_pos name="n" id="3737" ip_theory="Solution">
+   <ls_pos name="n" id="3735" ip_theory="Solution">
     <ip_qualid name="n"/>
    </ls_pos>
-   <ls_pos name="eq_sol" id="3755"
+   <ls_pos name="eq_sol" id="3753"
     ip_theory="Solution">
     <ip_qualid name="eq_sol"/>
    </ls_pos>
-   <ls_pos name="lt_sol" id="3791"
+   <ls_pos name="lt_sol" id="3789"
     ip_theory="Solution">
     <ip_qualid name="lt_sol"/>
    </ls_pos>
-   <ls_pos name="sorted" id="3804"
+   <ls_pos name="sorted" id="3802"
     ip_theory="Solution">
     <ip_qualid name="sorted"/>
    </ls_pos>
-   <ls_pos name="prefix !" id="3898"
+   <ls_pos name="prefix !" id="3896"
     ip_theory="Ref">
     <ip_library name="ref"/>
     <ip_qualid name="prefix !"/>
    </ls_pos>
-   <ls_pos name="pow2" id="4052"
+   <ls_pos name="pow2" id="4050"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2"/>
    </ls_pos>
-   <ls_pos name="size" id="4938"
+   <ls_pos name="size" id="4942"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="size"/>
    </ls_pos>
-   <ls_pos name="nth" id="4943"
+   <ls_pos name="nth" id="4948"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="nth"/>
    </ls_pos>
-   <ls_pos name="ones" id="4951"
+   <ls_pos name="ones" id="4957"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="ones"/>
    </ls_pos>
-   <ls_pos name="bw_and" id="4954"
+   <ls_pos name="bw_and" id="4960"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="bw_and"/>
    </ls_pos>
-   <ls_pos name="bw_or" id="4961"
+   <ls_pos name="bw_or" id="4967"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="bw_or"/>
    </ls_pos>
-   <ls_pos name="bw_xor" id="4968"
+   <ls_pos name="bw_xor" id="4974"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="bw_xor"/>
    </ls_pos>
-   <ls_pos name="bw_not" id="4975"
+   <ls_pos name="bw_not" id="4981"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="bw_not"/>
    </ls_pos>
-   <ls_pos name="lsr" id="4980"
+   <ls_pos name="lsr" id="4986"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="lsr"/>
    </ls_pos>
-   <ls_pos name="asr" id="4994"
+   <ls_pos name="asr" id="5000"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="asr"/>
    </ls_pos>
-   <ls_pos name="lsl" id="5008"
+   <ls_pos name="lsl" id="5014"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="lsl"/>
    </ls_pos>
-   <ls_pos name="rotate_right" id="5022"
+   <ls_pos name="rotate_right" id="5028"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="rotate_right"/>
    </ls_pos>
-   <ls_pos name="rotate_left" id="5028"
+   <ls_pos name="rotate_left" id="5034"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="rotate_left"/>
    </ls_pos>
-   <ls_pos name="to_int" id="5036"
+   <ls_pos name="to_int" id="5042"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="to_int"/>
    </ls_pos>
-   <ls_pos name="to_uint" id="5037"
-    ip_theory="BV32">
-    <ip_library name="bv"/>
-    <ip_qualid name="to_uint"/>
-   </ls_pos>
-   <ls_pos name="of_int" id="5038"
+   <ls_pos name="of_int" id="5043"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="of_int"/>
    </ls_pos>
-   <ls_pos name="size_bv" id="5059"
+   <ls_pos name="size_bv" id="5064"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="size_bv"/>
    </ls_pos>
-   <ls_pos name="ugt" id="5086"
+   <ls_pos name="ugt" id="5093"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="ugt"/>
    </ls_pos>
-   <ls_pos name="uge" id="5097"
+   <ls_pos name="uge" id="5104"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="uge"/>
    </ls_pos>
-   <ls_pos name="sge" id="5141"
+   <ls_pos name="sge" id="5148"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="sge"/>
    </ls_pos>
-   <ls_pos name="add" id="5150"
+   <ls_pos name="add" id="5157"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="add"/>
    </ls_pos>
-   <ls_pos name="sub" id="5161"
+   <ls_pos name="sub" id="5168"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="sub"/>
    </ls_pos>
-   <ls_pos name="neg" id="5172"
+   <ls_pos name="neg" id="5179"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="neg"/>
    </ls_pos>
-   <ls_pos name="mul" id="5176"
+   <ls_pos name="mul" id="5183"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="mul"/>
    </ls_pos>
-   <ls_pos name="udiv" id="5187"
+   <ls_pos name="udiv" id="5194"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="udiv"/>
    </ls_pos>
-   <ls_pos name="urem" id="5193"
+   <ls_pos name="urem" id="5200"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="urem"/>
    </ls_pos>
-   <ls_pos name="lsr_bv" id="5199"
+   <ls_pos name="lsr_bv" id="5206"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="lsr_bv"/>
    </ls_pos>
-   <ls_pos name="asr_bv" id="5210"
+   <ls_pos name="asr_bv" id="5217"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="asr_bv"/>
    </ls_pos>
-   <ls_pos name="lsl_bv" id="5216"
+   <ls_pos name="lsl_bv" id="5223"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="lsl_bv"/>
    </ls_pos>
-   <ls_pos name="nth_bv" id="5239"
+   <ls_pos name="nth_bv" id="5246"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="nth_bv"/>
    </ls_pos>
-   <ls_pos name="eq_sub_bv" id="5254"
+   <ls_pos name="eq_sub_bv" id="5261"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="eq_sub_bv"/>
    </ls_pos>
-   <ls_pos name="eq_sub" id="5268"
+   <ls_pos name="eq_sub" id="5275"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="eq_sub"/>
    </ls_pos>
-   <ls_pos name="eq" id="5298"
+   <ls_pos name="eq" id="5305"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="eq"/>
    </ls_pos>
-   <pr_pos name="Assoc" id="1953"
+   <pr_pos name="Assoc" id="1951"
     ip_theory="Int">
     <ip_library name="int"/>
     <ip_qualid name="CommutativeGroup"/>
     <ip_qualid name="Assoc"/>
    </pr_pos>
-   <pr_pos name="Unit_def_l" id="1960"
+   <pr_pos name="Unit_def_l" id="1958"
     ip_theory="Int">
     <ip_library name="int"/>
     <ip_qualid name="CommutativeGroup"/>
     <ip_qualid name="Unit_def_l"/>
    </pr_pos>
-   <pr_pos name="Unit_def_r" id="1963"
+   <pr_pos name="Unit_def_r" id="1961"
     ip_theory="Int">
     <ip_library name="int"/>
     <ip_qualid name="CommutativeGroup"/>
     <ip_qualid name="Unit_def_r"/>
    </pr_pos>
-   <pr_pos name="Inv_def_l" id="1966"
+   <pr_pos name="Inv_def_l" id="1964"
     ip_theory="Int">
     <ip_library name="int"/>
     <ip_qualid name="CommutativeGroup"/>
     <ip_qualid name="Inv_def_l"/>
    </pr_pos>
-   <pr_pos name="Inv_def_r" id="1969"
+   <pr_pos name="Inv_def_r" id="1967"
     ip_theory="Int">
     <ip_library name="int"/>
     <ip_qualid name="CommutativeGroup"/>
     <ip_qualid name="Inv_def_r"/>
    </pr_pos>
-   <pr_pos name="Comm" id="1972"
+   <pr_pos name="Comm" id="1970"
     ip_theory="Int">
     <ip_library name="int"/>
     <ip_qualid name="CommutativeGroup"/>
     <ip_qualid name="Comm"/>
     <ip_qualid name="Comm"/>
    </pr_pos>
-   <pr_pos name="Assoc" id="1977"
+   <pr_pos name="Assoc" id="1975"
     ip_theory="Int">
     <ip_library name="int"/>
     <ip_qualid name="Assoc"/>
     <ip_qualid name="Assoc"/>
    </pr_pos>
-   <pr_pos name="Mul_distr_l" id="1984"
+   <pr_pos name="Mul_distr_l" id="1982"
     ip_theory="Int">
     <ip_library name="int"/>
     <ip_qualid name="Mul_distr_l"/>
    </pr_pos>
-   <pr_pos name="Mul_distr_r" id="1991"
+   <pr_pos name="Mul_distr_r" id="1989"
     ip_theory="Int">
     <ip_library name="int"/>
     <ip_qualid name="Mul_distr_r"/>
    </pr_pos>
-   <pr_pos name="Comm" id="2009"
+   <pr_pos name="Comm" id="2007"
     ip_theory="Int">
     <ip_library name="int"/>
     <ip_qualid name="Comm"/>
     <ip_qualid name="Comm"/>
    </pr_pos>
-   <pr_pos name="Unitary" id="2014"
+   <pr_pos name="Unitary" id="2012"
     ip_theory="Int">
     <ip_library name="int"/>
     <ip_qualid name="Unitary"/>
    </pr_pos>
-   <pr_pos name="NonTrivialRing" id="2017"
+   <pr_pos name="NonTrivialRing" id="2015"
     ip_theory="Int">
     <ip_library name="int"/>
     <ip_qualid name="NonTrivialRing"/>
    </pr_pos>
-   <pr_pos name="Refl" id="2029"
+   <pr_pos name="Refl" id="2027"
     ip_theory="Int">
     <ip_library name="int"/>
     <ip_qualid name="Refl"/>
    </pr_pos>
-   <pr_pos name="Trans" id="2032"
+   <pr_pos name="Trans" id="2030"
     ip_theory="Int">
     <ip_library name="int"/>
     <ip_qualid name="Trans"/>
    </pr_pos>
-   <pr_pos name="Antisymm" id="2039"
+   <pr_pos name="Antisymm" id="2037"
     ip_theory="Int">
     <ip_library name="int"/>
     <ip_qualid name="Antisymm"/>
    </pr_pos>
-   <pr_pos name="Total" id="2044"
+   <pr_pos name="Total" id="2042"
     ip_theory="Int">
     <ip_library name="int"/>
     <ip_qualid name="Total"/>
    </pr_pos>
-   <pr_pos name="ZeroLessOne" id="2049"
+   <pr_pos name="ZeroLessOne" id="2047"
     ip_theory="Int">
     <ip_library name="int"/>
     <ip_qualid name="ZeroLessOne"/>
    </pr_pos>
-   <pr_pos name="CompatOrderAdd" id="2050"
+   <pr_pos name="CompatOrderAdd" id="2048"
     ip_theory="Int">
     <ip_library name="int"/>
     <ip_qualid name="CompatOrderAdd"/>
    </pr_pos>
-   <pr_pos name="CompatOrderMult" id="2057"
+   <pr_pos name="CompatOrderMult" id="2055"
     ip_theory="Int">
     <ip_library name="int"/>
     <ip_qualid name="CompatOrderMult"/>
    </pr_pos>
-   <pr_pos name="Abs_le" id="2070"
+   <pr_pos name="Abs_le" id="2068"
     ip_theory="Abs">
     <ip_library name="int"/>
     <ip_qualid name="Abs_le"/>
    </pr_pos>
-   <pr_pos name="Abs_pos" id="2075"
+   <pr_pos name="Abs_pos" id="2073"
     ip_theory="Abs">
     <ip_library name="int"/>
     <ip_qualid name="Abs_pos"/>
    </pr_pos>
-   <pr_pos name="Div_mod" id="2196"
+   <pr_pos name="Div_mod" id="2194"
     ip_theory="EuclideanDivision">
     <ip_library name="int"/>
     <ip_qualid name="Div_mod"/>
    </pr_pos>
-   <pr_pos name="Mod_bound" id="2201"
+   <pr_pos name="Mod_bound" id="2199"
     ip_theory="EuclideanDivision">
     <ip_library name="int"/>
     <ip_qualid name="Mod_bound"/>
    </pr_pos>
-   <pr_pos name="Div_unique" id="2206"
+   <pr_pos name="Div_unique" id="2204"
     ip_theory="EuclideanDivision">
     <ip_library name="int"/>
     <ip_qualid name="Div_unique"/>
    </pr_pos>
-   <pr_pos name="Div_bound" id="2213"
+   <pr_pos name="Div_bound" id="2211"
     ip_theory="EuclideanDivision">
     <ip_library name="int"/>
     <ip_qualid name="Div_bound"/>
    </pr_pos>
-   <pr_pos name="Mod_1" id="2218"
+   <pr_pos name="Mod_1" id="2216"
     ip_theory="EuclideanDivision">
     <ip_library name="int"/>
     <ip_qualid name="Mod_1"/>
    </pr_pos>
-   <pr_pos name="Div_1" id="2221"
+   <pr_pos name="Div_1" id="2219"
     ip_theory="EuclideanDivision">
     <ip_library name="int"/>
     <ip_qualid name="Div_1"/>
    </pr_pos>
-   <pr_pos name="Div_inf" id="2224"
+   <pr_pos name="Div_inf" id="2222"
     ip_theory="EuclideanDivision">
     <ip_library name="int"/>
     <ip_qualid name="Div_inf"/>
    </pr_pos>
-   <pr_pos name="Div_inf_neg" id="2229"
+   <pr_pos name="Div_inf_neg" id="2227"
     ip_theory="EuclideanDivision">
     <ip_library name="int"/>
     <ip_qualid name="Div_inf_neg"/>
    </pr_pos>
-   <pr_pos name="Mod_0" id="2234"
+   <pr_pos name="Mod_0" id="2232"
     ip_theory="EuclideanDivision">
     <ip_library name="int"/>
     <ip_qualid name="Mod_0"/>
    </pr_pos>
-   <pr_pos name="Div_1_left" id="2237"
+   <pr_pos name="Div_1_left" id="2235"
     ip_theory="EuclideanDivision">
     <ip_library name="int"/>
     <ip_qualid name="Div_1_left"/>
    </pr_pos>
-   <pr_pos name="Div_minus1_left" id="2240"
+   <pr_pos name="Div_minus1_left" id="2238"
     ip_theory="EuclideanDivision">
     <ip_library name="int"/>
     <ip_qualid name="Div_minus1_left"/>
    </pr_pos>
-   <pr_pos name="Mod_1_left" id="2243"
+   <pr_pos name="Mod_1_left" id="2241"
     ip_theory="EuclideanDivision">
     <ip_library name="int"/>
     <ip_qualid name="Mod_1_left"/>
    </pr_pos>
-   <pr_pos name="Mod_minus1_left" id="2246"
+   <pr_pos name="Mod_minus1_left" id="2244"
     ip_theory="EuclideanDivision">
     <ip_library name="int"/>
     <ip_qualid name="Mod_minus1_left"/>
    </pr_pos>
-   <pr_pos name="Div_mult" id="2249"
+   <pr_pos name="Div_mult" id="2247"
     ip_theory="EuclideanDivision">
     <ip_library name="int"/>
     <ip_qualid name="Div_mult"/>
    </pr_pos>
-   <pr_pos name="Mod_mult" id="2256"
+   <pr_pos name="Mod_mult" id="2254"
     ip_theory="EuclideanDivision">
     <ip_library name="int"/>
     <ip_qualid name="Mod_mult"/>
    </pr_pos>
-   <pr_pos name="extensionality" id="2828"
+   <pr_pos name="extensionality" id="2826"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="extensionality"/>
    </pr_pos>
-   <pr_pos name="subset_refl" id="2846"
+   <pr_pos name="subset_refl" id="2844"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="subset_refl"/>
    </pr_pos>
-   <pr_pos name="subset_trans" id="2849"
+   <pr_pos name="subset_trans" id="2847"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="subset_trans"/>
    </pr_pos>
-   <pr_pos name="empty_def1" id="2865"
+   <pr_pos name="empty_def1" id="2863"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="empty_def1"/>
    </pr_pos>
-   <pr_pos name="mem_empty" id="2866"
+   <pr_pos name="mem_empty" id="2864"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="mem_empty"/>
    </pr_pos>
-   <pr_pos name="add_def1" id="2869"
+   <pr_pos name="add_def1" id="2867"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="add_def1"/>
    </pr_pos>
-   <pr_pos name="remove_def1" id="2880"
+   <pr_pos name="remove_def1" id="2878"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="remove_def1"/>
    </pr_pos>
-   <pr_pos name="add_remove" id="2885"
+   <pr_pos name="add_remove" id="2883"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="add_remove"/>
    </pr_pos>
-   <pr_pos name="remove_add" id="2889"
+   <pr_pos name="remove_add" id="2887"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="remove_add"/>
    </pr_pos>
-   <pr_pos name="subset_remove" id="2893"
+   <pr_pos name="subset_remove" id="2891"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="subset_remove"/>
    </pr_pos>
-   <pr_pos name="union_def1" id="2898"
+   <pr_pos name="union_def1" id="2896"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="union_def1"/>
    </pr_pos>
-   <pr_pos name="inter_def1" id="2905"
+   <pr_pos name="inter_def1" id="2903"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="inter_def1"/>
    </pr_pos>
-   <pr_pos name="subset_diff" id="2918"
+   <pr_pos name="subset_diff" id="2916"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="subset_diff"/>
    </pr_pos>
-   <pr_pos name="choose_def" id="2924"
+   <pr_pos name="choose_def" id="2922"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="choose_def"/>
    </pr_pos>
-   <pr_pos name="cardinal_add" id="2935"
+   <pr_pos name="cardinal_add" id="2933"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="cardinal_add"/>
    </pr_pos>
-   <pr_pos name="cardinal_remove" id="2940"
+   <pr_pos name="cardinal_remove" id="2938"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="cardinal_remove"/>
    </pr_pos>
-   <pr_pos name="cardinal_subset" id="2945"
+   <pr_pos name="cardinal_subset" id="2943"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="cardinal_subset"/>
    </pr_pos>
-   <pr_pos name="subset_eq" id="2950"
+   <pr_pos name="subset_eq" id="2948"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="subset_eq"/>
    </pr_pos>
-   <pr_pos name="cardinal1" id="2955"
+   <pr_pos name="cardinal1" id="2953"
     ip_theory="Fset">
     <ip_library name="set"/>
     <ip_qualid name="cardinal1"/>
    </pr_pos>
-   <pr_pos name="min_elt_def1" id="3034"
+   <pr_pos name="min_elt_def1" id="3032"
     ip_theory="Fsetint">
     <ip_library name="set"/>
     <ip_qualid name="min_elt_def1"/>
    </pr_pos>
-   <pr_pos name="min_elt_def2" id="3037"
+   <pr_pos name="min_elt_def2" id="3035"
     ip_theory="Fsetint">
     <ip_library name="set"/>
     <ip_qualid name="min_elt_def2"/>
    </pr_pos>
-   <pr_pos name="max_elt_def1" id="3044"
+   <pr_pos name="max_elt_def1" id="3042"
     ip_theory="Fsetint">
     <ip_library name="set"/>
     <ip_qualid name="max_elt_def1"/>
    </pr_pos>
-   <pr_pos name="max_elt_def2" id="3047"
+   <pr_pos name="max_elt_def2" id="3045"
     ip_theory="Fsetint">
     <ip_library name="set"/>
     <ip_qualid name="max_elt_def2"/>
    </pr_pos>
-   <pr_pos name="interval_def" id="3055"
+   <pr_pos name="interval_def" id="3053"
     ip_theory="Fsetint">
     <ip_library name="set"/>
     <ip_qualid name="interval_def"/>
    </pr_pos>
-   <pr_pos name="cardinal_interval" id="3062"
+   <pr_pos name="cardinal_interval" id="3060"
     ip_theory="Fsetint">
     <ip_library name="set"/>
     <ip_qualid name="cardinal_interval"/>
    </pr_pos>
-   <pr_pos name="Select_eq" id="3173"
+   <pr_pos name="Select_eq" id="3171"
     ip_theory="Map">
     <ip_library name="map"/>
     <ip_qualid name="Select_eq"/>
    </pr_pos>
-   <pr_pos name="Select_neq" id="3182"
+   <pr_pos name="Select_neq" id="3180"
     ip_theory="Map">
     <ip_library name="map"/>
     <ip_qualid name="Select_neq"/>
    </pr_pos>
-   <pr_pos name="succ_def" id="3724"
+   <pr_pos name="succ_def" id="3722"
     ip_theory="S">
     <ip_qualid name="succ_def"/>
    </pr_pos>
-   <pr_pos name="pred_def" id="3731"
+   <pr_pos name="pred_def" id="3729"
     ip_theory="S">
     <ip_qualid name="pred_def"/>
    </pr_pos>
-   <pr_pos name="partial_solution_eq_prefix" id="3784"
+   <pr_pos name="partial_solution_eq_prefix" id="3782"
     ip_theory="Solution">
     <ip_qualid name="partial_solution_eq_prefix"/>
    </pr_pos>
-   <pr_pos name="no_duplicate" id="3823"
+   <pr_pos name="no_duplicate" id="3821"
     ip_theory="Solution">
     <ip_qualid name="no_duplicate"/>
    </pr_pos>
-   <pr_pos name="Power_0" id="4054"
+   <pr_pos name="Power_0" id="4052"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="Power_0"/>
    </pr_pos>
-   <pr_pos name="Power_s" id="4055"
+   <pr_pos name="Power_s" id="4053"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="Power_s"/>
    </pr_pos>
-   <pr_pos name="Power_1" id="4058"
+   <pr_pos name="Power_1" id="4056"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="Power_1"/>
    </pr_pos>
-   <pr_pos name="Power_sum" id="4059"
+   <pr_pos name="Power_sum" id="4057"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="Power_sum"/>
    </pr_pos>
-   <pr_pos name="pow2pos" id="4064"
+   <pr_pos name="pow2pos" id="4062"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2pos"/>
    </pr_pos>
-   <pr_pos name="pow2_0" id="4067"
+   <pr_pos name="pow2_0" id="4065"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_0"/>
    </pr_pos>
-   <pr_pos name="pow2_1" id="4068"
+   <pr_pos name="pow2_1" id="4066"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_1"/>
    </pr_pos>
-   <pr_pos name="pow2_2" id="4069"
+   <pr_pos name="pow2_2" id="4067"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_2"/>
    </pr_pos>
-   <pr_pos name="pow2_3" id="4070"
+   <pr_pos name="pow2_3" id="4068"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_3"/>
    </pr_pos>
-   <pr_pos name="pow2_4" id="4071"
+   <pr_pos name="pow2_4" id="4069"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_4"/>
    </pr_pos>
-   <pr_pos name="pow2_5" id="4072"
+   <pr_pos name="pow2_5" id="4070"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_5"/>
    </pr_pos>
-   <pr_pos name="pow2_6" id="4073"
+   <pr_pos name="pow2_6" id="4071"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_6"/>
    </pr_pos>
-   <pr_pos name="pow2_7" id="4074"
+   <pr_pos name="pow2_7" id="4072"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_7"/>
    </pr_pos>
-   <pr_pos name="pow2_8" id="4075"
+   <pr_pos name="pow2_8" id="4073"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_8"/>
    </pr_pos>
-   <pr_pos name="pow2_9" id="4076"
+   <pr_pos name="pow2_9" id="4074"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_9"/>
    </pr_pos>
-   <pr_pos name="pow2_10" id="4077"
+   <pr_pos name="pow2_10" id="4075"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_10"/>
    </pr_pos>
-   <pr_pos name="pow2_11" id="4078"
+   <pr_pos name="pow2_11" id="4076"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_11"/>
    </pr_pos>
-   <pr_pos name="pow2_12" id="4079"
+   <pr_pos name="pow2_12" id="4077"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_12"/>
    </pr_pos>
-   <pr_pos name="pow2_13" id="4080"
+   <pr_pos name="pow2_13" id="4078"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_13"/>
    </pr_pos>
-   <pr_pos name="pow2_14" id="4081"
+   <pr_pos name="pow2_14" id="4079"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_14"/>
    </pr_pos>
-   <pr_pos name="pow2_15" id="4082"
+   <pr_pos name="pow2_15" id="4080"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_15"/>
    </pr_pos>
-   <pr_pos name="pow2_16" id="4083"
+   <pr_pos name="pow2_16" id="4081"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_16"/>
    </pr_pos>
-   <pr_pos name="pow2_17" id="4084"
+   <pr_pos name="pow2_17" id="4082"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_17"/>
    </pr_pos>
-   <pr_pos name="pow2_18" id="4085"
+   <pr_pos name="pow2_18" id="4083"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_18"/>
    </pr_pos>
-   <pr_pos name="pow2_19" id="4086"
+   <pr_pos name="pow2_19" id="4084"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_19"/>
    </pr_pos>
-   <pr_pos name="pow2_20" id="4087"
+   <pr_pos name="pow2_20" id="4085"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_20"/>
    </pr_pos>
-   <pr_pos name="pow2_21" id="4088"
+   <pr_pos name="pow2_21" id="4086"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_21"/>
    </pr_pos>
-   <pr_pos name="pow2_22" id="4089"
+   <pr_pos name="pow2_22" id="4087"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_22"/>
    </pr_pos>
-   <pr_pos name="pow2_23" id="4090"
+   <pr_pos name="pow2_23" id="4088"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_23"/>
    </pr_pos>
-   <pr_pos name="pow2_24" id="4091"
+   <pr_pos name="pow2_24" id="4089"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_24"/>
    </pr_pos>
-   <pr_pos name="pow2_25" id="4092"
+   <pr_pos name="pow2_25" id="4090"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_25"/>
    </pr_pos>
-   <pr_pos name="pow2_26" id="4093"
+   <pr_pos name="pow2_26" id="4091"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_26"/>
    </pr_pos>
-   <pr_pos name="pow2_27" id="4094"
+   <pr_pos name="pow2_27" id="4092"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_27"/>
    </pr_pos>
-   <pr_pos name="pow2_28" id="4095"
+   <pr_pos name="pow2_28" id="4093"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_28"/>
    </pr_pos>
-   <pr_pos name="pow2_29" id="4096"
+   <pr_pos name="pow2_29" id="4094"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_29"/>
    </pr_pos>
-   <pr_pos name="pow2_30" id="4097"
+   <pr_pos name="pow2_30" id="4095"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_30"/>
    </pr_pos>
-   <pr_pos name="pow2_31" id="4098"
+   <pr_pos name="pow2_31" id="4096"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_31"/>
    </pr_pos>
-   <pr_pos name="pow2_32" id="4099"
+   <pr_pos name="pow2_32" id="4097"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_32"/>
    </pr_pos>
-   <pr_pos name="pow2_33" id="4100"
+   <pr_pos name="pow2_33" id="4098"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_33"/>
    </pr_pos>
-   <pr_pos name="pow2_34" id="4101"
+   <pr_pos name="pow2_34" id="4099"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_34"/>
    </pr_pos>
-   <pr_pos name="pow2_35" id="4102"
+   <pr_pos name="pow2_35" id="4100"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_35"/>
    </pr_pos>
-   <pr_pos name="pow2_36" id="4103"
+   <pr_pos name="pow2_36" id="4101"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_36"/>
    </pr_pos>
-   <pr_pos name="pow2_37" id="4104"
+   <pr_pos name="pow2_37" id="4102"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_37"/>
    </pr_pos>
-   <pr_pos name="pow2_38" id="4105"
+   <pr_pos name="pow2_38" id="4103"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_38"/>
    </pr_pos>
-   <pr_pos name="pow2_39" id="4106"
+   <pr_pos name="pow2_39" id="4104"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_39"/>
    </pr_pos>
-   <pr_pos name="pow2_40" id="4107"
+   <pr_pos name="pow2_40" id="4105"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_40"/>
    </pr_pos>
-   <pr_pos name="pow2_41" id="4108"
+   <pr_pos name="pow2_41" id="4106"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_41"/>
    </pr_pos>
-   <pr_pos name="pow2_42" id="4109"
+   <pr_pos name="pow2_42" id="4107"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_42"/>
    </pr_pos>
-   <pr_pos name="pow2_43" id="4110"
+   <pr_pos name="pow2_43" id="4108"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_43"/>
    </pr_pos>
-   <pr_pos name="pow2_44" id="4111"
+   <pr_pos name="pow2_44" id="4109"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_44"/>
    </pr_pos>
-   <pr_pos name="pow2_45" id="4112"
+   <pr_pos name="pow2_45" id="4110"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_45"/>
    </pr_pos>
-   <pr_pos name="pow2_46" id="4113"
+   <pr_pos name="pow2_46" id="4111"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_46"/>
    </pr_pos>
-   <pr_pos name="pow2_47" id="4114"
+   <pr_pos name="pow2_47" id="4112"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_47"/>
    </pr_pos>
-   <pr_pos name="pow2_48" id="4115"
+   <pr_pos name="pow2_48" id="4113"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_48"/>
    </pr_pos>
-   <pr_pos name="pow2_49" id="4116"
+   <pr_pos name="pow2_49" id="4114"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_49"/>
    </pr_pos>
-   <pr_pos name="pow2_50" id="4117"
+   <pr_pos name="pow2_50" id="4115"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_50"/>
    </pr_pos>
-   <pr_pos name="pow2_51" id="4118"
+   <pr_pos name="pow2_51" id="4116"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_51"/>
    </pr_pos>
-   <pr_pos name="pow2_52" id="4119"
+   <pr_pos name="pow2_52" id="4117"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_52"/>
    </pr_pos>
-   <pr_pos name="pow2_53" id="4120"
+   <pr_pos name="pow2_53" id="4118"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_53"/>
    </pr_pos>
-   <pr_pos name="pow2_54" id="4121"
+   <pr_pos name="pow2_54" id="4119"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_54"/>
    </pr_pos>
-   <pr_pos name="pow2_55" id="4122"
+   <pr_pos name="pow2_55" id="4120"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_55"/>
    </pr_pos>
-   <pr_pos name="pow2_56" id="4123"
+   <pr_pos name="pow2_56" id="4121"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_56"/>
    </pr_pos>
-   <pr_pos name="pow2_57" id="4124"
+   <pr_pos name="pow2_57" id="4122"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_57"/>
    </pr_pos>
-   <pr_pos name="pow2_58" id="4125"
+   <pr_pos name="pow2_58" id="4123"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_58"/>
    </pr_pos>
-   <pr_pos name="pow2_59" id="4126"
+   <pr_pos name="pow2_59" id="4124"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_59"/>
    </pr_pos>
-   <pr_pos name="pow2_60" id="4127"
+   <pr_pos name="pow2_60" id="4125"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_60"/>
    </pr_pos>
-   <pr_pos name="pow2_61" id="4128"
+   <pr_pos name="pow2_61" id="4126"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_61"/>
    </pr_pos>
-   <pr_pos name="pow2_62" id="4129"
+   <pr_pos name="pow2_62" id="4127"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_62"/>
    </pr_pos>
-   <pr_pos name="pow2_63" id="4130"
+   <pr_pos name="pow2_63" id="4128"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_63"/>
    </pr_pos>
-   <pr_pos name="pow2_64" id="4131"
+   <pr_pos name="pow2_64" id="4129"
     ip_theory="Pow2int">
     <ip_library name="bv"/>
     <ip_qualid name="pow2_64"/>
    </pr_pos>
-   <pr_pos name="size_pos" id="4941"
+   <pr_pos name="size_pos" id="4947"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="size_pos"/>
    </pr_pos>
-   <pr_pos name="nth_out_of_bound" id="4944"
+   <pr_pos name="nth_out_of_bound" id="4949"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="nth_out_of_bound"/>
    </pr_pos>
-   <pr_pos name="Nth_ones" id="4952"
+   <pr_pos name="Nth_ones" id="4958"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="Nth_ones"/>
    </pr_pos>
-   <pr_pos name="Nth_bw_and" id="4955"
+   <pr_pos name="Nth_bw_and" id="4961"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="Nth_bw_and"/>
    </pr_pos>
-   <pr_pos name="Nth_bw_or" id="4962"
+   <pr_pos name="Nth_bw_or" id="4968"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="Nth_bw_or"/>
    </pr_pos>
-   <pr_pos name="Nth_bw_xor" id="4969"
+   <pr_pos name="Nth_bw_xor" id="4975"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="Nth_bw_xor"/>
    </pr_pos>
-   <pr_pos name="Nth_bw_not" id="4976"
+   <pr_pos name="Nth_bw_not" id="4982"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="Nth_bw_not"/>
    </pr_pos>
-   <pr_pos name="Lsr_nth_low" id="4981"
+   <pr_pos name="Lsr_nth_low" id="4987"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="Lsr_nth_low"/>
    </pr_pos>
-   <pr_pos name="Lsr_nth_high" id="4986"
+   <pr_pos name="Lsr_nth_high" id="4992"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="Lsr_nth_high"/>
    </pr_pos>
-   <pr_pos name="Asr_nth_low" id="4995"
+   <pr_pos name="Asr_nth_low" id="5001"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="Asr_nth_low"/>
    </pr_pos>
-   <pr_pos name="Asr_nth_high" id="5000"
+   <pr_pos name="Asr_nth_high" id="5006"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="Asr_nth_high"/>
    </pr_pos>
-   <pr_pos name="Lsl_nth_high" id="5009"
+   <pr_pos name="Lsl_nth_high" id="5015"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="Lsl_nth_high"/>
    </pr_pos>
-   <pr_pos name="Lsl_nth_low" id="5014"
+   <pr_pos name="Lsl_nth_low" id="5020"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="Lsl_nth_low"/>
    </pr_pos>
-   <pr_pos name="Nth_rotate_right" id="5023"
+   <pr_pos name="Nth_rotate_right" id="5029"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="Nth_rotate_right"/>
    </pr_pos>
-   <pr_pos name="Nth_rotate_left" id="5029"
+   <pr_pos name="Nth_rotate_left" id="5035"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="Nth_rotate_left"/>
    </pr_pos>
-   <pr_pos name="two_power_size_val" id="5034"
+   <pr_pos name="two_power_size_val" id="5040"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="two_power_size_val"/>
    </pr_pos>
-   <pr_pos name="max_int_val" id="5035"
+   <pr_pos name="max_int_val" id="5041"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="max_int_val"/>
    </pr_pos>
-   <pr_pos name="to_int_extensionality" id="5044"
+   <pr_pos name="to_int_extensionality" id="5049"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="to_int_extensionality"/>
    </pr_pos>
-   <pr_pos name="to_uint_bounds" id="5054"
+   <pr_pos name="to_uint_bounds" id="5059"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="to_uint_bounds"/>
    </pr_pos>
-   <pr_pos name="to_uint_add" id="5151"
+   <pr_pos name="to_uint_add" id="5158"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="to_uint_add"/>
    </pr_pos>
-   <pr_pos name="to_uint_add_bounded" id="5156"
+   <pr_pos name="to_uint_add_bounded" id="5163"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="to_uint_add_bounded"/>
    </pr_pos>
-   <pr_pos name="to_uint_sub" id="5162"
+   <pr_pos name="to_uint_sub" id="5169"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="to_uint_sub"/>
    </pr_pos>
-   <pr_pos name="to_uint_sub_bounded" id="5167"
+   <pr_pos name="to_uint_sub_bounded" id="5174"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="to_uint_sub_bounded"/>
    </pr_pos>
-   <pr_pos name="to_uint_neg" id="5173"
+   <pr_pos name="to_uint_neg" id="5180"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="to_uint_neg"/>
    </pr_pos>
-   <pr_pos name="to_uint_mul" id="5177"
+   <pr_pos name="to_uint_mul" id="5184"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="to_uint_mul"/>
    </pr_pos>
-   <pr_pos name="to_uint_mul_bounded" id="5182"
+   <pr_pos name="to_uint_mul_bounded" id="5189"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="to_uint_mul_bounded"/>
    </pr_pos>
-   <pr_pos name="to_uint_udiv" id="5188"
+   <pr_pos name="to_uint_udiv" id="5195"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="to_uint_udiv"/>
    </pr_pos>
-   <pr_pos name="to_uint_urem" id="5194"
+   <pr_pos name="to_uint_urem" id="5201"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="to_uint_urem"/>
    </pr_pos>
-   <pr_pos name="Nth_bv_is_nth" id="5245"
+   <pr_pos name="Nth_bv_is_nth" id="5252"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="Nth_bv_is_nth"/>
    </pr_pos>
-   <pr_pos name="eq_sub_equiv" id="5287"
+   <pr_pos name="eq_sub_equiv" id="5294"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="eq_sub_equiv"/>
    </pr_pos>
-   <pr_pos name="Extensionality" id="5307"
+   <pr_pos name="Extensionality" id="5314"
     ip_theory="BV32">
     <ip_library name="bv"/>
     <ip_qualid name="Extensionality"/>
@@ -1354,436 +1347,439 @@
     <meta_arg_ls id="10"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="779"/>
-   </meta>
-   <meta name="remove_logic">
-    <meta_arg_ls id="780"/>
+    <meta_arg_ls id="777"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="781"/>
+    <meta_arg_ls id="778"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="1950"/>
+    <meta_arg_ls id="779"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="1951"/>
+    <meta_arg_ls id="1948"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="1952"/>
+    <meta_arg_ls id="1949"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="2065"/>
+    <meta_arg_ls id="1950"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="2190"/>
+    <meta_arg_ls id="2063"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="2193"/>
+    <meta_arg_ls id="2188"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="2814"/>
+    <meta_arg_ls id="2191"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="2817"/>
+    <meta_arg_ls id="2812"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="2835"/>
+    <meta_arg_ls id="2815"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="2856"/>
+    <meta_arg_ls id="2833"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="2868"/>
+    <meta_arg_ls id="2854"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="2874"/>
+    <meta_arg_ls id="2866"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="2879"/>
+    <meta_arg_ls id="2872"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="2897"/>
+    <meta_arg_ls id="2877"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="2904"/>
+    <meta_arg_ls id="2895"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="2911"/>
+    <meta_arg_ls id="2902"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="2923"/>
+    <meta_arg_ls id="2909"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="2927"/>
+    <meta_arg_ls id="2921"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="3032"/>
+    <meta_arg_ls id="2925"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="3042"/>
+    <meta_arg_ls id="3030"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="3052"/>
+    <meta_arg_ls id="3040"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="3137"/>
+    <meta_arg_ls id="3050"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="3140"/>
+    <meta_arg_ls id="3135"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="3160"/>
+    <meta_arg_ls id="3138"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="3564"/>
+    <meta_arg_ls id="3158"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="3573"/>
+    <meta_arg_ls id="3562"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="3582"/>
+    <meta_arg_ls id="3571"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="3587"/>
+    <meta_arg_ls id="3580"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="3596"/>
+    <meta_arg_ls id="3585"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="3722"/>
+    <meta_arg_ls id="3594"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="3729"/>
+    <meta_arg_ls id="3720"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="3737"/>
+    <meta_arg_ls id="3727"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="3755"/>
+    <meta_arg_ls id="3735"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="3791"/>
+    <meta_arg_ls id="3753"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="3804"/>
+    <meta_arg_ls id="3789"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="3898"/>
+    <meta_arg_ls id="3802"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="4052"/>
+    <meta_arg_ls id="3896"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="4938"/>
+    <meta_arg_ls id="4050"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="4943"/>
+    <meta_arg_ls id="4942"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="4951"/>
+    <meta_arg_ls id="4948"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="4954"/>
+    <meta_arg_ls id="4957"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="4961"/>
+    <meta_arg_ls id="4960"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="4968"/>
+    <meta_arg_ls id="4967"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="4975"/>
+    <meta_arg_ls id="4974"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="4980"/>
+    <meta_arg_ls id="4981"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="4994"/>
+    <meta_arg_ls id="4986"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="5008"/>
+    <meta_arg_ls id="5000"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="5022"/>
+    <meta_arg_ls id="5014"/>
    </meta>
    <meta name="remove_logic">
     <meta_arg_ls id="5028"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="5036"/>
+    <meta_arg_ls id="5034"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="5037"/>
+    <meta_arg_ls id="5042"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="5038"/>
+    <meta_arg_ls id="5043"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="5059"/>
+    <meta_arg_ls id="5064"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="5086"/>
+    <meta_arg_ls id="5093"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="5097"/>
+    <meta_arg_ls id="5104"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="5141"/>
+    <meta_arg_ls id="5148"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="5150"/>
+    <meta_arg_ls id="5157"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="5161"/>
+    <meta_arg_ls id="5168"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="5172"/>
+    <meta_arg_ls id="5179"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="5176"/>
+    <meta_arg_ls id="5183"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="5187"/>
+    <meta_arg_ls id="5194"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="5193"/>
+    <meta_arg_ls id="5200"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="5199"/>
+    <meta_arg_ls id="5206"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="5210"/>
+    <meta_arg_ls id="5217"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="5216"/>
+    <meta_arg_ls id="5223"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="5239"/>
+    <meta_arg_ls id="5246"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="5254"/>
+    <meta_arg_ls id="5261"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="5268"/>
+    <meta_arg_ls id="5275"/>
    </meta>
    <meta name="remove_logic">
-    <meta_arg_ls id="5298"/>
+    <meta_arg_ls id="5305"/>
+   </meta>
+   <meta name="remove_prop">
+    <meta_arg_pr id="1951"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="1953"/>
+    <meta_arg_pr id="1958"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="1960"/>
+    <meta_arg_pr id="1961"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="1963"/>
+    <meta_arg_pr id="1964"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="1966"/>
+    <meta_arg_pr id="1967"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="1969"/>
+    <meta_arg_pr id="1970"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="1972"/>
+    <meta_arg_pr id="1975"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="1977"/>
+    <meta_arg_pr id="1982"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="1984"/>
+    <meta_arg_pr id="1989"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="1991"/>
+    <meta_arg_pr id="2007"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2009"/>
+    <meta_arg_pr id="2012"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2014"/>
+    <meta_arg_pr id="2015"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2017"/>
+    <meta_arg_pr id="2027"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2029"/>
+    <meta_arg_pr id="2030"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2032"/>
+    <meta_arg_pr id="2037"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2039"/>
+    <meta_arg_pr id="2042"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2044"/>
+    <meta_arg_pr id="2047"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2049"/>
+    <meta_arg_pr id="2048"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2050"/>
+    <meta_arg_pr id="2055"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2057"/>
+    <meta_arg_pr id="2068"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2070"/>
+    <meta_arg_pr id="2073"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2075"/>
+    <meta_arg_pr id="2194"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2196"/>
+    <meta_arg_pr id="2199"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2201"/>
+    <meta_arg_pr id="2204"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2206"/>
+    <meta_arg_pr id="2211"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2213"/>
+    <meta_arg_pr id="2216"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2218"/>
+    <meta_arg_pr id="2219"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2221"/>
+    <meta_arg_pr id="2222"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2224"/>
+    <meta_arg_pr id="2227"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2229"/>
+    <meta_arg_pr id="2232"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2234"/>
+    <meta_arg_pr id="2235"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2237"/>
+    <meta_arg_pr id="2238"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2240"/>
+    <meta_arg_pr id="2241"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2243"/>
+    <meta_arg_pr id="2244"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2246"/>
+    <meta_arg_pr id="2247"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2249"/>
+    <meta_arg_pr id="2254"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2256"/>
+    <meta_arg_pr id="2826"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2828"/>
+    <meta_arg_pr id="2844"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2846"/>
+    <meta_arg_pr id="2847"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2849"/>
+    <meta_arg_pr id="2863"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2865"/>
+    <meta_arg_pr id="2864"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2866"/>
+    <meta_arg_pr id="2867"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2869"/>
+    <meta_arg_pr id="2878"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2880"/>
+    <meta_arg_pr id="2883"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2885"/>
+    <meta_arg_pr id="2887"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2889"/>
+    <meta_arg_pr id="2891"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2893"/>
+    <meta_arg_pr id="2896"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2898"/>
+    <meta_arg_pr id="2903"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2905"/>
+    <meta_arg_pr id="2916"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2918"/>
+    <meta_arg_pr id="2922"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2924"/>
+    <meta_arg_pr id="2933"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2935"/>
+    <meta_arg_pr id="2938"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2940"/>
+    <meta_arg_pr id="2943"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2945"/>
+    <meta_arg_pr id="2948"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2950"/>
+    <meta_arg_pr id="2953"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="2955"/>
+    <meta_arg_pr id="3032"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="3034"/>
+    <meta_arg_pr id="3035"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="3037"/>
+    <meta_arg_pr id="3042"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="3044"/>
+    <meta_arg_pr id="3045"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="3047"/>
+    <meta_arg_pr id="3053"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="3055"/>
+    <meta_arg_pr id="3060"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="3062"/>
+    <meta_arg_pr id="3171"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="3173"/>
+    <meta_arg_pr id="3180"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="3182"/>
+    <meta_arg_pr id="3722"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="3724"/>
+    <meta_arg_pr id="3729"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="3731"/>
+    <meta_arg_pr id="3782"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="3784"/>
+    <meta_arg_pr id="3821"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="3823"/>
+    <meta_arg_pr id="4052"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="4054"/>
+    <meta_arg_pr id="4053"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="4055"/>
+    <meta_arg_pr id="4056"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="4058"/>
+    <meta_arg_pr id="4057"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="4059"/>
+    <meta_arg_pr id="4062"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="4064"/>
+    <meta_arg_pr id="4065"/>
+   </meta>
+   <meta name="remove_prop">
+    <meta_arg_pr id="4066"/>
    </meta>
    <meta name="remove_prop">
     <meta_arg_pr id="4067"/>
@@ -1975,103 +1971,97 @@
     <meta_arg_pr id="4129"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="4130"/>
-   </meta>
-   <meta name="remove_prop">
-    <meta_arg_pr id="4131"/>
-   </meta>
-   <meta name="remove_prop">
-    <meta_arg_pr id="4941"/>
+    <meta_arg_pr id="4947"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="4944"/>
+    <meta_arg_pr id="4949"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="4952"/>
+    <meta_arg_pr id="4958"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="4955"/>
+    <meta_arg_pr id="4961"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="4962"/>
+    <meta_arg_pr id="4968"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="4969"/>
+    <meta_arg_pr id="4975"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="4976"/>
+    <meta_arg_pr id="4982"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="4981"/>
+    <meta_arg_pr id="4987"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="4986"/>
+    <meta_arg_pr id="4992"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="4995"/>
+    <meta_arg_pr id="5001"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="5000"/>
+    <meta_arg_pr id="5006"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="5009"/>
+    <meta_arg_pr id="5015"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="5014"/>
+    <meta_arg_pr id="5020"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="5023"/>
+    <meta_arg_pr id="5029"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="5029"/>
+    <meta_arg_pr id="5035"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="5034"/>
+    <meta_arg_pr id="5040"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="5035"/>
+    <meta_arg_pr id="5041"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="5044"/>
+    <meta_arg_pr id="5049"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="5054"/>
+    <meta_arg_pr id="5059"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="5151"/>
+    <meta_arg_pr id="5158"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="5156"/>
+    <meta_arg_pr id="5163"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="5162"/>
+    <meta_arg_pr id="5169"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="5167"/>
+    <meta_arg_pr id="5174"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="5173"/>
+    <meta_arg_pr id="5180"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="5177"/>
+    <meta_arg_pr id="5184"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="5182"/>
+    <meta_arg_pr id="5189"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="5188"/>
+    <meta_arg_pr id="5195"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="5194"/>
+    <meta_arg_pr id="5201"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="5245"/>
+    <meta_arg_pr id="5252"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="5287"/>
+    <meta_arg_pr id="5294"/>
    </meta>
    <meta name="remove_prop">
-    <meta_arg_pr id="5307"/>
+    <meta_arg_pr id="5314"/>
    </meta>
    <meta name="remove_type">
     <meta_arg_ts id="2"/>
@@ -2083,27 +2073,18 @@
     <meta_arg_ts id="21"/>
    </meta>
    <meta name="remove_type">
-    <meta_arg_ts id="3738"/>
+    <meta_arg_ts id="3736"/>
    </meta>
    <meta name="remove_type">
-    <meta_arg_ts id="3803"/>
+    <meta_arg_ts id="3801"/>
    </meta>
    <meta name="remove_type">
-    <meta_arg_ts id="3836"/>
+    <meta_arg_ts id="3834"/>
    </meta>
    <meta name="remove_type">
-    <meta_arg_ts id="3892"/>
+    <meta_arg_ts id="3890"/>
    </meta>
    <goal name="WP_parameter t.1" expl="1. assertion">
-   <transf name="eliminate_builtin">
-    <goal name="WP_parameter t.1.1" expl="1. assertion">
-    <proof prover="0" timelimit="60"><result status="valid" time="0.12" steps="148"/></proof>
-    <proof prover="2"><result status="valid" time="0.00"/></proof>
-    <proof prover="3"><result status="valid" time="0.03"/></proof>
-    <proof prover="5"><result status="valid" time="0.01"/></proof>
-    <proof prover="6"><result status="valid" time="0.03"/></proof>
-    </goal>
-   </transf>
    </goal>
   </metas>
   </goal>
@@ -2173,7 +2154,7 @@
    <proof prover="3"><result status="valid" time="0.29"/></proof>
    </goal>
    <goal name="WP_parameter t.22.2" expl="2. assertion">
-   <proof prover="3"><result status="valid" time="6.83"/></proof>
+   <proof prover="3"><result status="valid" time="5.80"/></proof>
    </goal>
   </transf>
   </goal>
@@ -2277,7 +2258,7 @@
    <proof prover="3"><result status="valid" time="0.11"/></proof>
    </goal>
    <goal name="WP_parameter t.49.3" expl="3. loop invariant preservation">
-   <proof prover="3" timelimit="60"><result status="valid" time="36.70"/></proof>
+   <proof prover="3" timelimit="60"><result status="valid" time="32.21"/></proof>
    <proof prover="6" timelimit="60"><result status="valid" time="6.44"/></proof>
    </goal>
   </transf>
@@ -2329,10 +2310,10 @@
   <proof prover="3"><result status="valid" time="0.07"/></proof>
   </goal>
   <goal name="WP_parameter t.62" expl="62. postcondition">
-  <proof prover="0"><result status="valid" time="0.18" steps="87"/></proof>
+  <proof prover="0"><result status="valid" time="0.18" steps="101"/></proof>
   </goal>
   <goal name="WP_parameter t.63" expl="63. postcondition">
-  <proof prover="0"><result status="valid" time="0.19" steps="124"/></proof>
+  <proof prover="0"><result status="valid" time="0.19" steps="137"/></proof>
   </goal>
   <goal name="WP_parameter t.64" expl="64. postcondition">
   <proof prover="3"><result status="valid" time="0.07"/></proof>
diff --git a/examples/queens_bv/why3shapes.gz b/examples/queens_bv/why3shapes.gz
index ae6c3e2bb7a417e70b00282fc8fdcd25e4e213ec..04242a638676917dcec8ab0851ea0872aaf106f9 100644
Binary files a/examples/queens_bv/why3shapes.gz and b/examples/queens_bv/why3shapes.gz differ
diff --git a/examples/rightmostbittrick.mlw b/examples/rightmostbittrick.mlw
index 0a9f75c6c3537fd82be5720399ba5ffaf81401bf..56d3ef0aa986a2175958f52f5e5bbee0b4d36e95 100644
--- a/examples/rightmostbittrick.mlw
+++ b/examples/rightmostbittrick.mlw
@@ -5,15 +5,15 @@ module Rmbt
 
   let ghost rightmost_position_set (a : t) : t
     requires { a <> zeros }
-    ensures  { ult result (of_int 64) }
+    ensures  { ult result (64:t) }
     ensures  { eq_sub_bv a zeros zeros result }
     ensures  { nth_bv a result }
   =
     let i = ref zeros in
-    while ult !i (of_int 64) && not (nth_bv a !i) do
-      variant {64 - to_uint !i}
+    while ult !i (64:t) && not (nth_bv a !i) do
+      variant {64 - t'int !i}
       invariant {eq_sub_bv a zeros zeros !i}
-      i := add !i (of_int 1)
+      i := add !i one
     done;
     !i
 
@@ -28,7 +28,7 @@ module Rmbt
     ensures  { nth result !p }
   =
     let ghost p_bv = rightmost_position_set x in
-    ghost p := to_uint p_bv;
+    ghost p := t'int p_bv;
     assert { nth_bv (neg x) p_bv };
     bw_and x (neg x)
 
diff --git a/examples/rightmostbittrick/why3session.xml b/examples/rightmostbittrick/why3session.xml
index 5906a523d714a72e769f92aee76ca75d9f2ea919..789b1df62da32167a4923b502c5e2f44ff3a5c3a 100644
--- a/examples/rightmostbittrick/why3session.xml
+++ b/examples/rightmostbittrick/why3session.xml
@@ -2,100 +2,100 @@
 <!DOCTYPE why3session PUBLIC "-//Why3//proof session v5//EN"
 "http://why3.lri.fr/why3session.dtd">
 <why3session shape_version="4">
-<prover id="0" name="Alt-Ergo" version="0.99.1" timelimit="5" steplimit="0" memlimit="1000"/>
+<prover id="0" name="Z3" version="4.5.0" timelimit="5" steplimit="0" memlimit="1000"/>
+<prover id="1" name="Z3" version="4.5.0" alternative="noBV" timelimit="5" steplimit="0" memlimit="1000"/>
 <prover id="2" name="CVC4" version="1.4" timelimit="5" steplimit="0" memlimit="1000"/>
-<prover id="4" name="Z3" version="4.4.0" alternative="noBV" timelimit="5" steplimit="0" memlimit="1000"/>
+<prover id="3" name="Alt-Ergo" version="1.01" timelimit="5" steplimit="0" memlimit="1000"/>
 <prover id="5" name="CVC4" version="1.4" alternative="noBV" timelimit="5" steplimit="0" memlimit="1000"/>
-<prover id="6" name="Z3" version="4.4.0" timelimit="5" steplimit="0" memlimit="1000"/>
+<prover id="7" name="Z3" version="4.3.2" timelimit="5" steplimit="0" memlimit="1000"/>
 <file name="../rightmostbittrick.mlw" expanded="true">
-<theory name="Rmbt" sum="20adbd3247e4350745dafae5c88a22b8" expanded="true">
+<theory name="Rmbt" sum="0aebb1809faa7083f6388aa7f9abe2b5" expanded="true">
  <goal name="WP_parameter rightmost_position_set" expl="VC for rightmost_position_set" expanded="true">
  <transf name="split_goal_wp" expanded="true">
   <goal name="WP_parameter rightmost_position_set.1" expl="1. loop invariant init">
-  <proof prover="0"><result status="valid" time="0.05" steps="80"/></proof>
   <proof prover="2"><result status="valid" time="0.01"/></proof>
+  <proof prover="3"><result status="valid" time="0.05" steps="72"/></proof>
   <proof prover="5"><result status="valid" time="0.02"/></proof>
-  <proof prover="6"><result status="valid" time="0.01"/></proof>
+  <proof prover="7"><result status="valid" time="0.58"/></proof>
   </goal>
-  <goal name="WP_parameter rightmost_position_set.2" expl="2. loop invariant preservation">
-  <proof prover="2"><result status="valid" time="0.03"/></proof>
+  <goal name="WP_parameter rightmost_position_set.2" expl="2. loop invariant preservation" expanded="true">
+  <proof prover="0"><result status="valid" time="0.20"/></proof>
+  <proof prover="2"><result status="valid" time="0.15"/></proof>
   <proof prover="5"><result status="valid" time="0.07"/></proof>
-  <proof prover="6"><result status="valid" time="0.02"/></proof>
   </goal>
   <goal name="WP_parameter rightmost_position_set.3" expl="3. loop variant decrease">
-  <proof prover="0"><result status="valid" time="1.25" steps="240"/></proof>
   <proof prover="2"><result status="valid" time="0.06"/></proof>
+  <proof prover="3"><result status="valid" time="0.12" steps="81"/></proof>
   <proof prover="5"><result status="valid" time="0.02"/></proof>
   </goal>
   <goal name="WP_parameter rightmost_position_set.4" expl="4. postcondition">
   <proof prover="2"><result status="valid" time="0.01"/></proof>
-  <proof prover="6"><result status="valid" time="0.01"/></proof>
+  <proof prover="7"><result status="valid" time="0.00"/></proof>
   </goal>
   <goal name="WP_parameter rightmost_position_set.5" expl="5. postcondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="71"/></proof>
+  <proof prover="1"><result status="valid" time="0.00"/></proof>
   <proof prover="2"><result status="valid" time="0.02"/></proof>
-  <proof prover="4"><result status="valid" time="0.00"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="74"/></proof>
   <proof prover="5"><result status="valid" time="0.02"/></proof>
-  <proof prover="6"><result status="valid" time="0.00"/></proof>
+  <proof prover="7"><result status="valid" time="0.00"/></proof>
   </goal>
   <goal name="WP_parameter rightmost_position_set.6" expl="6. postcondition">
-  <proof prover="0"><result status="valid" time="0.05" steps="71"/></proof>
+  <proof prover="1"><result status="valid" time="0.00"/></proof>
   <proof prover="2"><result status="valid" time="0.02"/></proof>
-  <proof prover="4"><result status="valid" time="0.00"/></proof>
+  <proof prover="3"><result status="valid" time="0.05" steps="74"/></proof>
   <proof prover="5"><result status="valid" time="0.01"/></proof>
-  <proof prover="6"><result status="valid" time="0.00"/></proof>
+  <proof prover="7"><result status="valid" time="0.00"/></proof>
   </goal>
-  <goal name="WP_parameter rightmost_position_set.7" expl="7. postcondition">
+  <goal name="WP_parameter rightmost_position_set.7" expl="7. postcondition" expanded="true">
+  <proof prover="0"><result status="valid" time="0.04"/></proof>
   <proof prover="2"><result status="valid" time="0.01"/></proof>
-  <proof prover="6"><result status="valid" time="0.00"/></proof>
   </goal>
   <goal name="WP_parameter rightmost_position_set.8" expl="8. postcondition">
-  <proof prover="0"><result status="valid" time="0.05" steps="70"/></proof>
+  <proof prover="1"><result status="valid" time="0.00"/></proof>
   <proof prover="2"><result status="valid" time="0.01"/></proof>
-  <proof prover="4"><result status="valid" time="0.00"/></proof>
+  <proof prover="3"><result status="valid" time="0.05" steps="73"/></proof>
   <proof prover="5"><result status="valid" time="0.02"/></proof>
-  <proof prover="6"><result status="valid" time="0.00"/></proof>
+  <proof prover="7"><result status="valid" time="0.00"/></proof>
   </goal>
-  <goal name="WP_parameter rightmost_position_set.9" expl="9. postcondition">
+  <goal name="WP_parameter rightmost_position_set.9" expl="9. postcondition" expanded="true">
+  <proof prover="0"><result status="valid" time="0.06"/></proof>
   <proof prover="2"><result status="valid" time="0.02"/></proof>
-  <proof prover="6"><result status="valid" time="0.00"/></proof>
   </goal>
  </transf>
  </goal>
  <goal name="WP_parameter rightmost_bit_trick" expl="VC for rightmost_bit_trick" expanded="true">
  <transf name="split_goal_wp" expanded="true">
   <goal name="WP_parameter rightmost_bit_trick.1" expl="1. precondition">
-  <proof prover="0"><result status="valid" time="0.04" steps="68"/></proof>
+  <proof prover="1"><result status="valid" time="0.00"/></proof>
   <proof prover="2"><result status="valid" time="0.00"/></proof>
-  <proof prover="4"><result status="valid" time="0.00"/></proof>
+  <proof prover="3"><result status="valid" time="0.04" steps="70"/></proof>
   <proof prover="5"><result status="valid" time="0.02"/></proof>
-  <proof prover="6"><result status="valid" time="0.00"/></proof>
+  <proof prover="7"><result status="valid" time="0.00"/></proof>
   </goal>
   <goal name="WP_parameter rightmost_bit_trick.2" expl="2. assertion">
   <proof prover="2"><result status="valid" time="0.02"/></proof>
-  <proof prover="6"><result status="valid" time="0.03"/></proof>
   </goal>
   <goal name="WP_parameter rightmost_bit_trick.3" expl="3. postcondition">
-  <proof prover="0"><result status="valid" time="0.07" steps="98"/></proof>
   <proof prover="2"><result status="valid" time="0.02"/></proof>
+  <proof prover="3"><result status="valid" time="0.07" steps="78"/></proof>
   <proof prover="5"><result status="valid" time="0.03"/></proof>
   </goal>
   <goal name="WP_parameter rightmost_bit_trick.4" expl="4. postcondition">
-  <proof prover="0"><result status="valid" time="0.18" steps="122"/></proof>
+  <proof prover="3"><result status="valid" time="0.02" steps="80"/></proof>
   <proof prover="5"><result status="valid" time="0.03"/></proof>
   </goal>
   <goal name="WP_parameter rightmost_bit_trick.5" expl="5. postcondition">
-  <proof prover="0"><result status="valid" time="0.02" steps="75"/></proof>
+  <proof prover="3"><result status="valid" time="0.02" steps="78"/></proof>
   <proof prover="5"><result status="valid" time="0.02"/></proof>
   </goal>
   <goal name="WP_parameter rightmost_bit_trick.6" expl="6. postcondition">
   <proof prover="2"><result status="valid" time="0.43"/></proof>
   </goal>
-  <goal name="WP_parameter rightmost_bit_trick.7" expl="7. postcondition" expanded="true">
+  <goal name="WP_parameter rightmost_bit_trick.7" expl="7. postcondition">
   <proof prover="2"><result status="valid" time="0.27"/></proof>
   </goal>
   <goal name="WP_parameter rightmost_bit_trick.8" expl="8. postcondition">
-  <proof prover="0"><result status="valid" time="0.15" steps="133"/></proof>
+  <proof prover="3"><result status="valid" time="0.15" steps="131"/></proof>
   <proof prover="5"><result status="valid" time="0.03"/></proof>
   </goal>
  </transf>
diff --git a/examples/rightmostbittrick/why3shapes.gz b/examples/rightmostbittrick/why3shapes.gz
index 11242f1aeaabe65551be408b2f137de366a9c50c..d2b7a38ab331ae249b765aa159dfe67ecc3c6894 100644
Binary files a/examples/rightmostbittrick/why3shapes.gz and b/examples/rightmostbittrick/why3shapes.gz differ
diff --git a/examples/tests-provers/bv.why b/examples/tests-provers/bv.why
index 4b9eb1729b76ce178fffcd8601e714dc6f85ae93..fcb47c3af239accbf808e3dfe45cf1fe852ec5ab 100644
--- a/examples/tests-provers/bv.why
+++ b/examples/tests-provers/bv.why
@@ -11,8 +11,8 @@ theory CheckBV64
 
   goal ok_zero   : zeros                                     = (of_int 0)
   goal ok_ones   : ones                                      = (of_int mx)
-  goal ok_zero2  : to_uint zeros                             = 0
-  goal ok_ones2  : to_uint ones                              = mx
+  goal ok_zero2  : t'int zeros                             = 0
+  goal ok_ones2  : t'int ones                              = mx
   goal ok_size   : size                                      = sz
   goal ok_max    : max_int                                   = mx
   goal ok_tpsize : two_power_size                            = md
@@ -88,8 +88,8 @@ theory CheckBV64
   goal g5a : asr_bv b0111 (of_int 2)                         = b0001
   goal g5b : asr_bv ones (of_int (Int.(-) size 1))           = ones
 
-  goal g7 : to_uint b11100                                   = 28
-  goal f7 : to_uint ones                                     = Int.(-_) 1
+  goal g7 : t'int b11100                                   = 28
+  goal f7 : t'int ones                                     = Int.(-_) 1
 
   goal g8a : nth_bv b0110 (of_int 2)                         = True
   goal g8b : nth_bv b0110 (of_int 3)                         = False
@@ -154,8 +154,8 @@ theory CheckBV32
 
   goal ok_zero   : zeros                                     = (of_int 0)
   goal ok_ones   : ones                                      = (of_int mx)
-  goal ok_zero2  : to_uint zeros                             = 0
-  goal ok_ones2  : to_uint ones                              = mx
+  goal ok_zero2  : t'int zeros                             = 0
+  goal ok_ones2  : t'int ones                              = mx
   goal ok_size   : size                                      = sz
   goal ok_max    : max_int                                   = mx
   goal ok_tpsize : two_power_size                            = md
@@ -212,8 +212,8 @@ theory CheckBV16
 
   goal ok_zero   : zeros                                     = (of_int 0)
   goal ok_ones   : ones                                      = (of_int mx)
-  goal ok_zero2  : to_uint zeros                             = 0
-  goal ok_ones2  : to_uint ones                              = mx
+  goal ok_zero2  : t'int zeros                             = 0
+  goal ok_ones2  : t'int ones                              = mx
   goal ok_size   : size                                      = sz
   goal ok_max    : max_int                                   = mx
   goal ok_tpsize : two_power_size                            = md
@@ -270,8 +270,8 @@ theory CheckBV8
 
   goal ok_zero   : zeros                                     = (of_int 0)
   goal ok_ones   : ones                                      = (of_int mx)
-  goal ok_zero2  : to_uint zeros                             = 0
-  goal ok_ones2  : to_uint ones                              = mx
+  goal ok_zero2  : t'int zeros                             = 0
+  goal ok_ones2  : t'int ones                              = mx
   goal ok_size   : size                                      = sz
   goal ok_max    : max_int                                   = mx
   goal ok_tpsize : two_power_size                            = md
diff --git a/examples/tests-provers/bv/why3session.xml b/examples/tests-provers/bv/why3session.xml
index 21c8ba4d43b4d56304b5c4b9b3c4fa003a6e7ab0..6b2e72db62f80260f55920b10d9c9e0cdd7d0b96 100644
--- a/examples/tests-provers/bv/why3session.xml
+++ b/examples/tests-provers/bv/why3session.xml
@@ -9,47 +9,47 @@
 <prover id="4" name="Z3" version="4.4.0" timelimit="5" steplimit="0" memlimit="1000"/>
 <prover id="5" name="Alt-Ergo" version="1.01" timelimit="1" steplimit="0" memlimit="1000"/>
 <file name="../bv.why" expanded="true">
-<theory name="CheckBV64" sum="5b43844b07e4444709c3531e7d99634a">
+<theory name="CheckBV64" sum="855747e71f46058c96f9a701bed1fff5" expanded="true">
  <goal name="ok_zero">
- <proof prover="0"><result status="valid" time="0.02" steps="67"/></proof>
+ <proof prover="0"><result status="valid" time="0.02" steps="87"/></proof>
  <proof prover="1"><result status="valid" time="0.02"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok_ones">
- <proof prover="0"><result status="valid" time="0.03" steps="67"/></proof>
+ <proof prover="0"><result status="valid" time="0.03" steps="87"/></proof>
  <proof prover="1"><result status="valid" time="0.02"/></proof>
  <proof prover="2"><result status="valid" time="0.02"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok_zero2">
- <proof prover="0"><result status="valid" time="0.02" steps="71"/></proof>
+ <proof prover="0"><result status="valid" time="0.02" steps="69"/></proof>
  <proof prover="1"><result status="valid" time="0.06"/></proof>
  <proof prover="2"><result status="valid" time="0.02"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok_ones2">
- <proof prover="0"><result status="valid" time="0.03" steps="71"/></proof>
+ <proof prover="0"><result status="valid" time="0.03" steps="69"/></proof>
  <proof prover="1"><result status="valid" time="0.06"/></proof>
  <proof prover="2"><result status="valid" time="0.02"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok_size">
- <proof prover="0"><result status="valid" time="0.02" steps="67"/></proof>
+ <proof prover="0"><result status="valid" time="0.02" steps="69"/></proof>
  <proof prover="1"><result status="valid" time="0.02"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="3" timelimit="5"><result status="valid" time="0.01"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok_max">
- <proof prover="0"><result status="valid" time="0.02" steps="67"/></proof>
+ <proof prover="0"><result status="valid" time="0.02" steps="69"/></proof>
  <proof prover="1"><result status="valid" time="0.02"/></proof>
  <proof prover="2"><result status="valid" time="0.02"/></proof>
  <proof prover="3" timelimit="5"><result status="valid" time="0.01"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok_tpsize">
- <proof prover="0"><result status="valid" time="0.02" steps="67"/></proof>
+ <proof prover="0"><result status="valid" time="0.02" steps="69"/></proof>
  <proof prover="1"><result status="valid" time="0.02"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="3" timelimit="5"><result status="valid" time="0.01"/></proof>
@@ -69,7 +69,7 @@
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok5">
- <proof prover="0"><result status="valid" time="0.08" steps="78"/></proof>
+ <proof prover="0"><result status="valid" time="0.08" steps="95"/></proof>
  <proof prover="1"><result status="valid" time="0.07"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
@@ -89,13 +89,13 @@
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok9">
- <proof prover="0"><result status="valid" time="0.10" steps="79"/></proof>
+ <proof prover="0"><result status="valid" time="0.10" steps="97"/></proof>
  <proof prover="1"><result status="valid" time="0.06"/></proof>
  <proof prover="2"><result status="valid" time="0.02"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok10">
- <proof prover="0"><result status="valid" time="0.16" steps="107"/></proof>
+ <proof prover="0"><result status="valid" time="0.16" steps="97"/></proof>
  <proof prover="1"><result status="valid" time="0.07"/></proof>
  <proof prover="2"><result status="valid" time="0.02"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
@@ -197,21 +197,20 @@
  </goal>
  <goal name="smoke4">
  <proof prover="0" timelimit="1"><result status="timeout" time="1.00"/></proof>
- <proof prover="1"><result status="unknown" time="0.39"/></proof>
+ <proof prover="1"><result status="unknown" time="0.56"/></proof>
  <proof prover="2"><result status="unknown" time="0.01"/></proof>
  <proof prover="3"><result status="timeout" time="0.95"/></proof>
  <proof prover="4" timelimit="1"><result status="timeout" time="1.00"/></proof>
  </goal>
- <goal name="smoke5">
+ <goal name="smoke5" expanded="true">
  <proof prover="0" timelimit="1"><result status="timeout" time="1.01"/></proof>
- <proof prover="1"><result status="timeout" time="5.00"/></proof>
  <proof prover="2"><result status="unknown" time="0.01"/></proof>
  <proof prover="3"><result status="timeout" time="0.92"/></proof>
  <proof prover="4" timelimit="1"><result status="timeout" time="1.00"/></proof>
  </goal>
  <goal name="smoke6">
  <proof prover="0" timelimit="1"><result status="timeout" time="1.00"/></proof>
- <proof prover="1"><result status="unknown" time="0.83"/></proof>
+ <proof prover="1"><result status="unknown" time="0.46"/></proof>
  <proof prover="2"><result status="unknown" time="0.00"/></proof>
  <proof prover="3"><result status="timeout" time="0.96"/></proof>
  <proof prover="4" timelimit="1"><result status="timeout" time="1.00"/></proof>
@@ -236,7 +235,7 @@
  </goal>
  <goal name="f1">
  <proof prover="0" timelimit="1"><result status="timeout" time="1.00"/></proof>
- <proof prover="1"><result status="unknown" time="0.71"/></proof>
+ <proof prover="1"><result status="unknown" time="0.90"/></proof>
  <proof prover="2"><result status="unknown" time="0.01"/></proof>
  <proof prover="3"><result status="timeout" time="0.94"/></proof>
  <proof prover="4" timelimit="1"><result status="timeout" time="1.00"/></proof>
@@ -266,7 +265,7 @@
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="g3b">
- <proof prover="1"><result status="valid" time="0.46"/></proof>
+ <proof prover="1"><result status="valid" time="0.99"/></proof>
  <transf name="compute_in_goal">
   <goal name="g3b.1" expl="1.">
   <proof prover="2"><result status="valid" time="0.01"/></proof>
@@ -282,13 +281,13 @@
  <proof prover="4" timelimit="1"><result status="timeout" time="1.00"/></proof>
  </goal>
  <goal name="g4a">
- <proof prover="0"><result status="valid" time="0.06" steps="82"/></proof>
+ <proof prover="0"><result status="valid" time="0.06" steps="100"/></proof>
  <proof prover="1"><result status="valid" time="0.07"/></proof>
  <proof prover="2"><result status="valid" time="0.03"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="g4b">
- <proof prover="0"><result status="valid" time="0.05" steps="82"/></proof>
+ <proof prover="0"><result status="valid" time="0.05" steps="100"/></proof>
  <proof prover="1"><result status="valid" time="0.07"/></proof>
  <proof prover="2"><result status="valid" time="0.02"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
@@ -302,7 +301,7 @@
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="g7">
- <proof prover="0"><result status="valid" time="0.04" steps="71"/></proof>
+ <proof prover="0"><result status="valid" time="0.04" steps="74"/></proof>
  <proof prover="1"><result status="valid" time="0.02"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="3" timelimit="5"><result status="valid" time="0.12"/></proof>
@@ -324,25 +323,25 @@
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="Nth_Bv_bw_and">
- <proof prover="0"><result status="valid" time="0.18" steps="152"/></proof>
- <proof prover="1"><result status="valid" time="0.07"/></proof>
+ <proof prover="0"><result status="valid" time="0.18" steps="219"/></proof>
+ <proof prover="1"><result status="valid" time="0.20"/></proof>
  <proof prover="2"><result status="valid" time="0.02"/></proof>
  <proof prover="4"><result status="valid" time="0.02"/></proof>
  </goal>
  <goal name="Nth_Bv_bw_or">
- <proof prover="0"><result status="valid" time="0.28" steps="175"/></proof>
+ <proof prover="0"><result status="valid" time="0.28" steps="255"/></proof>
  <proof prover="1"><result status="valid" time="0.31"/></proof>
  <proof prover="2"><result status="valid" time="0.03"/></proof>
  <proof prover="4"><result status="valid" time="0.02"/></proof>
  </goal>
  <goal name="Nth_Bv_bw_xor">
- <proof prover="0"><result status="valid" time="0.34" steps="245"/></proof>
+ <proof prover="0"><result status="valid" time="0.53" steps="323"/></proof>
  <proof prover="1"><result status="valid" time="0.30"/></proof>
  <proof prover="2"><result status="valid" time="0.02"/></proof>
  <proof prover="4"><result status="valid" time="0.01"/></proof>
  </goal>
  <goal name="Nth_Bv_bw_not">
- <proof prover="0"><result status="valid" time="0.08" steps="113"/></proof>
+ <proof prover="0"><result status="valid" time="0.08" steps="134"/></proof>
  <proof prover="1"><result status="valid" time="0.07"/></proof>
  <proof prover="2"><result status="valid" time="0.02"/></proof>
  <proof prover="4"><result status="valid" time="0.01"/></proof>
@@ -359,15 +358,15 @@
  <proof prover="1"><result status="valid" time="0.20"/></proof>
  <proof prover="2"><result status="valid" time="0.68"/></proof>
  <proof prover="4"><result status="valid" time="0.28"/></proof>
- <proof prover="5"><result status="valid" time="0.12" steps="170"/></proof>
+ <proof prover="5"><result status="valid" time="0.12" steps="249"/></proof>
  </goal>
  <goal name="Lsr_Bv_nth_bv_high">
  <proof prover="2"><result status="valid" time="0.02"/></proof>
  <proof prover="4"><result status="valid" time="0.01"/></proof>
- <proof prover="5"><result status="valid" time="0.10" steps="113"/></proof>
+ <proof prover="5"><result status="valid" time="0.10" steps="114"/></proof>
  </goal>
  <goal name="Asr_Bv_nth_bv_low">
- <proof prover="0"><result status="valid" time="0.21" steps="133"/></proof>
+ <proof prover="0"><result status="valid" time="0.21" steps="138"/></proof>
  <proof prover="1"><result status="valid" time="0.21"/></proof>
  <proof prover="2"><result status="valid" time="0.67"/></proof>
  <proof prover="4"><result status="valid" time="0.28"/></proof>
@@ -386,47 +385,47 @@
  <proof prover="4"><result status="valid" time="0.02"/></proof>
  </goal>
 </theory>
-<theory name="CheckBV32" sum="fceb5fb2799cf2b42152016cda87d36f">
+<theory name="CheckBV32" sum="b1a27c5773887143af0b808502b49f11">
  <goal name="ok_zero">
- <proof prover="0"><result status="valid" time="0.03" steps="67"/></proof>
+ <proof prover="0"><result status="valid" time="0.03" steps="87"/></proof>
  <proof prover="1"><result status="valid" time="0.03"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok_ones">
- <proof prover="0"><result status="valid" time="0.04" steps="67"/></proof>
+ <proof prover="0"><result status="valid" time="0.04" steps="87"/></proof>
  <proof prover="1"><result status="valid" time="0.04"/></proof>
  <proof prover="2"><result status="valid" time="0.02"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok_zero2">
- <proof prover="0"><result status="valid" time="0.04" steps="71"/></proof>
+ <proof prover="0"><result status="valid" time="0.04" steps="69"/></proof>
  <proof prover="1"><result status="valid" time="0.01"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok_ones2">
- <proof prover="0"><result status="valid" time="0.04" steps="71"/></proof>
+ <proof prover="0"><result status="valid" time="0.04" steps="69"/></proof>
  <proof prover="1"><result status="valid" time="0.10"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok_size">
- <proof prover="0"><result status="valid" time="0.04" steps="67"/></proof>
+ <proof prover="0"><result status="valid" time="0.04" steps="69"/></proof>
  <proof prover="1"><result status="valid" time="0.04"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="3" timelimit="5"><result status="valid" time="0.01"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok_max">
- <proof prover="0"><result status="valid" time="0.04" steps="67"/></proof>
+ <proof prover="0"><result status="valid" time="0.04" steps="69"/></proof>
  <proof prover="1"><result status="valid" time="0.04"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="3" timelimit="5"><result status="valid" time="0.00"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok_tpsize">
- <proof prover="0"><result status="valid" time="0.04" steps="67"/></proof>
+ <proof prover="0"><result status="valid" time="0.04" steps="69"/></proof>
  <proof prover="1"><result status="valid" time="0.04"/></proof>
  <proof prover="2"><result status="valid" time="0.02"/></proof>
  <proof prover="3" timelimit="5"><result status="valid" time="0.00"/></proof>
@@ -446,7 +445,7 @@
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok5">
- <proof prover="0"><result status="valid" time="0.14" steps="78"/></proof>
+ <proof prover="0"><result status="valid" time="0.14" steps="95"/></proof>
  <proof prover="1"><result status="valid" time="0.07"/></proof>
  <proof prover="2"><result status="valid" time="0.02"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
@@ -466,13 +465,13 @@
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok9">
- <proof prover="0"><result status="valid" time="0.10" steps="79"/></proof>
+ <proof prover="0"><result status="valid" time="0.10" steps="97"/></proof>
  <proof prover="1"><result status="valid" time="0.07"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok10">
- <proof prover="0"><result status="valid" time="0.14" steps="107"/></proof>
+ <proof prover="0"><result status="valid" time="0.14" steps="97"/></proof>
  <proof prover="1"><result status="valid" time="0.06"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
@@ -483,7 +482,7 @@
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok13">
- <proof prover="1"><result status="valid" time="0.45"/></proof>
+ <proof prover="1"><result status="valid" time="1.08"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
@@ -582,14 +581,13 @@
  </goal>
  <goal name="smoke5">
  <proof prover="0" timelimit="1"><result status="timeout" time="1.01"/></proof>
- <proof prover="1"><result status="unknown" time="3.12"/></proof>
  <proof prover="2"><result status="unknown" time="0.01"/></proof>
  <proof prover="3"><result status="timeout" time="0.92"/></proof>
  <proof prover="4" timelimit="1"><result status="timeout" time="1.00"/></proof>
  </goal>
  <goal name="smoke6">
  <proof prover="0" timelimit="1"><result status="timeout" time="1.00"/></proof>
- <proof prover="1"><result status="unknown" time="0.87"/></proof>
+ <proof prover="1"><result status="unknown" time="0.45"/></proof>
  <proof prover="2"><result status="unknown" time="0.01"/></proof>
  <proof prover="3"><result status="timeout" time="0.94"/></proof>
  <proof prover="4" timelimit="1"><result status="timeout" time="1.00"/></proof>
@@ -609,47 +607,47 @@
  <proof prover="4" timelimit="1"><result status="timeout" time="1.00"/></proof>
  </goal>
 </theory>
-<theory name="CheckBV16" sum="1c14003ec4c22dc07ba8fd53215e3698">
+<theory name="CheckBV16" sum="519ba81a22fcf5e81486ce11e8ce3427">
  <goal name="ok_zero">
- <proof prover="0"><result status="valid" time="0.04" steps="67"/></proof>
+ <proof prover="0"><result status="valid" time="0.04" steps="87"/></proof>
  <proof prover="1"><result status="valid" time="0.04"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok_ones">
- <proof prover="0"><result status="valid" time="0.04" steps="67"/></proof>
+ <proof prover="0"><result status="valid" time="0.04" steps="87"/></proof>
  <proof prover="1"><result status="valid" time="0.04"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok_zero2">
- <proof prover="0"><result status="valid" time="0.04" steps="71"/></proof>
+ <proof prover="0"><result status="valid" time="0.04" steps="69"/></proof>
  <proof prover="1"><result status="valid" time="0.02"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok_ones2">
- <proof prover="0"><result status="valid" time="0.04" steps="71"/></proof>
+ <proof prover="0"><result status="valid" time="0.04" steps="69"/></proof>
  <proof prover="1"><result status="valid" time="0.02"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok_size">
- <proof prover="0"><result status="valid" time="0.04" steps="67"/></proof>
+ <proof prover="0"><result status="valid" time="0.04" steps="69"/></proof>
  <proof prover="1"><result status="valid" time="0.04"/></proof>
  <proof prover="2"><result status="valid" time="0.02"/></proof>
  <proof prover="3" timelimit="5"><result status="valid" time="0.01"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok_max">
- <proof prover="0"><result status="valid" time="0.03" steps="67"/></proof>
+ <proof prover="0"><result status="valid" time="0.03" steps="69"/></proof>
  <proof prover="1"><result status="valid" time="0.04"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="3" timelimit="5"><result status="valid" time="0.00"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok_tpsize">
- <proof prover="0"><result status="valid" time="0.04" steps="67"/></proof>
+ <proof prover="0"><result status="valid" time="0.04" steps="69"/></proof>
  <proof prover="1"><result status="valid" time="0.04"/></proof>
  <proof prover="2"><result status="valid" time="0.02"/></proof>
  <proof prover="3" timelimit="5"><result status="valid" time="0.01"/></proof>
@@ -669,7 +667,7 @@
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok5">
- <proof prover="0"><result status="valid" time="0.05" steps="78"/></proof>
+ <proof prover="0"><result status="valid" time="0.05" steps="95"/></proof>
  <proof prover="1"><result status="valid" time="0.07"/></proof>
  <proof prover="2"><result status="valid" time="0.02"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
@@ -689,13 +687,13 @@
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok9">
- <proof prover="0"><result status="valid" time="0.14" steps="79"/></proof>
+ <proof prover="0"><result status="valid" time="0.14" steps="97"/></proof>
  <proof prover="1"><result status="valid" time="0.07"/></proof>
  <proof prover="2"><result status="valid" time="0.02"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok10">
- <proof prover="0"><result status="valid" time="0.24" steps="107"/></proof>
+ <proof prover="0"><result status="valid" time="0.10" steps="97"/></proof>
  <proof prover="1"><result status="valid" time="0.07"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
@@ -706,7 +704,7 @@
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok13">
- <proof prover="1"><result status="valid" time="0.46"/></proof>
+ <proof prover="1"><result status="valid" time="1.08"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
@@ -805,14 +803,13 @@
  </goal>
  <goal name="smoke5">
  <proof prover="0" timelimit="1"><result status="timeout" time="1.00"/></proof>
- <proof prover="1"><result status="unknown" time="2.92"/></proof>
  <proof prover="2"><result status="unknown" time="0.00"/></proof>
  <proof prover="3"><result status="timeout" time="0.94"/></proof>
  <proof prover="4" timelimit="1"><result status="timeout" time="0.99"/></proof>
  </goal>
  <goal name="smoke6">
  <proof prover="0" timelimit="1"><result status="timeout" time="1.00"/></proof>
- <proof prover="1"><result status="unknown" time="0.76"/></proof>
+ <proof prover="1"><result status="unknown" time="0.46"/></proof>
  <proof prover="2"><result status="unknown" time="0.01"/></proof>
  <proof prover="3"><result status="timeout" time="0.95"/></proof>
  <proof prover="4" timelimit="1"><result status="timeout" time="1.00"/></proof>
@@ -832,47 +829,47 @@
  <proof prover="4" timelimit="1"><result status="timeout" time="1.00"/></proof>
  </goal>
 </theory>
-<theory name="CheckBV8" sum="eb2d76e4b801f8a40c099f691ff08bdb">
+<theory name="CheckBV8" sum="ea95238af7ceb1367f64579161f51818">
  <goal name="ok_zero">
- <proof prover="0"><result status="valid" time="0.04" steps="67"/></proof>
+ <proof prover="0"><result status="valid" time="0.04" steps="87"/></proof>
  <proof prover="1"><result status="valid" time="0.05"/></proof>
  <proof prover="2"><result status="valid" time="0.00"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok_ones">
- <proof prover="0"><result status="valid" time="0.02" steps="67"/></proof>
+ <proof prover="0"><result status="valid" time="0.02" steps="87"/></proof>
  <proof prover="1"><result status="valid" time="0.05"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok_zero2">
- <proof prover="0"><result status="valid" time="0.03" steps="71"/></proof>
+ <proof prover="0"><result status="valid" time="0.03" steps="69"/></proof>
  <proof prover="1"><result status="valid" time="0.06"/></proof>
  <proof prover="2"><result status="valid" time="0.02"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok_ones2">
- <proof prover="0"><result status="valid" time="0.02" steps="71"/></proof>
+ <proof prover="0"><result status="valid" time="0.02" steps="69"/></proof>
  <proof prover="1"><result status="valid" time="0.12"/></proof>
  <proof prover="2"><result status="valid" time="0.02"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok_size">
- <proof prover="0"><result status="valid" time="0.02" steps="67"/></proof>
+ <proof prover="0"><result status="valid" time="0.02" steps="69"/></proof>
  <proof prover="1"><result status="valid" time="0.02"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="3" timelimit="5"><result status="valid" time="0.01"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok_max">
- <proof prover="0"><result status="valid" time="0.02" steps="67"/></proof>
+ <proof prover="0"><result status="valid" time="0.02" steps="69"/></proof>
  <proof prover="1"><result status="valid" time="0.04"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="3" timelimit="5"><result status="valid" time="0.01"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok_tpsize">
- <proof prover="0"><result status="valid" time="0.02" steps="67"/></proof>
+ <proof prover="0"><result status="valid" time="0.02" steps="69"/></proof>
  <proof prover="1"><result status="valid" time="0.04"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="3" timelimit="5"><result status="valid" time="0.01"/></proof>
@@ -892,7 +889,7 @@
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok5">
- <proof prover="0"><result status="valid" time="0.04" steps="78"/></proof>
+ <proof prover="0"><result status="valid" time="0.04" steps="95"/></proof>
  <proof prover="1"><result status="valid" time="0.07"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
@@ -912,13 +909,13 @@
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok9">
- <proof prover="0"><result status="valid" time="0.14" steps="79"/></proof>
+ <proof prover="0"><result status="valid" time="0.14" steps="97"/></proof>
  <proof prover="1"><result status="valid" time="0.07"/></proof>
  <proof prover="2"><result status="valid" time="0.02"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok10">
- <proof prover="0"><result status="valid" time="0.25" steps="107"/></proof>
+ <proof prover="0"><result status="valid" time="0.10" steps="97"/></proof>
  <proof prover="1"><result status="valid" time="0.07"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
@@ -929,7 +926,7 @@
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
  <goal name="ok13">
- <proof prover="1"><result status="valid" time="0.46"/></proof>
+ <proof prover="1"><result status="valid" time="1.20"/></proof>
  <proof prover="2"><result status="valid" time="0.01"/></proof>
  <proof prover="4"><result status="valid" time="0.00"/></proof>
  </goal>
@@ -1028,14 +1025,13 @@
  </goal>
  <goal name="smoke5">
  <proof prover="0" timelimit="1"><result status="timeout" time="1.00"/></proof>
- <proof prover="1"><result status="timeout" time="4.99"/></proof>
  <proof prover="2"><result status="unknown" time="0.00"/></proof>
  <proof prover="3"><result status="timeout" time="0.94"/></proof>
  <proof prover="4" timelimit="1"><result status="timeout" time="1.00"/></proof>
  </goal>
  <goal name="smoke6">
  <proof prover="0" timelimit="1"><result status="timeout" time="1.00"/></proof>
- <proof prover="1"><result status="unknown" time="0.75"/></proof>
+ <proof prover="1"><result status="unknown" time="0.44"/></proof>
  <proof prover="2"><result status="unknown" time="0.01"/></proof>
  <proof prover="3"><result status="timeout" time="0.95"/></proof>
  <proof prover="4" timelimit="1"><result status="timeout" time="1.00"/></proof>
diff --git a/examples/tests-provers/bv/why3shapes.gz b/examples/tests-provers/bv/why3shapes.gz
index d0a5985e41d5a7211eaa02524de1eae2da64bcce..757b02cab677443cb94deee42b886f363fbddc2e 100644
Binary files a/examples/tests-provers/bv/why3shapes.gz and b/examples/tests-provers/bv/why3shapes.gz differ
diff --git a/examples/tests/bv-smtlib-realization.why b/examples/tests/bv-smtlib-realization.why
index 5a98f0b24217ea4dcb6da4733b78bbc986e8ded5..421cfd7cd10997016c30fa57c29db734c8d4298a 100644
--- a/examples/tests/bv-smtlib-realization.why
+++ b/examples/tests/bv-smtlib-realization.why
@@ -22,15 +22,15 @@ theory BV_Check
   lemma max_int_val : max_int = two_power_size - 1
 
   lemma to_uint_extensionality :
-    forall v,v':t. to_uint v = to_uint v' -> v = v'
+    forall v,v':t. t'int v = t'int v' -> v = v'
 
   lemma to_int_extensionality:
     forall v,v':t. to_int v = to_int v' -> v = v'
 
-  lemma to_uint_bounds : forall v:t. 0 <= to_uint v < two_power_size
+  lemma to_uint_bounds : forall v:t. 0 <= t'int v < two_power_size
 
   lemma to_uint_of_int :
-    forall i. 0 <= i < two_power_size -> to_uint (of_int i) = i
+    forall i. 0 <= i < two_power_size -> t'int (of_int i) = i
 
   lemma Of_int_zero: zeros = of_int 0
 
@@ -106,13 +106,13 @@ theory BV_Check
 
   (* comparison operators *)
 
-  goal ult_spec: forall x y. ult x y <-> Int.(<) (to_uint x) (to_uint y)
+  goal ult_spec: forall x y. ult x y <-> Int.(<) (t'int x) (t'int y)
 
-  goal ule_spec: forall x y. ule x y <-> Int.(<=) (to_uint x) (to_uint y)
+  goal ule_spec: forall x y. ule x y <-> Int.(<=) (t'int x) (t'int y)
 
-  goal ugt_spec: forall x y. ugt x y <-> Int.(>) (to_uint x) (to_uint y)
+  goal ugt_spec: forall x y. ugt x y <-> Int.(>) (t'int x) (t'int y)
 
-  goal uge_spec: forall x y. uge x y <-> Int.(>=) (to_uint x) (to_uint y)
+  goal uge_spec: forall x y. uge x y <-> Int.(>=) (t'int x) (t'int y)
 
   goal slt_spec: forall x y. slt x y  <-> Int.(<) (to_int x) (to_int y)
 
@@ -125,47 +125,47 @@ theory BV_Check
   (** Arithmetic operators *)
 
   goal to_uint_add:
-    forall v1 v2. to_uint (add v1 v2) =  mod (Int.(+) (to_uint v1) (to_uint v2)) two_power_size
+    forall v1 v2. t'int (add v1 v2) =  mod (Int.(+) (t'int v1) (t'int v2)) two_power_size
   goal to_uint_add_bounded:
     forall v1 v2.
-      to_uint v1 + to_uint v2 < two_power_size ->
-      to_uint (add v1 v2) = to_uint v1 + to_uint v2
+      t'int v1 + t'int v2 < two_power_size ->
+      t'int (add v1 v2) = t'int v1 + t'int v2
 
   goal to_uint_sub:
-    forall v1 v2. to_uint (sub v1 v2) = mod (Int.(-) (to_uint v1) (to_uint v2)) two_power_size
+    forall v1 v2. t'int (sub v1 v2) = mod (Int.(-) (t'int v1) (t'int v2)) two_power_size
   goal to_uint_sub_bounded:
     forall v1 v2.
-      0 <= to_uint v1 - to_uint v2 < two_power_size ->
-      to_uint (sub v1 v2) = to_uint v1 - to_uint v2
+      0 <= t'int v1 - t'int v2 < two_power_size ->
+      t'int (sub v1 v2) = t'int v1 - t'int v2
 
   goal to_uint_neg:
-    forall v. to_uint (neg v) = mod (Int.(-_) (to_uint v)) two_power_size
+    forall v. t'int (neg v) = mod (Int.(-_) (t'int v)) two_power_size
 
   goal to_uint_mul:
-    forall v1 v2. to_uint (mul v1 v2) = mod (Int.( * ) (to_uint v1) (to_uint v2)) two_power_size
+    forall v1 v2. t'int (mul v1 v2) = mod (Int.( * ) (t'int v1) (t'int v2)) two_power_size
   goal to_uint_mul_bounded:
     forall v1 v2.
-      to_uint v1 * to_uint v2 < two_power_size ->
-      to_uint (mul v1 v2) = to_uint v1 * to_uint v2
+      t'int v1 * t'int v2 < two_power_size ->
+      t'int (mul v1 v2) = t'int v1 * t'int v2
 
   goal to_uint_udiv:
-    forall v1 v2. to_uint (udiv v1 v2) = div (to_uint v1) (to_uint v2)
+    forall v1 v2. t'int (udiv v1 v2) = div (t'int v1) (t'int v2)
 
   goal to_uint_urem:
-    forall v1 v2. to_uint (urem v1 v2) = mod (to_uint v1) (to_uint v2)
+    forall v1 v2. t'int (urem v1 v2) = mod (t'int v1) (t'int v2)
 
   goal to_uint_lsr:
     forall v n : t.
-      to_uint (lsr_bv v n) = div (to_uint v) (pow2 ( to_uint n ))
+      t'int (lsr_bv v n) = div (t'int v) (pow2 ( t'int n ))
 
   goal to_uint_lsl:
     forall v n : t.
-         to_uint (lsl_bv v n) = mod (Int.( * ) (to_uint v) (pow2 (to_uint n))) two_power_size
+         t'int (lsl_bv v n) = mod (Int.( * ) (t'int v) (pow2 (t'int n))) two_power_size
 
   (* equality goals *)
 
   goal eq_sub_equiv: forall a b i n:t.
-      eq_sub    a b (to_uint i) (to_uint n)
+      eq_sub    a b (t'int i) (t'int n)
   <-> eq_sub_bv a b i n
 
   goal Extensionality: forall x y : t [eq x y]. eq x y -> x = y
@@ -177,9 +177,9 @@ theory BVConverter_Check
   use import bv.BVConverter_32_64
 
   goal toSmall_to_uint :
-    forall x. in_range x -> BV64.to_uint x = BV32.to_uint (toSmall x)
+    forall x. in_range x -> BV64.t'int x = BV32.t'int (toSmall x)
 
   goal toBig_to_uint :
-    forall x. BV32.to_uint x = BV64.to_uint (toBig x)
+    forall x. BV32.t'int x = BV64.t'int (toBig x)
 
 end
diff --git a/examples/use_api/logic.ml b/examples/use_api/logic.ml
index e3357d62d4e5db8123746783b6c66869970cccce..a01286ecca8f92243446af6d1515a75a865e1bf0 100644
--- a/examples/use_api/logic.ml
+++ b/examples/use_api/logic.ml
@@ -120,12 +120,14 @@ An arithmetic goal: 2+2 = 4
 
 *)
 
-let two : Term.term = Term.t_const (Number.ConstInt (Number.int_const_dec "2"))
-let four : Term.term = Term.t_const (Number.ConstInt (Number.int_const_dec "4"))
-let int_theory : Theory.theory =
-  Env.read_theory env ["int"] "Int"
+let two  : Term.term = Term.t_nat_const 2
+let four : Term.term = Term.t_nat_const 4
+
+let int_theory : Theory.theory = Env.read_theory env ["int"] "Int"
+
 let plus_symbol : Term.lsymbol =
   Theory.ns_find_ls int_theory.Theory.th_export ["infix +"]
+
 let two_plus_two : Term.term = Term.fs_app plus_symbol [two;two] Ty.ty_int
 let two_plus_two : Term.term = Term.t_app_infer plus_symbol [two;two]
 let fmla3 : Term.term = Term.t_equ two_plus_two four
@@ -150,19 +152,20 @@ let () = printf "@[On task 3, alt-ergo answers %a@."
   Call_provers.print_prover_result result3
 
 (* quantifiers: let's build "forall x:int. x*x >= 0" *)
-let zero : Term.term = Term.t_const (Number.ConstInt (Number.int_const_dec "0"))
+let zero : Term.term = Term.t_nat_const 0
+
 let mult_symbol : Term.lsymbol =
   Theory.ns_find_ls int_theory.Theory.th_export ["infix *"]
+
 let ge_symbol : Term.lsymbol =
   Theory.ns_find_ls int_theory.Theory.th_export ["infix >="]
 
 let var_x : Term.vsymbol =
   Term.create_vsymbol (Ident.id_fresh "x") Ty.ty_int
+
 let x : Term.term = Term.t_var var_x
-let x_times_x : Term.term =
-  Term.t_app_infer mult_symbol [x;x]
-let fmla4_aux : Term.term =
-  Term.ps_app ge_symbol [x_times_x;zero]
+let x_times_x : Term.term = Term.t_app_infer mult_symbol [x;x]
+let fmla4_aux : Term.term = Term.ps_app ge_symbol [x_times_x;zero]
 let fmla4 : Term.term = Term.t_forall_close [var_x] [] fmla4_aux
 
 let task4 = None
@@ -275,9 +278,9 @@ let d =
   }
   in
   let body =
-    let c6 = Term.t_const (Number.ConstInt (Number.int_const_dec "6")) in
-    let c7 = Term.t_const (Number.ConstInt (Number.int_const_dec "7")) in
-    let c42 = Term.t_const (Number.ConstInt (Number.int_const_dec "42")) in
+    let c6 = Term.t_nat_const 6 in
+    let c7 = Term.t_nat_const 7 in
+    let c42 = Term.t_nat_const 42 in
     let p =
       Term.t_equ (Term.t_app_infer mul_int [c6;c7]) c42
     in
@@ -344,7 +347,8 @@ let d2 =
       (* e1 : the appropriate instance of "ref" *)
       let e1 = Mlw_expr.e_arrow ref_fun [Mlw_ty.ity_int] ity in
       (* we apply it to 0 *)
-      let c0 = Mlw_expr.e_const (Number.ConstInt (Number.int_const_dec "0")) in
+      let c0 = Mlw_expr.e_const
+        (Number.ConstInt (Number.int_const_dec "0")) Mlw_ty.ity_int in
       Mlw_expr.e_app e1 [c0]
     in
     (* building the first part of the let x = ref 0 *)
diff --git a/examples/use_api/mlw.ml b/examples/use_api/mlw.ml
index 14e2d5e5e29ab6e5a2f59ad90bb4bfece04fb6be..4ec0b3e332ee2f6a2b3d3beb95aa4510e77ce1d1 100644
--- a/examples/use_api/mlw.ml
+++ b/examples/use_api/mlw.ml
@@ -11,7 +11,7 @@
 
 (*******************
 
-This file builds some MLW modules using the API 
+This file builds some MLW modules using the API
 
 ******************)
 
@@ -64,9 +64,9 @@ let d =
   }
   in
   let body =
-    let c6 = Term.t_const (Number.ConstInt (Number.int_const_dec "6")) in
-    let c7 = Term.t_const (Number.ConstInt (Number.int_const_dec "7")) in
-    let c42 = Term.t_const (Number.ConstInt (Number.int_const_dec "42")) in
+    let c6  = Term.t_nat_const 6 in
+    let c7  = Term.t_nat_const 7 in
+    let c42 = Term.t_nat_const 42 in
     let p =
       Term.t_equ (Term.t_app_infer mul_int [c6;c7]) c42
     in
@@ -134,7 +134,8 @@ let d2 =
       (* e1 : the appropriate instance of "ref" *)
       let e1 = Mlw_expr.e_arrow ref_fun [Mlw_ty.ity_int] ity in
       (* we apply it to 0 *)
-      let c0 = Mlw_expr.e_const (Number.ConstInt (Number.int_const_dec "0")) in
+      let c0 = Mlw_expr.e_const
+        (Number.ConstInt (Number.int_const_dec "0")) Mlw_ty.ity_int in
       Mlw_expr.e_app e1 [c0]
     in
     (* building the first part of the let x = ref 0 *)
diff --git a/lib/coq/bv/BV_Gen.v.COQ84 b/lib/coq/bv/BV_Gen.v.COQ84
index d344a38ec48cbb19e3cf795562321584419f41f4..b56f67d7e0560b2999ca4806404d2055a6e0f380 100644
--- a/lib/coq/bv/BV_Gen.v.COQ84
+++ b/lib/coq/bv/BV_Gen.v.COQ84
@@ -11,15 +11,15 @@ Require bv.Pow2int.
 Definition last_bit : nat.
 Admitted.
 
-Definition size_bv: nat := S last_bit.
+Definition size_nat: nat := S last_bit.
 
 (* Why3 goal *)
 Definition size: Z.
-  exact (Z.of_nat size_bv).
+  exact (Z.of_nat size_nat).
 Defined.
 
 Lemma size_int_S : size = Z.succ (Z.of_nat last_bit).
-  unfold size, size_bv.
+  unfold size, size_nat.
   rewrite Nat2Z.inj_succ; trivial.
 Qed.
 
@@ -32,7 +32,7 @@ Require Import Bool.Bvector.
 
 (* Why3 goal *)
 Definition t : Type.
-  exact (Bvector size_bv).
+  exact (Bvector size_nat).
 Defined.
 
 Fixpoint nth_aux {l} (v : Vector.t bool l) (m : Z) : bool :=
@@ -228,13 +228,22 @@ Lemma Nth_zeros : forall (n:Z), ((nth zeros n) = false).
 intros n; apply Nth_zeros_aux.
 Qed.
 
+Definition one_aux l : Vector.t bool (S l).
+  exact (Vector.cons bool true l (Vector.const false l)).
+Defined.
+
+(* Why3 goal *)
+Definition one: t.
+  exact (one_aux last_bit).
+Defined.
+
 Definition ones_aux l : Vector.t bool l.
   exact (Vector.const true l).
 Defined.
 
 (* Why3 goal *)
 Definition ones: t.
-  exact (ones_aux size_bv).
+  exact (ones_aux size_nat).
 Defined.
 
 (* Why3 goal *)
@@ -415,7 +424,7 @@ Lemma BshiftRa_iter_nth_low : forall (b:t) (s:nat) (n:Z),
   rewrite <- Zplus_succ_r_reverse, <- Z.add_succ_l.
   apply IHs; omega.
   omega.
-  fold size_bv; fold size; omega.
+  fold size_nat; fold size; omega.
 Qed.
 
 (* Why3 goal *)
@@ -461,7 +470,7 @@ Lemma BhiftRa_iter_nth_high : forall (b:t) (s:nat) (n:Z),
   intro; rewrite nth_aux_shiftin_low.
   apply IHs; omega.
   omega.
-  fold size_bv; fold size; omega.
+  fold size_nat; fold size; omega.
 Qed.
 
 (* Why3 goal *)
@@ -1057,7 +1066,7 @@ Lemma Nth_rotate_right : forall (v:t) (n:Z) (i:Z), ((0%Z <= i)%Z /\
   revert H0.
   pattern i.
   apply Z_of_nat_prop; auto.
-  unfold nth, rotate_right, size, size_bv.
+  unfold nth, rotate_right, size, size_nat.
   intro n.
   rewrite Nat2Z.inj_succ.
   intros. rewrite Nat2Z.id.
@@ -1080,7 +1089,7 @@ Lemma Nth_rotate_left : forall (v:t) (n:Z) (i:Z), ((0%Z <= i)%Z /\
   revert H0.
   pattern i.
   apply Z_of_nat_prop; auto.
-  unfold nth, rotate_left, size, size_bv.
+  unfold nth, rotate_left, size, size_nat.
   intro n.
   rewrite Nat2Z.inj_succ.
   intros. rewrite Nat2Z.id.
@@ -1109,12 +1118,12 @@ Qed.
 
 (* Why3 goal *)
 Definition to_int: t -> Z.
-  exact (twos_complement size_bv).
+  exact (twos_complement size_nat).
 Defined.
 
 (* Why3 goal *)
 Definition to_uint: t -> Z.
-  exact (fun x => Z.of_nat (bvec_to_nat size_bv x)).
+  exact (fun x => Z.of_nat (bvec_to_nat size_nat x)).
 Defined.
 
 Lemma max_int_S : (two_power_size = max_int + 1)%Z.
@@ -1123,7 +1132,7 @@ Qed.
 
 (* Why3 goal *)
 Definition of_int: Z -> t.
-  exact (fun x => nat_to_bvec size_bv (Z.to_nat x)).
+  exact (fun x => nat_to_bvec size_nat (Z.to_nat x)).
 Defined.
 
 (* Why3 goal *)
@@ -1155,7 +1164,7 @@ Lemma to_uint_bounds : forall (v:t), (0%Z <= (to_uint v))%Z /\
   rewrite Z2Nat.id.
   easy.
   unfold two_power_size, size.
-  transitivity (Pow2int.pow2 (Z.of_nat size_bv) - 1);[apply max_int_nat|omega].
+  transitivity (Pow2int.pow2 (Z.of_nat size_nat) - 1);[apply max_int_nat|omega].
   rewrite H.
   apply inj_lt.
   apply bvec_to_nat_range.
@@ -1230,7 +1239,7 @@ Lemma to_uint_lsl_aux : forall (v:t) (n:nat), ((to_uint (lsl v
   unfold BshiftL, Bcons, to_uint.
   simpl BshiftL_iter.
   rewrite <- Nat2Z.id with (n := n).
-  change (Z.of_nat (2 * bvec_to_nat last_bit (Vector.shiftout (lsl v (Z.of_nat n)))) = (Z.of_nat (bvec_to_nat size_bv v) * Pow2int.pow2 (Z.of_nat (S (Z.to_nat (Z.of_nat n)))))  mod two_power_size)%Z.
+  change (Z.of_nat (2 * bvec_to_nat last_bit (Vector.shiftout (lsl v (Z.of_nat n)))) = (Z.of_nat (bvec_to_nat size_nat v) * Pow2int.pow2 (Z.of_nat (S (Z.to_nat (Z.of_nat n)))))  mod two_power_size)%Z.
   rewrite Nat2Z.id.
   rewrite Nat2Z.inj_mul.
   rewrite bvec_to_nat_shiftout_mod1.
@@ -1260,15 +1269,68 @@ Lemma to_uint_of_int : forall (i:Z), ((0%Z <= i)%Z /\
 Qed.
 
 (* Why3 goal *)
-Lemma Of_int_zeros : (zeros = (of_int 0%Z)).
+Definition size_bv: t.
+  exact (of_int size).
+Defined.
+
+(* Why3 goal *)
+Lemma to_uint_size_bv : ((to_uint size_bv) = size).
+  apply to_uint_of_int.
+  rewrite max_int_S.
+  destruct size_in_range; auto with zarith.
+Qed.
+
+Lemma Of_int_zeros: zeros = of_int 0.
 apply Nat_to_bvec_zeros.
 Qed.
 
 (* Why3 goal *)
-Lemma Of_int_ones : (ones = (of_int max_int)).
+Lemma to_uint_zeros : ((to_uint zeros) = 0%Z).
+  rewrite Of_int_zeros.
+  apply to_uint_of_int; easy.
+Qed.
+
+Lemma to_uint_one_aux : forall {l}, bvec_to_nat (S l) (one_aux l) = 1%nat.
+  intro l.
+  simpl.
+  rewrite bvec_to_nat_zeros.
+  auto with zarith.
+Qed.
+
+Lemma Of_int_one_aux : forall {l}, one_aux l = nat_to_bvec (S l) 1%nat.
+  intro l.
+  apply bvec_to_nat_extensionality.
+  rewrite bvec_to_nat_nat_to_bvec.
+  apply to_uint_one_aux.
+  pose proof (id_lt_pow2 l).
+  zify.
+  auto with zarith.
+Qed.
+
+(* Why3 goal *)
+Lemma to_uint_one : ((to_uint one) = 1%Z).
+  unfold to_uint, one.
+  simpl.
+  rewrite bvec_to_nat_zeros.
+  auto with zarith.
+Qed.
+
+Lemma Of_int_one : one = of_int 1.
+  apply Of_int_one_aux.
+Qed.
+
+Lemma Of_int_ones: ones = of_int max_int.
   apply Nat_to_bvec_ones.
 Qed.
 
+(* Why3 goal *)
+Lemma to_uint_ones : ((to_uint ones) = max_int).
+  rewrite Of_int_ones.
+  apply to_uint_of_int.
+  rewrite max_int_S.
+  destruct size_in_range; auto with zarith.
+Qed.
+
 (* Why3 assumption *)
 Definition ult (x:t) (y:t): Prop := ((to_uint x) < (to_uint y))%Z.
 
@@ -1507,8 +1569,9 @@ Lemma and_zeros : forall {l} (x:Vector.t bool l),
 Qed.
 
 Lemma nth_bv_def_aux : forall {l} (x:Vector.t bool (S l)) (i:Z),
-                         nth_aux x 0 = true <-> (Vector.map2 (fun a b => a && b) x (nat_to_bvec (S l) 1)) <> zeros_aux.
+                         nth_aux x 0 = true <-> (Vector.map2 (fun a b => a && b) x (one_aux l)) <> zeros_aux.
   intros.
+  rewrite Of_int_one_aux.
   destruct x.
   simpl.
   split; [easy|auto].
@@ -1523,7 +1586,7 @@ Qed.
 
 (* Why3 goal *)
 Lemma nth_bv_def : forall (x:t) (i:t), ((nth_bv x i) = true) <->
-  ~ ((bw_and (lsr_bv x i) (of_int 1%Z)) = zeros).
+  ~ ((bw_and (lsr_bv x i) one) = zeros).
   intros; unfold nth_bv.
   case (Z_lt_ge_dec (to_uint i) size); intro.
   rewrite <-(Zplus_0_l (to_uint i)).
@@ -1579,8 +1642,9 @@ Defined.
 
 (* Why3 goal *)
 Lemma eq_sub_bv_def : forall (a:t) (b:t) (i:t) (n:t), let mask :=
-  (lsl_bv (sub (lsl_bv (of_int 1%Z) n) (of_int 1%Z)) i) in ((eq_sub_bv a b i
-  n) <-> ((bw_and b mask) = (bw_and a mask))).
+  (lsl_bv (sub (lsl_bv one n) one) i) in ((eq_sub_bv a b i n) <-> ((bw_and b
+  mask) = (bw_and a mask))).
+  rewrite Of_int_one.
   easy.
 Qed.
 
@@ -1793,6 +1857,23 @@ Lemma nth_bit_pred_high :
   apply IHn; rewrite <-H1; rewrite Nat2Z.inj_succ in H0; omega.
 Qed.
 
+  Lemma one_nth: forall {l},
+    nat_to_bvec (S l) 1
+    = Vector.cons bool true l (Vector.const false _).
+    intro.
+    change (Bcons (Z.odd (Z.of_nat 1)) l (nat_to_bvec l (Div2.div2 1)) = true :: Vector.const false l).
+    assert (Z.odd (Z.of_nat 1) = true) by auto with zarith.
+    rewrite H.
+    assert (Div2.div2 1 = 0%nat) by auto with zarith.
+    rewrite H0.
+    assert (nat_to_bvec l 0 = Vector.const false l).
+    induction l.
+    auto.
+    change (Bcons (Z.odd (Z.of_nat 0)) l (nat_to_bvec l (Div2.div2 0)) = false :: Vector.const false l).
+    rewrite <-IHl; auto.
+    rewrite H1; trivial.
+  Qed.
+
 Lemma nth_bit_pred_low :
   forall n i,
     to_uint i >= Z.of_nat n ->
@@ -1831,23 +1912,7 @@ Lemma nth_bit_pred_low :
   apply IHn.
   rewrite <-H0; omega.
   assert (to_uint i > 0) by omega.
-  Lemma one_nth: forall {l},
-    nat_to_bvec (S l) 1
-    = Vector.cons bool true l (Vector.const false _).
-    intro.
-    change (Bcons (Z.odd (Z.of_nat 1)) l (nat_to_bvec l (Div2.div2 1)) = true :: Vector.const false l).
-    assert (Z.odd (Z.of_nat 1) = true) by auto with zarith.
-    rewrite H.
-    assert (Div2.div2 1 = 0%nat) by auto with zarith.
-    rewrite H0.
-    assert (nat_to_bvec l 0 = Vector.const false l).
-    induction l.
-    auto.
-    change (Bcons (Z.odd (Z.of_nat 0)) l (nat_to_bvec l (Div2.div2 0)) = false :: Vector.const false l).
-    rewrite <-IHl; auto.
-    rewrite H1; trivial.
-  Qed.
-  unfold of_int, size, size_bv.
+  unfold of_int, size, size_nat.
   rewrite one_nth.
   rewrite nth_cons_pred by auto with zarith.
   apply Nth_zeros_aux.
@@ -1936,7 +2001,7 @@ Lemma eq_sub_equiv : forall (a:t) (b:t) (i:t) (n:t), (eq_sub a b (to_uint i)
   case (Z_lt_ge_dec j size); intro.
 
   pose (to_uint_bounds i) as u; unfold uint_in_range in u.
-  assert (0 <= j < Z.of_nat size_bv) by auto with zarith.
+  assert (0 <= j < Z.of_nat size_nat) by auto with zarith.
   pose (H j H1).
   fold nth in e; rewrite Nth_bw_and, Nth_bw_and in e by auto.
   destruct H0.
diff --git a/lib/coq/bv/BV_Gen.v.COQ85 b/lib/coq/bv/BV_Gen.v.COQ85
index ce74d62b42329e71b436ba63be288d46baacf4b3..493d0f662235b2c4d394bec1ba805c3f8287a9e0 100644
--- a/lib/coq/bv/BV_Gen.v.COQ85
+++ b/lib/coq/bv/BV_Gen.v.COQ85
@@ -205,7 +205,6 @@ unfold nth.
 rewrite nth_aux_out_of_bound; auto with zarith.
 Qed.
 
-
 Definition zeros_aux {l} : Vector.t bool l.
   exact (Vector.const false l).
 Defined.
@@ -227,6 +226,15 @@ Lemma Nth_zeros : forall (n:Z), ((nth zeros n) = false).
 intros n; apply Nth_zeros_aux.
 Qed.
 
+Definition one_aux l : Vector.t bool (S l).
+  exact (Vector.cons bool true l (Vector.const false l)).
+Defined.
+
+(* Why3 goal *)
+Definition one: t.
+  exact (one_aux last_bit).
+Defined.
+
 Definition ones_aux l : Vector.t bool l.
   exact (Vector.const true l).
 Defined.
@@ -1259,15 +1267,68 @@ Lemma to_uint_of_int : forall (i:Z), ((0%Z <= i)%Z /\
 Qed.
 
 (* Why3 goal *)
-Lemma Of_int_zeros : (zeros = (of_int 0%Z)).
+Definition size_bv: t.
+  exact (of_int size).
+Defined.
+
+(* Why3 goal *)
+Lemma to_uint_size_bv : ((to_uint size_bv) = size).
+  apply to_uint_of_int.
+  rewrite max_int_S.
+  destruct size_in_range; auto with zarith.
+Qed.
+
+Lemma Of_int_zeros: zeros = of_int 0.
 apply Nat_to_bvec_zeros.
 Qed.
 
 (* Why3 goal *)
-Lemma Of_int_ones : (ones = (of_int max_int)).
+Lemma to_uint_zeros : ((to_uint zeros) = 0%Z).
+  rewrite Of_int_zeros.
+  apply to_uint_of_int; easy.
+Qed.
+
+Lemma to_uint_one_aux : forall {l}, bvec_to_nat (S l) (one_aux l) = 1%nat.
+  intro l.
+  simpl.
+  rewrite bvec_to_nat_zeros.
+  auto with zarith.
+Qed.
+
+Lemma Of_int_one_aux : forall {l}, one_aux l = nat_to_bvec (S l) 1%nat.
+  intro l.
+  apply bvec_to_nat_extensionality.
+  rewrite bvec_to_nat_nat_to_bvec.
+  apply to_uint_one_aux.
+  pose proof (id_lt_pow2 l).
+  zify.
+  auto with zarith.
+Qed.
+
+(* Why3 goal *)
+Lemma to_uint_one : ((to_uint one) = 1%Z).
+  unfold to_uint, one.
+  simpl.
+  rewrite bvec_to_nat_zeros.
+  auto with zarith.
+Qed.
+
+Lemma Of_int_one : one = of_int 1.
+  apply Of_int_one_aux.
+Qed.
+
+Lemma Of_int_ones: ones = of_int max_int.
   apply Nat_to_bvec_ones.
 Qed.
 
+(* Why3 goal *)
+Lemma to_uint_ones : ((to_uint ones) = max_int).
+  rewrite Of_int_ones.
+  apply to_uint_of_int.
+  rewrite max_int_S.
+  destruct size_in_range; auto with zarith.
+Qed.
+
 (* Why3 assumption *)
 Definition ult (x:t) (y:t): Prop := ((to_uint x) < (to_uint y))%Z.
 
@@ -1506,8 +1567,9 @@ Lemma and_zeros : forall {l} (x:Vector.t bool l),
 Qed.
 
 Lemma nth_bv_def_aux : forall {l} (x:Vector.t bool (S l)) (i:Z),
-                         nth_aux x 0 = true <-> (Vector.map2 (fun a b => a && b) x (nat_to_bvec (S l) 1)) <> zeros_aux.
+                         nth_aux x 0 = true <-> (Vector.map2 (fun a b => a && b) x (one_aux l)) <> zeros_aux.
   intros.
+  rewrite Of_int_one_aux.
   destruct x.
   simpl.
   split; [easy|auto].
@@ -1522,7 +1584,7 @@ Qed.
 
 (* Why3 goal *)
 Lemma nth_bv_def : forall (x:t) (i:t), ((nth_bv x i) = true) <->
-  ~ ((bw_and (lsr_bv x i) (of_int 1%Z)) = zeros).
+  ~ ((bw_and (lsr_bv x i) one) = zeros).
   intros; unfold nth_bv.
   case (Z_lt_ge_dec (to_uint i) size); intro.
   rewrite <-(Zplus_0_l (to_uint i)).
@@ -1578,8 +1640,9 @@ Defined.
 
 (* Why3 goal *)
 Lemma eq_sub_bv_def : forall (a:t) (b:t) (i:t) (n:t), let mask :=
-  (lsl_bv (sub (lsl_bv (of_int 1%Z) n) (of_int 1%Z)) i) in ((eq_sub_bv a b i
-  n) <-> ((bw_and b mask) = (bw_and a mask))).
+  (lsl_bv (sub (lsl_bv one n) one) i) in ((eq_sub_bv a b i n) <-> ((bw_and b
+  mask) = (bw_and a mask))).
+  rewrite Of_int_one.
   easy.
 Qed.
 
diff --git a/lib/coq/bv/BV_Gen.v.COQ86 b/lib/coq/bv/BV_Gen.v.COQ86
index ce74d62b42329e71b436ba63be288d46baacf4b3..4451b6726ca63c5afdd9702fbd694c0a2b57361b 100644
--- a/lib/coq/bv/BV_Gen.v.COQ86
+++ b/lib/coq/bv/BV_Gen.v.COQ86
@@ -227,6 +227,15 @@ Lemma Nth_zeros : forall (n:Z), ((nth zeros n) = false).
 intros n; apply Nth_zeros_aux.
 Qed.
 
+Definition one_aux l : Vector.t bool (S l).
+  exact (Vector.cons bool true l (Vector.const false l)).
+Defined.
+
+(* Why3 goal *)
+Definition one: t.
+  exact (one_aux last_bit).
+Defined.
+
 Definition ones_aux l : Vector.t bool l.
   exact (Vector.const true l).
 Defined.
@@ -1259,15 +1268,68 @@ Lemma to_uint_of_int : forall (i:Z), ((0%Z <= i)%Z /\
 Qed.
 
 (* Why3 goal *)
-Lemma Of_int_zeros : (zeros = (of_int 0%Z)).
+Definition size_bv: t.
+  exact (of_int size).
+Defined.
+
+(* Why3 goal *)
+Lemma to_uint_size_bv : ((to_uint size_bv) = size).
+  apply to_uint_of_int.
+  rewrite max_int_S.
+  destruct size_in_range; auto with zarith.
+Qed.
+
+Lemma Of_int_zeros: zeros = of_int 0.
 apply Nat_to_bvec_zeros.
 Qed.
 
 (* Why3 goal *)
-Lemma Of_int_ones : (ones = (of_int max_int)).
+Lemma to_uint_zeros : ((to_uint zeros) = 0%Z).
+  rewrite Of_int_zeros.
+  apply to_uint_of_int; easy.
+Qed.
+
+Lemma to_uint_one_aux : forall {l}, bvec_to_nat (S l) (one_aux l) = 1%nat.
+  intro l.
+  simpl.
+  rewrite bvec_to_nat_zeros.
+  auto with zarith.
+Qed.
+
+Lemma Of_int_one_aux : forall {l}, one_aux l = nat_to_bvec (S l) 1%nat.
+  intro l.
+  apply bvec_to_nat_extensionality.
+  rewrite bvec_to_nat_nat_to_bvec.
+  apply to_uint_one_aux.
+  pose proof (id_lt_pow2 l).
+  zify.
+  auto with zarith.
+Qed.
+
+(* Why3 goal *)
+Lemma to_uint_one : ((to_uint one) = 1%Z).
+  unfold to_uint, one.
+  simpl.
+  rewrite bvec_to_nat_zeros.
+  auto with zarith.
+Qed.
+
+Lemma Of_int_one : one = of_int 1.
+  apply Of_int_one_aux.
+Qed.
+
+Lemma Of_int_ones: ones = of_int max_int.
   apply Nat_to_bvec_ones.
 Qed.
 
+(* Why3 goal *)
+Lemma to_uint_ones : ((to_uint ones) = max_int).
+  rewrite Of_int_ones.
+  apply to_uint_of_int.
+  rewrite max_int_S.
+  destruct size_in_range; auto with zarith.
+Qed.
+
 (* Why3 assumption *)
 Definition ult (x:t) (y:t): Prop := ((to_uint x) < (to_uint y))%Z.
 
@@ -1506,8 +1568,9 @@ Lemma and_zeros : forall {l} (x:Vector.t bool l),
 Qed.
 
 Lemma nth_bv_def_aux : forall {l} (x:Vector.t bool (S l)) (i:Z),
-                         nth_aux x 0 = true <-> (Vector.map2 (fun a b => a && b) x (nat_to_bvec (S l) 1)) <> zeros_aux.
+                         nth_aux x 0 = true <-> (Vector.map2 (fun a b => a && b) x (one_aux l)) <> zeros_aux.
   intros.
+  rewrite Of_int_one_aux.
   destruct x.
   simpl.
   split; [easy|auto].
@@ -1522,7 +1585,7 @@ Qed.
 
 (* Why3 goal *)
 Lemma nth_bv_def : forall (x:t) (i:t), ((nth_bv x i) = true) <->
-  ~ ((bw_and (lsr_bv x i) (of_int 1%Z)) = zeros).
+  ~ ((bw_and (lsr_bv x i) one) = zeros).
   intros; unfold nth_bv.
   case (Z_lt_ge_dec (to_uint i) size); intro.
   rewrite <-(Zplus_0_l (to_uint i)).
@@ -1578,8 +1641,9 @@ Defined.
 
 (* Why3 goal *)
 Lemma eq_sub_bv_def : forall (a:t) (b:t) (i:t) (n:t), let mask :=
-  (lsl_bv (sub (lsl_bv (of_int 1%Z) n) (of_int 1%Z)) i) in ((eq_sub_bv a b i
-  n) <-> ((bw_and b mask) = (bw_and a mask))).
+  (lsl_bv (sub (lsl_bv one n) one) i) in ((eq_sub_bv a b i n) <-> ((bw_and b
+  mask) = (bw_and a mask))).
+  rewrite Of_int_one.
   easy.
 Qed.
 
diff --git a/modules/mach/bv.mlw b/modules/mach/bv.mlw
index d7b527d4608639d8ddf7c637c478f91954d26940..7cee6846f6d1f2d2c214140971f28ac831e85c7a 100644
--- a/modules/mach/bv.mlw
+++ b/modules/mach/bv.mlw
@@ -148,7 +148,7 @@ module BVCheck8
     constant size = size,
     function two_power_size = two_power_size,
     function zeros = zeros,
-    function to_uint = to_uint,
+    function to_uint = t'int,
     function of_int = of_int,
     function add = add,
     function sub = sub,
@@ -176,7 +176,7 @@ module BVCheck16
     constant size = size,
     function two_power_size = two_power_size,
     function zeros = zeros,
-    function to_uint = to_uint,
+    function to_uint = t'int,
     function of_int = of_int,
     function add = add,
     function sub = sub,
@@ -204,7 +204,7 @@ module BVCheck32
     constant size = size,
     function two_power_size = two_power_size,
     function zeros = zeros,
-    function to_uint = to_uint,
+    function to_uint = t'int,
     function of_int = of_int,
     function add = add,
     function sub = sub,
@@ -232,7 +232,7 @@ module BVCheck64
     constant size = size,
     function two_power_size = two_power_size,
     function zeros = zeros,
-    function to_uint = to_uint,
+    function to_uint = t'int,
     function of_int = of_int,
     function add = add,
     function sub = sub,
diff --git a/plugins/tptp/tptp_printer.ml b/plugins/tptp/tptp_printer.ml
index 644044db8218273b474151dd88a5ea8f11c488e1..a5af74712fcb5e66cc6df2ded1a690dd8e2dc311 100644
--- a/plugins/tptp/tptp_printer.ml
+++ b/plugins/tptp/tptp_printer.ml
@@ -62,7 +62,7 @@ type info = {
 
 let complex_type = Wty.memoize 3 (fun ty ->
   let s = Pp.string_of_wnl Pretty.print_ty ty in
-  create_tysymbol (id_fresh s) [] None)
+  create_tysymbol (id_fresh s) [] NoDef)
 
 let rec print_type info fmt ty = match ty.ty_node with
   | Tyvar _ when info.info_fmt = TFF0 ->
@@ -200,7 +200,7 @@ let print_fmla info fmt f =
 
 let print_decl info fmt d = match d.d_node with
   | Dtype _ when info.info_fmt = FOF -> ()
-  | Dtype { ts_def = Some _ } -> ()
+  | Dtype { ts_def = Alias _ } -> ()
   | Dtype { ts_args = _::_ } when info.info_fmt = TFF0 -> ()
   | Dtype ts when query_syntax info.info_syn ts.ts_name <> None -> ()
   | Dtype ts ->
diff --git a/plugins/tptp/tptp_typing.ml b/plugins/tptp/tptp_typing.ml
index 51f071e9e911bbce15beb3952edb28cbef136eea..ffc6cb40d9305eacd0402493b589f165a7a63e25 100644
--- a/plugins/tptp/tptp_typing.ml
+++ b/plugins/tptp/tptp_typing.ml
@@ -231,7 +231,7 @@ let find_ts ~loc env impl s args =
     try Hstr.find impl s with Not_found ->
       let args = List.map (fun _ -> create_tvsymbol (id_fresh "a")) args in
       let ss = if s = "int" || s = "real" then "_" ^ s else s in
-      let ts = SType (create_tysymbol (id_user ss loc) args None) in
+      let ts = SType (create_tysymbol (id_user ss loc) args NoDef) in
       Hstr.add impl s ts;
       ts in
   match ts with
@@ -284,7 +284,9 @@ let rec ty denv env impl { e_loc = loc; e_node = n } = match n with
   | Elet _ | Eite _ | Eqnt _ | Ebin _
   | Enot _ | Eequ _ | Edob _ | Enum _ -> error ~loc TypeExpected
 
-let t_int_const s = t_const (Number.ConstInt (Number.int_const_dec s))
+let t_int_const s =
+  t_const (Number.ConstInt (Number.int_const_dec s)) ty_int
+
 (* unused
 let t_real_const r = t_const (Number.ConstReal r)
 *)
@@ -307,7 +309,7 @@ let rec term denv env impl { e_loc = loc; e_node = n } = match n with
   | Enum (Nint s) -> t_int_const s
   | Enum (Nreal (i,f,e)) ->
       t_const (Number.ConstReal
-        (Number.real_const_dec i (Opt.get_def "0" f) e))
+        (Number.real_const_dec i (Opt.get_def "0" f) e)) ty_real
   | Enum (Nrat (n,d)) ->
       let n = t_int_const n and d = t_int_const d in
       let frac = ns_find_ls denv.th_rat.th_export ["frac"] in
@@ -371,7 +373,7 @@ and fmla denv env impl pol tvl { e_loc = loc; e_node = n } = match n with
             | Some false, Qexists (* premises *) ->
                 let _,ln,cn,_ = Loc.get loc in
                 let sk = Format.sprintf "_%s_%d_%d" s ln cn in
-                let ts = create_tysymbol (id_user sk loc) tvl None in
+                let ts = create_tysymbol (id_user sk loc) tvl NoDef in
                 let tv = ty_app ts (List.map ty_var tvl) in
                 Hstr.add impl sk (SType ts);
                 Mstr.add s (STSko tv) env, pol, tvl, vl, true
@@ -537,7 +539,7 @@ let typedecl denv env impl loc s (tvl,(el,e)) =
       | _ -> error ~loc DependentTy
     in
     let ss = if s = "int" || s = "real" then "_" ^ s else s in
-    let ts = create_tysymbol (id_user ss loc) (List.map ntv el) None in
+    let ts = create_tysymbol (id_user ss loc) (List.map ntv el) NoDef in
     Hstr.add impl s (SType ts)
   else
     (* function/predicate symbol *)
diff --git a/src/coq-tactic/why3tac.ml4 b/src/coq-tactic/why3tac.ml4
index f8d88132e7c1035885c787d7e6087929fd620293..f7e6a76e4f699020dd31225dd0fedc6b29af70e8 100644
--- a/src/coq-tactic/why3tac.ml4
+++ b/src/coq-tactic/why3tac.ml4
@@ -527,6 +527,7 @@ let rec tr_positive p = match kind_of_term p with
 let const_of_big_int b =
   Term.t_const
     (Number.ConstInt (Number.int_const_dec (Big_int.string_of_big_int b)))
+    ty_int
 
 (* translates a closed Coq term t:Z or R into a FOL term of type int or real *)
 let rec tr_arith_constant dep t = match kind_of_term t with
@@ -539,8 +540,10 @@ let rec tr_arith_constant dep t = match kind_of_term t with
       Term.fs_app fs [t] Ty.ty_int
   | Const _ when is_global coq_R0 t ->
       Term.t_const (Number.ConstReal (Number.real_const_dec "0" "0" None))
+        ty_real
   | Const _ when is_global coq_R1 t ->
       Term.t_const (Number.ConstReal (Number.real_const_dec "1" "0" None))
+        ty_real
 (*   | App (f, [|a;b|]) when f = Lazy.force coq_Rplus -> *)
 (*       let ta = tr_arith_constant a in *)
 (*       let tb = tr_arith_constant b in *)
@@ -620,7 +623,7 @@ and tr_global_ts dep env evd (r : global_reference) =
           let (_,vars), _, t = decomp_type_quantifiers env ty in
           if not (is_Set t) && not (is_Type t) then raise NotFO;
           let id = preid_of_id id in
-          let ts = Ty.create_tysymbol id vars None in
+          let ts = Ty.create_tysymbol id vars NoDef in
           let decl = Decl.create_ty_decl ts in
           add_table global_ts r (Some ts);
           add_new_decl dep !dep' decl;
@@ -636,11 +639,11 @@ and tr_global_ts dep env evd (r : global_reference) =
             | Some b ->
                 let b = force b in
                 let tvm, env, t = decomp_type_lambdas Idmap.empty env vars b in
-                let def = Some (tr_type dep' tvm env evd t) in
+                let def = Alias (tr_type dep' tvm env evd t) in
                 Ty.create_tysymbol id vars def
                   (* FIXME: is it correct to use None when NotFO? *)
             | None ->
-                Ty.create_tysymbol id vars None
+                Ty.create_tysymbol id vars NoDef
           in
           let decl = Decl.create_ty_decl ts in
           add_table global_ts r (Some ts);
@@ -655,7 +658,7 @@ and tr_global_ts dep env evd (r : global_reference) =
             let (_,vars), _, t = decomp_type_quantifiers env ty in
             if not (is_Set t) && not (is_Type t) then raise NotFO;
             let id = preid_of_id (Nametab.basename_of_global r) in
-            let ts = Ty.create_tysymbol id vars None in
+            let ts = Ty.create_tysymbol id vars NoDef in
             add_table global_ts r (Some ts)
           in
           Array.iteri make_one_ts mib.mind_packets;
diff --git a/src/core/decl.ml b/src/core/decl.ml
index 361fa3d9e27df8dd3d73011748499070a63d6a85..acade4efe9129ec01f874aa84257864d76a70860 100644
--- a/src/core/decl.ml
+++ b/src/core/decl.ml
@@ -413,7 +413,7 @@ let syms_ty s ty = ty_s_fold syms_ts s ty
 let syms_term s t = t_s_fold syms_ty syms_ls s t
 
 let create_ty_decl ts =
-  let syms = Opt.fold syms_ty Sid.empty ts.ts_def in
+  let syms = type_def_fold syms_ty Sid.empty ts.ts_def in
   let news = Sid.singleton ts.ts_name in
   mk_decl (Dtype ts) syms news
 
@@ -454,7 +454,7 @@ let create_data_decl tdl =
   let check_decl (syms,news) (ts,cl) =
     let cll = List.length cl in
     if cl = [] then raise (EmptyAlgDecl ts);
-    if ts.ts_def <> None then raise (IllegalTypeAlias ts);
+    if ts.ts_def <> NoDef then raise (IllegalTypeAlias ts);
     let news = news_id news ts.ts_name in
     let pjs = List.fold_left (fun s (_,pl) -> List.fold_left
       (Opt.fold (fun s ls -> Sls.add ls s)) s pl) Sls.empty cl in
@@ -716,7 +716,7 @@ let check_foundness kn d =
   | _ -> ()
 
 let rec ts_extract_pos kn sts ts =
-  assert (ts.ts_def = None);
+  assert (not (is_alias_type_def ts.ts_def));
   if ts_equal ts ts_func then [false;true] else
   if ts_equal ts ts_pred then [false] else
   if Sts.mem ts sts then List.map Util.ttrue ts.ts_args else
diff --git a/src/core/dterm.ml b/src/core/dterm.ml
index 54af0853b8d8627eb464fdbc257046ff76e0dda5..3dfb62eb5d2c617fc0673d6e7755dff2014cb18e 100644
--- a/src/core/dterm.ml
+++ b/src/core/dterm.ml
@@ -73,8 +73,6 @@ let rec dty_unify dty1 dty2 = match dty1,dty2 with
       List.iter2 dty_unify dl1 dl2
   | _ -> raise Exit
 
-let dty_int  = Duty ty_int
-let dty_real = Duty ty_real
 let dty_bool = Duty ty_bool
 
 let protect_on x s = if x then "(" ^^ s ^^ ")" else s
@@ -175,7 +173,7 @@ type dterm = {
 and dterm_node =
   | DTvar of string * dty
   | DTgvar of vsymbol
-  | DTconst of Number.constant
+  | DTconst of Number.constant * ty
   | DTapp of lsymbol * dterm list
   | DTfapp of dterm * dterm
   | DTif of dterm * dterm * dterm
@@ -296,10 +294,8 @@ let dterm ?loc node =
         Some dty
     | DTgvar vs ->
         Some (dty_of_ty vs.vs_ty)
-    | DTconst (Number.ConstInt _) ->
-        Some dty_int
-    | DTconst (Number.ConstReal _) ->
-        Some dty_real
+    | DTconst (_,ty) ->
+        Some (dty_of_ty ty)
     | DTapp (ls,dtl) ->
         let dtyl, dty = specialize_ls ls in
         dty_unify_app ls dterm_expected_type dtl dtyl;
@@ -475,8 +471,8 @@ and try_term strict keep_loc uloc env prop dty node =
       t_var (Mstr.find_exn (UnboundVar n) n env)
   | DTgvar vs ->
       t_var vs
-  | DTconst c ->
-      t_const c
+  | DTconst (c,ty) ->
+      t_const c ty
   | DTapp (ls,[]) when ls_equal ls fs_bool_true ->
       if prop then t_true else t_bool_true
   | DTapp (ls,[]) when ls_equal ls fs_bool_false ->
diff --git a/src/core/dterm.mli b/src/core/dterm.mli
index 68b19969e997a62be753d6b48dc49a2b07b80d52..1994efbb6ad67afb8b9dd32df6cd7484e086d9dd 100644
--- a/src/core/dterm.mli
+++ b/src/core/dterm.mli
@@ -56,7 +56,7 @@ type dterm = private {
 and dterm_node =
   | DTvar of string * dty
   | DTgvar of vsymbol
-  | DTconst of Number.constant
+  | DTconst of Number.constant * ty
   | DTapp of lsymbol * dterm list
   | DTfapp of dterm * dterm
   | DTif of dterm * dterm * dterm
diff --git a/src/core/env.mli b/src/core/env.mli
index fb1397e16960c0dadd05b620459a8a5364c8f240..f1955f4d2de84d9115ab0cb4a92b460670f65a95 100644
--- a/src/core/env.mli
+++ b/src/core/env.mli
@@ -145,7 +145,7 @@ val locate_library : env -> pathname -> filename
 (** [locate_library env path] returns the location of the library
     file specified by [path].
 
-    This is a low-level function that allows to accees a library file
+    This is a low-level function that allows to access a library file
     without parsing it. Do not use it without a good reason.
 
     @raise LibraryNotFound [path] if the library file was not found
diff --git a/src/core/pretty.ml b/src/core/pretty.ml
index 3993a92f40ec2874e4eaee1c3526132562e40922..59e2f6928c3ba1fd27dc4bc625b2ae51f22571cb 100644
--- a/src/core/pretty.ml
+++ b/src/core/pretty.ml
@@ -12,7 +12,6 @@
 open Format
 open Pp
 open Stdlib
-open Number
 open Ident
 open Ty
 open Term
@@ -133,16 +132,6 @@ let rec print_ty_node pri fmt ty = match ty.ty_node with
 
 let print_ty fmt ty = print_ty_node 0 fmt ty
 
-let print_const fmt = function
-  | ConstInt (IConstDec s) -> fprintf fmt "%s" s
-  | ConstInt (IConstHex s) -> fprintf fmt "0x%s" s
-  | ConstInt (IConstOct s) -> fprintf fmt "0o%s" s
-  | ConstInt (IConstBin s) -> fprintf fmt "0b%s" s
-  | ConstReal (RConstDec (i,f,None)) -> fprintf fmt "%s.%s" i f
-  | ConstReal (RConstDec (i,f,Some e)) -> fprintf fmt "%s.%se%s" i f e
-  | ConstReal (RConstHex (i,f,Some e)) -> fprintf fmt "0x%s.%sp%s" i f e
-  | ConstReal (RConstHex (i,f,None)) -> fprintf fmt "0x%s.%s" i f
-
 (* can the type of a value be derived from the type of the arguments? *)
 let unambig_fs fs =
   let rec lookup v ty = match ty.ty_node with
@@ -244,7 +233,7 @@ and print_tnode pri fmt t = match t.t_node with
   | Tvar v ->
       print_vs fmt v
   | Tconst c ->
-      print_const fmt c
+      Number.print_constant fmt c
   | Tapp (fs, tl) when is_fs_tuple fs ->
       fprintf fmt "(%a)" (print_list comma print_term) tl
   | Tapp (fs, tl) when unambig_fs fs ->
@@ -328,8 +317,10 @@ let print_constr fmt (cs,pjl) =
 
 let print_ty_decl fmt ts =
   let print_def fmt = function
-    | None -> ()
-    | Some ty -> fprintf fmt " =@ %a" print_ty ty
+    | NoDef -> ()
+    | Alias ty -> fprintf fmt " =@ %a" print_ty ty
+    | Range _  -> fprintf fmt " =@ <range ...>" (* TODO *)
+    | Float _  -> fprintf fmt " =@ <float ...>" (* TODO *)
   in
   fprintf fmt "@[<hov 2>type %a%a%a%a@]"
     print_ts ts print_id_labels ts.ts_name
@@ -532,6 +523,12 @@ let () = Exn_printer.register
       fprintf fmt "Unbound type variable: %a" print_tv tv
   | Ty.UnexpectedProp ->
       fprintf fmt "Unexpected propositional type"
+  | Ty.EmptyRange ->
+      fprintf fmt "Empty integer range"
+  | Ty.BadFloatSpec ->
+      fprintf fmt "Invalid floating point format"
+  | Ty.IllegalTypeParameters ->
+      fprintf fmt "This type cannot have type parameters"
   | Term.BadArity ({ls_args = []} as ls, _) ->
       fprintf fmt "%s %a expects no arguments"
         (if ls.ls_value = None then "Predicate" else "Function") print_ls ls
@@ -557,6 +554,8 @@ let () = Exn_printer.register
       fprintf fmt "Not a term: %a" print_term t
   | Term.FmlaExpected t ->
       fprintf fmt "Not a formula: %a" print_term t
+  | Term.InvalidLiteralType ty ->
+      fprintf fmt "Type %a cannot be used for a numeric literal" print_ty ty
   | Pattern.ConstructorExpected (ls,ty) ->
       fprintf fmt "%s %a is not a constructor of type %a"
         (if ls.ls_value = None then "Predicate" else "Function") print_ls ls
diff --git a/src/core/pretty.mli b/src/core/pretty.mli
index a3fa03ebb8ba5af9e1002806218376f25ab1f09f..cf046cdeb8486b4c7a701798ea87654cec65cddd 100644
--- a/src/core/pretty.mli
+++ b/src/core/pretty.mli
@@ -37,7 +37,6 @@ val print_vsty : formatter -> vsymbol -> unit     (* variable : type *)
 
 val print_quant : formatter -> quant -> unit      (* quantifier *)
 val print_binop : asym:bool -> formatter -> binop -> unit (* binary operator *)
-val print_const : formatter -> Number.constant -> unit  (* int/real constant *)
 val print_pat : formatter -> pattern -> unit      (* pattern *)
 val print_term : formatter -> term -> unit        (* term *)
 
diff --git a/src/core/printer.ml b/src/core/printer.ml
index 9335f58a9106afd2ef8c5a9e96918925a6f3ef27..75a328ad63b482892016d17992f6334f4d08c562 100644
--- a/src/core/printer.ml
+++ b/src/core/printer.ml
@@ -110,24 +110,34 @@ let opt_search_forward s pos =
     None
   with Exit -> Some(!b,!i)
 
-(*
-let _ = opt_search_forward "%1 + %2" 0
-let _ = opt_search_forward "%1 + %2" 2
-let _ = opt_search_forward "%1 + %2" 7
-let _ = opt_search_forward "%t1 + %v42" 0
-let _ = opt_search_forward "%t1 + %v42" 2
-
-let s = "<app><const name=\"HOL.eq\"/>%1%2</app>"
-let Some(b,e) = opt_search_forward s 0
-let t = String.sub s b (e-b)
-
-open Format
-*)
+let opt_search_forward_literal_format s pos =
+  let l = String.length s in
+  let b = ref pos in
+  let i = ref pos in
+  try
+    while !i < l-1 do
+      if s.[!i] = '%' then begin
+        incr i;
+        b := !i;
+        begin match s.[!i] with
+        | 's' | 'e' | 'm' -> incr i; (* float literals *)
+        | _ -> ()
+        end;
+        while !i < l && is_digit s.[!i] do incr i done;
+        begin match s.[!i] with
+        | 'b' | 'x' | 'o' | 'd' -> incr i; raise Exit
+        | _ -> ()
+        end;
+      end;
+      incr i
+    done;
+    None
+  with Exit -> Some(!b,!i)
 
-let global_substitute_fmt repl_fun text fmt =
+let global_substitute_fmt search_fun repl_fun text fmt =
   let len = String.length text in
   let rec replace start =
-    match opt_search_forward text start with
+    match search_fun text start with
     | None ->
       pp_print_string fmt (String.sub text start (len - start))
     | Some(pos,end_pos) ->
@@ -137,19 +147,11 @@ let global_substitute_fmt repl_fun text fmt =
   in
   replace 0
 
-(*
-let repl s e b fmt = fprintf fmt "A"
-
-let () =
-  global_substitute_fmt repl "(LAMBDA (x:%v0): %1)" std_formatter;
-  fprintf std_formatter "@."
-*)
-
-let iter_group iter_fun text =
+let iter_group search_fun iter_fun text =
   let rec iter start last_was_empty =
     let startpos = if last_was_empty then start + 1 else start in
     if startpos < String.length text then
-      match opt_search_forward text startpos with
+      match search_fun text startpos with
       | None -> ()
       | Some (pos,end_pos) ->
           iter_fun text pos end_pos;
@@ -157,11 +159,6 @@ let iter_group iter_fun text =
   in
   iter 0 false
 
-(*
-let regexp_arg_pos = Str.regexp "%\\([0-9]+\\)"
-let regexp_arg_pos_typed = Str.regexp "%\\([tv]?[0-9]+\\)"
-*)
-
 exception BadSyntaxIndex of int
 exception BadSyntaxArity of int * int
 
@@ -178,7 +175,7 @@ let check_syntax s len =
     if i > len then raise (BadSyntaxArity (len,i));
     ()
   in
-  iter_group (*regexp_arg_pos*) arg s
+  iter_group opt_search_forward arg s
 
 let check_syntax_logic ls s =
   let len = List.length ls.ls_args in
@@ -201,14 +198,24 @@ let check_syntax_logic ls s =
       if i > len then raise (BadSyntaxArity (len,i));
     end
   in
-  iter_group (*regexp_arg_pos_typed*) arg s
+  iter_group opt_search_forward arg s
+
+let check_syntax_literal _ts s =
+  let count = ref 0 in
+  let arg _s _b _e =
+    incr count;
+  (* nothing else to check ?! *)
+  in
+  iter_group opt_search_forward_literal_format arg s
+  (* if !count <> 1 then *)
+    (* raise (BadSyntaxArity (1,!count)) *)
 
 let syntax_arguments s print fmt l =
   let args = Array.of_list l in
   let repl_fun s b e fmt =
     let i = int_of_string (String.sub s b (e-b)) in
     print fmt args.(i-1) in
-  global_substitute_fmt (*regexp_arg_pos*) repl_fun s fmt
+  global_substitute_fmt opt_search_forward repl_fun s fmt
 
 (* return the type arguments of a symbol application, sorted according
    to their (formal) names *)
@@ -240,11 +247,55 @@ let gen_syntax_arguments_typed ty_of tys_of s print_arg print_type t fmt l =
       let grp = String.sub s b (e-b) in
       let i = int_of_string grp in
       print_arg fmt args.(i-1) in
-  global_substitute_fmt (*regexp_arg_pos_typed*) repl_fun s fmt
+  global_substitute_fmt opt_search_forward repl_fun s fmt
 
 let syntax_arguments_typed =
   gen_syntax_arguments_typed t_type get_type_arguments
 
+let syntax_range_literal s fmt c =
+  let f s b e fmt =
+    let base = match s.[e-1] with
+      | 'x' -> 16
+      | 'd' -> 10
+      | 'o' -> 8
+      | 'b' -> 2
+      | _ -> assert false
+    in
+    let digits =
+      if e > b + 1 then
+        Some (int_of_string (String.sub s b (e-b-1)))
+      else
+        None
+    in
+    let v = Number.compute_int c in
+    Number.print_in_base base digits fmt v
+  in
+  global_substitute_fmt opt_search_forward_literal_format f s fmt
+
+let syntax_float_literal s fp fmt c =
+  let f s b e fmt =
+    let base = match s.[e-1] with
+      | 'x' -> 16
+      | 'd' -> 10
+      | 'o' -> 8
+      | 'b' -> 2
+      | _ -> assert false
+    in
+    let digits =
+      if e > b + 2 then
+        Some (int_of_string (String.sub s (b+1) (e-b-2)))
+      else
+        None
+    in
+    let e,m = Number.compute_float c fp in
+    match s.[b] with
+    | 's' -> Number.print_in_base base digits fmt BigInt.zero
+    | 'e' -> Number.print_in_base base digits fmt e
+    | 'm' -> Number.print_in_base base digits fmt m
+    | _ -> assert false
+  in
+  global_substitute_fmt opt_search_forward_literal_format f s fmt
+
 (** {2 use printers} *)
 
 let print_prelude fmt pl =
@@ -298,6 +349,11 @@ let meta_syntax_converter = register_meta "syntax_converter" [MTlsymbol; MTstrin
          Can@ be@ specified@ in@ the@ driver@ with@ the@ 'syntax converter'@ \
          rules."
 
+let meta_syntax_literal = register_meta "syntax_literal" [MTtysymbol; MTstring; MTint]
+  ~desc:"Specify@ the@ syntax@ used@ to@ pretty-print@ a@ range@ literal.@ \
+         Can@ be@ specified@ in@ the@ driver@ with@ the@ 'syntax literal'@ \
+         rules."
+
 let meta_remove_prop = register_meta "remove_prop" [MTprsymbol]
     ~desc:"Remove@ a@ logical@ proposition@ from@ proof@ obligations.@ \
            Can@ be@ specified@ in@ the@ driver@ with@ the@ 'remove prop'@ rule."
@@ -328,6 +384,10 @@ let syntax_converter ls s b =
   check_syntax_logic ls s;
   create_meta meta_syntax_converter [MAls ls; MAstr s; MAint (if b then 1 else 0)]
 
+let syntax_literal ts s b =
+  check_syntax_literal ts s;
+  create_meta meta_syntax_literal [MAts ts; MAstr s; MAint (if b then 1 else 0)]
+
 let remove_prop pr =
   create_meta meta_remove_prop [MApr pr]
 
@@ -386,15 +446,27 @@ let get_syntax_map task =
 let get_converter_map task =
   Task.on_meta meta_syntax_converter cm_add_ls Mls.empty task
 
+let get_rliteral_map task =
+  Task.on_meta meta_syntax_literal sm_add_ts Mid.empty task
+
 let add_syntax_map td sm = match td.td_node with
-  | Meta (m, args) when meta_equal m meta_syntax_type      -> sm_add_ts sm args
-  | Meta (m, args) when meta_equal m meta_syntax_logic     -> sm_add_ls sm args
-  | Meta (m, args) when meta_equal m meta_remove_prop      -> sm_add_pr sm args
+  | Meta (m, args) when meta_equal m meta_syntax_type ->
+      sm_add_ts sm args
+  | Meta (m, args) when meta_equal m meta_syntax_logic ->
+      sm_add_ls sm args
+  | Meta (m, args) when meta_equal m meta_remove_prop ->
+      sm_add_pr sm args
   | _ -> sm
 
-let add_converter_map td cm = match td.td_node with
-  | Meta (m, args) when meta_equal m meta_syntax_converter -> cm_add_ls cm args
-  | _ -> cm
+(*let add_converter_map td cm = match td.td_node with
+  | Meta (m, args) when meta_equal m meta_syntax_converter ->
+    cm_add_ls cm args
+  | _ -> cm*)
+
+let add_rliteral_map td sm = match td.td_node with
+  | Meta (m, args) when meta_equal m meta_syntax_literal ->
+      sm_add_ts sm args
+  | _ -> sm
 
 let query_syntax sm id =
   try Some (fst (Mid.find id sm)) with Not_found -> None
diff --git a/src/core/printer.mli b/src/core/printer.mli
index bf924c8009aff92f6316df91d5aa1ebbfb0ae567..ae8d3c46bf2fceabb01726d36e2608ff9dc03f56 100644
--- a/src/core/printer.mli
+++ b/src/core/printer.mli
@@ -61,6 +61,7 @@ val print_th_prelude : task -> prelude_map pp
 val meta_syntax_type : meta
 val meta_syntax_logic : meta
 val meta_syntax_converter : meta
+val meta_syntax_literal : meta
 val meta_remove_prop : meta
 val meta_remove_logic : meta
 val meta_remove_type : meta
@@ -69,6 +70,7 @@ val meta_realized_theory : meta
 val syntax_type : tysymbol -> string -> bool -> tdecl
 val syntax_logic : lsymbol -> string -> bool -> tdecl
 val syntax_converter : lsymbol -> string -> bool -> tdecl
+val syntax_literal : tysymbol -> string -> bool -> tdecl
 val remove_prop : prsymbol -> tdecl
 
 val check_syntax_type: tysymbol -> string -> unit
@@ -83,7 +85,9 @@ val add_syntax_map : tdecl -> syntax_map -> syntax_map
 (* interprets a declaration as a syntax rule, if any *)
 
 val get_converter_map : task -> converter_map
-val add_converter_map : tdecl -> converter_map -> converter_map
+
+val get_rliteral_map : task -> syntax_map
+val add_rliteral_map : tdecl -> syntax_map -> syntax_map
 
 val query_syntax : syntax_map -> ident -> string option
 val query_converter : converter_map -> lsymbol -> string option
@@ -100,7 +104,13 @@ val syntax_arguments_typed :
 (** (syntax_arguments templ print_arg fmt l) prints in the formatter fmt
      the list l using the template templ and the printer print_arg *)
 
-(** {2 Pretty-printing transformations (useful for caching)} *)
+val syntax_range_literal :
+  string -> Number.integer_constant pp
+
+val syntax_float_literal :
+  string -> Number.float_format -> Number.real_constant pp
+
+(** {2 pretty-printing transformations (useful for caching)} *)
 
 val on_syntax_map : (syntax_map -> 'a Trans.trans) -> 'a Trans.trans
 
diff --git a/src/core/term.ml b/src/core/term.ml
index 940864e45efdf11397de46a7f924257a34c5bb4d..0f491d1c8827ac93139113af6b462cef77a1ebf3 100644
--- a/src/core/term.ml
+++ b/src/core/term.ml
@@ -822,12 +822,29 @@ let t_app ls tl ty = ignore (ls_app_inst ls tl ty); t_app ls tl ty
 let fs_app fs tl ty = t_app fs tl (Some ty)
 let ps_app ps tl    = t_app ps tl None
 
-let t_const c = match c with
-  | Number.ConstInt _  -> t_const c ty_int
-  | Number.ConstReal _ -> t_const c ty_real
-
 let t_nat_const n =
-  t_const (Number.ConstInt (Number.int_const_dec (string_of_int n)))
+  t_const (Number.ConstInt (Number.int_const_dec (string_of_int n))) ty_int
+
+exception InvalidLiteralType of ty
+
+let t_const c ty =
+  let ts = match ty.ty_node with
+    | Tyapp (ts,[]) -> ts
+    | _ -> raise (InvalidLiteralType ty) in
+  begin match c with
+    | Number.ConstInt c when not (ts_equal ts ts_int) ->
+        begin match ts.ts_def with
+          | Range ir -> Number.check_range c ir
+          | _ -> raise (InvalidLiteralType ty)
+        end
+    | Number.ConstReal c when not (ts_equal ts ts_real) ->
+        begin match ts.ts_def with
+          | Float fp -> Number.check_float c fp
+          | _ -> raise (InvalidLiteralType ty)
+        end
+    | _ -> ()
+  end;
+  t_const c ty
 
 let t_if f t1 t2 =
   t_ty_check t2 t1.t_ty;
diff --git a/src/core/term.mli b/src/core/term.mli
index 7b58cac0302bcc07cfaa50d16b667057471b2fed..d3ab3d50d0561bd7d358a49a2efc8fdffe68bb17 100644
--- a/src/core/term.mli
+++ b/src/core/term.mli
@@ -71,6 +71,7 @@ exception BadArity of lsymbol * int
 exception FunctionSymbolExpected of lsymbol
 exception PredicateSymbolExpected of lsymbol
 exception ConstructorExpected of lsymbol
+exception InvalidLiteralType of ty
 
 (** {2 Patterns} *)
 
@@ -202,7 +203,7 @@ val ls_arg_inst : lsymbol -> term list -> ty Mtv.t
 val ls_app_inst : lsymbol -> term list -> ty option -> ty Mtv.t
 
 val t_var : vsymbol -> term
-val t_const : Number.constant -> term
+val t_const : Number.constant -> ty -> term
 val t_if : term -> term -> term -> term
 val t_let : term -> term_bound -> term
 val t_case : term -> term_branch list -> term
diff --git a/src/core/theory.ml b/src/core/theory.ml
index 14cfb7970fdbb490b4a424ff31e6c8200820285a..ce9bc53c231372453796e92ac353b69656ccef78 100644
--- a/src/core/theory.ml
+++ b/src/core/theory.ml
@@ -147,6 +147,12 @@ let lookup_meta s = Hstr.find_exn meta_table (UnknownMeta s) s
 
 let list_metas () = Hstr.fold (fun _ v acc -> v::acc) meta_table []
 
+let meta_range = register_meta "range_type" [MTtysymbol; MTlsymbol]
+    ~desc:"Projection@ of@ a@ range@ type."
+
+let meta_float = register_meta "float_type" [MTtysymbol; MTlsymbol; MTlsymbol]
+    ~desc:"Projection@ and@ finiteness@ of@ a@ floating-point@ type."
+
 (** Theory *)
 
 type theory = {
@@ -311,8 +317,8 @@ let close_namespace uc import =
 (* Base constructors *)
 
 let known_ts kn ts = match ts.ts_def with
-  | Some ty -> ty_s_fold (fun () ts -> known_id kn ts.ts_name) () ty
-  | None -> known_id kn ts.ts_name
+  | Alias ty -> ty_s_fold (fun () ts -> known_id kn ts.ts_name) () ty
+  | NoDef | Range _ | Float _ -> known_id kn ts.ts_name
 
 let known_clone kn sm =
   Mts.iter (fun _ ts -> known_ts kn ts) sm.sm_ts;
@@ -375,24 +381,9 @@ let add_symbol add id v uc =
       uc_export = add true  id.id_string v e0 :: ste }
   | _ -> assert false
 
-let add_data uc (ts,csl) =
-  let add_proj uc = function
-    | Some pj -> add_symbol add_ls pj.ls_name pj uc
-    | None -> uc in
-  let add_constr uc (fs,pl) =
-    let uc = add_symbol add_ls fs.ls_name fs uc in
-    List.fold_left add_proj uc pl in
-  let uc = add_symbol add_ts ts.ts_name ts uc in
-  List.fold_left add_constr uc csl
-
-let add_logic uc (ls,_) = add_symbol add_ls ls.ls_name ls uc
-
-let add_ind uc (ps,la) =
-  let uc = add_symbol add_ls ps.ls_name ps uc in
-  let add uc (pr,_) = add_symbol add_pr pr.pr_name pr uc in
-  List.fold_left add uc la
-
-let add_prop uc (_,pr,_) = add_symbol add_pr pr.pr_name pr uc
+let add_symbol_ts uc ts = add_symbol add_ts ts.ts_name ts uc
+let add_symbol_ls uc ls = add_symbol add_ls ls.ls_name ls uc
+let add_symbol_pr uc pr = add_symbol add_pr pr.pr_name pr uc
 
 let create_decl d = mk_tdecl (Decl d)
 
@@ -435,8 +426,7 @@ let warn_dubious_axiom uc k p syms =
         (fun id ->
           if Sid.mem id uc.uc_local then
           match (Ident.Mid.find id uc.uc_known).d_node with
-          | Dtype { ts_def = None } | Dparam _ ->
-            raise Exit
+          | Dtype { ts_def = NoDef } | Dparam _ -> raise Exit
           | _ -> ())
         syms;
       Warning.emit ?loc:p.id_loc "axiom %s does not contain any local abstract symbol"
@@ -453,16 +443,35 @@ let add_decl ?(warn=true) uc d =
   check_decl_opacity d; (* we don't care about tasks *)
   let uc = add_tdecl uc (create_decl d) in
   match d.d_node with
-    | Dtype ts  -> add_symbol add_ts ts.ts_name ts uc
-    | Ddata dl  -> List.fold_left add_data uc dl
-    | Dparam ls -> add_symbol add_ls ls.ls_name ls uc
-    | Dlogic dl -> List.fold_left add_logic uc dl
-    | Dind (_, dl) -> List.fold_left add_ind uc dl
-    | Dprop ((k,pr,_) as p) ->
+  | Dtype ts  ->
+      add_symbol_ts uc ts
+  | Ddata dl  ->
+      let add_field uc = function
+        | Some pj -> add_symbol_ls uc pj
+        | None -> uc in
+      let add_constr uc (cs,pl) =
+        let uc = add_symbol_ls uc cs in
+        List.fold_left add_field uc pl in
+      let add_data uc (ts,csl) =
+        let uc = add_symbol_ts uc ts in
+        List.fold_left add_constr uc csl in
+      List.fold_left add_data uc dl
+  | Dparam ls ->
+      add_symbol_ls uc ls
+  | Dlogic dl ->
+      let add_logic uc (ls,_) = add_symbol_ls uc ls in
+      List.fold_left add_logic uc dl
+  | Dind (_, dl) ->
+      let add_ind uc (ps,la) =
+        let uc = add_symbol_ls uc ps in
+        let add uc (pr,_) = add_symbol_pr uc pr in
+        List.fold_left add uc la in
+      List.fold_left add_ind uc dl
+  | Dprop (k,pr,_) ->
       if warn && should_be_conservative uc.uc_name &&
-           should_be_conservative pr.pr_name
+        should_be_conservative pr.pr_name
       then warn_dubious_axiom uc k pr.pr_name d.d_syms;
-      add_prop uc p
+      add_symbol_pr uc pr
 
 (** Declaration constructors + add_decl *)
 
@@ -531,13 +540,18 @@ let empty_clones s = {
 
 let rec cl_find_ts cl ts =
   if not (Sid.mem ts.ts_name cl.cl_local) then
-    let td = Opt.map (cl_trans_ty cl) ts.ts_def in
-    if Opt.equal ty_equal ts.ts_def td then ts else
-    create_tysymbol (id_clone ts.ts_name) ts.ts_args td
+    match ts.ts_def with
+      | Alias ty ->
+          let td = cl_trans_ty cl ty in
+          if ty_equal td ty then ts else
+          let id = id_clone ts.ts_name in
+          create_tysymbol id ts.ts_args (Alias td)
+      | NoDef | Range _ | Float _ -> ts
   else try Mts.find ts cl.ts_table
   with Not_found ->
-    let td' = Opt.map (cl_trans_ty cl) ts.ts_def in
-    let ts' = create_tysymbol (id_clone ts.ts_name) ts.ts_args td' in
+    let id' = id_clone ts.ts_name in
+    let td' = type_def_map (cl_trans_ty cl) ts.ts_def in
+    let ts' = create_tysymbol id' ts.ts_args td' in
     cl.ts_table <- Mts.add ts ts' cl.ts_table;
     ts'
 
@@ -615,7 +629,7 @@ let cl_init th inst =
 
 let cl_type cl inst ts =
   if Mts.mem ts inst.inst_ts then
-    if ts.ts_def = None then raise EmptyDecl
+    if ts.ts_def = NoDef then raise EmptyDecl
     else raise (CannotInstantiate ts.ts_name);
   create_ty_decl (cl_find_ts cl ts)
 
@@ -715,7 +729,7 @@ let warn_clone_not_abstract loc th =
     List.iter (fun d -> match d.td_node with
       | Decl d ->
         begin match d.d_node with
-        | Dtype { ts_def = None }
+        | Dtype { ts_def = NoDef }
         | Dparam _ -> raise Exit
         | Dprop(Paxiom, _,_) -> raise Exit
         | _ -> ()
@@ -897,7 +911,7 @@ let tuple_theory = Hint.memo 17 (fun n ->
 
 let unit_theory =
   let uc = empty_theory (id_fresh "Unit") ["why3";"Unit"] in
-  let ts = create_tysymbol (id_fresh "unit") [] (Some (ty_tuple [])) in
+  let ts = create_tysymbol (id_fresh "unit") [] (Alias (ty_tuple [])) in
   let uc = use_export uc (tuple_theory 0) in
   let uc = add_ty_decl uc ts in
   close_theory uc
diff --git a/src/core/theory.mli b/src/core/theory.mli
index 18fb1cc94943d711ffde151a9c632be71768c202..3dbca27227bf8af0b4fbbf5d37859f314865695f 100644
--- a/src/core/theory.mli
+++ b/src/core/theory.mli
@@ -78,6 +78,9 @@ val register_meta_excl :
 val lookup_meta : string -> meta
 val list_metas  : unit -> meta list
 
+val meta_range : meta
+val meta_float : meta
+
 (** {2 Theories} *)
 
 type theory = private {
@@ -226,4 +229,3 @@ exception KnownMeta of meta
 exception UnknownMeta of string
 exception BadMetaArity of meta * int
 exception MetaTypeMismatch of meta * meta_arg_type * meta_arg_type
-
diff --git a/src/core/ty.ml b/src/core/ty.ml
index b4f27b4c83cc14bbc61565ee302632ae1cb98576..2e273139e9f2bd01473bd03185684e3e89fe6395 100644
--- a/src/core/ty.ml
+++ b/src/core/ty.ml
@@ -42,10 +42,16 @@ let tv_of_string =
 
 (* type symbols and types *)
 
+type 'a type_def =
+  | NoDef
+  | Alias of 'a
+  | Range of Number.int_range
+  | Float of Number.float_format
+
 type tysymbol = {
-  ts_name : ident;
-  ts_args : tvsymbol list;
-  ts_def  : ty option;
+  ts_name      : ident;
+  ts_args      : tvsymbol list;
+  ts_def       : ty type_def;
 }
 
 and ty = {
@@ -77,9 +83,9 @@ let ts_compare ts1 ts2 = id_compare ts1.ts_name ts2.ts_name
 let ty_compare ty1 ty2 = Pervasives.compare (ty_hash ty1) (ty_hash ty2)
 
 let mk_ts name args def = {
-  ts_name = id_register name;
-  ts_args = args;
-  ts_def  = def;
+  ts_name      = id_register name;
+  ts_args      = args;
+  ts_def       = def;
 }
 
 module Hsty = Hashcons.Make (struct
@@ -129,6 +135,26 @@ let ty_fold fn acc ty = match ty.ty_node with
 let ty_all pr ty = Util.all ty_fold pr ty
 let ty_any pr ty = Util.any ty_fold pr ty
 
+let type_def_map fn = function
+  | Alias ty -> Alias (fn ty)
+  | td -> td
+
+let type_def_fold fn acc = function
+  | Alias ty -> fn acc ty
+  | _ -> acc
+
+let is_alias_type_def = function
+  | Alias _ -> true
+  | _ -> false
+
+let is_range_type_def = function
+  | Range _ -> true
+  | _ -> false
+
+let is_float_type_def = function
+  | Float _ -> true
+  | _ -> false
+
 (* traversal functions on type variables *)
 
 let rec ty_v_map fn ty = match ty.ty_node with
@@ -151,20 +177,36 @@ let ty_closed ty = ty_v_all Util.ffalse ty
 exception BadTypeArity of tysymbol * int
 exception DuplicateTypeVar of tvsymbol
 exception UnboundTypeVar of tvsymbol
+exception IllegalTypeParameters
+exception BadFloatSpec
+exception EmptyRange
 
 let create_tysymbol name args def =
   let add s v = Stv.add_new (DuplicateTypeVar v) v s in
   let s = List.fold_left add Stv.empty args in
   let check v = Stv.mem v s || raise (UnboundTypeVar v) in
-  ignore (Opt.map (ty_v_all check) def);
+  begin match def with
+    | NoDef -> ()
+    | Alias def ->
+        ignore (ty_v_all check def)
+    | Range ir ->
+        if args <> [] then raise IllegalTypeParameters;
+        if BigInt.lt ir.Number.ir_upper ir.Number.ir_lower
+        then raise EmptyRange
+    | Float fp ->
+        if args <> [] then raise IllegalTypeParameters;
+        if fp.Number.fp_exponent_digits < 1 ||
+           fp.Number.fp_significand_digits < 1
+        then raise BadFloatSpec
+  end;
   mk_ts name args def
 
 let ty_app s tl = match s.ts_def with
-  | Some ty ->
+  | Alias ty ->
       let mv = try List.fold_right2 Mtv.add s.ts_args tl Mtv.empty with
         | Invalid_argument _ -> raise (BadTypeArity (s, List.length tl)) in
       ty_full_inst mv ty
-  | None ->
+  | NoDef | Range _ | Float _ ->
       if List.length s.ts_args <> List.length tl then
         raise (BadTypeArity (s, List.length tl));
       ty_app s tl
@@ -208,9 +250,9 @@ let ty_match s ty1 ty2 =
 
 (* built-in symbols *)
 
-let ts_int  = create_tysymbol (id_fresh "int")  [] None
-let ts_real = create_tysymbol (id_fresh "real") [] None
-let ts_bool = create_tysymbol (id_fresh "bool") [] None
+let ts_int  = create_tysymbol (id_fresh "int")  [] NoDef
+let ts_real = create_tysymbol (id_fresh "real") [] NoDef
+let ts_bool = create_tysymbol (id_fresh "bool") [] NoDef
 
 let ty_int  = ty_app ts_int  []
 let ty_real = ty_app ts_real []
@@ -219,13 +261,13 @@ let ty_bool = ty_app ts_bool []
 let ts_func =
   let tv_a = create_tvsymbol (id_fresh "a") in
   let tv_b = create_tvsymbol (id_fresh "b") in
-  create_tysymbol (id_fresh "func") [tv_a;tv_b] None
+  create_tysymbol (id_fresh "func") [tv_a;tv_b] NoDef
 
 let ty_func ty_a ty_b = ty_app ts_func [ty_a;ty_b]
 
 let ts_pred =
   let tv_a = create_tvsymbol (id_fresh "a") in
-  let def = Some (ty_func (ty_var tv_a) ty_bool) in
+  let def = Alias (ty_func (ty_var tv_a) ty_bool) in
   create_tysymbol (id_fresh "pred") [tv_a] def
 
 let ty_pred ty_a = ty_app ts_pred [ty_a]
@@ -235,7 +277,7 @@ let ts_tuple_ids = Hid.create 17
 let ts_tuple = Hint.memo 17 (fun n ->
   let vl = ref [] in
   for _i = 1 to n do vl := create_tvsymbol (id_fresh "a") :: !vl done;
-  let ts = create_tysymbol (id_fresh ("tuple" ^ string_of_int n)) !vl None in
+  let ts = create_tysymbol (id_fresh ("tuple" ^ string_of_int n)) !vl NoDef in
   Hid.add ts_tuple_ids ts.ts_name n;
   ts)
 
diff --git a/src/core/ty.mli b/src/core/ty.mli
index f8f4fdf32ee73bcbdb7c7a40ad707f8e13c90b00..0caf736015f17091390cb8b8d511c4d687917455 100644
--- a/src/core/ty.mli
+++ b/src/core/ty.mli
@@ -33,10 +33,16 @@ val tv_of_string : string -> tvsymbol
 
 (** {2 Type symbols and types} *)
 
+type 'a type_def =
+  | NoDef
+  | Alias of 'a
+  | Range of Number.int_range
+  | Float of Number.float_format
+
 type tysymbol = private {
-  ts_name : ident;
-  ts_args : tvsymbol list;
-  ts_def  : ty option;
+  ts_name      : ident;
+  ts_args      : tvsymbol list;
+  ts_def       : ty type_def;
 }
 
 and ty = private {
@@ -70,12 +76,24 @@ val ty_hash : ty -> int
 exception BadTypeArity of tysymbol * int
 exception DuplicateTypeVar of tvsymbol
 exception UnboundTypeVar of tvsymbol
+exception IllegalTypeParameters
+exception BadFloatSpec
+exception EmptyRange
 
-val create_tysymbol : preid -> tvsymbol list -> ty option -> tysymbol
+val create_tysymbol : preid -> tvsymbol list -> ty type_def -> tysymbol
 
 val ty_var : tvsymbol -> ty
 val ty_app : tysymbol -> ty list -> ty
 
+(** {2 Type definition utilities} *)
+
+val type_def_map : ('a -> 'a) -> 'a type_def -> 'a type_def
+val type_def_fold : ('a -> 'b -> 'a) -> 'a -> 'b type_def -> 'a
+
+val is_alias_type_def : 'a type_def -> bool
+val is_range_type_def : 'a type_def -> bool
+val is_float_type_def : 'a type_def -> bool
+
 (** {2 Generic traversal functions} *)
 
 (** traverse only one level of constructor, if you want full traversal
diff --git a/src/driver/driver.ml b/src/driver/driver.ml
index d5ece169311c4a4c90d424ac8cfd7ac16cfac6fd..d851bb7e61c0549ae667e6c542098edfb7f9a4ff 100644
--- a/src/driver/driver.ml
+++ b/src/driver/driver.ml
@@ -163,6 +163,9 @@ let load_driver = let driver_tag = ref (-1) in fun env file extra_files ->
     | Rconverter (q,s,b) ->
         let cs = syntax_converter (find_ls th q) s b in
         add_meta th cs meta
+    | Rliteral (q,s,b) ->
+        let cs = syntax_literal (find_ts th q) s b in
+        add_meta th cs meta
     | Rmeta (s,al) ->
         let rec ty_of_pty = function
           | PTyvar x ->
diff --git a/src/driver/driver_ast.ml b/src/driver/driver_ast.ml
index a0609054b59b88fb6ce1940a3daf44fac8df0018..b2ceea0c7073d0955d1183201d8c077dad358ed7 100644
--- a/src/driver/driver_ast.ml
+++ b/src/driver/driver_ast.ml
@@ -32,6 +32,7 @@ type th_rule =
   | Rsyntaxfs  of qualid * string * bool
   | Rsyntaxps  of qualid * string * bool
   | Rconverter of qualid * string * bool
+  | Rliteral   of qualid * string * bool
   | Rremovepr  of qualid
   | Rremoveall
   | Rmeta      of string * metarg list
diff --git a/src/driver/driver_lexer.mll b/src/driver/driver_lexer.mll
index cb0306c05148c5ed1d2a33d4fd8d7900d6c896a5..17ed87ae2bedbac9795b0246f04109dc2a370aaa 100644
--- a/src/driver/driver_lexer.mll
+++ b/src/driver/driver_lexer.mll
@@ -57,6 +57,7 @@
         "exception", EXCEPTION;
         "val", VAL;
         "converter", CONVERTER;
+        "literal", LITERAL;
       ]
 
 }
diff --git a/src/driver/driver_parser.mly b/src/driver/driver_parser.mly
index cc7e166c56c7ad3163ebc8acefa54bbca291454e..9da42302ad032644e76e00940aeb891ed88065ed 100644
--- a/src/driver/driver_parser.mly
+++ b/src/driver/driver_parser.mly
@@ -27,7 +27,7 @@
 %token TIMEOUT OUTOFMEMORY STEPLIMITEXCEEDED TIME STEPS
 %token UNDERSCORE LEFTPAR RIGHTPAR DOT QUOTE EOF
 %token BLACKLIST
-%token MODULE EXCEPTION VAL CONVERTER
+%token MODULE EXCEPTION VAL CONVERTER LITERAL
 %token FUNCTION PREDICATE TYPE PROP ALL FILENAME TRANSFORM PLUGIN
 %token LEFTPAR_STAR_RIGHTPAR COMMA CONSTANT
 %token LEFTSQ RIGHTSQ LARROW
@@ -89,6 +89,7 @@ trule:
 | syntax FUNCTION  qualid STRING { Rsyntaxfs  ($3, $4, $1) }
 | syntax PREDICATE qualid STRING { Rsyntaxps  ($3, $4, $1) }
 | syntax CONVERTER qualid STRING { Rconverter ($3, $4, $1) }
+| syntax LITERAL   qualid STRING { Rliteral   ($3, $4, $1) }
 | REMOVE PROP qualid             { Rremovepr  ($3) }
 | REMOVE ALL                     { Rremoveall }
 | META ident meta_args           { Rmeta      ($2, $3) }
diff --git a/src/mlw/expr.ml b/src/mlw/expr.ml
index 13bb682d6e1a38514dc4152459da7f70a8f6f774..c928e02fb00a818948080a9589a266bc41554c64 100644
--- a/src/mlw/expr.ml
+++ b/src/mlw/expr.ml
@@ -183,7 +183,7 @@ let mfield_of_rs s = match s.rs_cty.cty_args, s.rs_field with
 let create_constructor ~constr id s fl =
   let exn = Invalid_argument "Expr.create_constructor" in
   let fs = List.fold_right (Spv.add_new exn) fl Spv.empty in
-  if s.its_privmut || s.its_def <> None then raise exn;
+  if s.its_privmut || s.its_def <> NoDef then raise exn;
   if s.its_mfields <> [] then begin
     if constr <> 1 then raise exn;
     let mfs = Spv.of_list s.its_mfields in
@@ -1005,7 +1005,7 @@ and print_cexp exec pri fmt {c_node = n; c_cty = c} = match n with
 
 and print_enode pri fmt e = match e.e_node with
   | Evar v -> print_pv fmt v
-  | Econst c -> print_const fmt c
+  | Econst c -> Number.print_constant fmt c
   | Eexec c -> print_cexp true pri fmt c
   | Elet (LDvar (v,e1), e2)
     when v.pv_vs.vs_name.id_string = "_" && ity_equal v.pv_ity ity_unit ->
diff --git a/src/mlw/ity.ml b/src/mlw/ity.ml
index 0e8cd440531552e4ee2b340e80e10a2452c60f6e..f424acdc1db3d90386c34c7ff95322efdca14b36 100644
--- a/src/mlw/ity.ml
+++ b/src/mlw/ity.ml
@@ -27,7 +27,7 @@ type itysymbol = {
   its_arg_frz : bool list;      (** irreplaceable type parameters *)
   its_reg_vis : bool list;      (** non-ghost shareable components *)
   its_reg_frz : bool list;      (** irreplaceable shareable components *)
-  its_def     : ity option;     (** type alias *)
+  its_def     : ity type_def;   (** type definition *)
 }
 
 and ity = {
@@ -117,14 +117,14 @@ let reg_compare reg1 reg2 = id_compare reg1.reg_name reg2.reg_name
 let pv_compare  pv1  pv2  = id_compare pv1.pv_vs.vs_name pv2.pv_vs.vs_name
 
 let its_mutable s = s.its_privmut || s.its_mfields <> [] ||
-  match s.its_def with Some {ity_node = Ityreg _} -> true | _ -> false
+  match s.its_def with Alias {ity_node = Ityreg _} -> true | _ -> false
 
 let its_impure s = its_mutable s || s.its_regions <> []
 
 exception NonUpdatable of itysymbol * ity
 
 let check_its_args s tl =
-  assert (s.its_def = None);
+  assert (not (is_alias_type_def s.its_def));
   let check_imm acc imm ity =
     if imm && not ity.ity_pure then raise (NonUpdatable (s,ity));
     acc && ity.ity_pure in
@@ -408,17 +408,17 @@ let ity_pur s tl =
   (* compute the substitution even for non-aliases to verify arity *)
   let sbs = its_match_args s tl in
   match s.its_def with
-  | Some ity ->
+  | Alias ity ->
       ity_full_inst sbs (ity_purify ity)
-  | None ->
+  | _ ->
       ity_pur_unsafe s tl
 
 let create_region sbs id s tl rl = match s.its_def with
-  | Some { ity_node = Ityreg r } ->
+  | Alias { ity_node = Ityreg r } ->
       let tl = List.map (ity_full_inst sbs) r.reg_args in
       let rl = List.map (reg_full_inst sbs) r.reg_regs in
       mk_reg id r.reg_its tl rl
-  | None when its_mutable s ->
+  | _ when its_mutable s ->
       mk_reg id s tl rl
   | _ -> invalid_arg "Ity.create_region"
 
@@ -426,11 +426,11 @@ let ity_app sbs s tl rl =
   if its_mutable s then
     ity_reg (create_region sbs (id_fresh "rho") s tl rl)
   else match s.its_def with
-  | Some ity ->
+  | Alias ity ->
       ity_full_inst sbs ity
-  | None when rl = [] ->
+  | _ when rl = [] ->
       ity_pur_unsafe s tl
-  | None ->
+  | _ ->
       ity_app_unsafe s tl rl
 
 let rec ity_inst_fresh sbs ity = match ity.ity_node with
@@ -498,15 +498,20 @@ let rec ity_of_ty ty = match ty.ty_node with
 let its_of_ts ts imm =
   let tl = List.map Util.ttrue ts.ts_args in
   let il = if imm then tl else List.map Util.ffalse ts.ts_args in
+  let def = match ts.ts_def with
+    | Alias ty -> Alias (ity_of_ty ty)
+    | Range ir -> Range ir
+    | Float fp -> Float fp
+    | NoDef    -> NoDef in
   create_its ~ts ~pm:false ~mfld:[] ~regs:[] ~aimm:il ~aexp:tl ~avis:tl
-          ~afrz:tl ~rvis:[] ~rfrz:[] ~def:(Opt.map ity_of_ty ts.ts_def)
+          ~afrz:tl ~rvis:[] ~rfrz:[] ~def
 
 let create_itysymbol_pure id args =
-  its_of_ts (create_tysymbol id args None) true
+  its_of_ts (create_tysymbol id args NoDef) true
 
 let create_itysymbol_alias id args def =
   (* FIXME? should we compute [arg|reg]_[imm|exp|vis|frz]? *)
-  let ts = create_tysymbol id args (Some (ty_of_ity def)) in
+  let ts = create_tysymbol id args (Alias (ty_of_ity def)) in
   let regs = Sreg.elements (let add_r s r = Sreg.add r s in
     match def.ity_node with
     | Ityreg reg -> reg_r_fold add_r Sreg.empty reg
@@ -514,12 +519,12 @@ let create_itysymbol_alias id args def =
   let tl = List.map Util.ttrue args in
   let rl = List.map Util.ttrue regs in
   create_its ~ts ~pm:false ~mfld:[] ~regs ~aimm:tl ~aexp:tl
-    ~avis:tl ~afrz:tl ~rvis:rl ~rfrz:rl ~def:(Some def)
+    ~avis:tl ~afrz:tl ~rvis:rl ~rfrz:rl ~def:(Alias def)
 
 exception ImpureField of ity
 
 let create_itysymbol_rich id args pm flds =
-  let ts = create_tysymbol id args None in
+  let ts = create_tysymbol id args NoDef in
   let collect_vis fn acc =
     Mpv.fold (fun f _ a -> if f.pv_ghost then a else fn a f.pv_ity) flds acc in
   let collect_imm fn acc =
@@ -536,7 +541,7 @@ let create_itysymbol_rich id args pm flds =
     Mpv.iter (fun {pv_vs = v; pv_ity = i} _ -> if not i.ity_pure
       then Loc.error ?loc:v.vs_name.id_loc (ImpureField i)) flds;
     create_its ~ts ~pm ~mfld ~regs:[] ~aimm:tl ~aexp:tl ~avis:tl
-      ~afrz:tl ~rvis:[] ~rfrz:[] ~def:None
+      ~afrz:tl ~rvis:[] ~rfrz:[] ~def:NoDef
   end else (* non-private updatable type *)
     let top_regs ity = ity_r_fold (fun s r -> Sreg.add r s) ity in
     let regs = Sreg.elements (collect_all top_regs Sreg.empty) in
@@ -549,7 +554,7 @@ let create_itysymbol_rich id args pm flds =
     let afrz = check_args (collect_imm ity_freevars Stv.empty) in
     let rfrz = check_regs (collect_imm ity_freeregs Sreg.empty) in
     create_its ~ts ~pm ~mfld ~regs ~aimm ~aexp ~avis ~afrz ~rvis
-      ~rfrz ~def:None
+      ~rfrz ~def:NoDef
 
 (** pvsymbol creation *)
 
diff --git a/src/mlw/ity.mli b/src/mlw/ity.mli
index 2aafc1df3b7167695e0bcdfb8592d03b76179e9b..d903a607ad658957215cafa6390f9535c785e6e3 100644
--- a/src/mlw/ity.mli
+++ b/src/mlw/ity.mli
@@ -26,7 +26,7 @@ type itysymbol = private {
   its_arg_frz : bool list;      (** irreplaceable type parameters *)
   its_reg_vis : bool list;      (** non-ghost shareable components *)
   its_reg_frz : bool list;      (** irreplaceable shareable components *)
-  its_def     : ity option;     (** type alias *)
+  its_def     : ity type_def;   (** type definition *)
 }
 
 and ity = private {
diff --git a/src/mlw/pdecl.ml b/src/mlw/pdecl.ml
index c502972627ed639a295d828dbc941450615f118d..9fec59253c18ec192d203830e097e7a53f8d5260 100644
--- a/src/mlw/pdecl.ml
+++ b/src/mlw/pdecl.ml
@@ -57,7 +57,7 @@ let check_pure_its s = not s.its_privmut &&
   List.for_all (fun x -> x) s.its_arg_vis &&
   List.for_all (fun x -> x) s.its_arg_frz &&
   s.its_reg_vis = [] && s.its_reg_frz = [] &&
-  s.its_def = None
+  s.its_def = NoDef
 
 let create_semi_constructor id s fl pjl invl =
   let ity = ity_app s (List.map ity_var s.its_ts.ts_args) s.its_regions in
@@ -272,7 +272,7 @@ let get_syms node pure =
   | PDtype dl ->
       let syms_itd syms d =
         (* the syms of the invariants are already in [pure] *)
-        let syms = Opt.fold syms_ity syms d.itd_its.its_def in
+        let syms = type_def_fold syms_ity syms d.itd_its.its_def in
         let add_fd syms s = syms_ity syms s.rs_cty.cty_result in
         let add_cs syms s = List.fold_left syms_pv syms s.rs_cty.cty_args in
         let syms = List.fold_left add_fd syms d.itd_fields in
diff --git a/src/parser/lexer.mll b/src/parser/lexer.mll
index ee0e0873873b971cbd553feebcc5da55537ae1ba..28559f90b325430e6f5ba09ad327b2a6474cdbd6 100644
--- a/src/parser/lexer.mll
+++ b/src/parser/lexer.mll
@@ -36,6 +36,7 @@
         "exists", EXISTS;
         "export", EXPORT;
         "false", FALSE;
+        "float", FLOAT;
         "forall", FORALL;
         "function", FUNCTION;
         "goal", GOAL;
@@ -51,6 +52,7 @@
         "not", NOT;
         "predicate", PREDICATE;
         "prop", PROP;
+        "range", RANGE;
         "so", SO;
         "then", THEN;
         "theory", THEORY;
@@ -101,8 +103,13 @@ let lalpha = ['a'-'z' '_']
 let ualpha = ['A'-'Z']
 let alpha = lalpha | ualpha
 let digit = ['0'-'9']
-let lident = lalpha (alpha | digit | '\'')*
-let uident = ualpha (alpha | digit | '\'')*
+let digit_or_us = ['0'-'9' '_']
+let alpha_no_us = ['a'-'z' 'A'-'Z']
+let suffix = (alpha_no_us | '\''* digit_or_us)* '\''*
+let lident = lalpha suffix
+let uident = ualpha suffix
+let lident_quote = lident ('\'' alpha_no_us suffix)+
+let uident_quote = uident ('\'' alpha_no_us suffix)+
 let hexadigit = ['0'-'9' 'a'-'f' 'A'-'F']
 
 let op_char_1 = ['=' '<' '>' '~']
@@ -133,8 +140,12 @@ rule token = parse
       { UNDERSCORE }
   | lident as id
       { try Hashtbl.find keywords id with Not_found -> LIDENT id }
+  | lident_quote as id
+      { LIDENT_QUOTE id }
   | uident as id
       { UIDENT id }
+  | uident_quote as id
+      { UIDENT_QUOTE id }
   | ['0'-'9'] ['0'-'9' '_']* as s
       { INTEGER (Number.int_const_dec (Lexlib.remove_underscores s)) }
   | '0' ['x' 'X'] (['0'-'9' 'A'-'F' 'a'-'f']['0'-'9' 'A'-'F' 'a'-'f' '_']* as s)
@@ -146,14 +157,14 @@ rule token = parse
   | (digit+ as i) ("" as f) ['e' 'E'] (['-' '+']? digit+ as e)
   | (digit+ as i) '.' (digit* as f) (['e' 'E'] (['-' '+']? digit+ as e))?
   | (digit* as i) '.' (digit+ as f) (['e' 'E'] (['-' '+']? digit+ as e))?
-      { FLOAT (Number.real_const_dec i f
+      { REAL (Number.real_const_dec i f
           (Opt.map Lexlib.remove_leading_plus e)) }
   | '0' ['x' 'X'] (hexadigit+ as i) ("" as f) ['p' 'P'] (['-' '+']? digit+ as e)
   | '0' ['x' 'X'] (hexadigit+ as i) '.' (hexadigit* as f)
         (['p' 'P'] (['-' '+']? digit+ as e))?
   | '0' ['x' 'X'] (hexadigit* as i) '.' (hexadigit+ as f)
         (['p' 'P'] (['-' '+']? digit+ as e))?
-      { FLOAT (Number.real_const_hex i f
+      { REAL (Number.real_const_hex i f
           (Opt.map Lexlib.remove_leading_plus e)) }
   | "(*)"
       { LEFTPAR_STAR_RIGHTPAR }
@@ -201,10 +212,14 @@ rule token = parse
       { DOTDOT }
   | "|"
       { BAR }
-  | "="
-      { EQUAL }
+  | "<"
+      { LT }
+  | ">"
+      { GT }
   | "<>"
       { LTGT }
+  | "="
+      { EQUAL }
   | "["
       { LEFTSQ }
   | "]"
@@ -244,10 +259,3 @@ rule token = parse
   let () = Env.register_format Env.base_language "why" ["why"] read_channel
     ~desc:"WhyML@ logical@ language"
 }
-
-(*
-Local Variables:
-compile-command: "unset LANG; make -C ../.. test"
-End:
-*)
-
diff --git a/src/parser/parser.mly b/src/parser/parser.mly
index d36695c2349fe03fd5856dc7135e6e957d3b7f24..32d932be6633ac997c618a9c7c6592c8be5d0464 100644
--- a/src/parser/parser.mly
+++ b/src/parser/parser.mly
@@ -148,10 +148,10 @@ end
 
 (* Tokens *)
 
-%token <string> LIDENT UIDENT
+%token <string> LIDENT LIDENT_QUOTE UIDENT UIDENT_QUOTE
 %token <Ptree.integer_constant> INTEGER
 %token <string> OP1 OP2 OP3 OP4 OPPREF
-%token <Ptree.real_constant> FLOAT
+%token <Ptree.real_constant> REAL
 %token <string> STRING
 %token <Loc.position> POSITION
 %token <string> QUOTE_UIDENT QUOTE_LIDENT OPAQUE_QUOTE_LIDENT
@@ -159,9 +159,9 @@ end
 (* keywords *)
 
 %token AS AXIOM BY CLONE COINDUCTIVE CONSTANT
-%token ELSE END EPSILON EXISTS EXPORT FALSE FORALL FUNCTION
+%token ELSE END EPSILON EXISTS EXPORT FALSE FLOAT FORALL FUNCTION
 %token GOAL IF IMPORT IN INDUCTIVE LEMMA
-%token LET MATCH META NAMESPACE NOT PROP PREDICATE
+%token LET MATCH META NAMESPACE NOT PROP PREDICATE RANGE
 %token SO THEN THEORY TRUE TYPE USE WITH
 
 (* program keywords *)
@@ -177,7 +177,7 @@ end
 %token AND ARROW
 %token BAR
 %token COLON COMMA
-%token DOT DOTDOT EQUAL LAMBDA LTGT
+%token DOT DOTDOT EQUAL LAMBDA LT GT LTGT
 %token LEFTPAR LEFTPAR_STAR_RIGHTPAR LEFTSQ
 %token LARROW LRARROW OR
 %token RIGHTPAR RIGHTSQ
@@ -205,7 +205,7 @@ end
 %right OR BARBAR
 %right AND AMPAMP
 %nonassoc NOT
-%left EQUAL LTGT OP1
+%left EQUAL LTGT LT GT OP1
 %nonassoc LARROW
 %nonassoc RIGHTSQ    (* stronger than <- for e1[e2 <- e3] *)
 %left OP2
@@ -241,10 +241,10 @@ theory_or_module:
 | module_head module_decl* END  { Increment.close_module () }
 
 theory_head:
-| THEORY labels(uident)  { Increment.open_theory $2 }
+| THEORY labels(uident_nq)  { Increment.open_theory $2 }
 
 module_head:
-| MODULE labels(uident)  { Increment.open_module $2 }
+| MODULE labels(uident_nq)  { Increment.open_module $2 }
 
 theory_decl:
 | decl            { Increment.new_decl  (floc $startpos $endpos) $1 }
@@ -260,7 +260,7 @@ module_decl:
     { Increment.close_namespace (floc $startpos($1) $endpos($1)) $1 }
 
 namespace_head:
-| NAMESPACE boption(IMPORT) uident
+| NAMESPACE boption(IMPORT) uident_nq
    { Increment.open_namespace $3.id_str; $2 }
 
 (* Use and clone *)
@@ -302,9 +302,9 @@ decl:
 | PREDICATE predicate_decl with_logic_decl* { Dlogic ($2::$3) }
 | INDUCTIVE   with_list1(inductive_decl)    { Dind (Decl.Ind, $2) }
 | COINDUCTIVE with_list1(inductive_decl)    { Dind (Decl.Coind, $2) }
-| AXIOM labels(ident) COLON term            { Dprop (Decl.Paxiom, $2, $4) }
-| LEMMA labels(ident) COLON term            { Dprop (Decl.Plemma, $2, $4) }
-| GOAL  labels(ident) COLON term            { Dprop (Decl.Pgoal, $2, $4) }
+| AXIOM labels(ident_nq) COLON term         { Dprop (Decl.Paxiom, $2, $4) }
+| LEMMA labels(ident_nq) COLON term         { Dprop (Decl.Plemma, $2, $4) }
+| GOAL  labels(ident_nq) COLON term         { Dprop (Decl.Pgoal, $2, $4) }
 | META sident comma_list1(meta_arg)         { Dmeta ($2, $3) }
 
 meta_arg:
@@ -319,7 +319,7 @@ meta_arg:
 (* Type declarations *)
 
 type_decl:
-| labels(lident) ty_var* typedefn
+| labels(lident_nq) ty_var* typedefn
   { let model, vis, def, inv = $3 in
     let vis = if model then Abstract else vis in
     { td_ident = $1; td_params = $2;
@@ -327,7 +327,7 @@ type_decl:
       td_inv = inv; td_loc = floc $startpos $endpos } }
 
 late_invariant:
-| labels(lident) ty_var* invariant+
+| labels(lident_nq) ty_var* invariant+
   { { td_ident = $1; td_params = $2;
       td_model = false; td_vis = Public; td_def = TDabstract;
       td_inv = $3; td_loc = floc $startpos $endpos } }
@@ -344,6 +344,13 @@ typedefn:
     { $1, $2, TDrecord $4, $6 }
 | model abstract ty invariant*
     { $1, $2, TDalias $3, $4 }
+(* FIXME: allow negative bounds *)
+| EQUAL LT RANGE INTEGER INTEGER GT
+    { false, Public,
+      TDrange (Number.compute_int $4, Number.compute_int $5), [] }
+| EQUAL LT FLOAT INTEGER INTEGER GT
+    { false, Public,
+      TDfloat (small_integer $4, small_integer $5), [] }
 
 model:
 | EQUAL         { false }
@@ -355,7 +362,7 @@ abstract:
 | ABSTRACT      { Abstract }
 
 type_field:
-| field_modifiers labels(lident) cast
+| field_modifiers labels(lident_nq) cast
   { { f_ident = $2; f_mutable = fst $1; f_ghost = snd $1;
       f_pty = $3; f_loc = floc $startpos $endpos } }
 
@@ -367,7 +374,7 @@ field_modifiers:
 | MUTABLE GHOST { true,  true  }
 
 type_case:
-| labels(uident) params { floc $startpos $endpos, $1, $2 }
+| labels(uident_nq) params { floc $startpos $endpos, $1, $2 }
 
 (* Logic declarations *)
 
@@ -403,7 +410,7 @@ ind_defn:
 | EQUAL bar_list1(ind_case) { $2 }
 
 ind_case:
-| labels(ident) COLON term  { floc $startpos $endpos, $1, $3 }
+| labels(ident_nq) COLON term  { floc $startpos $endpos, $1, $3 }
 
 (* Type expressions *)
 
@@ -516,11 +523,11 @@ binder_vars_head:
       | _ -> Loc.error ~loc:(floc $startpos $endpos) Error }
 
 binder_var:
-| labels(lident)  { floc $startpos $endpos, Some $1 }
-| anon_binder     { $1 }
+| labels(lident_nq) { floc $startpos $endpos, Some $1 }
+| anon_binder       { $1 }
 
 anon_binder:
-| UNDERSCORE      { floc $startpos $endpos, None }
+| UNDERSCORE        { floc $startpos $endpos, None }
 
 (* Logical terms *)
 
@@ -635,7 +642,7 @@ quant:
 
 numeral:
 | INTEGER { Number.ConstInt $1 }
-| FLOAT   { Number.ConstReal $1 }
+| REAL    { Number.ConstReal $1 }
 
 (* Program declarations *)
 
@@ -644,8 +651,8 @@ pdecl:
 | LET top_ghost labels(lident_rich) fun_defn        { Dfun ($3, $2, $4) }
 | LET top_ghost labels(lident_rich) EQUAL fun_expr  { Dfun ($3, $2, $5) }
 | LET REC with_list1(rec_defn)                      { Drec $3 }
-| EXCEPTION labels(uident)                          { Dexn ($2, PTtuple []) }
-| EXCEPTION labels(uident) ty                       { Dexn ($2, $3) }
+| EXCEPTION labels(uident_nq)                       { Dexn ($2, PTtuple []) }
+| EXCEPTION labels(uident_nq) ty                    { Dexn ($2, $3) }
 
 top_ghost:
 | (* epsilon *) { Gnone  }
@@ -736,7 +743,7 @@ expr_:
           Ematch (e, [$3, $7]) }
 | LET top_ghost labels(lident_op_id) EQUAL seq_expr IN seq_expr
     { Elet ($3, $2, $5, $7) }
-| LET top_ghost labels(lident) fun_defn IN seq_expr
+| LET top_ghost labels(lident_nq) fun_defn IN seq_expr
     { Efun ($3, $2, $4, $6) }
 | LET top_ghost labels(lident_op_id) fun_defn IN seq_expr
     { Efun ($3, $2, $4, $6) }
@@ -910,12 +917,12 @@ pat_conj_:
 pat_uni_:
 | pat_arg_                              { $1 }
 | uqualid pat_arg+                      { Papp ($1,$2) }
-| mk_pat(pat_uni_) AS labels(lident)    { Pas ($1,$3) }
+| mk_pat(pat_uni_) AS labels(lident_nq) { Pas ($1,$3) }
 | mk_pat(pat_uni_) cast                 { Pcast($1,$2) }
 
 pat_arg_:
 | UNDERSCORE                            { Pwild }
-| labels(lident)                        { Pvar $1 }
+| labels(lident_nq)                     { Pvar $1 }
 | uqualid                               { Papp ($1,[]) }
 | LEFTPAR RIGHTPAR                      { Ptuple [] }
 | LEFTPAR pattern_ RIGHTPAR             { $2 }
@@ -927,15 +934,34 @@ ident:
 | uident { $1 }
 | lident { $1 }
 
+ident_nq:
+| uident_nq { $1 }
+| lident_nq { $1 }
+
 uident:
 | UIDENT          { mk_id $1 $startpos $endpos }
+| UIDENT_QUOTE    { mk_id $1 $startpos $endpos }
+
+uident_nq:
+| UIDENT          { mk_id $1 $startpos $endpos }
+| UIDENT_QUOTE    { let loc = floc $startpos($1) $endpos($1) in
+                    Loc.errorm ~loc "Symbol %s cannot be user-defined" $1 }
 
 lident:
 | LIDENT          { mk_id $1 $startpos $endpos }
 | lident_keyword  { mk_id $1 $startpos $endpos }
+| LIDENT_QUOTE    { mk_id $1 $startpos $endpos }
+
+lident_nq:
+| LIDENT          { mk_id $1 $startpos $endpos }
+| lident_keyword  { mk_id $1 $startpos $endpos }
+| LIDENT_QUOTE    { let loc = floc $startpos($1) $endpos($1) in
+                    Loc.errorm ~loc "Symbol %s cannot be user-defined" $1 }
 
 lident_keyword:
 | MODEL           { "model" }
+| RANGE           { "range" }
+| FLOAT           { "float" }
 
 quote_uident:
 | QUOTE_UIDENT  { mk_id ("'" ^ $1) $startpos $endpos }
@@ -948,12 +974,8 @@ opaque_quote_lident:
 
 (* Idents + symbolic operation names *)
 
-ident_rich:
-| uident        { $1 }
-| lident_rich   { $1 }
-
 lident_rich:
-| lident        { $1 }
+| lident_nq     { $1 }
 | lident_op_id  { $1 }
 
 lident_op_id:
@@ -977,6 +999,8 @@ op_symbol:
 | OP2 { $1 }
 | OP3 { $1 }
 | OP4 { $1 }
+| LT  { "<" }
+| GT  { ">" }
 
 %inline oppref:
 | o = OPPREF { mk_id (prefix o)  $startpos $endpos }
@@ -991,16 +1015,24 @@ prefix_op:
 | o = OP4   { mk_id (infix o)    $startpos $endpos }
 | EQUAL     { mk_id (infix "=")  $startpos $endpos }
 | LTGT      { mk_id (infix "<>") $startpos $endpos }
+| LT        { mk_id (infix "<")  $startpos $endpos }
+| GT        { mk_id (infix ">")  $startpos $endpos }
 
 (* Qualified idents *)
 
 qualid:
-| ident_rich              { Qident $1 }
-| uqualid DOT ident_rich  { Qdot ($1, $3) }
+| uident                    { Qident $1 }
+| lident                    { Qident $1 }
+| lident_op_id              { Qident $1 }
+| uqualid DOT uident        { Qdot ($1, $3) }
+| uqualid DOT lident        { Qdot ($1, $3) }
+| uqualid DOT lident_op_id  { Qdot ($1, $3) }
 
 lqualid_rich:
-| lident_rich             { Qident $1 }
-| uqualid DOT lident_rich { Qdot ($1, $3) }
+| lident                    { Qident $1 }
+| lident_op_id              { Qident $1 }
+| uqualid DOT lident        { Qdot ($1, $3) }
+| uqualid DOT lident_op_id  { Qdot ($1, $3) }
 
 lqualid:
 | lident              { Qident $1 }
diff --git a/src/parser/ptree.ml b/src/parser/ptree.ml
index 2839dc7fd819ade012252ecfbf12d2b332f1a0d1..da588ae5ad80ed95a2cb871c5a7f04a05eec5e58 100644
--- a/src/parser/ptree.ml
+++ b/src/parser/ptree.ml
@@ -126,6 +126,8 @@ type type_def =
   | TDalias     of pty
   | TDalgebraic of (loc * ident * param list) list
   | TDrecord    of field list
+  | TDrange     of BigInt.t * BigInt.t
+  | TDfloat     of int * int
 
 type visibility = Public | Private | Abstract
 
diff --git a/src/parser/typing.ml b/src/parser/typing.ml
index 60fdee6d3470a32436190c6e90112ed210bac12c..dea4f1b523f75e1ef3ef612e8328c47f56b20996 100644
--- a/src/parser/typing.ml
+++ b/src/parser/typing.ml
@@ -290,8 +290,10 @@ let rec dterm uc gvars denv {term_desc = desc; term_loc = loc} =
       let e1, ch = if chainable_op uc op2
         then get_chain e12 ch else e12, ch in
       make_chain (dterm uc gvars denv e1) ch
-  | Ptree.Tconst c ->
-      DTconst c
+  | Ptree.Tconst (Number.ConstInt _ as c) ->
+      DTconst (c, ty_int)
+  | Ptree.Tconst (Number.ConstReal _ as c) ->
+      DTconst (c, ty_real)
   | Ptree.Tlet (x, e1, e2) ->
       let id = create_user_id x in
       let e1 = dterm uc gvars denv e1 in
@@ -366,7 +368,12 @@ let rec dterm uc gvars denv {term_desc = desc; term_loc = loc} =
   | Ptree.Tnamed (Lstr lab, e1) ->
       DTlabel (dterm uc gvars denv e1, Slab.singleton lab)
   | Ptree.Tcast (e1, ty) ->
-      DTcast (dterm uc gvars denv e1, ty_of_pty uc ty))
+    (* FIXME: accepts and silently ignores double casts: ((0:ty1):ty2) *)
+      let e1 = dterm uc gvars denv e1 in
+      let ty = ty_of_pty uc ty in
+      match e1.dt_node with
+      | DTconst (c,_) -> DTconst (c, ty)
+      | _ -> DTcast (e1, ty))
 
 (** Export for program parsing *)
 
@@ -397,10 +404,9 @@ let add_types dl th =
   let tysymbols = Hstr.create 17 in
   let rec visit x =
     let d = Mstr.find x def in
-    try
-      match Hstr.find tysymbols x with
-        | None -> Loc.errorm ~loc:d.td_loc "Cyclic type definition"
-        | Some ts -> ts
+    try match Hstr.find tysymbols x with
+      | None -> Loc.errorm ~loc:d.td_loc "Cyclic type definition"
+      | Some ts -> ts
     with Not_found ->
       Hstr.add tysymbols x None;
       let vars = Hstr.create 17 in
@@ -436,9 +442,17 @@ let add_types dl th =
               | PTparen ty ->
                   apply ty
             in
-            create_tysymbol id vl (Some (apply ty))
+            create_tysymbol id vl (Alias (apply ty))
+        | TDrange (lo,hi) ->
+            let ir = { Number.ir_lower = lo;
+                       Number.ir_upper = hi } in
+            Loc.try2 ~loc:d.td_loc create_tysymbol id vl (Range ir)
+        | TDfloat (eb,sb) ->
+            let fp = { Number.fp_exponent_digits = eb;
+                       Number.fp_significand_digits = sb } in
+            Loc.try2 ~loc:d.td_loc create_tysymbol id vl (Float fp)
         | TDabstract | TDalgebraic _ ->
-            create_tysymbol id vl None
+            create_tysymbol id vl NoDef
         | TDrecord _ ->
             assert false
       in
@@ -448,7 +462,8 @@ let add_types dl th =
   let th' =
     let add_ts (abstr,alias) d =
       let ts = visit d.td_ident.id_str in
-      if ts.ts_def = None then ts::abstr, alias else abstr, ts::alias in
+      if is_alias_type_def ts.ts_def then
+        abstr, ts::alias else ts::abstr, alias in
     let abstr,alias = List.fold_left add_ts ([],[]) dl in
     try
       let th = List.fold_left add_ty_decl th abstr in
@@ -466,8 +481,10 @@ let add_types dl th =
           ts
     in
     match d.td_def with
-      | TDabstract -> ts::abstr, algeb, alias
-      | TDalias _ -> abstr, algeb, ts::alias
+      | TDabstract | TDrange _ | TDfloat _ ->
+          ts::abstr, algeb, alias
+      | TDalias _ ->
+          abstr, algeb, ts::alias
       | TDalgebraic cl ->
           let ht = Hstr.create 17 in
           let constr = List.length cl in
@@ -499,6 +516,30 @@ let add_types dl th =
           assert false
   in
   let abstr,algeb,alias = List.fold_right decl dl ([],[],[]) in
+  let add_ty_decl uc ts =
+    let uc = add_ty_decl uc ts in
+    match ts.ts_def with
+    | NoDef | Alias _ -> uc
+    | Range _ ->
+        (* FIXME: "t'to_int" is probably better *)
+        let nm = ts.ts_name.id_string ^ "'int" in
+        let id = id_derive nm ts.ts_name in
+        let pj = create_fsymbol id [ty_app ts []] ty_int in
+        let uc = add_param_decl uc pj in
+        add_meta uc meta_range [MAts ts; MAls pj]
+    | Float _ ->
+        (* FIXME: "t'to_real" is probably better *)
+        let nm = ts.ts_name.id_string ^ "'real" in
+        let id = id_derive nm ts.ts_name in
+        let pj = create_fsymbol id [ty_app ts []] ty_real in
+        let uc = add_param_decl uc pj in
+        (* FIXME: "t'is_finite" is probably better *)
+        let nm = ts.ts_name.id_string ^ "'isFinite" in
+        let id = id_derive nm ts.ts_name in
+        let iF = create_psymbol id [ty_app ts []] in
+        let uc = add_param_decl uc iF in
+        add_meta uc meta_float [MAts ts; MAls pj; MAls iF]
+  in
   try
     let th = List.fold_left add_ty_decl th abstr in
     let th = if algeb = [] then th else add_data_decl th algeb in
@@ -520,7 +561,7 @@ let prepare_typedef td =
   if td.td_inv <> [] then
     Loc.errorm ~loc:td.td_loc "pure types cannot have invariants";
   match td.td_def with
-  | TDabstract | TDalgebraic _ | TDalias _ ->
+  | TDabstract | TDrange _ | TDfloat _ | TDalgebraic _ | TDalias _ ->
       td
   | TDrecord fl ->
       let field { f_loc = loc; f_ident = id; f_pty = ty;
@@ -676,7 +717,7 @@ let rec clone_ns kn sl path ns2 ns1 s =
     | Some ts2 when ts_equal ts1 ts2 -> acc
     | Some _ when not (Sid.mem ts1.ts_name sl) ->
         raise (NonLocal ts1.ts_name)
-    | Some _ when ts1.ts_def <> None ->
+    | Some _ when ts1.ts_def <> NoDef ->
         raise (CannotInstantiate ts1.ts_name)
     | Some ts2 ->
         begin match (Mid.find ts1.ts_name kn).d_node with
@@ -684,7 +725,7 @@ let rec clone_ns kn sl path ns2 ns1 s =
           | _ -> raise (CannotInstantiate ts1.ts_name)
         end
     | None when not (Sid.mem ts1.ts_name sl) -> acc
-    | None when ts1.ts_def <> None -> acc
+    | None when ts1.ts_def <> NoDef -> acc
     | None ->
         begin match (Mid.find ts1.ts_name kn).d_node with
           | Decl.Dtype _ -> Loc.errorm
@@ -759,7 +800,7 @@ let type_inst th t s =
       let ts1 = find_tysymbol_ns t.th_export p in
       let id = id_user (ts1.ts_name.id_string ^ "_subst") loc in
       let tvl = List.map (fun id -> tv_of_string id.id_str) tvl in
-      let def = Some (ty_of_pty th pty) in
+      let def = Alias (ty_of_pty th pty) in
       let ts2 = Loc.try3 ~loc create_tysymbol id tvl def in
       if Mts.mem ts1 s.inst_ts
       then Loc.error ~loc (ClashSymbol ts1.ts_name.id_string);
diff --git a/src/printer/alt_ergo.ml b/src/printer/alt_ergo.ml
index bbf88c527b034c2bceb599d44c5c7e98e7339a7d..2cf07fe02de927ec79f469fdd349cd5aed27d47b 100644
--- a/src/printer/alt_ergo.ml
+++ b/src/printer/alt_ergo.ml
@@ -307,7 +307,7 @@ let print_enum_decl info fmt ts csl =
     (print_list alt2 print_cs) csl
 
 let print_ty_decl info fmt ts =
-  if ts.ts_def <> None then () else
+  if is_alias_type_def ts.ts_def then () else
   if Mid.mem ts.ts_name info.info_syn then () else
   (fprintf fmt "%a@\n@\n" (print_type_decl info) ts; forget_tvs info)
 
diff --git a/src/printer/coq.ml b/src/printer/coq.ml
index d5a473f152b41266e47ea19f283c86b7979aa0e8..9bdc927dd0a19178f1a4698cecc745cbedd23305 100644
--- a/src/printer/coq.ml
+++ b/src/printer/coq.ml
@@ -674,7 +674,7 @@ let print_previous_proof def info fmt previous =
 let print_type_decl ~prev info fmt ts =
   if is_ts_tuple ts then () else
   match ts.ts_def with
-    | None ->
+    | NoDef | Range _ | Float _ ->
       if info.realization then
         match prev with
         | Some (Query (_,Notation,c)) ->
@@ -700,7 +700,7 @@ let print_type_decl ~prev info fmt ts =
         end;
         fprintf fmt "@\n"
       end
-    | Some ty ->
+    | Alias ty ->
       fprintf fmt "(* Why3 assumption *)@\n@[<hov 2>Definition %a%a :=@ %a.@]@\n@\n"
         print_ts ts
           (print_list_pre space
diff --git a/src/printer/cvc3.ml b/src/printer/cvc3.ml
index fe1320a3545d5c78af0c5eda810a3a7034cf6395..90eaea30bf6265707886ccd31ddaeb8e9b6c6c1a 100644
--- a/src/printer/cvc3.ml
+++ b/src/printer/cvc3.ml
@@ -55,7 +55,7 @@ type info = {
 (** type *)
 let complex_type = Wty.memoize 3 (fun ty ->
   let s = Pp.string_of_wnl Pretty.print_ty ty in
-  create_tysymbol (id_fresh s) [] None)
+  create_tysymbol (id_fresh s) [] NoDef)
 
 let rec print_type info fmt ty = match ty.ty_node with
   | Tyvar _ -> unsupported "cvc3: you must encode the polymorphism"
@@ -202,7 +202,7 @@ and print_triggers info fmt = function
     (print_triggers info) l
 
 let print_type_decl info fmt ts =
-  if ts.ts_args = [] && ts.ts_def = None then
+  if ts.ts_args = [] && not (is_alias_type_def ts.ts_def) then
   if not (Mid.mem ts.ts_name info.info_syn) then
   fprintf fmt "%a : TYPE;@\n@\n" print_ident ts.ts_name
 
diff --git a/src/printer/isabelle.ml b/src/printer/isabelle.ml
index d98441c6921e94f42717a9542cd6cda85074608e..1c441da12ee2999c38dce118117760b1c158579f 100644
--- a/src/printer/isabelle.ml
+++ b/src/printer/isabelle.ml
@@ -389,9 +389,10 @@ let print_ind_decls info s fmt tl =
 
 let print_type_decl info fmt ts =
   if not (Mid.mem ts.ts_name info.info_syn || is_ts_tuple ts) then
+  let def = match ts.ts_def with Alias ty -> Some ty | _ -> None in
     (elem "typedecl" (print_ts info)
        (pair print_tparams (print_option (print_ty info)))
-       fmt (ts, (ts.ts_args, ts.ts_def));
+       fmt (ts, (ts.ts_args, def));
      forget_tvs ())
 
 let print_param_decl info fmt ls =
diff --git a/src/printer/pvs.ml b/src/printer/pvs.ml
index b8571dc68d668a274c697766c39ca1686cb3cd39..de6a3a298f69c9f13e109a1b71e9497cc2b51095 100644
--- a/src/printer/pvs.ml
+++ b/src/printer/pvs.ml
@@ -625,12 +625,12 @@ let print_type_decl ~prev info fmt ts = ignore (prev);
   if not (is_ts_tuple ts) then begin
     print_name fmt ts.ts_name;
     match ts.ts_def with
-    | None ->
+    | NoDef | Range _ | Float _ ->
         fprintf fmt "@[<hov 2>%a%a: TYPE+"
           print_ts ts print_params_list ts.ts_args;
         realization fmt info prev;
         fprintf fmt "@]@\n@\n"
-    | Some ty ->
+    | Alias ty ->
         fprintf fmt "@[<hov 2>%a%a: TYPE+ =@ %a@]@\n@\n"
           print_ts ts print_params_list ts.ts_args
           (print_ty info) ty
diff --git a/src/printer/smtv1.ml b/src/printer/smtv1.ml
index 9790fb8fd2cef76f3ffabcca4d1f1c0f6eb3d6d7..427e322ee5f8ab6c83f389b1255704cd08681526 100644
--- a/src/printer/smtv1.ml
+++ b/src/printer/smtv1.ml
@@ -48,7 +48,7 @@ type info = {
 
 let complex_type = Wty.memoize 3 (fun ty ->
   let s = Pp.string_of_wnl Pretty.print_ty ty in
-  create_tysymbol (id_fresh s) [] None)
+  create_tysymbol (id_fresh s) [] NoDef)
 
 let rec print_type info fmt ty = match ty.ty_node with
   | Tyvar _ -> unsupported "smtv1: you must encode the polymorphism"
@@ -172,7 +172,7 @@ let _print_logic_binder info fmt v =
 *)
 
 let print_type_decl info fmt ts =
-  if ts.ts_args = [] && ts.ts_def = None then
+  if ts.ts_args = [] && not (is_alias_type_def ts.ts_def) then
   if not (Mid.mem ts.ts_name info.info_syn) then
   fprintf fmt ":extrasorts (%a)@\n@\n" print_ident ts.ts_name
 
diff --git a/src/printer/smtv2.ml b/src/printer/smtv2.ml
index 33f3932faf921bf53d7c17a9102803c377125f99..e9a7dc4c402f9e9fdf54cf2b130477dc3da848a8 100644
--- a/src/printer/smtv2.ml
+++ b/src/printer/smtv2.ml
@@ -81,6 +81,7 @@ let ident_printer () =
 type info = {
   info_syn        : syntax_map;
   info_converters : converter_map;
+  info_rliteral   : syntax_map;
   mutable info_model : S.t;
   mutable info_in_goal : bool;
   info_vc_term : vc_term_info;
@@ -138,6 +139,21 @@ let collect_model_ls info ls =
       add_model_element
       (t_label ?loc:ls.ls_name.id_loc ls.ls_name.id_label t) info.info_model
 
+let number_format = {
+  Number.long_int_support = true;
+  Number.extra_leading_zeros_support = false;
+  Number.dec_int_support = Number.Number_default;
+  Number.hex_int_support = Number.Number_unsupported;
+  Number.oct_int_support = Number.Number_unsupported;
+  Number.bin_int_support = Number.Number_unsupported;
+  Number.def_int_support = Number.Number_unsupported;
+  Number.dec_real_support = Number.Number_unsupported;
+  Number.hex_real_support = Number.Number_unsupported;
+  Number.frac_real_support = Number.Number_custom
+    (Number.PrintFracReal ("%s.0", "(* %s.0 %s.0)", "(/ %s.0 %s.0)"));
+  Number.def_real_support = Number.Number_unsupported;
+}
+
 (** expr *)
 let rec print_term info fmt t =
   debug_print_term "Printing term: " t;
@@ -149,21 +165,24 @@ let rec print_term info fmt t =
 
   let () = match t.t_node with
   | Tconst c ->
-      let number_format = {
-          Number.long_int_support = true;
-          Number.extra_leading_zeros_support = false;
-          Number.dec_int_support = Number.Number_default;
-          Number.hex_int_support = Number.Number_unsupported;
-          Number.oct_int_support = Number.Number_unsupported;
-          Number.bin_int_support = Number.Number_unsupported;
-          Number.def_int_support = Number.Number_unsupported;
-          Number.dec_real_support = Number.Number_unsupported;
-          Number.hex_real_support = Number.Number_unsupported;
-          Number.frac_real_support = Number.Number_custom
-            (Number.PrintFracReal ("%s.0", "(* %s.0 %s.0)", "(/ %s.0 %s.0)"));
-          Number.def_real_support = Number.Number_unsupported;
-        } in
-      Number.print number_format fmt c
+      let ts = match t.t_ty with
+        | Some { ty_node = Tyapp (ts, []) } -> ts
+        | _ -> assert false (* impossible *) in
+      (* look for syntax literal ts in driver *)
+      begin match query_syntax info.info_rliteral ts.ts_name, c with
+        | Some st, Number.ConstInt c ->
+          syntax_range_literal st fmt c
+        | Some st, Number.ConstReal c ->
+          let fp = match ts.ts_def with
+            | Float fp -> fp
+            | _ -> assert false in
+          syntax_float_literal st fp fmt c
+        | None, _ -> Number.print number_format fmt c
+        (* TODO/FIXME: we must assert here that the type is either
+            ty_int or ty_real, otherwise it makes no sense to print
+            the literal. Do we ensure that preserved literal types
+            are exactly those that have a dedicated syntax? *)
+      end
   | Tvar v -> print_var info fmt v
   | Tapp (ls, tl) ->
     (* let's check if a converter applies *)
@@ -376,7 +395,7 @@ and print_triggers info fmt = function
     (print_triggers info) l
 
 let print_type_decl info fmt ts =
-  if ts.ts_def <> None then () else
+  if is_alias_type_def ts.ts_def then () else
   if Mid.mem ts.ts_name info.info_syn then () else
   fprintf fmt "(declare-sort %a %i)@\n@\n"
     (print_ident info) ts.ts_name (List.length ts.ts_args)
@@ -478,20 +497,21 @@ let print_data_decl info fmt (ts,cl) =
     (print_ident info) ts.ts_name
     (print_list space (print_constructor_decl info)) cl
 
-let print_decl vc_loc cntexample args info fmt d = match d.d_node with
+let print_decl vc_loc cntexample args info fmt d =
+  match d.d_node with
   | Dtype ts ->
       print_type_decl info fmt ts
   | Ddata [(ts,_)] when query_syntax info.info_syn ts.ts_name <> None -> ()
   | Ddata dl ->
-    fprintf fmt "@[(declare-datatypes ()@ (%a))@]@\n"
-      (print_list space (print_data_decl info)) dl
+      fprintf fmt "@[(declare-datatypes ()@ (%a))@]@\n"
+        (print_list space (print_data_decl info)) dl
   | Dparam ls ->
       collect_model_ls info ls;
       print_param_decl info fmt ls
   | Dlogic dl ->
       print_list nothing (print_logic_decl info) fmt dl
   | Dind _ -> unsupportedDecl d
-      "smtv2 : inductive definition are not supported"
+      "smtv2: inductive definitions are not supported"
   | Dprop (k,pr,f) ->
       if Mid.mem pr.pr_name info.info_syn then () else
       print_prop_decl vc_loc cntexample args info fmt k pr f
@@ -507,6 +527,7 @@ let print_task args ?old:_ fmt task =
   let info = {
     info_syn = Discriminate.get_syntax_map task;
     info_converters = Printer.get_converter_map task;
+    info_rliteral = Printer.get_rliteral_map task;
     info_model = S.empty;
     info_in_goal = false;
     info_vc_term = vc_info;
diff --git a/src/printer/why3printer.ml b/src/printer/why3printer.ml
index 2d783e41ca26846f2bb120676297ce6513b42e95..bb82ae7f3926e96db5e711d51062b39bb5ac8229 100644
--- a/src/printer/why3printer.ml
+++ b/src/printer/why3printer.ml
@@ -137,7 +137,6 @@ let print_pat = print_pat_node 0
 let print_vsty fmt v =
   fprintf fmt "%a:@,%a" print_vs v print_ty v.vs_ty
 
-let print_const = Pretty.print_const
 let print_quant = Pretty.print_quant
 let print_binop = Pretty.print_binop
 
@@ -174,7 +173,7 @@ and print_tnode pri fmt t = match t.t_node with
   | Tvar v ->
       print_vs fmt v
   | Tconst c ->
-      print_const fmt c
+      Number.print_constant fmt c
   | Tapp (fs, tl) when unambig_fs fs ->
       print_app pri fs fmt tl
   | Tapp (fs, tl) ->
@@ -247,14 +246,22 @@ let print_constr fmt (cs,pjl) =
     (List.fold_right2 add_pj pjl cs.ls_args [])
 
 let print_type_decl fmt ts = match ts.ts_def with
-  | None ->
+  | NoDef ->
       fprintf fmt "@[<hov 2>type %a%a%a@]@\n@\n"
         print_ts ts print_ident_labels ts.ts_name
         (print_list nothing print_tv_arg) ts.ts_args
-  | Some ty ->
+  | Alias ty ->
       fprintf fmt "@[<hov 2>type %a%a%a =@ %a@]@\n@\n"
         print_ts ts print_ident_labels ts.ts_name
         (print_list nothing print_tv_arg) ts.ts_args print_ty ty
+  | Range _ir -> (* TODO *)
+      fprintf fmt "@[<hov 2>type %a%a%a =@ <range ...>@]@\n@\n"
+        print_ts ts print_ident_labels ts.ts_name
+        (print_list nothing print_tv_arg) ts.ts_args
+  | Float _fp -> (* TODO *)
+      fprintf fmt "@[<hov 2>type %a%a%a =@ <float ...>@]@\n@\n"
+        print_ts ts print_ident_labels ts.ts_name
+        (print_list nothing print_tv_arg) ts.ts_args
 
 let print_type_decl fmt ts =
   if not (query_remove ts.ts_name) then
diff --git a/src/printer/yices.ml b/src/printer/yices.ml
index 2781113aad69eafe4d9ad6849a0e213946d29564..43cc26b3fb81de39d39a52ebaaa7a7905e876df4 100644
--- a/src/printer/yices.ml
+++ b/src/printer/yices.ml
@@ -60,7 +60,7 @@ type info = {
 (** type *)
 let complex_type = Wty.memoize 3 (fun ty ->
   let s = Pp.string_of_wnl Pretty.print_ty ty in
-  create_tysymbol (id_fresh s) [] None)
+  create_tysymbol (id_fresh s) [] NoDef)
 
 let rec print_type info fmt ty = match ty.ty_node with
   | Tyvar _ -> unsupported "cvc3: you must encode the polymorphism"
@@ -210,7 +210,7 @@ let print_logic_binder info fmt v =
 *)
 
 let print_type_decl info fmt ts =
-  if ts.ts_args = [] && ts.ts_def = None then
+  if ts.ts_args = [] && not (is_alias_type_def ts.ts_def) then
   if not (Mid.mem ts.ts_name info.info_syn) then
   fprintf fmt "(define-type %a)@\n@\n" print_ident ts.ts_name
 
diff --git a/src/session/session.ml b/src/session/session.ml
index 2022a5da95ebf21fae6ce3900a887c6c4b003f61..93cd701cd676a2cb0c2abb4e487405fd4da9635b 100644
--- a/src/session/session.ml
+++ b/src/session/session.ml
@@ -1361,7 +1361,7 @@ and load_metas ctxt mg a =
             let tvs = Util.foldi (fun l _ ->
               (create_tvsymbol (Ident.id_fresh "a"))::l)
               [] 0 arity in
-            let ts = Ty.create_tysymbol (Ident.id_fresh name) tvs None in
+            let ts = Ty.create_tysymbol (Ident.id_fresh name) tvs NoDef in
             Hint.add hts intid ts;
             let idpos_ts = Mts.add ts pos idpos.idpos_ts in
             { idpos with idpos_ts = idpos_ts }
diff --git a/src/session/termcode.ml b/src/session/termcode.ml
index 1d29a139ca3f52e6bd713919aff9583ab86abb81..ea6ea809a114bf4c19f3743d40b4201c84effb7f 100644
--- a/src/session/termcode.ml
+++ b/src/session/termcode.ml
@@ -282,7 +282,7 @@ let ident_shape ~push id acc =
   id_string_shape ~push id.Ident.id_string acc
 
 let const_shape ~push acc c =
-  Format.fprintf Format.str_formatter "%a" Pretty.print_const c;
+  Format.fprintf Format.str_formatter "%a" Number.print_constant c;
   push (Format.flush_str_formatter ()) acc
 
 let rec pat_shape ~(push:string->'a->'a) c m (acc:'a) p : 'a =
@@ -457,10 +457,15 @@ module Checksum = struct
     | CV1 -> ident_v1 b id
     | CV2 -> ident_v2 b id
 
+  let _integer_constant b c =
+    Number.print_integer_constant Format.str_formatter c;
+    let s = Format.flush_str_formatter () in
+    string b s
+
   let const b c =
-      Format.fprintf Format.str_formatter "%a" Pretty.print_const c;
-      let s = Format.flush_str_formatter () in
-      string b s
+    Number.print_constant Format.str_formatter c;
+    let s = Format.flush_str_formatter () in
+    string b s
 
   let tvsymbol b tv = ident b tv.Ty.tv_name
 
@@ -520,7 +525,11 @@ module Checksum = struct
   let tysymbol b ts =
     ident b ts.Ty.ts_name;
     list tvsymbol b ts.Ty.ts_args;
-    option ty b ts.Ty.ts_def
+    match ts.Ty.ts_def with
+    | Ty.NoDef   -> char b 'n'
+    | Ty.Alias x -> char b 's'; ty b x
+    | Ty.Range _ -> char b 'r' (* FIXME *)
+    | Ty.Float _ -> char b 'f' (* FIXME *)
 
   let lsymbol b ls =
     ident b ls.ls_name;
@@ -529,7 +538,7 @@ module Checksum = struct
     list tvsymbol b (Ty.Stv.elements ls.ls_opaque);
     int b ls.ls_constr
 
-  (* start: T D R L I P (C M) *)
+  (* start: T G F D R L I P (C M) *)
   let decl b d = match d.Decl.d_node with
     | Decl.Dtype ts ->
         char b 'T'; tysymbol b ts
diff --git a/src/transform/eliminate_literal.ml b/src/transform/eliminate_literal.ml
new file mode 100644
index 0000000000000000000000000000000000000000..590636deff5c945faefa97857143d659af17dd4c
--- /dev/null
+++ b/src/transform/eliminate_literal.ml
@@ -0,0 +1,160 @@
+(********************************************************************)
+(*                                                                  *)
+(*  The Why3 Verification Platform   /   The Why3 Development Team  *)
+(*  Copyright 2010-2016   --   INRIA - CNRS - Paris-Sud University  *)
+(*                                                                  *)
+(*  This software is distributed under the terms of the GNU Lesser  *)
+(*  General Public License version 2.1, with the special exception  *)
+(*  on linking described in file LICENSE.                           *)
+(*                                                                  *)
+(********************************************************************)
+
+open Ident
+open Ty
+open Term
+open Decl
+open Theory
+
+let meta_keep_lit = register_meta "literal:keep" [MTtysymbol]
+  ~desc:"Preserve@ literals@ of@ a@ given@ type."
+
+let add_literal (known_lit, decl as acc) t c ls_proj fin =
+  try acc, Mterm.find t known_lit with Not_found ->
+    (* TODO: pretty-print the constant to have a readable name *)
+    let litname =
+      match fin with None -> "rliteral" | _ -> "fliteral" in
+    let ls = create_lsymbol (id_fresh litname) [] t.t_ty in
+    let ls_decl = create_param_decl ls in
+    let pr = create_prsymbol (id_fresh (litname^"_axiom")) in
+    let ls_t = t_app ls [] t.t_ty in
+    let f = t_app ls_proj [ls_t] ls_proj.ls_value in
+    let f = t_equ f (t_const c (Opt.get f.t_ty)) in
+    let f = match fin with
+      | None -> f
+      | Some isF -> t_and (t_app isF [ls_t] None) f in
+    let ax_decl = create_prop_decl Paxiom pr f in
+    let decl = ax_decl::ls_decl::decl in
+    (Mterm.add t ls_t known_lit, decl), ls_t
+
+(* TODO: remove int and real literals if not supported.
+   NOTE: in this case, [add_literal] above is incorrect. *)
+let rec abstract_terms kn range_metas float_metas type_kept acc t =
+  match t.t_node, t.t_ty with
+  | Tconst (Number.ConstInt _ as c), Some {ty_node = Tyapp (ts,[])}
+    when not (ts_equal ts ts_int || Sts.mem ts type_kept) ->
+      let to_int = Mts.find ts range_metas in
+      add_literal acc t c to_int None
+  | Tconst (Number.ConstReal _ as c), Some {ty_node = Tyapp (ts,[])}
+    when not (ts_equal ts ts_real || Sts.mem ts type_kept) ->
+      let to_real,isF = Mts.find ts float_metas in
+      add_literal acc t c to_real (Some isF)
+  | _ ->
+      t_map_fold (abstract_terms kn range_metas float_metas type_kept) acc t
+
+let elim le_int le_real abs_real type_kept kn
+    range_metas float_metas d (known_lit,task) =
+  match d.d_node with
+  | Dtype ts when Mts.exists (fun ts' _ -> ts_equal ts ts') range_metas
+               && not (Sts.mem ts type_kept) ->
+      let to_int = Mts.find ts range_metas in
+      let ir = match ts.ts_def with Range ir -> ir | _ -> assert false in
+      let lo = Number.int_const_dec (BigInt.to_string ir.Number.ir_lower) in
+      let hi = Number.int_const_dec (BigInt.to_string ir.Number.ir_upper) in
+      let ty_decl = create_ty_decl ts in
+      let ls_decl = create_param_decl to_int in
+      let pr = create_prsymbol (id_fresh (ts.ts_name.id_string ^ "'axiom")) in
+      let v = create_vsymbol (id_fresh "i") (ty_app ts []) in
+      let v_term = t_app to_int [t_var v] (Some ty_int) in
+      let a_term = t_const (Number.ConstInt lo) ty_int in
+      let b_term = t_const (Number.ConstInt hi) ty_int in
+      let f = t_and (t_app le_int [a_term; v_term] None)
+          (t_app le_int [v_term; b_term] None)
+      in
+      let f = t_forall_close [v] [] f in
+      let ax_decl = create_prop_decl Paxiom pr f in
+      (known_lit, List.fold_left Task.add_decl task [ty_decl; ls_decl; ax_decl])
+  | Dtype ts when Mts.exists (fun ts' _ -> ts_equal ts ts') float_metas
+               && not (Sts.mem ts type_kept) ->
+      let to_real,is_finite = Mts.find ts float_metas in
+      let fp = match ts.ts_def with Float fp -> fp | _ -> assert false in
+      let eb = BigInt.of_int fp.Number.fp_exponent_digits in
+      let sb = BigInt.of_int fp.Number.fp_significand_digits in
+      (* declare abstract type [t] *)
+      let ty_decl = create_ty_decl ts in
+      (* declare projection to_real *)
+      let proj_decl = create_param_decl to_real in
+      (* declare predicate is_finite *)
+      let isFinite_decl = create_param_decl is_finite in
+      (* create defining axiom *)
+      (* [forall v:t. is_finite v -> | to_real v | <= max] *)
+      let pr = create_prsymbol (id_fresh (ts.ts_name.id_string ^ "'axiom")) in
+      let v = create_vsymbol (id_fresh "x") (ty_app ts []) in
+      let v_term = t_app to_real [t_var v] (Some ty_real) in
+      (* compute max *)
+      let emax = BigInt.pow_int_pos_bigint 2 (BigInt.pred eb) in
+      let m = BigInt.pred (BigInt.pow_int_pos_bigint 2 sb) in
+      let e = BigInt.sub emax sb in
+      Number.print_in_base 16 None Format.str_formatter m;
+      let m_string = Format.flush_str_formatter () in
+      Number.print_in_base 10 None Format.str_formatter e;
+      let e_string = Format.flush_str_formatter () in
+      let term = t_const
+          (Number.ConstReal
+             (Number.real_const_hex m_string "" (Some e_string))) ty_real in
+      (* compose axiom *)
+      let f = t_app le_real [t_app abs_real [v_term] (Some ty_real); term] None in
+      let f = t_implies (t_app is_finite [t_var v] None) f in
+      let f = t_forall_close [v] [] f in
+      let ax_decl = create_prop_decl Paxiom pr f in
+      (known_lit, List.fold_left Task.add_decl task
+         [ty_decl; proj_decl; isFinite_decl; ax_decl])
+  | _ ->
+      let (known_lit, local_decl), d =
+        decl_map_fold
+          (abstract_terms kn range_metas float_metas type_kept)
+          (known_lit,[]) d in
+      let t = List.fold_left Task.add_decl task (List.rev local_decl) in
+      (known_lit, Task.add_decl t d)
+
+let eliminate le_int le_real abs_real type_kept
+    range_metas float_metas t (known_lit, acc) =
+  match t.Task.task_decl.td_node with
+  | Decl d ->
+      elim le_int le_real abs_real type_kept
+        t.Task.task_known range_metas float_metas d (known_lit, acc)
+  | Meta (m, [MAts ts]) when meta_equal m meta_keep_lit ->
+      let td = create_meta Libencoding.meta_kept [MAty (ty_app ts [])] in
+      let acc = Task.add_tdecl acc t.Task.task_decl in
+      known_lit, Task.add_tdecl acc td
+  | Use _ | Clone _ | Meta _ ->
+      known_lit, Task.add_tdecl acc t.Task.task_decl
+
+let eliminate_literal env =
+  (* FIXME: int.Int.le_sym should be imported in the task *)
+  let th = Env.read_theory env ["int"] "Int" in
+  let le_int = ns_find_ls th.th_export ["infix <="] in
+  let th = Env.read_theory env ["real"] "Real" in
+  let le_real = ns_find_ls th.th_export ["infix <="] in
+  let th = Env.read_theory env ["real"] "Abs" in
+  let abs_real = ns_find_ls th.th_export ["abs"] in
+  Trans.on_meta meta_range (fun range_metas ->
+      Trans.on_meta meta_float (fun float_metas ->
+          let range_metas = List.fold_left (fun acc meta_arg ->
+              match meta_arg with
+              | [MAts ts; MAls to_int] -> Mts.add ts to_int acc
+              | _ -> assert false) Mts.empty range_metas in
+          let float_metas = List.fold_left (fun acc meta_arg ->
+              match meta_arg with
+              | [MAts ts; MAls to_real; MAls is_finite] ->
+                  Mts.add ts (to_real,is_finite) acc
+              | _ -> assert false) Mts.empty float_metas in
+          Trans.on_tagged_ts meta_keep_lit
+            (fun type_kept ->
+               Trans.fold_map
+                 (eliminate le_int le_real abs_real type_kept
+                    range_metas float_metas)
+                 Mterm.empty None)))
+
+let () =
+  Trans.register_env_transform "eliminate_literal" eliminate_literal
+    ~desc:"Eliminate@ unsupported@ literals."
diff --git a/src/transform/eliminate_literal.mli b/src/transform/eliminate_literal.mli
new file mode 100644
index 0000000000000000000000000000000000000000..e162cf92c49d593ddf7d3c5f3b5d74643e2c5b03
--- /dev/null
+++ b/src/transform/eliminate_literal.mli
@@ -0,0 +1,12 @@
+(********************************************************************)
+(*                                                                  *)
+(*  The Why3 Verification Platform   /   The Why3 Development Team  *)
+(*  Copyright 2010-2016   --   INRIA - CNRS - Paris-Sud University  *)
+(*                                                                  *)
+(*  This software is distributed under the terms of the GNU Lesser  *)
+(*  General Public License version 2.1, with the special exception  *)
+(*  on linking described in file LICENSE.                           *)
+(*                                                                  *)
+(********************************************************************)
+
+val meta_keep_lit : Theory.meta
diff --git a/src/transform/encoding_guards.ml b/src/transform/encoding_guards.ml
index d63c1ac85ebbee55e8cf556e3b34cdf6caddf27f..32f952ad0fc4db63898b055a48ea52b3476370ed 100644
--- a/src/transform/encoding_guards.ml
+++ b/src/transform/encoding_guards.ml
@@ -114,9 +114,8 @@ let ls_desc info ls =
   [create_prop_decl Paxiom pr (t_type_close (expl_term info true) f)]
 
 let decl info d = match d.d_node with
-  | Dtype { ts_def = Some _ } -> []
-  | Dtype ts ->
-      [d; lsdecl_of_ts ts]
+  | Dtype { ts_def = Alias _ } -> []
+  | Dtype ts -> [d; lsdecl_of_ts ts]
   | Ddata _ -> Printer.unsupportedDecl d
       "Algebraic types are not supported, run eliminate_algebraic"
   | Dparam ls ->
diff --git a/src/transform/encoding_guards_full.ml b/src/transform/encoding_guards_full.ml
index 6bf16e0520e08853092cf828467f1d78b945b861..a10e3aea8abd1d5eb5b43cf246d480bc18851cdf 100644
--- a/src/transform/encoding_guards_full.ml
+++ b/src/transform/encoding_guards_full.ml
@@ -269,7 +269,7 @@ end
 (** {2 main part} *)
 
 let decl kept d = match d.d_node with
-  | Dtype { ts_def = Some _ } -> []
+  | Dtype { ts_def = Alias _ } -> []
   | Dtype ts -> d :: Lib.lsdecl_of_ts_select ts
   | Ddata _ -> Printer.unsupportedDecl d
       "Algebraic types are not supported, run eliminate_algebraic"
diff --git a/src/transform/encoding_sort.ml b/src/transform/encoding_sort.ml
index 2fe2e6c442820d005bad1975128e5bbb6c104f8a..212c8718e233303b5d966f2ee5795debe1004a0e 100644
--- a/src/transform/encoding_sort.ml
+++ b/src/transform/encoding_sort.ml
@@ -32,7 +32,7 @@ let conv_ts tenv undefined name ty =
     try
       Hty.find tenv.specials ty
     with Not_found ->
-      let ts = create_tysymbol (id_clone name) [] None in
+      let ts = create_tysymbol (id_clone name) [] NoDef in
       Hty.add tenv.specials ty ts;
       ts in
   Hts.replace undefined ts ();
@@ -128,7 +128,7 @@ let fold tenv taskpre task =
   match taskpre.task_decl.td_node with
     | Decl d ->
       begin match d.d_node with
-        | Dtype { ts_def = Some _ }
+        | Dtype { ts_def = Alias _ }
         | Dtype { ts_args = _::_ } -> task
         | Dtype ts -> add_ty_decl task ts
         | Ddata _ ->
@@ -151,9 +151,9 @@ let fold tenv taskpre task =
         let ud = Hts.create 3 in
         let map = function
           | MAty ty -> MAty (conv_ty tenv ud ty)
-          | MAts {ts_name = name; ts_args = []; ts_def = Some ty} ->
-            MAts (conv_ts tenv ud name ty)
-          | MAts {ts_args = []; ts_def = None} as x -> x
+          | MAts {ts_name = name; ts_args = []; ts_def = Alias ty} ->
+              MAts (conv_ts tenv ud name ty)
+          | MAts {ts_args = []} as x -> x
           | MAts _ -> raise Exit
           | MAls ls -> MAls (conv_ls tenv ud ls)
           | MApr _ -> raise Exit
diff --git a/src/transform/encoding_tags.ml b/src/transform/encoding_tags.ml
index 570f38e18a5f8a6d7a5176321340492bb5f26430..763f0b72a8e4b08d5b8f9c8d7d373467980eb178 100644
--- a/src/transform/encoding_tags.ml
+++ b/src/transform/encoding_tags.ml
@@ -115,9 +115,8 @@ let ls_desc info ls =
   [create_prop_decl Paxiom pr (t_type_close (expl_term info true) f)]
 
 let decl info d = match d.d_node with
-  | Dtype { ts_def = Some _ } -> []
-  | Dtype ts ->
-      [d; lsdecl_of_ts ts]
+  | Dtype { ts_def = Alias _ } -> []
+  | Dtype ts -> [d; lsdecl_of_ts ts]
   | Ddata _ -> Printer.unsupportedDecl d
       "Algebraic types are not supported, run eliminate_algebraic"
   | Dparam ls ->
diff --git a/src/transform/encoding_tags_full.ml b/src/transform/encoding_tags_full.ml
index ec7d7675d06961c48f73b7e4361d47c5c225f3e8..85e7934618cb9c3986e31949340873095cdf6ea5 100644
--- a/src/transform/encoding_tags_full.ml
+++ b/src/transform/encoding_tags_full.ml
@@ -61,7 +61,7 @@ let deco_term kept tvar =
   deco
 
 let deco_decl kept d = match d.d_node with
-  | Dtype { ts_def = Some _ } -> []
+  | Dtype { ts_def = Alias _ } -> []
   | Dtype ts -> [d; lsdecl_of_ts ts]
   | Ddata _ -> Printer.unsupportedDecl d
       "Algebraic types are not supported, run eliminate_algebraic"
@@ -87,10 +87,10 @@ let deco kept = Trans.decl (deco_decl kept) deco_init
 
 (** Monomorphisation *)
 
-let ts_base = create_tysymbol (id_fresh "uni") [] None
+let ts_base = create_tysymbol (id_fresh "uni") [] NoDef
 let ty_base = ty_app ts_base []
 
-let ts_deco = create_tysymbol (id_fresh "deco") [] None
+let ts_deco = create_tysymbol (id_fresh "deco") [] NoDef
 let ty_deco = ty_app ts_deco []
 
 let ls_deco = create_fsymbol (id_fresh "sort") [ty_type;ty_base] ty_deco
diff --git a/src/transform/intro_vc_vars_counterexmp.ml b/src/transform/intro_vc_vars_counterexmp.ml
index 0077a25bad3ed0a1b5399221c6de7f07f9d249d6..508aa6d2801ba6ca1c37f2841892078fa2698f1c 100644
--- a/src/transform/intro_vc_vars_counterexmp.ml
+++ b/src/transform/intro_vc_vars_counterexmp.ml
@@ -299,7 +299,7 @@ let do_intro_vc_vars_counterexmp info vc_loc pr t =
   let vc_map = Hprid.create 100 in
   let vc_var = Hvs.create 100 in
   let tvs = t_ty_freevars Stv.empty t in
-  let mk_ts tv () = create_tysymbol (id_clone tv.tv_name) [] None in
+  let mk_ts tv () = create_tysymbol (id_clone tv.tv_name) [] NoDef in
   let tvm = Mtv.mapi mk_ts tvs in
   let decls = Mtv.map create_ty_decl tvm in
   let subst = Mtv.map (fun ts -> ty_app ts []) tvm in
diff --git a/src/transform/introduction.ml b/src/transform/introduction.ml
index a49d5de14ac946a7fb8a258cddf724549beb48e1..906b7a4e07ec7e9a558eac2b57948866c1d76f60 100644
--- a/src/transform/introduction.ml
+++ b/src/transform/introduction.ml
@@ -59,7 +59,7 @@ let rec intros pr f =
 
 let intros pr f =
   let tvs = t_ty_freevars Stv.empty f in
-  let mk_ts tv () = create_tysymbol (id_clone tv.tv_name) [] None in
+  let mk_ts tv () = create_tysymbol (id_clone tv.tv_name) [] NoDef in
   let tvm = Mtv.mapi mk_ts tvs in
   let decls = Mtv.map create_ty_decl tvm in
   let subst = Mtv.map (fun ts -> ty_app ts []) tvm in
diff --git a/src/transform/libencoding.ml b/src/transform/libencoding.ml
index e46996405adfb7f2586acfdacf5ae4460fc2592e..a305079257d1588b77400b2cce66774d88e5a2ff 100644
--- a/src/transform/libencoding.ml
+++ b/src/transform/libencoding.ml
@@ -28,7 +28,7 @@ let meta_base = register_meta_excl "encoding : base" [MTty]
     polymorphism@ encoding@ (`int'@ or@ `real'@ only)."
 
 (* sort symbol of the default base type *)
-let ts_base = create_tysymbol (id_fresh "uni") [] None
+let ts_base = create_tysymbol (id_fresh "uni") [] NoDef
 
 (* default base type *)
 let ty_base = ty_app ts_base []
@@ -37,7 +37,7 @@ let ty_base = ty_app ts_base []
 let d_ts_base = create_ty_decl ts_base
 
 (* sort symbol of (polymorphic) types *)
-let ts_type = create_tysymbol (id_fresh "ty") [] None
+let ts_type = create_tysymbol (id_fresh "ty") [] NoDef
 
 (* sort of (polymorphic) types *)
 let ty_type = ty_app ts_type []
@@ -162,7 +162,7 @@ let d_monomorph ty_base kept lsmap d =
   let consts = ref Sls.empty in
   let t_mono = t_monomorph ty_base kept lsmap consts in
   let dl = match d.d_node with
-    | Dtype { ts_def = Some _ } -> []
+    | Dtype { ts_def = Alias _ } -> []
     | Dtype ts when not (Sty.exists (ty_s_any (ts_equal ts)) kept) -> []
     | Dtype ts ->
         [create_ty_decl ts]
@@ -242,7 +242,7 @@ let monomorphise_task =
 
 (* replace type variables in a goal with fresh type constants *)
 let ts_of_tv = Htv.memo 63 (fun tv ->
-  create_tysymbol (id_clone tv.tv_name) [] None)
+  create_tysymbol (id_clone tv.tv_name) [] NoDef)
 
 let monomorphise_goal = Trans.goal (fun pr f ->
   let stv = t_ty_freevars Stv.empty f in
diff --git a/src/transform/reduction_engine.ml b/src/transform/reduction_engine.ml
index abe49f326d013f91510e3a94fad11aa8146a0582..5b1d42ee368081302e90569a8de101354cca7bc3 100644
--- a/src/transform/reduction_engine.ml
+++ b/src/transform/reduction_engine.ml
@@ -23,7 +23,8 @@ let v_label_copy orig v =
   | Term t -> Term (t_label_copy orig t)
 
 let const_of_positive n =
-    t_const (Number.ConstInt (Number.int_const_dec (BigInt.to_string n)))
+  t_const (Number.ConstInt (Number.int_const_dec (BigInt.to_string n)))
+    Ty.ty_int
 
 let ls_minus = ref ps_equ (* temporary *)
 
@@ -47,7 +48,7 @@ let big_int_of_const c =
 let big_int_of_value v =
   match v with
   | Int n -> n
-  | Term {t_node = Tconst c } -> big_int_of_const c
+  | Term { t_node = Tconst c } -> big_int_of_const c
   | Term { t_node = Tapp (ls,[{ t_node = Tconst c }]) }
     when ls_compare ls !ls_minus = 0 -> BigInt.minus (big_int_of_const c)
   | _ -> raise NotNum
diff --git a/src/util/bigInt.ml b/src/util/bigInt.ml
index 6537afeba4b4f5bf04c60c2a1ccd008836d6a507..2de06c295348dd5ddde7346b3644d528ed98c18a 100644
--- a/src/util/bigInt.ml
+++ b/src/util/bigInt.ml
@@ -59,9 +59,11 @@ let min = min_big_int
 let max = max_big_int
 let abs = abs_big_int
 
+let num_digits = num_digits_big_int
+
 let pow_int_pos = power_int_positive_int
+let pow_int_pos_bigint = power_int_positive_big_int
 
 let to_string = string_of_big_int
 let of_string = big_int_of_string
 let to_int = int_of_big_int
-
diff --git a/src/util/bigInt.mli b/src/util/bigInt.mli
index 31047571cbfae4df89bb2260430a18538a30873b..ebfc27017f8f5d62f716c13c38d356fed94f9eb0 100644
--- a/src/util/bigInt.mli
+++ b/src/util/bigInt.mli
@@ -58,8 +58,12 @@ val min : t -> t -> t
 val max : t -> t -> t
 val abs : t -> t
 
+(** number of digits  *)
+val num_digits : t -> int
+
 (** power of small integers. Second arg must be non-negative *)
 val pow_int_pos : int -> int -> t
+val pow_int_pos_bigint : int -> t -> t
 
 (** conversions *)
 val of_string : string -> t
diff --git a/src/util/number.ml b/src/util/number.ml
index 7b045e58b7695b9bb4b411697d81be59cf216208..da20a8306f6ac649f88134ca08ae57641fdec9ee 100644
--- a/src/util/number.ml
+++ b/src/util/number.ml
@@ -74,9 +74,6 @@ let real_const_hex i f e =
   Opt.iter check_exp e;
   RConstHex (i,f,e)
 
-(** Printing *)
-
-
 let compute_any radix s =
   let n = String.length s in
   let rec compute acc i =
@@ -93,6 +90,8 @@ let compute_any radix s =
     end in
   (compute BigInt.zero 0)
 
+(** Printing *)
+
 let compute_int c =
   match c with
   | IConstDec s -> compute_any 10 s
@@ -257,15 +256,216 @@ let print support fmt = function
   | ConstReal (RConstDec (i, f, e)) -> print_dec_real support fmt i f e
   | ConstReal (RConstHex (i, f, e)) -> print_hex_real support fmt i f e
 
-let () = Exn_printer.register
-  begin fun fmt exn -> match exn with
-  | InvalidConstantLiteral (n,s) ->
-      fprintf fmt "Invalid constant literal in base %d: '%s'" n s
-  | _ -> raise exn
+let char_of_int i =
+  if i < 10 then
+    Char.chr (i + Char.code '0')
+  else
+    Char.chr (i + Char.code 'A' - 10)
+
+open BigInt
+
+let print_zeros fmt n =
+  for _i = 0 to n - 1 do
+    pp_print_char fmt '0'
+  done
+
+let rec print_in_base_aux radix digits fmt i =
+  if lt i radix then begin
+    begin match digits with
+      | Some n -> print_zeros fmt (n - 1)
+      | None -> ()
+    end;
+    fprintf fmt "%c" (char_of_int (to_int i))
   end
+  else
+    let d,m = computer_div_mod i radix in
+    let digits = Opt.map ((+) (-1)) digits in
+    print_in_base_aux radix digits fmt d;
+    fprintf fmt "%c" (char_of_int (to_int m))
+
+let print_in_base radix digits fmt i =
+  print_in_base_aux (of_int radix) digits fmt i
+
+(** Range checks *)
+
+type int_range = {
+  ir_lower : BigInt.t;
+  ir_upper : BigInt.t;
+}
+
+exception OutOfRange of integer_constant
 
-(*
-Local Variables:
-compile-command: "unset LANG; make -C ../.. byte"
-End:
-*)
+let check_range c {ir_lower = lo; ir_upper = hi} =
+  let cval = compute_int c in
+  if BigInt.lt cval lo || BigInt.gt cval hi then raise (OutOfRange c)
+
+(** Float checks *)
+
+type float_format = {
+  fp_exponent_digits    : int;
+  fp_significand_digits : int; (* counting the hidden bit *)
+}
+
+exception NonRepresentableFloat of real_constant
+
+let debug_float = Debug.register_info_flag "float"
+  ~desc:"Avoid@ catching@ exceptions@ in@ order@ to@ get@ \
+         float@ literal@ checks@ messages."
+
+let float_parser c =
+  let exp_parser e = match e.[0] with
+    | '-' -> minus (compute_any 10 (String.sub e 1 (String.length e - 1)))
+    | _   -> compute_any 10 e
+  in
+
+  (* get the value s and e such that c = s * 2 ^ e *)
+  let s, e =
+    match c with
+    (* c = a.b * 10 ^ e *)
+    | RConstDec (a,b,e) ->
+      let b_length = String.length b in
+      let s = ref (compute_any 10 (a ^ b)) in
+      let e = sub (match e with
+          | None -> Debug.dprintf debug_float "c = %s.%s" a b;
+            zero
+          | Some e -> Debug.dprintf debug_float "c = %s.%se%s" a b e;
+            exp_parser e)
+          (of_int b_length)
+      in
+      (* transform c = s * 10 ^ i into c = s' * 2 ^ i' *)
+      let s =
+        if lt e zero then begin
+          let efive = pow_int_pos_bigint 5 (minus e) in
+          let dv, rem = euclidean_div_mod !s efive in
+          if not (eq rem zero) then begin
+            raise (NonRepresentableFloat c);
+          end else
+            dv
+        end else
+          mul !s (pow_int_pos_bigint 5 e)
+      in
+      Debug.dprintf debug_float " = %s * 2 ^ %s" (to_string s) (to_string e);
+      ref s, ref e
+
+    (* c = a.b * 2 ^ e *)
+    | RConstHex (a,b,e) ->
+      let b_length = String.length b in
+      ref (compute_any 16 (a ^ b)),
+      ref (sub (match e with
+          | None -> Debug.dprintf debug_float "c = %s.%s" a b;
+            zero
+          | Some e -> Debug.dprintf debug_float "c = %s.%sp%s" a b e;
+            exp_parser e)
+          (of_int (b_length * 4)))
+  in
+  s, e
+
+let compute_float c fp =
+  let eb = BigInt.of_int fp.fp_exponent_digits in
+  let sb = BigInt.of_int fp.fp_significand_digits in
+  (* 2 ^ (sb - 1)    min representable normalized significand*)
+  let smin = pow_int_pos_bigint 2 (sub sb one) in
+  (* (2 ^ sb) - 1    max representable normalized significand*)
+  let smax = sub (pow_int_pos_bigint 2 sb) one in
+  (* 2 ^ (eb - 1)    exponent of the infinities *)
+  let emax = pow_int_pos_bigint 2 (sub eb one) in
+  (* 1 - emax        exponent of the denormalized *)
+  let eden = sub one emax in
+  (* 3 - emax - sb   smallest denormalized' exponent *)
+  let emin = sub (add (of_int 2) eden) sb in
+
+  (* get [s] and [e] such that "c = s * 2 ^ e" *)
+  let s, e = float_parser c in
+
+  (* if s = 0 stop now *)
+  if eq !s zero then
+    zero, zero
+
+  else begin
+
+    (* if s is too big or e is too small, try to remove trailing zeros
+       in s and incr e *)
+    while gt !s smax || lt !e emin do
+      let new_s, rem = euclidean_div_mod !s (of_int 2) in
+      if not (eq rem zero) then begin
+        Debug.dprintf debug_float "Too many digits in significand.";
+        raise (NonRepresentableFloat c);
+      end else begin
+        s := new_s;
+        e := succ !e
+      end
+    done;
+
+    (* if s is too small and e is too big, add trailing zeros in s and
+       decr e *)
+    while lt !s smin && gt !e emin do
+      s := mul_int 2 !s;
+      e := pred !e
+    done;
+
+    Debug.dprintf debug_float " = %s * 2 ^ %s@." (to_string !s) (to_string !e);
+
+    if lt !s smin then begin
+      (* denormal case *)
+
+      Debug.dprintf debug_float "final: c = 0.[%s] * 2 ^ ([0] - bias + 1); bias=%s, i.e, 0[%a][%a]@."
+        (to_string !s) (to_string (sub emax one)) (print_in_base 2 (Some (to_int eb))) zero
+      (print_in_base 2 (Some (to_int (sub sb one)))) !s;
+
+      !s, zero
+
+    end else begin
+      (* normal case *)
+
+      (* normalize the exponent *)
+      let fe = add !e (sub sb one) in
+
+      (* now that s and e are in shape, check that e is not too big *)
+      if ge fe emax then begin
+        Debug.dprintf debug_float "Exponent too big.";
+        raise (NonRepresentableFloat c)
+      end;
+
+      (* add the exponent bia to e *)
+      let fe = add fe (sub emax one) in
+      let fs = sub !s smin in
+
+      Debug.dprintf debug_float "final: c = 1.[%s] * 2 ^ ([%s] - bias); bias=%s, i.e, 0[%a][%a]@."
+        (to_string fs) (to_string fe) (to_string (sub emax one))
+        (print_in_base 2 (Some (to_int eb))) fe
+        (print_in_base 2 (Some (to_int (sub sb one)))) fs;
+
+      assert (le zero fs && lt fs (pow_int_pos_bigint 2 (sub sb one))
+              && le zero fe && lt fe (sub (pow_int_pos_bigint 2 eb) one));
+
+      fe, fs
+    end
+  end
+
+let check_float c fp = ignore (compute_float c fp)
+
+let print_integer_constant fmt = function
+  | IConstDec s -> fprintf fmt "%s" s
+  | IConstHex s -> fprintf fmt "0x%s" s
+  | IConstOct s -> fprintf fmt "0o%s" s
+  | IConstBin s -> fprintf fmt "0b%s" s
+
+let print_real_constant fmt = function
+  | RConstDec (i,f,None)   -> fprintf fmt "%s.%s" i f
+  | RConstDec (i,f,Some e) -> fprintf fmt "%s.%se%s" i f e
+  | RConstHex (i,f,Some e) -> fprintf fmt "0x%s.%sp%s" i f e
+  | RConstHex (i,f,None)   -> fprintf fmt "0x%s.%s" i f
+
+let print_constant fmt = function
+  | ConstInt c  -> print_integer_constant fmt c
+  | ConstReal c -> print_real_constant fmt c
+
+let () = Exn_printer.register (fun fmt exn -> match exn with
+  | InvalidConstantLiteral (n,s) ->
+      fprintf fmt "Invalid integer literal in base %d: '%s'" n s
+  | NonRepresentableFloat c ->
+      fprintf fmt "Invalid floating point literal: '%a'"
+        print_real_constant c
+  | OutOfRange c ->
+      fprintf fmt "Integer literal %a is out of range" print_integer_constant c
+  | _ -> raise exn)
diff --git a/src/util/number.mli b/src/util/number.mli
index 9ef4becfdb89b0e1a5ec7e2c840572c990ce359d..2981e34b0a19ecdc38240d9406ebdfee9c93f7fd 100644
--- a/src/util/number.mli
+++ b/src/util/number.mli
@@ -43,7 +43,13 @@ val compute_int : integer_constant -> BigInt.t
 val real_const_dec : string -> string -> string option -> real_constant
 val real_const_hex : string -> string -> string option -> real_constant
 
-(** Printing *)
+(** Pretty-printing *)
+
+val print_integer_constant : formatter -> integer_constant -> unit
+val print_real_constant : formatter -> real_constant -> unit
+val print_constant : formatter -> constant -> unit
+
+(** Pretty-printing with conversion *)
 
 type integer_format =
   (string -> unit, Format.formatter, unit) format
@@ -82,3 +88,40 @@ type number_support = {
 }
 
 val print : number_support -> formatter -> constant -> unit
+
+val print_in_base : int -> int option -> formatter -> BigInt.t -> unit
+(** [print_in_base radix digits fmt i] prints the value of [i] in base
+    [radix]. If digits is not [None] adds leading 0s to have [digits]
+    characters. *)
+
+(** Range checking *)
+
+type int_range = {
+  ir_lower : BigInt.t;
+  ir_upper : BigInt.t;
+}
+
+exception OutOfRange of integer_constant
+
+val check_range : integer_constant -> int_range -> unit
+(** [check_range c ir] checks that [c] is in the range described
+    by [ir], and raises [OutOfRange c] if not. *)
+
+(** Float checking *)
+
+type float_format = {
+  fp_exponent_digits    : int;
+  fp_significand_digits : int; (* counting the hidden bit *)
+}
+
+exception NonRepresentableFloat of real_constant
+
+val compute_float : real_constant -> float_format -> BigInt.t * BigInt.t
+(** [compute_float c fp] checks that [c] is a float literal
+    representable in the format [fp]. Returns a pair [e,s] with
+    [s] the significand (without the hidden bit), and [e] the biased
+    exponent. Raises [NonRepresentableFloat c] exception otherwise. *)
+
+val check_float : real_constant -> float_format -> unit
+(** [check_float c fp] is the same as [compute_float c fp]
+    but does not return any value. *)
diff --git a/src/whyml/mlw_decl.ml b/src/whyml/mlw_decl.ml
index dde74541b23bff55b00ddd0c5f6b3477840544b2..976868ab5203c24fee275b2d47df4fcf13c84ffe 100644
--- a/src/whyml/mlw_decl.ml
+++ b/src/whyml/mlw_decl.ml
@@ -39,7 +39,7 @@ and pdecl_node =
 
 let pd_equal : pdecl -> pdecl -> bool = (==)
 
-let ts_mark = create_tysymbol (id_fresh "'mark") [] None
+let ts_mark = create_tysymbol (id_fresh "'mark") [] NoDef
 let ty_mark = ty_app ts_mark []
 let ity_mark = ity_pur ts_mark []
 
diff --git a/src/whyml/mlw_dexpr.ml b/src/whyml/mlw_dexpr.ml
index 021ef01f2d5972311dbcf7debfc61c2e94454db3..62603d075fbe878e6aa4015f0f9f65892a1d27bd 100644
--- a/src/whyml/mlw_dexpr.ml
+++ b/src/whyml/mlw_dexpr.ml
@@ -77,12 +77,9 @@ let ity_of_dity dity =
   ity dity
 
 let dity_int  = Dpur (ts_int,  [])
-let dity_real = Dpur (ts_real, [])
 let dity_bool = Dpur (ts_bool, [])
 let dity_unit = Dpur (ts_unit, [])
 
-let dvty_int  = [], dity_int
-let dvty_real = [], dity_real
 let dvty_bool = [], dity_bool
 let dvty_unit = [], dity_unit
 
@@ -398,7 +395,7 @@ and dexpr_node =
   | DEplapp of plsymbol * dexpr list
   | DElsapp of lsymbol * dexpr list
   | DEapply of dexpr * dexpr
-  | DEconst of Number.constant
+  | DEconst of Number.constant * ity
   | DElam of dbinder list * dexpr * dspec later
   | DElet of dlet_defn * dexpr
   | DEfun of dfun_defn * dexpr
@@ -676,10 +673,7 @@ let dexpr ?loc node =
         let argl, res = specialize_ls fs_func_app in
         dity_unify_app fs_func_app dexpr_expected_type [de1;de2] argl;
         [], res
-    | DEconst (Number.ConstInt _) ->
-        dvty_int
-    | DEconst (Number.ConstReal _) ->
-        dvty_real
+    | DEconst (_, ity) -> [], dity_of_ity ity
     | DEfun ((_,_,[],_,_),_) ->
         invalid_arg "Mlw_dexpr.dexpr: empty argument list in DEfun"
     | DElet (_,de)
@@ -1203,8 +1197,8 @@ and try_expr keep_loc uloc env ({de_dvty = argl,res} as de0) =
       e_app e1 [e_ghostify gh (get env de2)]
   | DEapply (de1,de2) ->
       e_lapp fs_func_app [get env de1; get env de2] (ity_of_dity res)
-  | DEconst c ->
-      e_const c
+  | DEconst (c,ity) ->
+      e_const c ity
   | DElet ((id,gh,de1),de2) ->
       let e1 = get env de1 in
       let mk_expr e1 =
diff --git a/src/whyml/mlw_dexpr.mli b/src/whyml/mlw_dexpr.mli
index 8026ea3f36513c77d266948e0485643b2487602c..ab8bef45259cb12097c38efc3fcc4f7a7efcb85e 100644
--- a/src/whyml/mlw_dexpr.mli
+++ b/src/whyml/mlw_dexpr.mli
@@ -106,7 +106,7 @@ and dexpr_node =
   | DEplapp of plsymbol * dexpr list
   | DElsapp of lsymbol * dexpr list
   | DEapply of dexpr * dexpr
-  | DEconst of Number.constant
+  | DEconst of Number.constant * ity
   | DElam of dbinder list * dexpr * dspec later
   | DElet of dlet_defn * dexpr
   | DEfun of dfun_defn * dexpr
diff --git a/src/whyml/mlw_driver.ml b/src/whyml/mlw_driver.ml
index d1957d996826a6d18dee9bfdcb2ce4d7dd60ff56..61742cfedca2c9691b6b5bf81e0c6c4e3300fa02 100644
--- a/src/whyml/mlw_driver.ml
+++ b/src/whyml/mlw_driver.ml
@@ -115,14 +115,16 @@ let load_driver env file extra_files =
         add_syntax ps.ls_name s b
     | Rconverter _ ->
         Loc.errorm "Syntax converter cannot be used in pure theories"
+    | Rliteral _ ->
+        Loc.errorm "Syntax literal cannot be used in pure theories"
     | Rremovepr (q) ->
-      ignore (find_pr th q)
+        ignore (find_pr th q)
     | Rremoveall ->
-      let it key _ = match (Mid.find key th.th_known).Decl.d_node with
-        | Decl.Dprop (_,symb,_) -> ignore symb
-        | _ -> ()
-      in
-      Mid.iter it th.th_local
+        let it key _ = match (Mid.find key th.th_known).Decl.d_node with
+          | Decl.Dprop (_,symb,_) -> ignore symb
+          | _ -> ()
+        in
+        Mid.iter it th.th_local
     | Rmeta (s,al) ->
         let rec ty_of_pty = function
           | PTyvar x ->
diff --git a/src/whyml/mlw_expr.ml b/src/whyml/mlw_expr.ml
index 6e022119d4fdc7420ac044f74e89b00733f3fc8a..844385b97e80ddd2494d411cb6148a13f3292030 100644
--- a/src/whyml/mlw_expr.ml
+++ b/src/whyml/mlw_expr.ml
@@ -690,10 +690,10 @@ let e_assign pls e0 e1 = on_value (e_assign_real pls e0) e1
 
 (* numeric constants *)
 
-let e_const t =
+let e_from_t t =
   mk_expr (Elogic t) (VTvalue (ity_of_ty_opt t.t_ty)) false eff_empty syms_empty
 
-let e_const c = e_const (t_const c)
+let e_const c ity = e_from_t (t_const c (ty_of_ity ity))
 
 (* boolean expressions *)
 
diff --git a/src/whyml/mlw_expr.mli b/src/whyml/mlw_expr.mli
index 71cd00f04905dfe85d79d0b5953872c473acd47c..5e414f64aeee687a90c5cd90cdcde6f4bb05fa24 100644
--- a/src/whyml/mlw_expr.mli
+++ b/src/whyml/mlw_expr.mli
@@ -232,7 +232,7 @@ val fs_void : lsymbol
 val t_void : term
 val e_void : expr
 
-val e_const : Number.constant -> expr
+val e_const : Number.constant -> ity -> expr
 val e_lazy_and : expr -> expr -> expr
 val e_lazy_or : expr -> expr -> expr
 val e_not : expr -> expr
diff --git a/src/whyml/mlw_ocaml.ml b/src/whyml/mlw_ocaml.ml
index 2b6a9872c075a7c60e62e76b95da3da338d64c6c..9c917cd97d3e20b669ada022005d6bc6b8c893f9 100644
--- a/src/whyml/mlw_ocaml.ml
+++ b/src/whyml/mlw_ocaml.ml
@@ -199,9 +199,10 @@ module Translate = struct
         []
 
   let type_decl info ts = match ts.ts_def with
-    | None ->
+    | NoDef | Range _ | Float _ ->
+        (* FIXME: how should we extract Range and Float? *)
         ML.Dabstract
-    | Some ty ->
+    | Alias ty ->
         ML.Dalias (type_ info ty)
 
   let type_args = List.map (fun tv -> tv.tv_name)
diff --git a/src/whyml/mlw_ty.ml b/src/whyml/mlw_ty.ml
index 9e3b32fef0377b6d13988c183d0b27343aed99de..d8c6d00b4adcbbab511a8bbf7c90431369075b04 100644
--- a/src/whyml/mlw_ty.ml
+++ b/src/whyml/mlw_ty.ml
@@ -411,8 +411,8 @@ let ity_pur s tl =
   let sub = { ity_subst_tv = mv; ity_subst_reg = Mreg.empty } in
   (* every top region in def is guaranteed to be in mr *)
   match s.ts_def with
-  | Some ty -> ity_full_inst sub (ity_of_ty ty)
-  | None -> ity_pur_unsafe s tl
+  | Alias ty -> ity_full_inst sub (ity_of_ty ty)
+  | _ -> ity_pur_unsafe s tl
 
 (* itysymbol creation *)
 
@@ -435,7 +435,9 @@ let create_itysymbol_unsafe, restore_its =
 let create_itysymbol name
       ?(abst=false) ?(priv=false) ?(inv=false) ?(ghost_reg=Sreg.empty)
       args regs def =
-  let puredef = Opt.map ty_of_ity def in
+  let puredef = match def with
+    | Some def -> Alias (ty_of_ity def)
+    | None -> NoDef in
   let purets = create_tysymbol name args puredef in
   (* all regions *)
   let add s r = Sreg.add_new (DuplicateRegion r) r s in
@@ -471,6 +473,7 @@ let ts_unit = ts_tuple 0
 let ty_unit = ty_tuple []
 
 let ity_int  = ity_of_ty Ty.ty_int
+let ity_real = ity_of_ty Ty.ty_real
 let ity_bool = ity_of_ty Ty.ty_bool
 let ity_unit = ity_of_ty ty_unit
 
diff --git a/src/whyml/mlw_ty.mli b/src/whyml/mlw_ty.mli
index 4a9469a54621c3ce9cc542b23930ed46d1c9bdf4..35912cd6983f12739c92d967a805389ba7351f95 100644
--- a/src/whyml/mlw_ty.mli
+++ b/src/whyml/mlw_ty.mli
@@ -147,7 +147,8 @@ val lookup_nonghost_reg : Sreg.t -> ity -> bool
 val ts_unit : tysymbol (** the same as [Ty.ts_tuple 0] *)
 val ty_unit : ty
 
-val ity_int : ity
+val ity_int  : ity
+val ity_real : ity
 val ity_bool : ity
 val ity_unit : ity
 
diff --git a/src/whyml/mlw_typing.ml b/src/whyml/mlw_typing.ml
index 7775af0fa146704da9a43f820be48174206edb74..78c7a76ce8636845f6c17fada1fa80feaf9bcc42 100644
--- a/src/whyml/mlw_typing.ml
+++ b/src/whyml/mlw_typing.ml
@@ -484,7 +484,8 @@ let rec dexpr ({uc = uc} as lenv) denv {expr_desc = desc; expr_loc = loc} =
       let e1, ch = if chainable_op uc denv op2
         then get_chain e12 ch else e12, ch in
       make_chain "q1 " "q2 " (dexpr lenv denv e1) ch
-  | Ptree.Econst c -> DEconst c
+  | Ptree.Econst (Number.ConstInt _ as c) -> DEconst (c, ity_int)
+  | Ptree.Econst (Number.ConstReal _ as c) -> DEconst (c, ity_real)
   | Ptree.Erecord [] -> raise Decl.EmptyRecord
   | Ptree.Erecord ((q,_)::_ as fl) ->
       let prog_val cs pj = function
@@ -624,7 +625,12 @@ let rec dexpr ({uc = uc} as lenv) denv {expr_desc = desc; expr_loc = loc} =
   | Ptree.Enamed (Lstr lab, e1) ->
       DElabel (dexpr lenv denv e1, Slab.singleton lab)
   | Ptree.Ecast (e1, pty) ->
-      DEcast (dexpr lenv denv e1, ity_of_pty uc pty))
+      (* FIXME: accepts and silently ignores double casts: ((0:ty1):ty2) *)
+      let e1 = dexpr lenv denv e1 in
+      let ity = ity_of_pty uc pty in
+      match e1.de_node with
+      | DEconst (c, _) -> DEconst (c, ity)
+      | _ -> DEcast (e1, ity))
 
 and drec_defn ~top lenv denv fdl =
   let prep (id, gh, (bl, pty, e, sp)) =
@@ -683,7 +689,7 @@ let look_for_loc tdl s =
   let look loc d =
     let loc = look_id loc d.td_ident in
     match d.td_def with
-      | TDabstract | TDalias _ -> loc
+      | TDabstract | TDalias _ | TDrange _ | TDfloat _ -> loc
       | TDalgebraic csl -> List.fold_left look_cs loc csl
       | TDrecord fl -> List.fold_left look_fl loc fl
   in
@@ -713,7 +719,8 @@ let add_types ~wp uc tdl =
           | PTtyapp (q,tyl) -> List.fold_left check (ts_seen seen q) tyl
           | PTtuple tyl -> List.fold_left check seen tyl in
         let seen = match d.td_def with
-          | TDabstract | TDalgebraic _ | TDrecord _ -> seen
+          | TDabstract | TDrange _ | TDfloat _ | TDalgebraic _ | TDrecord _ ->
+              seen
           | TDalias ty -> check (Mstr.add x false seen) ty in
         Mstr.add x true seen in
   ignore (Mstr.fold cyc_visit def Mstr.empty);
@@ -741,7 +748,7 @@ let add_types ~wp uc tdl =
       let imp =
         let td = Mstr.find x def in
         match td.td_def with
-        | TDabstract -> false
+        | TDabstract | TDrange _ | TDfloat _ -> false
         | TDalias ty -> check ty
         | TDalgebraic csl ->
             let check (_,_,gh,ty) = gh || check ty in
@@ -780,7 +787,7 @@ let add_types ~wp uc tdl =
       let mut =
         let td = Mstr.find x def in
         match td.td_def with
-        | TDabstract -> false
+        | TDabstract | TDrange _ | TDfloat _ -> false
         | TDalias ty -> check ty
         | TDalgebraic csl ->
             let check (_,_,_,ty) = check ty in
@@ -860,7 +867,7 @@ let add_types ~wp uc tdl =
               ~abst ~priv ~inv:false ~ghost_reg vl rl (Some def))
         | TDalias ty ->
             let def = ty_of_ity (parse ty) in
-            TS (create_tysymbol id vl (Some def))
+            TS (create_tysymbol id vl (Alias def))
         | TDalgebraic csl when Hstr.find mutables x ->
             let projs = Hstr.create 5 in
             let nogh = ref Sreg.empty in
@@ -925,7 +932,15 @@ let add_types ~wp uc tdl =
         | TDalgebraic _ | TDrecord _ when Hstr.find impures x ->
             PT (create_itysymbol id ~abst ~priv ~inv:false vl [] None)
         | TDalgebraic _ | TDrecord _ | TDabstract ->
-            TS (create_tysymbol id vl None)
+            TS (create_tysymbol id vl NoDef)
+        | TDrange (lo,hi) ->
+            let ir = { Number.ir_lower = lo;
+                       Number.ir_upper = hi } in
+            TS (Loc.try2 ~loc:d.td_loc create_tysymbol id vl (Range ir))
+        | TDfloat (eb,sb) ->
+            let fp = { Number.fp_exponent_digits = eb;
+                       Number.fp_significand_digits = sb } in
+            TS (Loc.try2 ~loc:d.td_loc create_tysymbol id vl (Float fp))
       in
       Hstr.add tysymbols x (Some ts);
       ts
@@ -968,7 +983,7 @@ let add_types ~wp uc tdl =
           parse ty
     in
     match d.td_def with
-      | TDabstract ->
+      | TDabstract | TDrange _ | TDfloat _ ->
           ts :: abstr, algeb, alias
       | TDalias _ ->
           abstr, algeb, ts :: alias
@@ -1037,9 +1052,33 @@ let add_types ~wp uc tdl =
 
   (* add type declarations *)
 
+  let add_pure_type_decl uc ts =
+    let uc = add_decl_with_tuples uc (Decl.create_ty_decl ts) in
+    match ts.ts_def with
+    | NoDef | Alias _ -> uc
+    | Range _ ->
+        (* FIXME: "t'to_int" is probably better *)
+        let nm = ts.ts_name.id_string ^ "'int" in
+        let id = id_derive nm ts.ts_name in
+        let pj = create_fsymbol id [ty_app ts []] ty_int in
+        let uc = add_decl uc (Decl.create_param_decl pj) in
+        add_meta uc meta_range [MAts ts; MAls pj]
+    | Float _ ->
+        (* FIXME: "t'to_real" is probably better *)
+        let nm = ts.ts_name.id_string ^ "'real" in
+        let id = id_derive nm ts.ts_name in
+        let pj = create_fsymbol id [ty_app ts []] ty_real in
+        let uc = add_decl uc (Decl.create_param_decl pj) in
+        (* FIXME: "t'is_finite" is probably better *)
+        let nm = ts.ts_name.id_string ^ "'isFinite" in
+        let id = id_derive nm ts.ts_name in
+        let iF = Term.create_psymbol id [ty_app ts []] in
+        let uc = add_decl uc (Decl.create_param_decl iF) in
+        add_meta uc meta_float [MAts ts; MAls pj; MAls iF]
+  in
   let add_type_decl uc = function
     | PT ts -> add_pdecl_with_tuples ~wp uc (create_ty_decl ts)
-    | TS ts -> add_decl_with_tuples uc (Decl.create_ty_decl ts)
+    | TS ts -> add_pure_type_decl uc ts
   in
   let add_invariant uc d = if d.td_inv = [] then uc else
     add_type_invariant d.td_loc uc d.td_ident d.td_params d.td_inv in
diff --git a/tests/test_range.mlw b/tests/test_range.mlw
new file mode 100644
index 0000000000000000000000000000000000000000..8926b273bea4c485d3a95e6325074dc811c440f8
--- /dev/null
+++ b/tests/test_range.mlw
@@ -0,0 +1,48 @@
+theory T
+  use import int.Int
+
+  type q
+
+  type t is range t2int: 0 .. 42
+
+  (* meta "range:keep" type t *)
+
+  goal g : forall x:t. x = (12 : t)
+end
+
+theory U
+  use import bv.BV8
+
+  type q
+
+  (* meta "range:keep" type t *)
+
+  goal g : forall x:t. x = (12 : t)
+end
+
+module M
+  use import bv.BV16
+  use import int.Int
+
+  let f (x : t) : t
+   ensures { ule result (12 : t) }
+  = bw_and x (12 : t)
+
+end
+
+module N
+  use import bv.BV8
+  use import int.Int
+
+  use import int.NumOf
+
+  meta "encoding : kept" type t
+
+  let ghost step1 (n x1 : t) (i : int) : unit
+  =
+    assert { let i' = of_int i in
+             let twoi = mul (2 : t) i' in
+                 to_uint (bw_and (lsr_bv x1 twoi) (0x03 : t))
+               = numof (nth n) (to_uint twoi) (to_uint twoi + 2) }
+
+end
\ No newline at end of file
diff --git a/theories/bv.why b/theories/bv.why
index 23715fea524a8df54ef4bad7507b821cd80ca762..bb4406dcdf036729397f1f4a647a579f65a9cdac 100644
--- a/theories/bv.why
+++ b/theories/bv.why
@@ -120,6 +120,8 @@ theory BV_Gen
   axiom Nth_zeros:
     forall n:int. nth zeros n = False
 
+  constant one : t
+
   constant ones : t
   axiom Nth_ones:
     forall n. 0 <= n < size -> nth ones n = True
@@ -241,13 +243,12 @@ theory BV_Gen
   axiom to_uint_of_int :
     forall i. 0 <= i < two_power_size -> to_uint (of_int i) = i
 
-  constant size_bv : t = of_int size
-
-  axiom Of_int_zeros:
-    zeros = of_int 0
+  constant size_bv : t
 
-  axiom Of_int_ones:
-    ones = of_int max_int
+  axiom to_uint_size_bv : to_uint size_bv = size
+  axiom to_uint_zeros   : to_uint zeros = 0
+  axiom to_uint_one     : to_uint one = 1
+  axiom to_uint_ones    : to_uint ones = max_int
 
   (* comparison operators *)
 
@@ -360,7 +361,7 @@ theory BV_Gen
 
   axiom nth_bv_def:
     forall x i.
-      nth_bv x i = not (bw_and (lsr_bv x i) (of_int 1) = zeros)
+      nth_bv x i = not (bw_and (lsr_bv x i) one = zeros)
 
   axiom Nth_bv_is_nth:
     forall x i.
@@ -375,7 +376,7 @@ theory BV_Gen
   predicate eq_sub_bv t t t t
 
   axiom eq_sub_bv_def: forall a b i n.
-    let mask = lsl_bv (sub (lsl_bv (of_int 1) n) (of_int 1)) i in
+    let mask = lsl_bv (sub (lsl_bv one n) one) i in
       eq_sub_bv a b i n = (bw_and b mask = bw_and a mask)
 
   predicate eq_sub (a b:t) (i n:int) =
@@ -399,7 +400,13 @@ theory BV64
   constant two_power_size : int = 0x1_0000_0000_0000_0000
   constant max_int        : int = 0xFFFF_FFFF_FFFF_FFFF
 
+  use int.Int (* needed to use range types *)
+
+  type t = < range 0x0000_0000_0000_0000 0xFFFF_FFFF_FFFF_FFFF >
+
   clone export BV_Gen with
+    type t = t,
+    function to_uint = t'int,
     constant size = size,
     constant two_power_size = two_power_size,
     constant max_int = max_int,
@@ -414,7 +421,13 @@ theory BV32
   constant two_power_size : int = 0x1_0000_0000
   constant max_int        : int = 0xFFFF_FFFF
 
+  use int.Int (* needed to use range types *)
+
+  type t = < range 0x0000_0000 0xFFFF_FFFF >
+
   clone export BV_Gen with
+    type t = t,
+    function to_uint = t'int,
     constant size = size,
     constant two_power_size = two_power_size,
     constant max_int = max_int,
@@ -429,7 +442,13 @@ theory BV16
   constant two_power_size : int = 0x1_0000
   constant max_int : int = 0xFFFF
 
+  use int.Int (* needed to use range types *)
+
+  type t = < range 0x0000 0xFFFF >
+
   clone export BV_Gen with
+    type t = t,
+    function to_uint = t'int,
     constant size = size,
     constant two_power_size = two_power_size,
     constant max_int = max_int,
@@ -444,7 +463,13 @@ theory BV8
   constant two_power_size : int = 0x1_00
   constant max_int        : int = 0xFF
 
+  use int.Int (* needed to use range types *)
+
+  type t = < range 0x00 0xFF >
+
   clone export BV_Gen with
+    type t = t,
+    function to_uint = t'int,
     constant size = size,
     constant two_power_size = two_power_size,
     constant max_int = max_int,
@@ -485,82 +510,82 @@ theory BVConverter_32_64
   use BV32
   use BV64
 
-  predicate in_range (b : BV64.t) = BV64.ule b (BV64.of_int BV32.max_int)
+  predicate in_range (b : BV64.t) = BV64.ule b (0xFFFF_FFFF:BV64.t)
 
   clone export BVConverter_Gen with
     type bigBV = BV64.t,
     type smallBV = BV32.t,
     predicate in_small_range = in_range,
-    function to_uint_small = BV32.to_uint,
-    function to_uint_big = BV64.to_uint
+    function to_uint_small = BV32.t'int,
+    function to_uint_big = BV64.t'int
 end
 
 theory BVConverter_16_64
   use BV16
   use BV64
 
-  predicate in_range (b : BV64.t) = BV64.ule b (BV64.of_int BV16.max_int)
+  predicate in_range (b : BV64.t) = BV64.ule b (0xFFFF:BV64.t)
 
   clone export BVConverter_Gen with
     type bigBV = BV64.t,
     type smallBV = BV16.t,
     predicate in_small_range = in_range,
-    function to_uint_small = BV16.to_uint,
-    function to_uint_big = BV64.to_uint
+    function to_uint_small = BV16.t'int,
+    function to_uint_big = BV64.t'int
 end
 
 theory BVConverter_8_64
   use BV8
   use BV64
 
-  predicate in_range (b : BV64.t) = BV64.ule b (BV64.of_int BV8.max_int)
+  predicate in_range (b : BV64.t) = BV64.ule b (0xFF:BV64.t)
 
   clone export BVConverter_Gen with
     type bigBV = BV64.t,
     type smallBV = BV8.t,
     predicate in_small_range = in_range,
-    function to_uint_small = BV8.to_uint,
-    function to_uint_big = BV64.to_uint
+    function to_uint_small = BV8.t'int,
+    function to_uint_big = BV64.t'int
 end
 
 theory BVConverter_16_32
   use BV16
   use BV32
 
-  predicate in_range (b : BV32.t) = BV32.ule b (BV32.of_int BV16.max_int)
+  predicate in_range (b : BV32.t) = BV32.ule b (0xFFFF:BV32.t)
 
   clone export BVConverter_Gen with
     type bigBV = BV32.t,
     type smallBV = BV16.t,
     predicate in_small_range = in_range,
-    function to_uint_small = BV16.to_uint,
-    function to_uint_big = BV32.to_uint
+    function to_uint_small = BV16.t'int,
+    function to_uint_big = BV32.t'int
 end
 
 theory BVConverter_8_32
   use BV8
   use BV32
 
-  predicate in_range (b : BV32.t) = BV32.ule b (BV32.of_int BV8.max_int)
+  predicate in_range (b : BV32.t) = BV32.ule b (0xFF:BV32.t)
 
   clone export BVConverter_Gen with
     type bigBV = BV32.t,
     type smallBV = BV8.t,
     predicate in_small_range = in_range,
-    function to_uint_small = BV8.to_uint,
-    function to_uint_big = BV32.to_uint
+    function to_uint_small = BV8.t'int,
+    function to_uint_big = BV32.t'int
 end
 
 theory BVConverter_8_16
   use BV8
   use BV16
 
-  predicate in_range (b : BV16.t) = BV16.ule b (BV16.of_int BV8.max_int)
+  predicate in_range (b : BV16.t) = BV16.ule b (0xFF:BV16.t)
 
   clone export BVConverter_Gen with
     type bigBV = BV16.t,
     type smallBV = BV8.t,
     predicate in_small_range = in_range,
-    function to_uint_small = BV8.to_uint,
-    function to_uint_big = BV16.to_uint
+    function to_uint_small = BV8.t'int,
+    function to_uint_big = BV16.t'int
 end