From e793c0f2bcc9dadb71d590c044c2d5388b978c0b Mon Sep 17 00:00:00 2001
From: Per Lindgren <per.lindgren@ltu.se>
Date: Fri, 10 Aug 2018 23:38:11 +0200
Subject: [PATCH] add in modified double_wp

extraction, bv32 and registers
---
 README.md                    |    1 +
 bv_op.mlw                    |   38 +
 bv_op/why3session.xml        |   13 +
 bv_op/why3shapes.gz          |  Bin 0 -> 68 bytes
 com_aexpr.mlw                |  322 +++++
 com_aexpr/why3session.xml    |  834 +++++++++++++
 com_aexpr/why3shapes.gz      |  Bin 0 -> 18344 bytes
 compiler.mlw                 |  534 +++++++++
 compiler/why3session.xml     | 1234 +++++++++++++++++++
 compiler/why3shapes.gz       |  Bin 0 -> 25676 bytes
 extract.sh                   |    3 +
 imp.mlw                      |   88 ++
 imp/why3session.xml          | 2149 ++++++++++++++++++++++++++++++++++
 imp/why3shapes.gz            |  Bin 0 -> 38000 bytes
 imp_ex_assignment.mlw        |   47 +
 imp_test.mlw                 |   40 +
 imp_test/why3session.xml     |  238 ++++
 imp_test/why3session.xml.bak |  238 ++++
 imp_test/why3shapes.gz       |  Bin 0 -> 3238 bytes
 imp_test/why3shapes.gz.bak   |  Bin 0 -> 3230 bytes
 logic.mlw                    |  160 +++
 logic/why3session.xml        |   78 ++
 logic/why3shapes.gz          |  Bin 0 -> 1434 bytes
 ocaml64_bv.drv               |   72 ++
 specs.mlw                    |  460 ++++++++
 specs/why3session.xml        |  465 ++++++++
 specs/why3shapes.gz          |  Bin 0 -> 6546 bytes
 state.mlw                    |   45 +
 state/why3session.xml        |   36 +
 state/why3shapes.gz          |  Bin 0 -> 283 bytes
 vm.mlw                       |  298 +++++
 vm/why3session.xml           |  336 ++++++
 vm/why3shapes.gz             |  Bin 0 -> 3510 bytes
 33 files changed, 7729 insertions(+)
 create mode 100644 README.md
 create mode 100644 bv_op.mlw
 create mode 100644 bv_op/why3session.xml
 create mode 100644 bv_op/why3shapes.gz
 create mode 100644 com_aexpr.mlw
 create mode 100644 com_aexpr/why3session.xml
 create mode 100644 com_aexpr/why3shapes.gz
 create mode 100644 compiler.mlw
 create mode 100644 compiler/why3session.xml
 create mode 100644 compiler/why3shapes.gz
 create mode 100755 extract.sh
 create mode 100644 imp.mlw
 create mode 100644 imp/why3session.xml
 create mode 100644 imp/why3shapes.gz
 create mode 100644 imp_ex_assignment.mlw
 create mode 100644 imp_test.mlw
 create mode 100644 imp_test/why3session.xml
 create mode 100644 imp_test/why3session.xml.bak
 create mode 100644 imp_test/why3shapes.gz
 create mode 100644 imp_test/why3shapes.gz.bak
 create mode 100644 logic.mlw
 create mode 100644 logic/why3session.xml
 create mode 100644 logic/why3shapes.gz
 create mode 100644 ocaml64_bv.drv
 create mode 100644 specs.mlw
 create mode 100644 specs/why3session.xml
 create mode 100644 specs/why3shapes.gz
 create mode 100644 state.mlw
 create mode 100644 state/why3session.xml
 create mode 100644 state/why3shapes.gz
 create mode 100644 vm.mlw
 create mode 100644 vm/why3session.xml
 create mode 100644 vm/why3shapes.gz

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..62c674a
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+based on branch extract_bv32_reg
diff --git a/bv_op.mlw b/bv_op.mlw
new file mode 100644
index 0000000..46de61b
--- /dev/null
+++ b/bv_op.mlw
@@ -0,0 +1,38 @@
+module BV_OP
+  
+  use bv.BV32  
+  
+  let function bv_add i1 i2:int 
+    ensures { 
+      result = BV32.to_int (BV32.add (BV32.of_int i1) (BV32.of_int i2))
+    }
+  =
+    let v1: BV32.t = BV32.of_int i1 in
+    let v2: BV32.t = BV32.of_int i2 in
+    let v: BV32.t = BV32.add v1 v2 in
+    BV32.to_int v 
+  
+  meta rewrite_def function bv_add
+
+  (*meta rewrite_def function bv_add
+  (* stupid test *)
+  use int.Int
+  use bv.BV32 
+  (*
+  constant bv_add : int -> int -> int = fun x y -> x + y 
+  *)
+
+  let function bv_add i1 i2:int 
+      ensures { 
+        result = i1 + i2
+      }
+    = i1 + i2
+
+  meta rewrite_def function bv_add
+  
+  (*
+  lemma bv_add_com:
+    forall v1 v2. bv_add v1 v2 = bv_add v2 v1
+  *)
+  *)
+end
\ No newline at end of file
diff --git a/bv_op/why3session.xml b/bv_op/why3session.xml
new file mode 100644
index 0000000..862d5d2
--- /dev/null
+++ b/bv_op/why3session.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE why3session PUBLIC "-//Why3//proof session v5//EN"
+"http://why3.lri.fr/why3session.dtd">
+<why3session shape_version="5">
+<prover id="0" name="Alt-Ergo" version="2.0.0" timelimit="5" steplimit="0" memlimit="2000"/>
+<file name="../bv_op.mlw" proved="true">
+<theory name="BV_OP" proved="true">
+ <goal name="VC bv_add" expl="VC for bv_add" proved="true">
+ <proof prover="0"><result status="valid" time="0.02" steps="70"/></proof>
+ </goal>
+</theory>
+</file>
+</why3session>
diff --git a/bv_op/why3shapes.gz b/bv_op/why3shapes.gz
new file mode 100644
index 0000000000000000000000000000000000000000..3b196670a019599de42f91301dcf9ea38f4aa54d
GIT binary patch
literal 68
zcmb2|=3oGW|C>#GO#BS}jeQLbOiaB@OtzV9_3$(CHZ?ObHaFhpvnhb1ILza;evpS&
Vx4)04=0hfiD<6K(Heg_2004kA6te&T

literal 0
HcmV?d00001

diff --git a/com_aexpr.mlw b/com_aexpr.mlw
new file mode 100644
index 0000000..9318d80
--- /dev/null
+++ b/com_aexpr.mlw
@@ -0,0 +1,322 @@
+(* Register based compiler for arithmetic expressions *)
+
+module Compile_aexpr_reg
+
+  use int.Int
+  use list.List
+  use list.Length
+  use list.Append
+  use imp.Imp
+  use vm.Vm
+  use state.State
+  use state.Reg
+  use logic.Compiler_logic
+  use specs.VM_instr_spec
+
+  (* Compilation scheme: the generated code for arithmetic expressions
+     put the result of the expression on the stack. *)
+  function aexpr_post (a:aexpr) (len:pos) (idr:idr) : post 'a =
+    fun _ p ms ms' -> 
+      let VMS p1 r1 s1 m1 = ms in 
+      let VMS p2 r2 s2 m2 = ms' in
+      p1 = p /\
+      p2 = p + len /\ 
+      (forall r'. r' < idr -> read r1 r' = read r2 r') /\ (* preserve lower registers *)
+      read r2 idr  = aeval m1 a /\ (* result in idr *)
+      s2 = s1 /\ (* preserve stack *) 
+      m2 = m1 (* preserve memory *)
+      
+  meta rewrite_def function aexpr_post
+
+  let rec compile_aexpr (a:aexpr) (idr: idr) :  hl 'a
+    ensures { result.pre --> trivial_pre }
+    ensures { result.post --> aexpr_post a result.code.length idr}
+    variant { a }
+    = let c = match a with
+      | Anum n      -> $ iimmf idr n
+      | Avar x      -> $ iloadf idr x 
+      | Aadd a1 a2  -> $ 
+        compile_aexpr a1 idr -- $ compile_aexpr a2 (idr + 1) -- $ iaddrf (idr + 1) idr idr
+      | Aaddu a1 a2 -> $ 
+        compile_aexpr a1 idr -- $ compile_aexpr a2 (idr + 1) -- $ iaddurf (idr + 1) idr idr
+      | Asub a1 a2  -> $ 
+        compile_aexpr a2 idr -- $ compile_aexpr a1 (idr + 1) -- $ isubrf (idr + 1) idr idr
+      end in
+      hoare trivial_pre c (aexpr_post a c.wcode.length idr)
+
+  (* Check that the above specification indeed implies the
+     natural one. *)
+  
+   let compile_aexpr_natural (a:aexpr) (idr:idr) : code
+    ensures { forall c p r1 s m. codeseq_at c p result ->
+        exists r2.
+        transition_star c (VMS p r1 s m)
+                          (VMS (p + length result) r2 s m) 
+        /\
+        forall r. r < idr -> read r2 r = read r1 r  /\
+        read r2 idr = aeval m a  
+    }
+  = let res = compile_aexpr a idr : hl unit in
+    assert { res.pre = trivial_pre }; (* we have a trivial precod *)
+    assert { forall p r s m. res.pre () p (VMS p r s m) }; 
+ 
+    assert { forall p ms. res.pre () p ms ->
+      exists ms'. 
+      res.post () p ms ms' /\ contextual_irrelevance res.code p ms ms' /\
+      let VMS p1 r1 s1 m1 = ms in
+      let VMS p2 r2 s2 m2 = ms' in
+      p2 = p1 + res.code.length /\ m2 = m1 /\ s2 = s1 /\ 
+      forall r. r < idr -> read r2 r = read r1 r  /\
+      read r2 idr = aeval m1 a    
+    };
+    
+    res.code
+
+end
+
+(*
+(* Register based compiler for arithmetic expressions, k registers *)
+module Compile_aexpr_reg_k
+
+  use int.Int
+  use list.List
+  use list.Length
+  use list.Append
+  use imp.Imp
+  use vm.Vm
+  use state.State
+  use state.Reg
+  use logic.Compiler_logic
+  use specs.VM_instr_spec
+
+  (** we have k registers, namely 0,1,...,k-1,
+      and there are at least two of them, otherwise we can't add *)
+  val constant k: int
+    ensures { 2 <= result }
+    
+  (* Compilation scheme: the generated code for arithmetic expressions
+     put the result of the expression on the stack. *)
+  function aexpr_post (a:aexpr) (len:pos) (idr:idr) : post 'a =
+    fun _ p ms ms' -> 
+      let VMS p1 r1 s1 m1 = ms in 
+      let VMS p2 r2 s2 m2 = ms' in
+      p1 = p /\
+      p2 = p + len /\ 
+      (forall r'. r' < idr -> read r1 r' = read r2 r') /\ (* preserve lower registers *)
+      read r2 idr  = aeval m1 a /\ (* result in idr *)
+      s2 = s1 /\ (* preserve stack *) 
+      m2 = m1 (* preserve memory *)
+      
+  meta rewrite_def function aexpr_post
+
+  let rec compile_aexpr (a:aexpr) (idr: idr) :  hl 'a
+    requires { 0 <= idr < k }
+    ensures { result.pre --> trivial_pre }
+    ensures { result.post --> aexpr_post a result.code.length idr}
+    variant { a }
+    = let c = match a with
+      | Anum n     -> $ iimmf idr n
+      | Avar x     -> $ iloadf idr x 
+      | Aadd a1 a2 -> 
+        if idr < k - 1 then 
+          $ compile_aexpr a1 idr --  
+          $ compile_aexpr a2 (idr + 1) --  
+          $ iaddrf (idr + 1) idr idr
+        else 
+          $ ipushf (k - 2) -- 
+          $ compile_aexpr a1 (k - 2) -- 
+          $ compile_aexpr a2 (k - 1) --
+          $ iaddrf (k - 2) (k - 1) (k - 1)--
+          $ ipopf (k - 2)           
+        
+      | Asub a1 a2 -> 
+        if idr < k - 1 then 
+          $ compile_aexpr a2 idr -- 
+          $ compile_aexpr a1 (idr + 1) -- 
+          $ isubrf (idr + 1) idr idr
+        else 
+          $ ipushf (k - 2) -- 
+          $ compile_aexpr a1 (k - 2) -- 
+          $ compile_aexpr a2 (k - 1) --
+          $ isubrf (k - 2) (k - 1) (k - 1) --
+          $ ipopf (k - 2) 
+      end in
+      hoare trivial_pre c (aexpr_post a c.wcode.length idr)
+
+  (* Check that the above specification indeed implies the
+     natural one. *)
+  
+   let compile_aexpr_natural (a:aexpr) (idr:idr) : code
+    requires { 0 <= idr < k }
+    ensures { forall c p r1 s m. codeseq_at c p result ->
+        exists r2.
+        transition_star c (VMS p r1 s m)
+                          (VMS (p + length result) r2 s m) 
+        /\
+        forall r. r < idr -> read r2 r = read r1 r  /\
+        read r2 idr = aeval m a  
+    }
+  = let res = compile_aexpr a idr : hl unit in
+    assert { res.pre = trivial_pre }; (* we have a trivial precod *)
+    assert { forall p r s m. res.pre () p (VMS p r s m) }; 
+ 
+    assert { forall p ms. res.pre () p ms ->
+      exists ms'. 
+      res.post () p ms ms' /\ contextual_irrelevance res.code p ms ms' /\
+      let VMS p1 r1 s1 m1 = ms in
+      let VMS p2 r2 s2 m2 = ms' in
+      p2 = p1 + res.code.length /\ m2 = m1 /\ s2 = s1 /\ 
+      forall r. r < idr -> read r2 r = read r1 r  /\
+      read r2 idr = aeval m1 a    
+    };
+    
+    res.code
+
+end
+
+(* Register based compiler for arithmetic expressions, optimal k registers *)
+module Compile_aexpr_reg_k_optimal
+
+  use int.Int
+  use int.MinMax
+  use list.List
+  use list.Length
+  use list.Append
+  use imp.Imp
+  use vm.Vm
+  use state.State
+  use state.Reg
+  use logic.Compiler_logic
+  use specs.VM_instr_spec
+
+  (** we have k registers, namely 0,1,...,k-1,
+      and there are at least two of them, otherwise we can't add *)
+  val constant k: int
+    ensures { 2 <= result }
+    
+  (** the minimal number of registers needed to evaluate e *)
+  let rec function n (e: aexpr) : int
+  variant { e }
+  ensures { result > 0 }
+  = match e with
+    | Anum _     -> 1
+    | Avar _     -> 1
+    | Aadd e1 e2 -> let n1 = n e1 in let n2 = n e2 in
+                    if n1 = n2 then 1 + n1 else max n1 n2
+    | Asub e1 e2 -> let n1 = n e1 in let n2 = n e2 in
+                    if n1 = n2 then 1 + n1 else max n1 n2
+    end
+  meta rewrite_def function n
+  
+  
+  (** Note: This is of course inefficient to recompute function `n` many
+      times. A realistic implementation would compute `n e` once for
+      each sub-expression `e`, either with a first pass of tree decoration,
+      or with function `compile` returning the value of `n e` as well,
+      in a bottom-up way *)
+
+  function measure (e: aexpr) : int =
+    match e with
+    | Anum _      -> 0
+    | Avar _      -> 0
+    | Aadd e1 e2  -> 1 + measure e1 + measure e2 + if n e1 >= n e2 then 0 else 1 
+    | Aaddu e1 e2 -> 1 + measure e1 + measure e2 + if n e1 >= n e2 then 0 else 1 
+    | Asub e1 e2  -> 1 + measure e1 + measure e2 + if n e1 >= n e2 then 0 else 1
+    end
+
+  lemma measure_nonneg: forall e. measure e >= 0
+    
+  (* Compilation scheme: the generated code for arithmetic expressions
+     put the result of the expression on the stack. *)
+  function aexpr_post (a:aexpr) (len:pos) (idr:idr) : post 'a =
+    fun _ p ms ms' -> 
+      let VMS p1 r1 s1 m1 = ms in 
+      let VMS p2 r2 s2 m2 = ms' in
+      p1 = p /\
+      p2 = p + len /\ 
+      (forall r'. r' < idr -> read r1 r' = read r2 r') /\ (* preserve lower registers *)
+      read r2 idr  = aeval m1 a /\ (* result in idr *)
+      s2 = s1 /\ (* preserve stack *) 
+      m2 = m1 (* preserve memory *)
+      
+  meta rewrite_def function aexpr_post
+
+  let rec compile_aexpr (a:aexpr) (idr: idr) (ghost left: int) :  hl 'a
+    requires { n a <= left } 
+    requires { 0 <= idr < k }
+    variant  { measure a }
+    ensures  { result.pre --> trivial_pre }
+    ensures  { result.post --> aexpr_post a result.code.length idr }
+    = 
+      let c = match a with
+      | Anum n     -> $ iimmf idr n
+      | Avar x     -> $ iloadf idr x 
+      | Aadd a1 a2 -> 
+        if n a1 >= n a2 then (* we compile a1 first *)
+          if idr < k - 1 then 
+            $ compile_aexpr a1 idr left --  
+            $ compile_aexpr a2 (idr + 1) (left - 1) --  
+            $ iaddrf (idr + 1) idr idr
+          else 
+            (
+            assert { idr = k - 1 }; 
+            $ ipushf (idr - 1) -- 
+            $ compile_aexpr a1 (idr - 1) (left + 1) -- 
+            $ compile_aexpr a2 idr left --
+            $ iaddrf (idr - 1) idr idr --
+            $ ipopf (idr - 1)
+            )
+        else (* we compile a2 first, by swapping *)
+          $ compile_aexpr (Aadd a2 a1) idr left 
+      | Asub a1 a2 -> 
+        if idr < k - 1 then 
+          if n a1 >= n a2 then (* we compile a1 first *)
+            $ compile_aexpr a1 idr left -- 
+            $ compile_aexpr a2 (idr + 1) (left - 1) -- 
+            $ isubrf idr (idr + 1) idr
+          else
+            $ compile_aexpr a2 idr left -- 
+            $ compile_aexpr a1 (idr + 1) (left - 1) -- 
+            $ isubrf (idr + 1) idr idr
+        else 
+          $ ipushf (idr - 1) -- 
+          $ compile_aexpr a1 (idr - 1) (left + 1) -- 
+          $ compile_aexpr a2 idr left --
+          $ isubrf (idr - 1) idr idr --
+          $ ipopf (idr - 1) 
+      
+      end in
+      hoare trivial_pre c (aexpr_post a c.wcode.length idr)
+
+  (* Check that the above specification indeed implies the
+     natural one. *)
+  
+   let compile_aexpr_natural (a:aexpr) (idr:idr) : code
+    requires { 0 <= idr < k }
+    ensures { forall c p r1 s m. codeseq_at c p result ->
+        exists r2.
+        transition_star c (VMS p r1 s m)
+                          (VMS (p + length result) r2 s m) 
+        /\
+        forall r. r < idr -> read r2 r = read r1 r  /\
+        read r2 idr = aeval m a  
+    }
+  = let res = compile_aexpr a idr (ghost n a): hl unit in
+    assert { res.pre = trivial_pre }; (* we have a trivial precod *)
+    assert { forall p r s m. res.pre () p (VMS p r s m) }; 
+ 
+    assert { forall p ms. res.pre () p ms ->
+      exists ms'. 
+      res.post () p ms ms' /\ contextual_irrelevance res.code p ms ms' /\
+      let VMS p1 r1 s1 m1 = ms in
+      let VMS p2 r2 s2 m2 = ms' in
+      p2 = p1 + res.code.length /\ m2 = m1 /\ s2 = s1 /\ 
+      forall r. r < idr -> read r2 r = read r1 r  /\
+      read r2 idr = aeval m1 a    
+    };
+    
+    res.code
+   
+end
+
+*)
diff --git a/com_aexpr/why3session.xml b/com_aexpr/why3session.xml
new file mode 100644
index 0000000..31e679e
--- /dev/null
+++ b/com_aexpr/why3session.xml
@@ -0,0 +1,834 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE why3session PUBLIC "-//Why3//proof session v5//EN"
+"http://why3.lri.fr/why3session.dtd">
+<why3session shape_version="5">
+<prover id="0" name="Alt-Ergo" version="2.0.0" timelimit="5" steplimit="0" memlimit="2000"/>
+<prover id="1" name="CVC4" version="1.6" alternative="counterexamples" timelimit="5" steplimit="0" memlimit="2000"/>
+<prover id="2" name="Alt-Ergo" version="2.2.0" timelimit="5" steplimit="0" memlimit="2000"/>
+<prover id="3" name="Eprover" version="2.1" timelimit="5" steplimit="0" memlimit="2000"/>
+<prover id="4" name="Z3" version="4.7.1" alternative="counterexamples" timelimit="5" steplimit="0" memlimit="2000"/>
+<file name="../com_aexpr.mlw">
+<theory name="Compile_aexpr_reg">
+ <goal name="VC compile_aexpr" expl="VC for compile_aexpr">
+ <transf name="split_goal_right" >
+  <goal name="VC compile_aexpr.0" expl="variant decrease">
+  <proof prover="0" obsolete="true"><result status="valid" time="0.14" steps="162"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.1" expl="variant decrease">
+  <proof prover="0" obsolete="true"><result status="valid" time="0.15" steps="172"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.2" expl="variant decrease">
+  <proof prover="0" obsolete="true"><result status="valid" time="0.14" steps="162"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.3" expl="variant decrease">
+  <proof prover="0" obsolete="true"><result status="valid" time="0.15" steps="172"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.4" expl="unreachable point">
+  </goal>
+  <goal name="VC compile_aexpr.5" expl="precondition">
+  <transf name="split_goal_right" >
+   <goal name="VC compile_aexpr.5.0" expl="precondition">
+   <transf name="compute_specified" >
+    <goal name="VC compile_aexpr.5.0.0" expl="precondition">
+    <transf name="introduce_premises" >
+     <goal name="VC compile_aexpr.5.0.0.0" expl="precondition">
+     <transf name="compute_specified" >
+      <goal name="VC compile_aexpr.5.0.0.0.0" expl="precondition">
+      <proof prover="0" obsolete="true"><result status="valid" time="0.27" steps="326"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_aexpr.5.1" expl="precondition">
+   <transf name="compute_specified" >
+    <goal name="VC compile_aexpr.5.1.0" expl="precondition">
+    <transf name="introduce_premises" >
+     <goal name="VC compile_aexpr.5.1.0.0" expl="precondition">
+     <transf name="compute_specified" >
+      <goal name="VC compile_aexpr.5.1.0.0.0" expl="precondition">
+      <proof prover="0" obsolete="true"><result status="valid" time="0.27" steps="316"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_aexpr.5.2" expl="precondition">
+   <transf name="compute_specified" >
+    <goal name="VC compile_aexpr.5.2.0" expl="precondition">
+    <transf name="introduce_premises" >
+     <goal name="VC compile_aexpr.5.2.0.0" expl="precondition">
+     <transf name="compute_specified" >
+      <goal name="VC compile_aexpr.5.2.0.0.0" expl="precondition">
+      <proof prover="0" obsolete="true"><result status="valid" time="0.81" steps="500"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_aexpr.5.3" expl="precondition">
+   <transf name="compute_specified" >
+    <goal name="VC compile_aexpr.5.3.0" expl="precondition">
+    <transf name="introduce_premises" >
+     <goal name="VC compile_aexpr.5.3.0.0" expl="precondition">
+     <transf name="compute_specified" >
+      <goal name="VC compile_aexpr.5.3.0.0.0" expl="precondition">
+      <proof prover="0" obsolete="true"><result status="valid" time="0.78" steps="500"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC compile_aexpr.6" expl="postcondition">
+  <proof prover="0" obsolete="true"><result status="valid" time="0.10" steps="81"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.7" expl="postcondition">
+  <proof prover="0" obsolete="true"><result status="valid" time="0.09" steps="81"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC compile_aexpr_natural" expl="VC for compile_aexpr_natural">
+ <transf name="split_goal_right" >
+  <goal name="VC compile_aexpr_natural.0" expl="assertion">
+  <proof prover="0" obsolete="true"><result status="valid" time="0.09" steps="80"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr_natural.1" expl="assertion">
+  <proof prover="0" obsolete="true"><result status="valid" time="0.11" steps="81"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr_natural.2" expl="assertion">
+  <proof prover="0" obsolete="true"><result status="valid" time="0.19" steps="172"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr_natural.3" expl="postcondition">
+  <proof prover="0" obsolete="true"><result status="valid" time="0.29" steps="309"/></proof>
+  </goal>
+ </transf>
+ </goal>
+</theory>
+<theory name="Compile_aexpr_reg_k">
+ <goal name="VC k">
+ <proof prover="0"><result status="valid" time="0.07" steps="78"/></proof>
+ </goal>
+ <goal name="VC compile_aexpr">
+ <transf name="split_goal_right" >
+  <goal name="VC compile_aexpr.0">
+  <proof prover="0"><result status="valid" time="0.15" steps="175"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.1">
+  <proof prover="0"><result status="valid" time="0.10" steps="88"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.2">
+  <proof prover="0"><result status="valid" time="0.20" steps="185"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.3">
+  <proof prover="0"><result status="valid" time="0.11" steps="92"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.4">
+  <proof prover="0"><result status="valid" time="0.16" steps="192"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.5">
+  <proof prover="0"><result status="valid" time="0.11" steps="93"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.6">
+  <proof prover="0"><result status="valid" time="0.16" steps="202"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.7">
+  <proof prover="0"><result status="valid" time="0.10" steps="97"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.8">
+  <proof prover="0"><result status="valid" time="0.22" steps="175"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.9">
+  <proof prover="0"><result status="valid" time="0.09" steps="88"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.10">
+  <proof prover="0"><result status="valid" time="0.20" steps="185"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.11">
+  <proof prover="0"><result status="valid" time="0.15" steps="92"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.12">
+  <proof prover="0"><result status="valid" time="0.13" steps="192"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.13">
+  <proof prover="0"><result status="valid" time="0.10" steps="93"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.14">
+  <proof prover="0"><result status="valid" time="0.14" steps="202"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.15">
+  <proof prover="0"><result status="valid" time="0.10" steps="97"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.16">
+  <transf name="split_goal_right" >
+   <goal name="VC compile_aexpr.16.0">
+   <transf name="compute_specified" >
+    <goal name="VC compile_aexpr.16.0.0">
+    <transf name="introduce_premises" >
+     <goal name="VC compile_aexpr.16.0.0.0">
+     <transf name="compute_specified" >
+      <goal name="VC compile_aexpr.16.0.0.0.0">
+      <proof prover="0"><result status="valid" time="0.32" steps="348"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_aexpr.16.1">
+   <transf name="compute_specified" >
+    <goal name="VC compile_aexpr.16.1.0">
+    <transf name="introduce_premises" >
+     <goal name="VC compile_aexpr.16.1.0.0">
+     <transf name="compute_specified" >
+      <goal name="VC compile_aexpr.16.1.0.0.0">
+      <proof prover="0"><result status="valid" time="0.32" steps="338"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_aexpr.16.2">
+   <transf name="compute_specified" >
+    <goal name="VC compile_aexpr.16.2.0">
+    <transf name="introduce_premises" >
+     <goal name="VC compile_aexpr.16.2.0.0">
+     <transf name="compute_specified" >
+      <goal name="VC compile_aexpr.16.2.0.0.0">
+      <proof prover="1" timelimit="10" memlimit="1000"><result status="valid" time="1.09"/></proof>
+      <proof prover="2" obsolete="true"><result status="timeout" time="5.00"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_aexpr.16.3">
+   <transf name="compute_specified" >
+    <goal name="VC compile_aexpr.16.3.0">
+    <transf name="introduce_premises" >
+     <goal name="VC compile_aexpr.16.3.0.0">
+     <transf name="compute_specified" >
+      <goal name="VC compile_aexpr.16.3.0.0.0">
+      <transf name="split_goal_right" >
+       <goal name="VC compile_aexpr.16.3.0.0.0.0">
+       <proof prover="0"><result status="valid" time="0.14" steps="141"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.3.0.0.0.1">
+       <proof prover="0"><result status="valid" time="0.16" steps="144"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.3.0.0.0.2">
+       <proof prover="0"><result status="valid" time="0.13" steps="116"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.3.0.0.0.3">
+       <proof prover="0"><result status="valid" time="0.12" steps="125"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.3.0.0.0.4">
+       <proof prover="0"><result status="valid" time="0.21" steps="204"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.3.0.0.0.5">
+       <proof prover="0"><result status="valid" time="0.13" steps="129"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.3.0.0.0.6">
+       <proof prover="0"><result status="valid" time="0.18" steps="180"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.3.0.0.0.7">
+       <proof prover="0"><result status="valid" time="2.53" steps="973"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.3.0.0.0.8">
+       <proof prover="0"><result status="valid" time="2.00" steps="754"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.3.0.0.0.9">
+       <proof prover="0"><result status="valid" time="0.23" steps="213"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.3.0.0.0.10">
+       <proof prover="0"><result status="valid" time="0.19" steps="183"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_aexpr.16.4">
+   <transf name="compute_specified" >
+    <goal name="VC compile_aexpr.16.4.0">
+    <transf name="introduce_premises" >
+     <goal name="VC compile_aexpr.16.4.0.0">
+     <transf name="compute_specified" >
+      <goal name="VC compile_aexpr.16.4.0.0.0">
+      <transf name="split_goal_right" >
+       <goal name="VC compile_aexpr.16.4.0.0.0.0">
+       <proof prover="0"><result status="valid" time="0.13" steps="123"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.4.0.0.0.1">
+       <proof prover="0"><result status="valid" time="0.11" steps="104"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.4.0.0.0.2">
+       <proof prover="0"><result status="valid" time="0.12" steps="113"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.4.0.0.0.3">
+       <proof prover="0"><result status="valid" time="0.12" steps="116"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.4.0.0.0.4">
+       <proof prover="0"><result status="valid" time="0.15" steps="150"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.4.0.0.0.5">
+       <proof prover="0"><result status="valid" time="0.35" steps="204"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.4.0.0.0.6">
+       <proof prover="0"><result status="valid" time="0.18" steps="174"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.4.0.0.0.7">
+       <proof prover="0"><result status="valid" time="0.19" steps="149"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.4.0.0.0.8">
+       <proof prover="0"><result status="valid" time="0.16" steps="153"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_aexpr.16.5">
+   <transf name="compute_specified" >
+    <goal name="VC compile_aexpr.16.5.0">
+    <transf name="introduce_premises" >
+     <goal name="VC compile_aexpr.16.5.0.0">
+     <transf name="compute_specified" >
+      <goal name="VC compile_aexpr.16.5.0.0.0">
+      <transf name="split_goal_right" >
+       <goal name="VC compile_aexpr.16.5.0.0.0.0">
+       <proof prover="0"><result status="valid" time="0.14" steps="141"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.5.0.0.0.1">
+       <proof prover="0"><result status="valid" time="0.15" steps="144"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.5.0.0.0.2">
+       <proof prover="0"><result status="valid" time="0.12" steps="116"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.5.0.0.0.3">
+       <proof prover="0"><result status="valid" time="0.12" steps="125"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.5.0.0.0.4">
+       <proof prover="0"><result status="valid" time="0.35" steps="204"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.5.0.0.0.5">
+       <proof prover="0"><result status="valid" time="0.13" steps="129"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.5.0.0.0.6">
+       <proof prover="0"><result status="valid" time="0.19" steps="180"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.5.0.0.0.7">
+       <proof prover="0"><result status="valid" time="2.41" steps="963"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.5.0.0.0.8">
+       <proof prover="0"><result status="valid" time="2.02" steps="741"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.5.0.0.0.9">
+       <proof prover="0"><result status="valid" time="0.22" steps="213"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.16.5.0.0.0.10">
+       <proof prover="0"><result status="valid" time="0.22" steps="183"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC compile_aexpr.17">
+  <proof prover="0"><result status="valid" time="0.13" steps="84"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.18">
+  <proof prover="0"><result status="valid" time="0.12" steps="84"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC compile_aexpr_natural">
+ <transf name="split_goal_right" >
+  <goal name="VC compile_aexpr_natural.0">
+  <transf name="compute_specified" >
+   <goal name="VC compile_aexpr_natural.0.0">
+   <transf name="introduce_premises" >
+    <goal name="VC compile_aexpr_natural.0.0.0">
+    <proof prover="0"><result status="valid" time="0.09" steps="81"/></proof>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC compile_aexpr_natural.1">
+  <proof prover="0"><result status="valid" time="0.10" steps="83"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr_natural.2">
+  <proof prover="0"><result status="valid" time="0.14" steps="84"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr_natural.3">
+  <proof prover="0"><result status="valid" time="0.35" steps="212"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr_natural.4">
+  <proof prover="0"><result status="valid" time="0.94" steps="350"/></proof>
+  </goal>
+ </transf>
+ </goal>
+</theory>
+<theory name="Compile_aexpr_reg_k_optimal">
+ <goal name="VC k">
+ <proof prover="0"><result status="valid" time="0.09" steps="78"/></proof>
+ </goal>
+ <goal name="VC n">
+ <proof prover="0"><result status="valid" time="0.72" steps="460"/></proof>
+ </goal>
+ <goal name="measure_nonneg">
+ <transf name="induction_ty_lex" >
+  <goal name="measure_nonneg.0">
+  <proof prover="0"><result status="valid" time="0.14" steps="155"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC compile_aexpr">
+ <proof prover="0" obsolete="true"><result status="timeout" time="5.00"/></proof>
+ <transf name="split_goal_right" >
+  <goal name="VC compile_aexpr.0">
+  <proof prover="0"><result status="valid" time="0.18" steps="129"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.1">
+  <proof prover="0"><result status="valid" time="0.22" steps="250"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.2">
+  <proof prover="0"><result status="valid" time="0.15" steps="93"/></proof>
+  <proof prover="1"><result status="valid" time="0.25"/></proof>
+  <proof prover="4"><result status="valid" time="0.05"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.3">
+  <proof prover="0"><result status="valid" time="0.18" steps="138"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.4">
+  <proof prover="0"><result status="valid" time="0.10" steps="154"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.5">
+  <proof prover="0"><result status="valid" time="0.20" steps="97"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.6">
+  <proof prover="0"><result status="valid" time="0.10" steps="87"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.7">
+  <proof prover="0"><result status="valid" time="0.14" steps="139"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.8">
+  <proof prover="0"><result status="valid" time="0.15" steps="155"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.9">
+  <proof prover="0"><result status="valid" time="0.17" steps="99"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.10">
+  <proof prover="0"><result status="valid" time="0.21" steps="148"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.11">
+  <proof prover="0"><result status="valid" time="0.17" steps="164"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.12">
+  <proof prover="0"><result status="valid" time="0.17" steps="103"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.13">
+  <proof prover="0"><result status="valid" time="0.12" steps="120"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.14">
+  <proof prover="0"><result status="valid" time="0.14" steps="121"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.15">
+  <proof prover="0"><result status="valid" time="0.12" steps="87"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.16">
+  <proof prover="0"><result status="valid" time="0.20" steps="129"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.17">
+  <proof prover="0"><result status="valid" time="0.26" steps="250"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.18">
+  <proof prover="0"><result status="valid" time="0.11" steps="93"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.19">
+  <proof prover="0"><result status="valid" time="0.19" steps="138"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.20">
+  <proof prover="0"><result status="valid" time="0.16" steps="154"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.21">
+  <proof prover="0"><result status="valid" time="0.10" steps="97"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.22">
+  <proof prover="0"><result status="valid" time="0.14" steps="130"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.23">
+  <proof prover="0"><result status="valid" time="0.15" steps="166"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.24">
+  <proof prover="0"><result status="valid" time="0.12" steps="93"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.25">
+  <proof prover="0"><result status="valid" time="0.17" steps="139"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.26">
+  <proof prover="0"><result status="valid" time="0.17" steps="171"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.27">
+  <proof prover="0"><result status="valid" time="0.17" steps="97"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.28">
+  <proof prover="0"><result status="valid" time="0.17" steps="157"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.29">
+  <proof prover="0"><result status="valid" time="0.18" steps="215"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.30">
+  <proof prover="0"><result status="valid" time="0.15" steps="95"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.31">
+  <proof prover="0"><result status="valid" time="0.24" steps="169"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.32">
+  <proof prover="0"><result status="valid" time="0.18" steps="226"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.33">
+  <proof prover="0"><result status="valid" time="0.12" steps="99"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.34">
+  <proof prover="0" obsolete="true"><result status="timeout" time="5.00"/></proof>
+  <transf name="split_goal_right" >
+   <goal name="VC compile_aexpr.34.0">
+   <proof prover="0"><result status="timeout" time="5.00"/></proof>
+   <transf name="compute_specified" >
+    <goal name="VC compile_aexpr.34.0.0">
+    <transf name="introduce_premises" >
+     <goal name="VC compile_aexpr.34.0.0.0">
+     <transf name="compute_specified" >
+      <goal name="VC compile_aexpr.34.0.0.0.0">
+      <proof prover="0"><result status="valid" time="0.36" steps="476"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_aexpr.34.1">
+   <proof prover="0"><result status="timeout" time="5.00"/></proof>
+   <transf name="compute_specified" >
+    <goal name="VC compile_aexpr.34.1.0">
+    <transf name="introduce_premises" >
+     <goal name="VC compile_aexpr.34.1.0.0">
+     <transf name="compute_specified" >
+      <goal name="VC compile_aexpr.34.1.0.0.0">
+      <proof prover="0"><result status="valid" time="0.35" steps="493"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_aexpr.34.2">
+   <proof prover="0" obsolete="true"><result status="timeout" time="5.00"/></proof>
+   <transf name="split_goal_right" >
+    <goal name="VC compile_aexpr.34.2.0">
+    <transf name="compute_specified" >
+     <goal name="VC compile_aexpr.34.2.0.0">
+     <transf name="introduce_premises" >
+      <goal name="VC compile_aexpr.34.2.0.0.0">
+      <transf name="compute_specified" >
+       <goal name="VC compile_aexpr.34.2.0.0.0.0">
+       <proof prover="0"><result status="valid" time="1.65" steps="1358"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+    <goal name="VC compile_aexpr.34.2.1">
+    <proof prover="0" obsolete="true"><result status="timeout" time="5.00"/></proof>
+    <transf name="compute_specified" >
+     <goal name="VC compile_aexpr.34.2.1.0">
+     <transf name="introduce_premises" >
+      <goal name="VC compile_aexpr.34.2.1.0.0">
+      <proof prover="0" obsolete="true"><result status="timeout" time="5.00"/></proof>
+      <proof prover="3" obsolete="true"><result status="timeout" time="5.00"/></proof>
+      <proof prover="4" obsolete="true"><result status="timeout" time="5.00"/></proof>
+      <transf name="compute_specified" >
+       <goal name="VC compile_aexpr.34.2.1.0.0.0">
+       <proof prover="0" obsolete="true"><result status="timeout" time="5.00"/></proof>
+       <proof prover="1" obsolete="true"><result status="timeout" time="5.00"/></proof>
+       <proof prover="4" obsolete="true"><result status="timeout" time="5.00"/></proof>
+       <transf name="split_goal_right" >
+        <goal name="VC compile_aexpr.34.2.1.0.0.0.0">
+        <proof prover="0"><result status="valid" time="0.20" steps="173"/></proof>
+        </goal>
+        <goal name="VC compile_aexpr.34.2.1.0.0.0.1">
+        <proof prover="0"><result status="valid" time="0.20" steps="176"/></proof>
+        </goal>
+        <goal name="VC compile_aexpr.34.2.1.0.0.0.2">
+        <proof prover="0"><result status="valid" time="0.13" steps="117"/></proof>
+        </goal>
+        <goal name="VC compile_aexpr.34.2.1.0.0.0.3">
+        <proof prover="0"><result status="valid" time="0.13" steps="126"/></proof>
+        </goal>
+        <goal name="VC compile_aexpr.34.2.1.0.0.0.4">
+        <proof prover="0"><result status="valid" time="0.27" steps="247"/></proof>
+        </goal>
+        <goal name="VC compile_aexpr.34.2.1.0.0.0.5">
+        <proof prover="0"><result status="valid" time="0.16" steps="130"/></proof>
+        </goal>
+        <goal name="VC compile_aexpr.34.2.1.0.0.0.6">
+        <proof prover="0"><result status="valid" time="0.26" steps="212"/></proof>
+        </goal>
+        <goal name="VC compile_aexpr.34.2.1.0.0.0.7">
+        <proof prover="0"><result status="valid" time="2.36" steps="1115"/></proof>
+        <proof prover="1" obsolete="true"><result status="timeout" time="5.00"/></proof>
+        <proof prover="3" obsolete="true"><result status="timeout" time="5.00"/></proof>
+        <proof prover="4" obsolete="true"><result status="timeout" time="5.00"/></proof>
+        </goal>
+        <goal name="VC compile_aexpr.34.2.1.0.0.0.8">
+        <proof prover="0"><result status="valid" time="0.59" steps="398"/></proof>
+        </goal>
+        <goal name="VC compile_aexpr.34.2.1.0.0.0.9">
+        <proof prover="0"><result status="valid" time="0.33" steps="248"/></proof>
+        </goal>
+        <goal name="VC compile_aexpr.34.2.1.0.0.0.10">
+        <proof prover="0"><result status="valid" time="0.26" steps="217"/></proof>
+        </goal>
+       </transf>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+    <goal name="VC compile_aexpr.34.2.2">
+    <transf name="compute_specified" >
+     <goal name="VC compile_aexpr.34.2.2.0">
+     <transf name="introduce_premises" >
+      <goal name="VC compile_aexpr.34.2.2.0.0">
+      <transf name="compute_specified" >
+       <goal name="VC compile_aexpr.34.2.2.0.0.0">
+       <proof prover="0"><result status="valid" time="0.31" steps="344"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_aexpr.34.3">
+   <proof prover="0"><result status="timeout" time="5.00"/></proof>
+   <transf name="split_goal_right" >
+    <goal name="VC compile_aexpr.34.3.0">
+    <transf name="compute_specified" >
+     <goal name="VC compile_aexpr.34.3.0.0">
+     <transf name="introduce_premises" >
+      <goal name="VC compile_aexpr.34.3.0.0.0">
+      <transf name="compute_specified" >
+       <goal name="VC compile_aexpr.34.3.0.0.0.0">
+       <proof prover="0"><result status="valid" time="1.75" steps="1332"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+    <goal name="VC compile_aexpr.34.3.1">
+    <transf name="compute_specified" >
+     <goal name="VC compile_aexpr.34.3.1.0">
+     <transf name="introduce_premises" >
+      <goal name="VC compile_aexpr.34.3.1.0.0">
+      <transf name="compute_specified" >
+       <goal name="VC compile_aexpr.34.3.1.0.0.0">
+       <proof prover="0"><result status="valid" time="1.97" steps="1522"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_aexpr.34.4">
+   <proof prover="0"><result status="timeout" time="5.00"/></proof>
+   <transf name="compute_specified" >
+    <goal name="VC compile_aexpr.34.4.0">
+    <transf name="introduce_premises" >
+     <goal name="VC compile_aexpr.34.4.0.0">
+     <transf name="compute_specified" >
+      <goal name="VC compile_aexpr.34.4.0.0.0">
+      <proof prover="0"><result status="timeout" time="5.00"/></proof>
+      <transf name="split_goal_right" >
+       <goal name="VC compile_aexpr.34.4.0.0.0.0">
+       <proof prover="0"><result status="valid" time="0.16" steps="151"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.34.4.0.0.0.1">
+       <proof prover="0"><result status="valid" time="0.17" steps="154"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.34.4.0.0.0.2">
+       <proof prover="0"><result status="valid" time="0.13" steps="116"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.34.4.0.0.0.3">
+       <proof prover="0"><result status="valid" time="0.13" steps="125"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.34.4.0.0.0.4">
+       <proof prover="0"><result status="valid" time="0.27" steps="219"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.34.4.0.0.0.5">
+       <proof prover="0"><result status="valid" time="0.14" steps="129"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.34.4.0.0.0.6">
+       <proof prover="0"><result status="valid" time="0.22" steps="190"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.34.4.0.0.0.7">
+       <proof prover="0"><result status="valid" time="1.91" steps="1012"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.34.4.0.0.0.8">
+       <proof prover="0"><result status="valid" time="0.46" steps="330"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.34.4.0.0.0.9">
+       <proof prover="0"><result status="valid" time="0.26" steps="225"/></proof>
+       </goal>
+       <goal name="VC compile_aexpr.34.4.0.0.0.10">
+       <proof prover="0"><result status="valid" time="0.21" steps="195"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC compile_aexpr.35">
+  <proof prover="0"><result status="valid" time="0.12" steps="85"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.36">
+  <proof prover="0"><result status="valid" time="0.10" steps="85"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC compile_aexpr_natural">
+ <transf name="split_goal_right" >
+  <goal name="VC compile_aexpr_natural.0">
+  <proof prover="0"><result status="valid" time="0.10" steps="82"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr_natural.1">
+  <proof prover="0"><result status="valid" time="0.10" steps="83"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr_natural.2">
+  <proof prover="0"><result status="valid" time="0.10" steps="84"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr_natural.3">
+  <proof prover="0"><result status="valid" time="0.10" steps="85"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr_natural.4">
+  <proof prover="0"><result status="valid" time="0.27" steps="216"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr_natural.5">
+  <proof prover="0"><result status="valid" time="0.66" steps="354"/></proof>
+  </goal>
+ </transf>
+ </goal>
+</theory>
+</file>
+<file name="../specs.mlw">
+<theory name="VM_instr_spec">
+ <goal name="VC ifunf" expl="VC for ifunf">
+ </goal>
+ <goal name="VC iimmf" expl="VC for iimmf">
+ </goal>
+ <goal name="VC iloadf" expl="VC for iloadf">
+ </goal>
+ <goal name="VC istoref" expl="VC for istoref">
+ </goal>
+ <goal name="VC ipushf" expl="VC for ipushf">
+ </goal>
+ <goal name="VC ipopf" expl="VC for ipopf">
+ </goal>
+ <goal name="VC iaddrf" expl="VC for iaddrf">
+ </goal>
+ <goal name="VC iaddurf" expl="VC for iaddurf">
+ </goal>
+ <goal name="VC isubrf" expl="VC for isubrf">
+ </goal>
+ <goal name="VC ibeqrf" expl="VC for ibeqrf">
+ </goal>
+ <goal name="VC ibnerf" expl="VC for ibnerf">
+ </goal>
+ <goal name="VC iblerf" expl="VC for iblerf">
+ </goal>
+ <goal name="VC ibgtrf" expl="VC for ibgtrf">
+ </goal>
+ <goal name="VC iconstf" expl="VC for iconstf">
+ </goal>
+ <goal name="VC ivarf" expl="VC for ivarf">
+ </goal>
+ <goal name="VC create_binop" expl="VC for create_binop">
+ </goal>
+ <goal name="VC iaddf" expl="VC for iaddf">
+ </goal>
+ <goal name="VC iadduf" expl="VC for iadduf">
+ </goal>
+ <goal name="VC isubf" expl="VC for isubf">
+ </goal>
+ <goal name="VC inil" expl="VC for inil">
+ </goal>
+ <goal name="VC ibranchf" expl="VC for ibranchf">
+ </goal>
+ <goal name="VC create_cjump" expl="VC for create_cjump">
+ </goal>
+ <goal name="VC ibeqf" expl="VC for ibeqf">
+ </goal>
+ <goal name="VC ibnef" expl="VC for ibnef">
+ </goal>
+ <goal name="VC iblef" expl="VC for iblef">
+ </goal>
+ <goal name="VC ibgtf" expl="VC for ibgtf">
+ </goal>
+ <goal name="VC isetvarf" expl="VC for isetvarf">
+ </goal>
+</theory>
+</file>
+<file name="../imp.mlw">
+<theory name="Imp">
+ <goal name="ceval_deterministic_aux">
+ </goal>
+ <goal name="ceval_deterministic">
+ </goal>
+</theory>
+</file>
+</why3session>
diff --git a/com_aexpr/why3shapes.gz b/com_aexpr/why3shapes.gz
new file mode 100644
index 0000000000000000000000000000000000000000..238d567b3ed12c7b0b97449406bb81b4a56e3121
GIT binary patch
literal 18344
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

literal 0
HcmV?d00001

diff --git a/compiler.mlw b/compiler.mlw
new file mode 100644
index 0000000..a159aa9
--- /dev/null
+++ b/compiler.mlw
@@ -0,0 +1,534 @@
+
+
+(*Imp to Vm compiler *)
+(**************************************************************************)
+(* Compiler for arithmetic expressions *)
+module Compile_aexpr
+
+
+  use int.Int
+  use list.List
+  use list.Length
+  use list.Append
+  use imp.Imp
+  use vm.Vm
+  use state.State
+  use logic.Compiler_logic
+  use specs.VM_instr_spec
+
+  (* Compilation scheme: the generated code for arithmetic expressions
+     put the result of the expression on the stack. *)
+  function aexpr_post (a:aexpr) (len:pos) : post 'a =
+    fun _ p ms ms' -> let VMS _ r s m = ms in ms' = VMS (p+len) r (push (aeval m a) s) m
+  meta rewrite_def function aexpr_post
+
+  let rec compile_aexpr (a:aexpr) :  hl 'a
+    ensures { result.pre --> trivial_pre }
+    ensures { result.post --> aexpr_post a result.code.length }
+    variant { a }
+    = let c = match a with
+      | Anum n      -> $ iconstf n
+      | Avar x      -> $ ivarf x
+      | Aadd a1 a2  -> $ compile_aexpr a1 -- $ compile_aexpr a2 --  $ iaddf ()
+      | Aaddu a1 a2 -> $ compile_aexpr a1 -- $ compile_aexpr a2 --  $ iadduf ()
+      | Asub a1 a2  -> $ compile_aexpr a1 -- $ compile_aexpr a2 --  $ isubf ()
+     (* | Amul a1 a2 -> $ compile_aexpr a1 -- $ compile_aexpr a2 --  $ imulf () *)
+      end in
+      hoare trivial_pre c (aexpr_post a c.wcode.length)
+
+  (* Check that the above specification indeed implies the
+     natural one. *)
+  let compile_aexpr_natural (a:aexpr) : code
+    ensures { forall c p r s m. codeseq_at c p result ->
+        transition_star c (VMS p r s m)
+                          (VMS (p + length result) r (push (aeval m a) s) m) }
+  = let res = compile_aexpr a : hl unit in
+    assert { forall p r s m. res.pre () p (VMS p r s m) }; res.code
+
+end
+
+(* Compiler for boolean expressions. *)
+module Compile_bexpr
+
+  use int.Int
+  use list.List
+  use list.Length
+  use list.Append
+  use imp.Imp
+  use vm.Vm
+  use state.State
+  use logic.Compiler_logic
+  use specs.VM_instr_spec
+  use Compile_aexpr
+
+  (* Compilation scheme: the generated code perform a jump
+     iff the boolean expression evaluate to cond. *)
+  function bexpr_post (b:bexpr) (cond: bool) (out_t:ofs) (out_f:ofs) : post 'a =
+    fun _ p ms ms' -> let VMS _ r s m = ms in if beval m b = cond
+        then ms' = VMS (p + out_t) r s m
+        else ms' = VMS (p + out_f) r s m
+  meta rewrite_def function bexpr_post
+
+  function exec_cond (b1:bexpr) (cond:bool) : pre 'a =
+    fun _ _ ms -> let VMS _ _ _ m = ms in beval m b1 = cond
+  meta rewrite_def function exec_cond
+
+  let rec compile_bexpr (b:bexpr) (cond:bool) (ofs:ofs) :  hl 'a
+    ensures { result.pre --> trivial_pre }
+    ensures { result.post --> let len = result.code.length in
+      bexpr_post b cond (len + ofs) len }
+    variant { b }
+  = let c = match b with
+    | Btrue      -> $ if cond then ibranchf ofs else inil ()
+    | Bfalse     -> $ if cond then inil () else ibranchf ofs
+    | Bnot b1    -> $ compile_bexpr b1 (not cond) ofs
+    | Beq a1 a2  -> $ compile_aexpr a1 -- $ compile_aexpr a2 --
+                    $ if cond then ibeqf ofs else ibnef ofs
+    | Ble a1 a2  -> $ compile_aexpr a1 -- $ compile_aexpr a2 --
+                    $ if cond then iblef ofs else ibgtf ofs
+    | Band b1 b2 ->
+      let c2  = $ compile_bexpr b2 cond ofs % exec_cond b1 true in
+      let ofs = if cond then length c2.wcode else ofs + length c2.wcode in
+      $ compile_bexpr b1 false ofs -- c2 
+    end in
+    let ghost post = bexpr_post b cond (c.wcode.length + ofs) c.wcode.length in
+    hoare trivial_pre c post
+
+  (* Check that the above specification implies the natural one. *)
+  let compile_bexpr_natural (b:bexpr) (cond:bool) (ofs:ofs) : code
+    ensures { forall c p r s m. codeseq_at c p result ->
+        transition_star c (VMS p r s m)
+           (VMS (p + length result + if beval m b = cond then ofs else 0) r s m) }
+  = let res = compile_bexpr b cond ofs : hl unit in
+    assert { forall p r s m. res.pre () p (VMS p r s m) }; res.code
+  
+end
+
+(* Register based compiler for arithmetic expressions *)
+module Compile_aexpr_reg
+
+  use int.Int
+  use list.List
+  use list.Length
+  use list.Append
+  use imp.Imp
+  use vm.Vm
+  use state.State
+  use state.Reg
+  use logic.Compiler_logic
+  use specs.VM_instr_spec
+
+  (* Compilation scheme: the generated code for arithmetic expressions
+     put the result of the expression on the stack. *)
+  function aexpr_post (a:aexpr) (len:pos) (idr:idr) : post 'a =
+    fun _ p ms ms' -> 
+      let VMS p1 r1 s1 m1 = ms in 
+      let VMS p2 r2 s2 m2 = ms' in
+      p1 = p /\
+      p2 = p + len /\ 
+      (forall r'. r' < idr -> read r1 r' = read r2 r') /\ (* preserve lower registers *)
+      read r2 idr  = aeval m1 a /\ (* result in idr *)
+      s2 = s1 /\ (* preserve stack *) 
+      m2 = m1 (* preserve memory *)
+      
+  meta rewrite_def function aexpr_post
+
+  let rec compile_aexpr (a:aexpr) (idr: idr) :  hl 'a
+    ensures { result.pre --> trivial_pre }
+    ensures { result.post --> aexpr_post a result.code.length idr}
+    variant { a }
+    = let c = match a with
+      | Anum n      -> $ iimmf idr n
+      | Avar x      -> $ iloadf idr x 
+      | Aadd a1 a2  -> $ 
+        compile_aexpr a1 idr -- $ compile_aexpr a2 (idr + 1) -- $ iaddrf (idr + 1) idr idr
+      | Aaddu a1 a2 -> $ 
+        compile_aexpr a1 idr -- $ compile_aexpr a2 (idr + 1) -- $ iaddurf (idr + 1) idr idr
+      | Asub a1 a2  -> $ 
+        compile_aexpr a2 idr -- $ compile_aexpr a1 (idr + 1) -- $ isubrf (idr + 1) idr idr
+      end in
+      hoare trivial_pre c (aexpr_post a c.wcode.length idr)
+
+  (* Check that the above specification indeed implies the
+     natural one. *)
+  
+   let compile_aexpr_natural (a:aexpr) (idr:idr) : code
+    ensures { forall c p r1 s m. codeseq_at c p result ->
+        exists r2.
+        transition_star c (VMS p r1 s m)
+                          (VMS (p + length result) r2 s m) 
+        /\
+        forall r. r < idr -> read r2 r = read r1 r  /\
+        read r2 idr = aeval m a  
+    }
+  = let res = compile_aexpr a idr : hl unit in
+    assert { res.pre = trivial_pre }; (* we have a trivial precod *)
+    assert { forall p r s m. res.pre () p (VMS p r s m) }; 
+ 
+    assert { forall p ms. res.pre () p ms ->
+      exists ms'. 
+      res.post () p ms ms' /\ contextual_irrelevance res.code p ms ms' /\
+      let VMS p1 r1 s1 m1 = ms in
+      let VMS p2 r2 s2 m2 = ms' in
+      p2 = p1 + res.code.length /\ m2 = m1 /\ s2 = s1 /\ 
+      forall r. r < idr -> read r2 r = read r1 r  /\
+      read r2 idr = aeval m1 a    
+    };
+    
+    res.code
+
+end
+
+(* Compiler for Boolean expressions. *)
+module Compile_bexpr_reg
+
+  use int.Int
+  use list.List
+  use list.Length
+  use list.Append
+  use imp.Imp
+  use vm.Vm
+  use state.State
+  use state.Reg
+  use logic.Compiler_logic
+  use specs.VM_instr_spec
+  use Compile_aexpr_reg
+
+  (* Compilation scheme: the generated code perform a jump
+     iff the boolean expression evaluate to cond. *)
+  function bexpr_post (b:bexpr) (cond: bool) (out_t:ofs) (out_f:ofs) (idr: idr): post 'a =
+    fun _ p ms ms' -> 
+      let VMS _ r s m = ms in
+      let VMS p1 r1 s1 m1 = ms' in
+      (
+      if beval m b = cond then
+        p1 = p + out_t
+      else 
+        p1 = p + out_f
+      ) /\  
+      m1 = m /\
+      s1 = s /\
+      forall r'. r' < idr -> read r1 r' = read r r' 
+     
+  meta rewrite_def function bexpr_post
+
+  function exec_cond (b1:bexpr) (cond:bool) : pre 'a =
+    fun _ _ ms -> let VMS _ _ _ m = ms in beval m b1 = cond
+  meta rewrite_def function exec_cond
+
+  let rec compile_bexpr (b:bexpr) (cond:bool) (ofs:ofs) (idr:idr):  hl 'a
+    ensures { result.pre --> trivial_pre }
+    ensures { result.post --> let len = result.code.length in
+      bexpr_post b cond (len + ofs) len idr }
+    variant { b }
+  = let c = match b with
+    | Btrue     -> $ if cond then ibranchf ofs else inil ()
+    | Bfalse    -> $ if cond then inil () else ibranchf ofs
+    | Bnot b1   -> $ compile_bexpr b1 (not cond) ofs idr
+    | Beq a1 a2 -> $ compile_aexpr a1 idr -- $ compile_aexpr a2 (idr + 1) --
+                   $ if cond then ibeqrf idr (idr + 1) ofs else ibnerf idr (idr + 1) ofs
+    | Ble a1 a2 -> $ compile_aexpr a1 idr -- $ compile_aexpr a2 (idr + 1) --
+                   $ if cond then iblerf idr (idr + 1) ofs else ibgtrf idr (idr + 1) ofs
+    
+    | Band b1 b2 ->
+      let c2  = $ compile_bexpr b2 cond ofs idr % exec_cond b1 true in
+      let ofs = if cond then length c2.wcode else ofs + length c2.wcode in
+      $ compile_bexpr b1 false ofs idr -- c2
+                   
+    end in
+    let ghost post = bexpr_post b cond (c.wcode.length + ofs) c.wcode.length idr in
+    hoare trivial_pre c post
+  
+  
+  let compile_bexpr_natural (b:bexpr) (cond:bool) (ofs:ofs) (idr): code
+    ensures { forall c p s m. codeseq_at c p result ->
+       if beval m b = cond then
+         forall r1. exists r2.
+         transition_star c (VMS p r1 s m)
+           (VMS (p + length result + ofs) r2 s m)
+       else
+         forall r1. exists r2. 
+         transition_star c (VMS p r1 s m)
+           (VMS (p + length result) r2 s m)
+    }
+       
+  = let res = compile_bexpr b cond ofs idr : hl unit in
+    assert { forall p r s m. res.pre () p (VMS p r s m) }; 
+    assert { forall p ms. res.pre () p ms ->
+      exists ms'. 
+      res.post () p ms ms' /\ contextual_irrelevance res.code p ms ms' /\
+      let VMS _ _ s1 m1 = ms in
+      let VMS _ _ s2 m2 = ms' in
+      m2 = m1 /\ s2 = s1 
+    };
+    res.code
+  
+end
+
+(* Compiler for commands, no regs used *)
+
+module Compile_com
+
+  use int.Int
+  use list.List
+  use list.Length
+  use list.Append
+  use imp.Imp
+  use vm.Vm
+  use state.State
+  use logic.Compiler_logic
+  use specs.VM_instr_spec
+  use Compile_aexpr
+  use Compile_bexpr
+
+  (* Compilation scheme: the generated code for a command
+     simulates the command on the memory part of the machine state. *)
+  (* As we specify only terminating behavior, we have to require
+     that the source program terminates in the initial conditions. *)
+  function com_pre (cmd:com) : pre 'a =
+    fun _ p ms -> let VMS p' _ _ m = ms in p = p' /\ exists m'. ceval m cmd m'
+  meta rewrite_def function com_pre
+
+  function com_post (cmd:com) (len:pos) : post 'a =
+    fun _ _ ms ms' -> let VMS p r s m = ms in let VMS p' r' s' m' = ms' in
+      p' = p + len /\ s' = s /\ ceval m cmd m' /\  r' = r
+  meta rewrite_def function com_post
+
+  function exec_cond_old (b1:bexpr) (cond:bool) : pre ('a,machine_state) =
+    fun x _ _ -> let VMS _ _ _ m = snd x in beval m b1 = cond
+  meta rewrite_def function exec_cond_old
+
+  (* Invariant for loop compilation: any intermediate state
+     would evaluate to the same final state as the initial state. *)
+  function loop_invariant (c:com) : pre ('a,machine_state) =
+    fun x p msi -> let VMS _ r0 s0 m0 = snd x in let VMS pi ri si mi = msi in
+      pi = p /\ s0 = si /\ r0 = ri /\ exists mf. ceval m0 c mf /\ ceval mi c mf
+  meta rewrite_def function loop_invariant
+
+  function loop_variant (c:com) (test:bexpr) : post 'a =
+    fun _ _ msj msi -> let VMS _pj _rj _sj mj = msj in let VMS _pi _ri _si mi = msi in
+       ceval mi c mj /\ beval mi test
+  (* meta rewrite_def function loop_variant *)
+  
+  lemma loop_variant_lemma : forall c test,x:'a,p msj msi.
+    loop_variant c test x p msj msi =
+      let VMS _pj _rj _sj mj = msj in let VMS _pi _ri _si mi = msi in
+      ceval mi c mj /\ beval mi test
+  meta rewrite lemma loop_variant_lemma
+
+  (* Well-foundedness of the loop variant. *)
+  lemma loop_variant_acc : forall c test,x:'a,p mi mj.
+    let wh = Cwhile test c in let var = (loop_variant c test x p) in
+    (ceval mi wh mj -> forall pi ri si. acc var (VMS pi ri si mi))
+    by forall pi ri si mi mj mf. ceval mi c mj /\ beval mi test ->
+      ceval mj wh mf /\ (forall pj rj sj. acc var (VMS pj rj sj mj)) ->
+      acc var (VMS pi ri si mi) by
+      (forall pk rk sk mk. var (VMS pk rk sk mk) (VMS pi ri si mi) -> mk = mj)
+
+  let rec compile_com (cmd: com) : hl 'a
+    ensures { result.pre --> com_pre cmd }
+    ensures { result.post --> let len = result.code.length in com_post cmd len }
+    variant  { cmd }
+  = let res = match cmd with
+    | Cskip              -> $ inil ()
+    | Cassign x a        -> $ compile_aexpr a  -- $ isetvarf x
+    | Cseq cmd1 cmd2     -> $ compile_com cmd1 -- $ compile_com cmd2
+    | Cif cond cmd1 cmd2 -> let code_false = compile_com cmd2 in
+      let code_true = $ compile_com cmd1 -- $ ibranchf code_false.code.length in
+      $ compile_bexpr cond false code_true.wcode.length --
+      (code_true % exec_cond cond true) --
+      ($ code_false % exec_cond_old cond false)
+    | Cwhile test body  ->
+      let code_body = compile_com body in
+      let body_length = length code_body.code + 1 in
+      let code_test = compile_bexpr test false body_length in
+      let ofs = length code_test.code + body_length in
+      let wp_while = $ code_test --
+          ($ code_body -- $ ibranchf (- ofs)) % exec_cond test true in
+      let ghost inv = loop_invariant cmd in
+      let ghost var = loop_variant body test in
+      $ inil () -- make_loop wp_while inv (exec_cond test true) var
+    end in
+    hoare (com_pre cmd) res (com_post cmd res.wcode.length)
+
+  (* Get back to natural specification for the compiler. *)
+  let compile_com_natural (com: com) : code
+    ensures { forall c p r s m m'. ceval m com m' -> codeseq_at c p result ->
+    
+      transition_star c (VMS p r s m) (VMS (p + length result) r s m') }
+  = let res = compile_com com : hl unit in
+    assert { forall c p r s m m'. ceval m com m' -> codeseq_at c p res.code ->
+     res.pre () p (VMS p r s m) && (forall ms'. res.post () p (VMS p r s m) ms' ->
+      ms' = VMS (p + length res.code) r s m') };
+    res.code
+
+  (* Insert the final halting instruction. *)
+  let compile_program (prog : com) : code
+    ensures { forall  mi mf: state.
+      ceval mi prog mf -> vm_terminates result mi mf }
+  = let code = compile_com_natural prog in
+    let code2 = code ++ ihalt in
+    
+    assert { 
+      forall r m m'. ceval m prog m' -> codeseq_at code2 0 code ->
+      transition_star code2 (VMS 0 r Nil m) (VMS (length code) r Nil m')
+    };
+    
+    code2 
+
+
+(*
+  (* Execution test: compile a simple factorial program, e.g
+     X := 1; WHILE NOT (Y <= 0) DO X := X * Y; Y := Y - 1 DONE
+     (why3 execute -L . compiler.mlw Compile_com.test) *)
+  let test () : code =
+    let x = Id 0 in
+    let y = Id 1 in
+    let cond = Bnot (Ble (Avar y) (Anum 0)) in
+    let body1 = Cassign x (Amul (Avar x) (Avar y)) in
+    let body2 = Cassign y (Asub (Avar y) (Anum 1)) in
+    let lp = Cwhile cond (Cseq body1 body2) in
+    let code = Cseq (Cassign x (Anum 1)) lp in
+    compile_program code
+
+  let test2 () : code =
+    compile_program (Cwhile Btrue Cskip)
+*)
+
+end
+
+(* Compiler for commands, regs used *)
+
+module Compile_com_reg
+
+  use int.Int
+  use list.List
+  use list.Length
+  use list.Append
+  use imp.Imp
+  use vm.Vm
+  use state.State
+  use logic.Compiler_logic
+  use specs.VM_instr_spec
+  use Compile_aexpr_reg
+  use Compile_bexpr_reg
+
+  (* Compilation scheme: the generated code for a command
+     simulates the command on the memory part of the machine state. *)
+  (* As we specify only terminating behavior, we have to require
+     that the source program terminates in the initial conditions. *)
+  function com_pre (cmd:com) : pre 'a =
+    fun _ p ms -> let VMS p' _ _ m = ms in p = p' /\ exists m'. ceval m cmd m'
+  meta rewrite_def function com_pre
+
+  function com_post (cmd:com) (len:pos) : post 'a =
+    fun _ _ ms ms' -> let VMS p _ (* r *) s m = ms in let VMS p' _ (*r'*) s' m' = ms' in
+      p' = p + len /\ s' = s /\ ceval m cmd m' (* /\  r' = r *)
+  meta rewrite_def function com_post
+  
+  function exec_cond_old (b1:bexpr) (cond:bool) : pre ('a,machine_state) =
+    fun x _ _ -> let VMS _ _ _ m = snd x in beval m b1 = cond
+  meta rewrite_def function exec_cond_old
+
+  (* Invariant for loop compilation: any intermediate state
+     would evaluate to the same final state as the initial state. *)
+  function loop_invariant (c:com) : pre ('a,machine_state) =
+    fun x p msi -> let VMS _ _ (* r0 *) s0 m0 = snd x in let VMS pi _ (* ri *) si mi = msi in
+      pi = p /\ s0 = si /\ (* r0 = ri /\ *) exists mf. ceval m0 c mf /\ ceval mi c mf
+  meta rewrite_def function loop_invariant
+
+  function loop_variant (c:com) (test:bexpr) : post 'a =
+    fun _ _ msj msi -> let VMS _pj _rj _sj mj = msj in let VMS _pi _ri _si mi = msi in
+       ceval mi c mj /\ beval mi test
+  (* meta rewrite_def function loop_variant *)
+  
+  lemma loop_variant_lemma : forall c test,x:'a,p msj msi.
+    loop_variant c test x p msj msi =
+      let VMS _pj _rj _sj mj = msj in let VMS _pi _ri _si mi = msi in
+      ceval mi c mj /\ beval mi test
+  meta rewrite lemma loop_variant_lemma
+
+  (* Well-foundedness of the loop variant. *)
+  lemma loop_variant_acc : forall c test,x:'a,p mi mj.
+    let wh = Cwhile test c in let var = (loop_variant c test x p) in
+    (ceval mi wh mj -> forall pi ri si. acc var (VMS pi ri si mi))
+    by forall pi ri si mi mj mf. ceval mi c mj /\ beval mi test ->
+      ceval mj wh mf /\ (forall pj rj sj. acc var (VMS pj rj sj mj)) ->
+      acc var (VMS pi ri si mi) by
+      (forall pk rk sk mk. var (VMS pk rk sk mk) (VMS pi ri si mi) -> mk = mj)
+
+  let rec compile_com (cmd: com) : hl 'a
+    ensures { result.pre --> com_pre cmd }
+    ensures { result.post --> let len = result.code.length in com_post cmd len }
+    variant  { cmd }
+  = let res = match cmd with
+    | Cskip              -> $ inil ()
+    | Cassign x a        -> $ compile_aexpr a 0 -- $ istoref 0 x
+    | Cseq cmd1 cmd2     -> $ compile_com cmd1 -- $ compile_com cmd2
+    | Cif cond cmd1 cmd2 -> let code_false = compile_com cmd2 in
+      let code_true = $ compile_com cmd1 -- $ ibranchf code_false.code.length in
+      $ compile_bexpr cond false code_true.wcode.length 0 --
+      (code_true % exec_cond cond true) --
+      ($ code_false % exec_cond_old cond false)
+    | Cwhile test body  ->
+      let code_body = compile_com body in
+      let body_length = length code_body.code + 1 in
+      let code_test = compile_bexpr test false body_length 0 in
+      let ofs = length code_test.code + body_length in
+      let wp_while = $ code_test --
+          ($ code_body -- $ ibranchf (- ofs)) % exec_cond test true in
+      let ghost inv = loop_invariant cmd in
+      let ghost var = loop_variant body test in
+      $ inil () -- make_loop wp_while inv (exec_cond test true) var
+    end in
+    hoare (com_pre cmd) res (com_post cmd res.wcode.length)
+
+  (* Get back to natural specification for the compiler. *)
+  let compile_com_natural (com: com) : code
+    ensures { forall c p r s m m'. ceval m com m' -> codeseq_at c p result ->
+      exists r'.
+      transition_star c (VMS p r s m) (VMS (p + length result) r' s m') }
+  = let res = compile_com com : hl unit in
+    assert { forall c p r s m m'. ceval m com m' -> codeseq_at c p res.code ->
+     res.pre () p (VMS p r s m) && (forall ms'. res.post () p (VMS p r s m) ms' ->
+     exists r'.
+      ms' = VMS (p + length res.code) r' s m') };
+    res.code
+       
+  (* Insert the final halting instruction. *)
+  let compile_program (prog : com) : code
+    ensures { forall  mi mf: state.
+      ceval mi prog mf -> vm_terminates_reg result mi mf }
+       
+  = let code = compile_com_natural prog in
+    let code2 = code ++ ihalt in
+    
+    assert { 
+      forall r m m'. ceval m prog m' -> codeseq_at code2 0 code ->
+      exists r'.
+      transition_star code2 (VMS 0 r Nil m) (VMS (length code) r' Nil m')
+    };
+    
+    code2 
+
+
+(*
+  (* Execution test: compile a simple factorial program, e.g
+     X := 1; WHILE NOT (Y <= 0) DO X := X * Y; Y := Y - 1 DONE
+     (why3 execute -L . compiler.mlw Compile_com.test) *)
+  let test () : code =
+    let x = Id 0 in
+    let y = Id 1 in
+    let cond = Bnot (Ble (Avar y) (Anum 0)) in
+    let body1 = Cassign x (Amul (Avar x) (Avar y)) in
+    let body2 = Cassign y (Asub (Avar y) (Anum 1)) in
+    let lp = Cwhile cond (Cseq body1 body2) in
+    let code = Cseq (Cassign x (Anum 1)) lp in
+    compile_program code
+
+  let test2 () : code =
+    compile_program (Cwhile Btrue Cskip)
+*)
+
+end
+
diff --git a/compiler/why3session.xml b/compiler/why3session.xml
new file mode 100644
index 0000000..1c6b29a
--- /dev/null
+++ b/compiler/why3session.xml
@@ -0,0 +1,1234 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE why3session PUBLIC "-//Why3//proof session v5//EN"
+"http://why3.lri.fr/why3session.dtd">
+<why3session shape_version="4">
+<prover id="0" name="CVC4" version="1.6" alternative="counterexamples" timelimit="10" steplimit="0" memlimit="2000"/>
+<prover id="1" name="Eprover" version="2.1" timelimit="10" steplimit="0" memlimit="2000"/>
+<prover id="3" name="Alt-Ergo" version="2.0.0" timelimit="10" steplimit="0" memlimit="2000"/>
+<file name="../compiler.mlw" proved="true">
+<theory name="Compile_aexpr" proved="true">
+ <goal name="VC compile_aexpr" expl="VC for compile_aexpr" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC compile_aexpr.0" expl="variant decrease" proved="true">
+  <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.11" steps="159"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.1" expl="variant decrease" proved="true">
+  <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.13" steps="169"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.2" expl="variant decrease" proved="true">
+  <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.08" steps="159"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.3" expl="variant decrease" proved="true">
+  <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.13" steps="169"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.4" expl="precondition" proved="true">
+  <transf name="split_goal_right" proved="true" >
+   <goal name="VC compile_aexpr.4.0" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_aexpr.4.0.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_aexpr.4.0.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_aexpr.4.0.0.0.0" expl="precondition" proved="true">
+      <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.08" steps="151"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_aexpr.4.1" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_aexpr.4.1.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_aexpr.4.1.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_aexpr.4.1.0.0.0" expl="precondition" proved="true">
+      <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.08" steps="148"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_aexpr.4.2" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_aexpr.4.2.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_aexpr.4.2.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_aexpr.4.2.0.0.0" expl="precondition" proved="true">
+      <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.20" steps="226"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_aexpr.4.3" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_aexpr.4.3.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_aexpr.4.3.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_aexpr.4.3.0.0.0" expl="precondition" proved="true">
+      <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.21" steps="226"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC compile_aexpr.5" expl="postcondition" proved="true">
+  <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.12" steps="81"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.6" expl="postcondition" proved="true">
+  <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.09" steps="81"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC compile_aexpr_natural" expl="VC for compile_aexpr_natural" proved="true">
+ <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.16" steps="196"/></proof>
+ </goal>
+</theory>
+<theory name="Compile_bexpr" proved="true">
+ <goal name="VC compile_bexpr" expl="VC for compile_bexpr" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC compile_bexpr.0" expl="variant decrease" proved="true">
+  <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.09" steps="175"/></proof>
+  </goal>
+  <goal name="VC compile_bexpr.1" expl="variant decrease" proved="true">
+  <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.08" steps="180"/></proof>
+  </goal>
+  <goal name="VC compile_bexpr.2" expl="variant decrease" proved="true">
+  <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.18" steps="218"/></proof>
+  </goal>
+  <goal name="VC compile_bexpr.3" expl="precondition" proved="true">
+  <transf name="split_goal_right" proved="true" >
+   <goal name="VC compile_bexpr.3.0" expl="precondition" proved="true">
+   <transf name="split_goal_right" proved="true" >
+    <goal name="VC compile_bexpr.3.0.0" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_bexpr.3.0.0.0" expl="precondition" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="VC compile_bexpr.3.0.0.0.0" expl="precondition" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="VC compile_bexpr.3.0.0.0.0.0" expl="precondition" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.08" steps="183"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+    <goal name="VC compile_bexpr.3.0.1" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_bexpr.3.0.1.0" expl="precondition" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="VC compile_bexpr.3.0.1.0.0" expl="precondition" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="VC compile_bexpr.3.0.1.0.0.0" expl="precondition" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.05" steps="161"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_bexpr.3.1" expl="precondition" proved="true">
+   <transf name="split_goal_right" proved="true" >
+    <goal name="VC compile_bexpr.3.1.0" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_bexpr.3.1.0.0" expl="precondition" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="VC compile_bexpr.3.1.0.0.0" expl="precondition" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="VC compile_bexpr.3.1.0.0.0.0" expl="precondition" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.06" steps="161"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+    <goal name="VC compile_bexpr.3.1.1" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_bexpr.3.1.1.0" expl="precondition" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="VC compile_bexpr.3.1.1.0.0" expl="precondition" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="VC compile_bexpr.3.1.1.0.0.0" expl="precondition" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.08" steps="163"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_bexpr.3.2" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_bexpr.3.2.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_bexpr.3.2.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_bexpr.3.2.0.0.0" expl="precondition" proved="true">
+      <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.26" steps="292"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_bexpr.3.3" expl="precondition" proved="true">
+   <transf name="split_goal_right" proved="true" >
+    <goal name="VC compile_bexpr.3.3.0" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_bexpr.3.3.0.0" expl="precondition" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="VC compile_bexpr.3.3.0.0.0" expl="precondition" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="VC compile_bexpr.3.3.0.0.0.0" expl="precondition" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.58" steps="526"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+    <goal name="VC compile_bexpr.3.3.1" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_bexpr.3.3.1.0" expl="precondition" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="VC compile_bexpr.3.3.1.0.0" expl="precondition" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="VC compile_bexpr.3.3.1.0.0.0" expl="precondition" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.48" steps="477"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_bexpr.3.4" expl="precondition" proved="true">
+   <transf name="split_goal_right" proved="true" >
+    <goal name="VC compile_bexpr.3.4.0" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_bexpr.3.4.0.0" expl="precondition" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="VC compile_bexpr.3.4.0.0.0" expl="precondition" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="VC compile_bexpr.3.4.0.0.0.0" expl="precondition" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.62" steps="524"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+    <goal name="VC compile_bexpr.3.4.1" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_bexpr.3.4.1.0" expl="precondition" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="VC compile_bexpr.3.4.1.0.0" expl="precondition" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="VC compile_bexpr.3.4.1.0.0.0" expl="precondition" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.58" steps="481"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_bexpr.3.5" expl="precondition" proved="true">
+   <transf name="split_goal_right" proved="true" >
+    <goal name="VC compile_bexpr.3.5.0" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_bexpr.3.5.0.0" expl="precondition" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="VC compile_bexpr.3.5.0.0.0" expl="precondition" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="VC compile_bexpr.3.5.0.0.0.0" expl="precondition" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.50" steps="405"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+    <goal name="VC compile_bexpr.3.5.1" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_bexpr.3.5.1.0" expl="precondition" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="VC compile_bexpr.3.5.1.0.0" expl="precondition" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="VC compile_bexpr.3.5.1.0.0.0" expl="precondition" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.46" steps="406"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC compile_bexpr.4" expl="postcondition" proved="true">
+  <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.09" steps="81"/></proof>
+  </goal>
+  <goal name="VC compile_bexpr.5" expl="postcondition" proved="true">
+  <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.10" steps="81"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC compile_bexpr_natural" expl="VC for compile_bexpr_natural" proved="true">
+ <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.24" steps="291"/></proof>
+ </goal>
+</theory>
+<theory name="Compile_aexpr_reg" proved="true">
+ <goal name="VC compile_aexpr" expl="VC for compile_aexpr" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC compile_aexpr.0" expl="variant decrease" proved="true">
+  <proof prover="3"><result status="valid" time="0.14" steps="162"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.1" expl="variant decrease" proved="true">
+  <proof prover="3"><result status="valid" time="0.15" steps="172"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.2" expl="variant decrease" proved="true">
+  <proof prover="3"><result status="valid" time="0.15" steps="162"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.3" expl="variant decrease" proved="true">
+  <proof prover="3"><result status="valid" time="0.16" steps="172"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.4" expl="precondition" proved="true">
+  <transf name="split_goal_right" proved="true" >
+   <goal name="VC compile_aexpr.4.0" expl="precondition" proved="true">
+   <proof prover="3"><result status="timeout" time="10.00"/></proof>
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_aexpr.4.0.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_aexpr.4.0.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_aexpr.4.0.0.0.0" expl="precondition" proved="true">
+      <proof prover="3"><result status="valid" time="0.26" steps="326"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_aexpr.4.1" expl="precondition" proved="true">
+   <proof prover="3"><result status="timeout" time="10.00"/></proof>
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_aexpr.4.1.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_aexpr.4.1.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_aexpr.4.1.0.0.0" expl="precondition" proved="true">
+      <proof prover="3"><result status="valid" time="0.26" steps="316"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_aexpr.4.2" expl="precondition" proved="true">
+   <proof prover="3"><result status="timeout" time="10.00"/></proof>
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_aexpr.4.2.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_aexpr.4.2.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_aexpr.4.2.0.0.0" expl="precondition" proved="true">
+      <proof prover="3"><result status="valid" time="0.54" steps="500"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_aexpr.4.3" expl="precondition" proved="true">
+   <proof prover="3"><result status="timeout" time="10.00"/></proof>
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_aexpr.4.3.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_aexpr.4.3.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_aexpr.4.3.0.0.0" expl="precondition" proved="true">
+      <proof prover="3"><result status="valid" time="0.53" steps="500"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC compile_aexpr.5" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.11" steps="81"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.6" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.10" steps="81"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC compile_aexpr_natural" expl="VC for compile_aexpr_natural" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC compile_aexpr_natural.0" expl="assertion" proved="true">
+  <proof prover="3"><result status="valid" time="0.09" steps="80"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr_natural.1" expl="assertion" proved="true">
+  <proof prover="3"><result status="valid" time="0.10" steps="81"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr_natural.2" expl="assertion" proved="true">
+  <proof prover="3"><result status="valid" time="0.18" steps="172"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr_natural.3" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.26" steps="309"/></proof>
+  </goal>
+ </transf>
+ </goal>
+</theory>
+<theory name="Compile_bexpr_reg" proved="true">
+ <goal name="VC compile_bexpr" expl="VC for compile_bexpr" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC compile_bexpr.0" expl="variant decrease" proved="true">
+  <proof prover="3"><result status="valid" time="0.16" steps="175"/></proof>
+  </goal>
+  <goal name="VC compile_bexpr.1" expl="variant decrease" proved="true">
+  <proof prover="3"><result status="valid" time="0.16" steps="180"/></proof>
+  </goal>
+  <goal name="VC compile_bexpr.2" expl="variant decrease" proved="true">
+  <proof prover="3"><result status="valid" time="0.19" steps="218"/></proof>
+  </goal>
+  <goal name="VC compile_bexpr.3" expl="precondition" proved="true">
+  <transf name="split_goal_right" proved="true" >
+   <goal name="VC compile_bexpr.3.0" expl="precondition" proved="true">
+   <transf name="split_goal_right" proved="true" >
+    <goal name="VC compile_bexpr.3.0.0" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_bexpr.3.0.0.0" expl="precondition" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="VC compile_bexpr.3.0.0.0.0" expl="precondition" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="VC compile_bexpr.3.0.0.0.0.0" expl="precondition" proved="true">
+       <proof prover="3"><result status="valid" time="0.25" steps="298"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+    <goal name="VC compile_bexpr.3.0.1" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_bexpr.3.0.1.0" expl="precondition" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="VC compile_bexpr.3.0.1.0.0" expl="precondition" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="VC compile_bexpr.3.0.1.0.0.0" expl="precondition" proved="true">
+       <proof prover="3"><result status="valid" time="0.18" steps="169"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_bexpr.3.1" expl="precondition" proved="true">
+   <transf name="split_goal_right" proved="true" >
+    <goal name="VC compile_bexpr.3.1.0" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_bexpr.3.1.0.0" expl="precondition" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="VC compile_bexpr.3.1.0.0.0" expl="precondition" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="VC compile_bexpr.3.1.0.0.0.0" expl="precondition" proved="true">
+       <proof prover="3"><result status="valid" time="0.17" steps="169"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+    <goal name="VC compile_bexpr.3.1.1" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_bexpr.3.1.1.0" expl="precondition" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="VC compile_bexpr.3.1.1.0.0" expl="precondition" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="VC compile_bexpr.3.1.1.0.0.0" expl="precondition" proved="true">
+       <proof prover="3"><result status="valid" time="0.25" steps="279"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_bexpr.3.2" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_bexpr.3.2.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_bexpr.3.2.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_bexpr.3.2.0.0.0" expl="precondition" proved="true">
+      <proof prover="3"><result status="valid" time="0.32" steps="343"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_bexpr.3.3" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_bexpr.3.3.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_bexpr.3.3.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_bexpr.3.3.0.0.0" expl="precondition" proved="true">
+      <proof prover="3"><result status="valid" time="0.73" steps="937"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_bexpr.3.4" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_bexpr.3.4.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_bexpr.3.4.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_bexpr.3.4.0.0.0" expl="precondition" proved="true">
+      <proof prover="3"><result status="valid" time="0.72" steps="937"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_bexpr.3.5" expl="precondition" proved="true">
+   <transf name="split_goal_right" proved="true" >
+    <goal name="VC compile_bexpr.3.5.0" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_bexpr.3.5.0.0" expl="precondition" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="VC compile_bexpr.3.5.0.0.0" expl="precondition" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="VC compile_bexpr.3.5.0.0.0.0" expl="precondition" proved="true">
+       <proof prover="3"><result status="valid" time="0.63" steps="533"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+    <goal name="VC compile_bexpr.3.5.1" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_bexpr.3.5.1.0" expl="precondition" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="VC compile_bexpr.3.5.1.0.0" expl="precondition" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="VC compile_bexpr.3.5.1.0.0.0" expl="precondition" proved="true">
+       <proof prover="3"><result status="valid" time="0.75" steps="534"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC compile_bexpr.4" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.11" steps="81"/></proof>
+  </goal>
+  <goal name="VC compile_bexpr.5" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.10" steps="81"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC compile_bexpr_natural" expl="VC for compile_bexpr_natural" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC compile_bexpr_natural.0" expl="assertion" proved="true">
+  <proof prover="3"><result status="valid" time="0.10" steps="81"/></proof>
+  </goal>
+  <goal name="VC compile_bexpr_natural.1" expl="assertion" proved="true">
+  <proof prover="3"><result status="valid" time="0.16" steps="155"/></proof>
+  </goal>
+  <goal name="VC compile_bexpr_natural.2" expl="postcondition" proved="true">
+  <proof prover="3" obsolete="true"><result status="timeout" time="10.00"/></proof>
+  <transf name="split_goal_right" proved="true" >
+   <goal name="VC compile_bexpr_natural.2.0" expl="postcondition" proved="true">
+   <proof prover="3"><result status="valid" time="0.34" steps="251"/></proof>
+   </goal>
+   <goal name="VC compile_bexpr_natural.2.1" expl="postcondition" proved="true">
+   <proof prover="3"><result status="valid" time="0.37" steps="325"/></proof>
+   </goal>
+  </transf>
+  </goal>
+ </transf>
+ </goal>
+</theory>
+<theory name="Compile_com" proved="true">
+ <goal name="loop_variant_lemma" proved="true">
+ <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.16" steps="154"/></proof>
+ </goal>
+ <goal name="loop_variant_acc" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="loop_variant_acc.0" proved="true">
+  <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.29" steps="298"/></proof>
+  </goal>
+  <goal name="loop_variant_acc.1" proved="true">
+  <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.15" steps="113"/></proof>
+  </goal>
+  <goal name="loop_variant_acc.2" proved="true">
+  <transf name="induction_pr" proved="true" >
+   <goal name="loop_variant_acc.2.0" proved="true">
+   <transf name="simplify_trivial_quantification_in_goal" proved="true" >
+    <goal name="loop_variant_acc.2.0.0" proved="true">
+    <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.05" steps="82"/></proof>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="loop_variant_acc.2.1" proved="true">
+   <transf name="simplify_trivial_quantification_in_goal" proved="true" >
+    <goal name="loop_variant_acc.2.1.0" proved="true">
+    <proof prover="1" timelimit="5" memlimit="1000"><result status="valid" time="0.11"/></proof>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="loop_variant_acc.2.2" proved="true">
+   <transf name="simplify_trivial_quantification_in_goal" proved="true" >
+    <goal name="loop_variant_acc.2.2.0" proved="true">
+    <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.08" steps="86"/></proof>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="loop_variant_acc.2.3" proved="true">
+   <transf name="simplify_trivial_quantification_in_goal" proved="true" >
+    <goal name="loop_variant_acc.2.3.0" proved="true">
+    <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.06" steps="85"/></proof>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="loop_variant_acc.2.4" proved="true">
+   <transf name="simplify_trivial_quantification_in_goal" proved="true" >
+    <goal name="loop_variant_acc.2.4.0" proved="true">
+    <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.09" steps="85"/></proof>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="loop_variant_acc.2.5" proved="true">
+   <transf name="simplify_trivial_quantification_in_goal" proved="true" >
+    <goal name="loop_variant_acc.2.5.0" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="loop_variant_acc.2.5.0.0" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="loop_variant_acc.2.5.0.0.0" proved="true">
+      <transf name="apply" proved="true" arg1="Acc">
+       <goal name="loop_variant_acc.2.5.0.0.0.0" proved="true">
+       <transf name="compute_specified" proved="true" >
+        <goal name="loop_variant_acc.2.5.0.0.0.0.0" proved="true">
+        <transf name="introduce_premises" proved="true" >
+         <goal name="loop_variant_acc.2.5.0.0.0.0.0.0" proved="true">
+         <proof prover="1"><result status="valid" time="0.41"/></proof>
+         </goal>
+        </transf>
+        </goal>
+       </transf>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="loop_variant_acc.2.6" proved="true">
+   <transf name="simplify_trivial_quantification_in_goal" proved="true" >
+    <goal name="loop_variant_acc.2.6.0" proved="true">
+    <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.21" steps="227"/></proof>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC compile_com" expl="VC for compile_com" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC compile_com.0" expl="variant decrease" proved="true">
+  <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.17" steps="165"/></proof>
+  </goal>
+  <goal name="VC compile_com.1" expl="variant decrease" proved="true">
+  <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.23" steps="177"/></proof>
+  </goal>
+  <goal name="VC compile_com.2" expl="variant decrease" proved="true">
+  <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.07" steps="169"/></proof>
+  </goal>
+  <goal name="VC compile_com.3" expl="variant decrease" proved="true">
+  <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.26" steps="196"/></proof>
+  </goal>
+  <goal name="VC compile_com.4" expl="variant decrease" proved="true">
+  <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.19" steps="165"/></proof>
+  </goal>
+  <goal name="VC compile_com.5" expl="precondition" proved="true">
+  <transf name="split_goal_right" proved="true" >
+   <goal name="VC compile_com.5.0" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_com.5.0.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_com.5.0.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_com.5.0.0.0.0" expl="precondition" proved="true">
+      <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.14" steps="105"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_com.5.1" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_com.5.1.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_com.5.1.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_com.5.1.0.0.0" expl="precondition" proved="true">
+      <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.41" steps="421"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_com.5.2" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_com.5.2.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_com.5.2.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_com.5.2.0.0.0" expl="precondition" proved="true">
+      <proof prover="3"><result status="valid" time="1.16" steps="955"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_com.5.3" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_com.5.3.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_com.5.3.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_com.5.3.0.0.0" expl="precondition" proved="true">
+      <proof prover="3"><result status="valid" time="0.85" steps="1157"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_com.5.4" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_com.5.4.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_com.5.4.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_com.5.4.0.0.0" expl="precondition" proved="true">
+      <transf name="split_goal_right" proved="true" >
+       <goal name="VC compile_com.5.4.0.0.0.0" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.22" steps="132"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.1" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.13" steps="104"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.2" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.10" steps="104"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.3" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.21" steps="104"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.4" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.27" steps="164"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.5" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.12" steps="112"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.6" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.13" steps="120"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.7" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.15" steps="127"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.8" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.12" steps="127"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.9" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.13" steps="127"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.10" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="5" memlimit="1000"><result status="valid" time="0.20" steps="126"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.11" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.17" steps="134"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.12" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.15" steps="133"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.13" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.12" steps="127"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.14" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="1.25" steps="669"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.15" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.13" steps="134"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.16" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.25" steps="174"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.17" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.14" steps="174"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.18" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.15" steps="174"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.19" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="2.96" steps="1488"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.20" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.22" steps="181"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.21" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.13" steps="144"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.22" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.11" steps="120"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.23" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.19" steps="128"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.24" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.13" steps="127"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.25" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.67" steps="471"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.26" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.09" steps="127"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.27" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.25" steps="127"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.28" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.11" steps="125"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.29" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.12" steps="134"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.30" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.25" steps="139"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.31" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.20" steps="138"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.32" expl="VC for compile_com" proved="true">
+       <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.13" steps="138"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.33" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.18" steps="138"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC compile_com.6" expl="postcondition" proved="true">
+  <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.08" steps="81"/></proof>
+  </goal>
+  <goal name="VC compile_com.7" expl="postcondition" proved="true">
+  <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.09" steps="81"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC compile_com_natural" expl="VC for compile_com_natural" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC compile_com_natural.0" expl="assertion" proved="true">
+  <transf name="compute_specified" proved="true" >
+   <goal name="VC compile_com_natural.0.0" expl="assertion" proved="true">
+   <transf name="introduce_premises" proved="true" >
+    <goal name="VC compile_com_natural.0.0.0" expl="assertion" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_com_natural.0.0.0.0" expl="assertion" proved="true">
+     <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.04" steps="127"/></proof>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC compile_com_natural.1" expl="postcondition" proved="true">
+  <proof prover="3" timelimit="1" memlimit="1000"><result status="valid" time="0.06" steps="125"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC compile_program" expl="VC for compile_program" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC compile_program.0" expl="assertion" proved="true">
+  <proof prover="3"><result status="valid" time="0.15" steps="181"/></proof>
+  </goal>
+  <goal name="VC compile_program.1" expl="postcondition" proved="true">
+  <proof prover="1"><result status="valid" time="0.46"/></proof>
+  </goal>
+ </transf>
+ </goal>
+</theory>
+<theory name="Compile_com_reg" proved="true">
+ <goal name="loop_variant_lemma" proved="true">
+ <proof prover="3"><result status="valid" time="0.15" steps="154"/></proof>
+ </goal>
+ <goal name="loop_variant_acc" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="loop_variant_acc.0" proved="true">
+  <proof prover="3"><result status="valid" time="0.27" steps="298"/></proof>
+  </goal>
+  <goal name="loop_variant_acc.1" proved="true">
+  <proof prover="3"><result status="valid" time="0.13" steps="113"/></proof>
+  </goal>
+  <goal name="loop_variant_acc.2" proved="true">
+  <transf name="induction_pr" proved="true" >
+   <goal name="loop_variant_acc.2.0" proved="true">
+   <proof prover="3"><result status="valid" time="0.10" steps="85"/></proof>
+   </goal>
+   <goal name="loop_variant_acc.2.1" proved="true">
+   <proof prover="3"><result status="valid" time="0.12" steps="85"/></proof>
+   </goal>
+   <goal name="loop_variant_acc.2.2" proved="true">
+   <proof prover="3"><result status="valid" time="0.12" steps="87"/></proof>
+   </goal>
+   <goal name="loop_variant_acc.2.3" proved="true">
+   <proof prover="3"><result status="valid" time="0.12" steps="87"/></proof>
+   </goal>
+   <goal name="loop_variant_acc.2.4" proved="true">
+   <proof prover="3"><result status="valid" time="0.12" steps="87"/></proof>
+   </goal>
+   <goal name="loop_variant_acc.2.5" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="loop_variant_acc.2.5.0" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="loop_variant_acc.2.5.0.0" proved="true">
+     <transf name="apply" proved="true" arg1="Acc">
+      <goal name="loop_variant_acc.2.5.0.0.0" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="loop_variant_acc.2.5.0.0.0.0" proved="true">
+       <transf name="introduce_premises" proved="true" >
+        <goal name="loop_variant_acc.2.5.0.0.0.0.0" proved="true">
+        <proof prover="1"><result status="valid" time="0.44"/></proof>
+        </goal>
+       </transf>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="loop_variant_acc.2.6" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="loop_variant_acc.2.6.0" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="loop_variant_acc.2.6.0.0" proved="true">
+     <proof prover="0"><result status="valid" time="0.42"/></proof>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC compile_com" expl="VC for compile_com" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC compile_com.0" expl="variant decrease" proved="true">
+  <proof prover="3"><result status="valid" time="0.15" steps="165"/></proof>
+  </goal>
+  <goal name="VC compile_com.1" expl="variant decrease" proved="true">
+  <proof prover="3"><result status="valid" time="0.17" steps="177"/></proof>
+  </goal>
+  <goal name="VC compile_com.2" expl="variant decrease" proved="true">
+  <proof prover="3"><result status="valid" time="0.16" steps="169"/></proof>
+  </goal>
+  <goal name="VC compile_com.3" expl="variant decrease" proved="true">
+  <proof prover="3"><result status="valid" time="0.18" steps="196"/></proof>
+  </goal>
+  <goal name="VC compile_com.4" expl="variant decrease" proved="true">
+  <proof prover="3"><result status="valid" time="0.16" steps="165"/></proof>
+  </goal>
+  <goal name="VC compile_com.5" expl="precondition" proved="true">
+  <transf name="split_goal_right" proved="true" >
+   <goal name="VC compile_com.5.0" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_com.5.0.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_com.5.0.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_com.5.0.0.0.0" expl="precondition" proved="true">
+      <proof prover="3"><result status="valid" time="0.13" steps="105"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_com.5.1" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_com.5.1.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_com.5.1.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_com.5.1.0.0.0" expl="precondition" proved="true">
+      <proof prover="3"><result status="valid" time="0.26" steps="269"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_com.5.2" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_com.5.2.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_com.5.2.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_com.5.2.0.0.0" expl="precondition" proved="true">
+      <proof prover="3"><result status="valid" time="1.35" steps="953"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_com.5.3" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_com.5.3.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_com.5.3.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_com.5.3.0.0.0" expl="precondition" proved="true">
+      <proof prover="3"><result status="valid" time="0.93" steps="1068"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_com.5.4" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_com.5.4.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_com.5.4.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_com.5.4.0.0.0" expl="precondition" proved="true">
+      <transf name="split_goal_right" proved="true" >
+       <goal name="VC compile_com.5.4.0.0.0.0" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.17" steps="132"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.1" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.12" steps="104"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.2" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.13" steps="104"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.3" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.17" steps="164"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.4" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.15" steps="111"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.5" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.15" steps="118"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.6" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.15" steps="123"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.7" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.14" steps="123"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.8" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.15" steps="123"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.9" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.14" steps="123"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.10" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.14" steps="123"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.11" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.16" steps="128"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.12" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="1.76" steps="680"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.13" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.17" steps="134"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.14" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.21" steps="174"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.15" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.22" steps="174"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.16" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="3.68" steps="1564"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.17" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.24" steps="180"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.18" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.23" steps="143"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.19" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.19" steps="118"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.20" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.17" steps="129"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.21" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.16" steps="127"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.22" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.78" steps="452"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.23" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.16" steps="123"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.24" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.23" steps="123"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.25" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.22" steps="123"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.26" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.24" steps="123"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.27" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.24" steps="123"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.28" expl="VC for compile_com" proved="true">
+       <proof prover="3"><result status="valid" time="0.17" steps="123"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC compile_com.6" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.14" steps="81"/></proof>
+  </goal>
+  <goal name="VC compile_com.7" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.13" steps="81"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC compile_com_natural" expl="VC for compile_com_natural" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC compile_com_natural.0" expl="assertion" proved="true">
+  <transf name="compute_specified" proved="true" >
+   <goal name="VC compile_com_natural.0.0" expl="assertion" proved="true">
+   <transf name="introduce_premises" proved="true" >
+    <goal name="VC compile_com_natural.0.0.0" expl="assertion" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_com_natural.0.0.0.0" expl="assertion" proved="true">
+     <proof prover="3"><result status="valid" time="0.13" steps="140"/></proof>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC compile_com_natural.1" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.12" steps="137"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC compile_program" expl="VC for compile_program" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC compile_program.0" expl="assertion" proved="true">
+  <proof prover="3"><result status="valid" time="0.11" steps="86"/></proof>
+  </goal>
+  <goal name="VC compile_program.1" expl="postcondition" proved="true">
+  <proof prover="1"><result status="valid" time="0.51"/></proof>
+  </goal>
+ </transf>
+ </goal>
+</theory>
+</file>
+</why3session>
diff --git a/compiler/why3shapes.gz b/compiler/why3shapes.gz
new file mode 100644
index 0000000000000000000000000000000000000000..bafb9ddc1958fe1d3031504b4f42a4e280807c2f
GIT binary patch
literal 25676
zcmb2|=3oGW|8Mq2_RCmL()%%Qzf=C_3mOe3?;KVd?qc_HI52Zn`_7K(Zq5&)re40~
zbxHH(zu$(xye>_TFbZ~`*%cKe`0!oHr3{nbXEIDKt4&zZEb5}Q$T`VH<CRWEq65=b
zeZKvBJ>>28e~`alzpGmO{;eN>FQ-?3SG-$W|8e^MKg<7q`FQ#|^Y**v^LOhX+1D-q
z@8j3`*Xnsb9*Cc6UVlvf&Gqx;|MzWvfA7(D^P@*!t^9a<`#bI0trd?M#dzg!y!~<e
z^uzoAt3Th*pU?M2fv@Ow8}pOZ?4<$U>g)d{zj~2&nEl%Q`*&-9S6iOAAHLGK=gryt
zqXtFG-(2s%Z@2gFx0TY9U%F?<>Ap0viJzGJcHh6I_(>OTSpWZcc>4O<{UzRh!F&(5
z)_#51|Gj<hx}aO;-Y+}n#_lcLvFTE5&i{A!%N8i9=9Ygfx*NZz{NjE6kMTQqhc0h;
zlKnSctL)dk_#gd8FMrJq<*q%PoxgNhb^QPE+<l_+<7##7BI?7}&;I^M_UfA#ja^mM
zEz9Py#F|w;URrV>gy)`h_R<Gu+%NcLdupm*-0M(v|0aKYe9H@acbU)mD<99yUpc!g
z|M9PbrcCwo_jNGe2sdjvocPOg`t{I#|DN)fTgaT4UDdEhO8#~GaWnVhs}F9xt$Xrt
zSVaF#>+<gpA209w{$_c3eNE=h{C$s$=gg|>?A|LaV|(E3+g>(VQ5WHs3z};0T8*wT
zFerOEwM^Dr!M|mRK(3~TXJzwA^EHzL!c;{5CTySHu!cibOXyqwv?jh+yQ8~0i+0|#
z`?~Y#DaR>}i{wiEtd>n-6;pZTn%X+;<@HF}8*?vn&iH*#ctViujHHBEfm6RU8YJ|X
z6<vNN`0ml`Q@7r#q%l)z28+xdGd9!Cu%=%g$}Hk1xogB4J$C%A`u_27<&R$FrQ1GA
zzZaNkBe}oyyS+}G^p<yhm)1T@c)Rc4p;J#@aP41Nmi1-lkKP-i8C%=$U(1tOx8|XF
z&;#?$4f#);euOb<*6GzmKhW6M61Y15>fNLN*57FkdA<JX+47wY`Mc)Hm<kk1Yn{to
zr+Db$%Sn?njpuUn9lCwmGP62@+r!G^ge^zxX%8)}2Fay{K`gmbKU|vqU}kYfvk><j
zFR3fS;==w;UOvx?r#*;FSaDtBfUJd<@Z^}65__-eM5LQuG}*ai&Xn&nBrP`lxcwz4
zlmGwu|JLgyuIQTbUfA~U%kk;;N>l&m-e34kZN+Qfx<}Gk@0tIH|9)0ED}cRhvi1JX
z)W+t1xqY?2%N}fg7A4qi@Zsx|{ED60BGb3??mu7rxhTi*+zOXa=jDek>)3p%D4hG~
zmYa7$*!nHXBKKOqf4QC~zW9DhLRa$hyPJ*nZ&MDqxH<2{(K!s(4KqAgy^Zw4Mf|i&
z&VNnWAG=9(>CE*ap$R7HE?UoOo+xI>M|e!I=?&`i{&}kE_uV?JV-DVrZbeOr?oU|r
zK)dBlWp95?>izmiBQd8Fbtx5Fe-|t+ed1v@@$ADFlSF+2*UN4-TUdCe!gR`guA(<(
zJ=0{9Zy3htxgNilv$gq*@-O%Oi?>WNE>AB1+&jM@^TGS=+t=64R{yu)Smd$Wc~cY)
z3Y}fErDLCG+@GMRcT<9tj;%J?7bE2_@j@nY&cy)r?wKAuEoO}Wvpv093Y{f0-ZSQ^
zXRh1yqcCOTyW_wAy{rEBb^kx<)I9YWXQw4x`@2<LWrlJ8*QQ9eRUF|LCpdT-xD+I6
zO!t&jvr!h;|7Y)P;4ZY&$kX-tq$yW|m1G&hHO_Bg{dkzwIA79p(FC#8PP>G2tDR;Q
zcy3kE(d_S@uQXXpS5)+ncF58odt=4DSsk7C^6&q>yE*2#Wybt<`zK#JA^1A~>E4|;
z|F*u}-qm}3+wJHL2J5oa`DORml-xe+oNdpas{Kq}`{deLzs0Y~-`@J~!JD)5Z#{3F
zl$P7Q{6#|Y`Ae?sFZ0+>&Xmslx@~FY-lf;fw_WP9nCSaZWA)LzGXGW0=ZdC#p9?ME
zS*o)<?v}{XsRx31nu1Q<*c|+Bxpj$HS6yvl?ylmvd2i2T-mloF{rstC-<)r@v-9Q%
zu390)@*zuYVPvwFb4!w*W9kJaA$y<CoNr1xniixpDoJ$&ee0XZ+?@GM(w1@20>kWG
z&oj6K{XSW4J#y!ZMeh-j)bi{H$6Y>uXne^vLE+Yc)YK1$U3}F1)zy;OkA2kr5m5J4
z%JB5P!jQ#}j%`elk?>xctZ<R#f!A^oK{l7gvPaZe&WbqJWSZXk<C(omvNT2|w?xR|
zr_M{>47T60$*IR#%5;=xnr4J;H{O1I&8KxY`@fpE6f&##?3u*u%G0&WeD)XXg*O*o
zbo`Svd*{*HGu8F7CT}{}&9d2CGg@-}{hYI3o3^}uduq}Jjjj9A3!DG<c{ffuP`dc6
zPN@4whkG)u_YXTeXw78%@ybt2^m0sdT7qhpTgRLa^_o#3TQhhB(v-5|+?HOrq*3L1
zHvCGB>sfml)Aeuk@|&OS*=^I1=IXh{&GOt#0VA)u7mi#%@<PT(A!Aq5GwqChP0!+`
zOpI5>a&WPzdMO`E5!sXGR;|pjv7nIU)O?0nmXlAqJn)Oqk|+#w;5p{{NM!qzAIq6%
z{V!rY>(61L{w_4Yq%xsnCWD1}qsn?gKZ6Ti`%X++80&1W^5p+Qr>!afr_D{6w`zCx
z_pjn%6Z+OP8Hhcs`*bE??fjJXPdy5{SC8+Mcm5}x;b?k)q3hbLziW#E>fN0VUpbbY
z`gyK>5yzDuB_|L2`uuAuU2&uJbAP^ouh@a!C1Ptj#8|E?T3j%aI60Y1U@sr%HrFE?
zm0j}JeR`thzwXnMm!~I7s|%+qFf8025;fDK^>U!9Zf}8F+ttf$`Sv%~*Vk-&zajnG
z;pu)=d;WeBja=%kQDadNK1=a&^k>a|Lf<u7u2j6Az0SO{@9p(-7uj~a$u`{B`+xVu
z+yDO_UtTWQ`)3{ZF6X&7w_jTL)%A`2U9miGc3;uo_0`D^8DdRhZ7UZjGAU|BEeuTv
zGFl%!Y3EkvS(kP#V*Y&Sgu4gdtM9p<TLjdjA8kv_+cqWg^x_4d6wX<1JZZK3)U@0a
z%PSSse?=VqaAeiw(z!`z4W3VyIn2K{DB*e4pNO+^U#{L|JF59LW#_G8_xJZo@7^o_
zo4b8i-M32*AASBW)3<)kl`p3cR@LVIzaIW4eY#%viFL^(jk&uH+~Rm}gX4k7qXSYW
z6WgC;uN5ot{C0PG?V%43Rd4@#)@GSGxl_s|;b4LH+Rsgr?^?Di1#T`YTQz%PNcn@*
zWA@+bYk&Os+7SL||GwJ8_4khEKYeKuHqY<y?6>U!^X8rk%ec;PdSh1)=TwoUTtQ5(
zs#3e!s@tp@f|A4dkFNdhy};rA>*-b>_KVMb^7`+o{R=mocb~LGq{n^fp05mtjFKlW
z^K?ygv`+SaKhx65(93($!W^xPGV{Od)GP0F2#4O;RG8@c+@w4#K6UY>sjg2y+RwbZ
z%Q*jI^_P5OkK=uMw`!*Z7q-rL+M2YeVOFQp+F5=!8rRR1d7LwF51Axl;(G0}SzC%g
z;gJ_Rc*WlfY~U-;S-tqpgG(00%e5B2`zODwyD#tE6`|`nTrr!KM9yyWF;VBZwf5~I
zTh4vg-dSqB`0;bQ8|%be(JiG6dGV|hgF^%&gB?@cS=Vl@n#Q%u!F>G-kMMamyI<eS
z%h!&)Rh~JGLC2fn+wZvB+@imCO+WUwB23ucVfuW<|9dyaC}jmGRjuYJwRs{eGf(yP
zis>1R_VI#+Qw0utX?&k<ojB2dDf{X*F4f%(Nz+n1w{%E0WPi9LSXsE`s{S#te$&?V
zelrh0=)4-|s_XbUCF4V&XM4bT&Y2D|HK*3_U+COFRbyR=W5={(i@OtEe_OjUQ~rqN
z+p_))^M#MkT`b}+P3ts#mT^y8C^DySw#TMEg9P^)8~yUs|DU!!{Qh*Nbl4ilz1wD&
zEzqdiEM)Lkt!iW7jrq+d)KlBCpUZ5S>3{Qy`1-eso3&ydFcjHkDEr-*Aph-Gv4Z2>
zUvi6YF&yzu+w&l5W&@k-<8x8kO&3iL9BtHjtoJqcV&~u7S9$SOub-Kk9SyJXiGRh;
zZua!r%{#A+zwewF@59k4{ao4WfrjG3GfRCKPsK8So%uK^<2c{D67|w;dG{ovzCJK8
z*(P)A+R6DZW#^Th{pj8Q=LAQ_Rt+%+Be5MmhaBt}SETY-T{?aKf2`>x+rm?;_s`vQ
zV(0cdH!>_AHnNzwYWA8*33DvASp1!FR(NhnpP5qiEsfW$$1kgI=~(L!TNpFH$4XCH
zyY{vEM=6cftfpQDi#a%d&e&T%PvFqp;zR$ExKtnh*xT+AvuRS6%a<;Tm^PP_8naTE
z?H4*7JYQOJVYyvdP7n`g%7!Z|*H|un)W!B(xNhTwrbT~NN%#fv+!lLtc*gAh1j+TM
z8_unrJom%BK#qGBnp3vS@}9P$SnA`Fbf>KHr``6v26Ig6`&dOq-MOc6wP)XA`fT~t
z*+a_Jdgq^>@1h2Oyc!;=#Cdbh2?_i#g+J8bee3c$n>`#Bx;^|hory=WL7~z<pm`h1
zPmKyG9>!Tk25u()vIZ%KqoOral9ZNb^c-}5eo>=yBGZ2NPaUh1Dg^F7vpX{XO7(`I
zrlUtCJ&vfZc3v{gORy!$YsPBZ%CC8L`^rC?gt4BC{bW@&&HV1x!Xwq%o$fbZF-4{B
zpHgPXsp%kad!c4tZIPq)%f;8*Qd5;*o?jO$cY1$k5O;{u5iK#^NiBs}-0!eXtnkZb
z*}p7omx|fKt9CcsE*ckK;;T`g_u_rEuYU3Oux|VOW3y{~uBXNC`{pMp<;cNl)%19h
z_VP}*yQQHazq_&o*>|j8QL(zOLRG<c?xS^<SI?!tPW;{3=688=cRIV1Bj2+dk9SRM
zNskQLyzF#rOmNwrkg_C;Be%78KYs3~?mK<z6QlIF<M*bd{_E38Kei=Kd#TJJgN3FO
z<tz%@gz789I@MR+Eh)I;uIS7cC4Rv1Ws94u2MaIv!}_SVWqY(^7t6O_kx~D)q(1Fh
zx3Bw>zx%f7{5m&PJGszh^QActmVReBYbm~`L-S+?gRb?fk|XnPJdK<+f6lW#$2%3b
z{k!zKbK%c_^S`q^nm=Q5>hqpszcRW0|Nr~3&ZFj$-I1%zqQ&nf|2C2PA8J}RS!211
zq<ij^gaeseR}2p;J9^5#n|S80mfE_cM_Ov%jviswd$M%Ojqe{HKfc*;GQgD4;M~C<
zDYYSL26>AFGCC?Jwd``w`~Ez;YwfZA%X)Ql-laL*njqqE`{}n;HHvcrRt4nm5%gOd
zVsZU@wWUe4;g1KL%hO)lo~<%+Ej~PX>C@2k^G#`AXXQ+v`qR@#{NH?G>9dy8`+lpX
zZ|0pgEjn3z+TP?0IiK0e>}57PgXib2tnOR;ET-xTOV}E-W0A@GR?mr9dB%k0ronR&
z`!kl)`=oE0Ut&8~a*xADZqNCxiNf6HW{BjZyu5yk&m<_wwe-qG!IgV?dkl_WSeH7{
zSlpaBs6RDMtH@0+ADZ1aKHso6{nawN;LC4bPA@iVU%TymmAl-PKl47BUjGtcUtguc
z5t6}iQk_vS!=s5+fI)N7pMXc=T;BVlM8j7<;*1n^ujO|)E9c(qRP0)k;wQyyxMEI$
zVP-aK@vW?m@0|{NXNiVyev}nvBfPnZ-K)4sNY<yIg+nldt1akoN5RFryWiZOY^1${
z<-;^CW;xxS7b;x7%qCiysVv(hQ-AC^(<Pr08glLQ)ipnUp5<~1;+UfOXbo#~MH~Cu
zz$I+&WoC(fx7=N8s=Y4l=+!k9TWrtPuTk%;o?&~oeCx#`W-gw72Die4dzeIQ&q%9^
z8h3q)*YrIe>JxMH2)~#x|Beag?_NG~-2Hj;^97d42aO-}H7qjJT-oTkp7ZLbPnSBw
zpC7*Zv!J}x&PM#X^Aw}NLl@@=9PyNzGQlazmt_Itn@dL@`ukt{*|7M#&hzV@e%Tyu
z>OxDF-Qi?xF_XKU{<=nDFH`+r$Jw*$_wJIP*YUe?woA$;4vjUT4^~d#nt8E8ul3TM
z`|1I&vchBDcCC*67*TdK@crS5v1bo$=$O{6GMOc@`Eie0dS=U;T!9eI;<Nh;O?B3_
z9lg3?N8z-J$3lynq8&af1#-J_P8Yd+X?eG-fd8cpAIw~jc*yi}ip+BJ=9OXC<LBje
z^ve3wh(FK!H){X;oE2unySZs$z=kMcZ=P_02s^3uzMC8;9%$NQvF_K*8KSBO?jPF{
zo#xv8{w9CZ_td=BR|@azOL978?oYXC#rK<g;`!yr7Rbg|UVgSz>akw?jWFYQiR3jp
z!p+{5>x7f1<=QuK8XWqwsmmquc+aajtDMYL;>5xi-(IOzbZ|zd^+9!KrD7?Mf))ER
zC+)BaR=Fmn_f~&O+ml@`->1De_vrSWUAxxpOJ2=yVtT~5;7-w&jWf5%_$&x9GC9n;
z_tqWtTX&YS?n(8@y?JLX;~K5WZv)@lKg1`nmGO?sc1PxjMZ7&~@6QQq-!QSC8M(Ex
z!Y5$yXQ$Us52d($Ha?TFEBHs^(Vk^DW#*lEA-t(-(OmneOWiRhA^GR7A39umL@>HK
zJR?-0?^GpAvfR|ZoZxvvGTgUrsQ+O3(b&m6`KChrXHJ>RjQaT;tCFM(0#%;tEPA0K
z>hJQ{+*k9VxOb;|X5nms$ORdpDycFPS~gueF`*z)>QzT_wAlCgHe1YR$3~W9UgZ#B
zony7NRrH`i%JY>`(pGCHNS^YWpBDDYbahe2#f0vwMT+asc{I9MF-w`fzdv*Gx0`|5
z2T$$!v-Yj&x{up#FJJC0RU9<$*6Sp{Tkgl-dA#vcT`lfrzE+q!Xr)ZJnbbK)R}Vk0
zKdsOHyzrS2U#tJV>qWT0-xf8o!?*9)?P~g+{9vA?lJKil4D*b9ef->A95kCP=2ujo
zwJT!%9$v7Y;d}HVkGF49>|^KDKVEuOFh}oB1`DrNQ1+A(H*Q4_5%J&m=c#S$=PSD4
z=r?(F%ZE9$M3TG$RXiu%_pvQH`Yk-?zjs2lelO>>-7#8|jpyx9npW)eDNy0<+{%fm
zUfOzYca*$u1T{Sk+HS%yUH8Len-5|FC!2o=rrv4K;M~f5>-5AGXNzOAmQD+dGnC%i
zbA|Kj+ACgbrdb8CCa=9~d}_z*f4aY1ieC5@y_mZ1wQ}us^$RZRCq(8?u3UR^^Q!Ik
zORs!P7s=Ou_<ozDrQ*@qDLt2tMN0A-o>SGcxURGGK*kfpu3X8By6=0JcF&OG>+RLN
zZ_-@zO6VEm^ecNK|8ER?DJk@9`YO$et`^I84H+tDvKaE8)>(KSaS$^sSQek;f8>q;
zmrK=Co>UiC;hl^H$Fxo}FqM8g`f$5=hU#9}pyjvPe+m2leZ0Bv@bw$~@m3!{emfoh
z`{#wowax#}uQ_-<^P>EZx$5m=duHxw`Mvyp$>P&{x5Qg(oGyHLy(#JTpOYaDr{DJb
zzgIdbWd1$tNcUpj^54tm3T;#Ul%e;@q0;xeYfFWw!o1h@8ShL36=o_=RC8MFbjwSt
zL)fM0;-qceZu!4MTrXaaV?Q!6SNw=((e^^_gH5JKi*lGw*3Wsf`D*8vTb~6t8`mDG
zIqts4ZGK`3`>n1@3vtZ@eOBw&uVH;DTwVVC-`@>KvVZPuV~wl*@%V4z_QM7yduo3y
zdHLa1@8PLi`5rgbe81SX@woOT)>(T0rKi{4etP-v!|+}ER~^{S{OI`fdBQ^bYhM3!
z{P?)KzmjkI`&qa4Ts${hVuh#z>(gtWT=pghX0c>=y8dM9tWLMDsTEx0?)p{r-!v<^
zpVO>%)zALYVzptvf4qv<BFJdv$tl-ML8Fz^*Zxmi?Gn-~$@L*e-cm@^{o`%j&copm
zy|=C3B=0XscYOUaXvIgbb<@7?*cEuF@#zQC%oURl2?&O4x>Bsq=$Nn2(YTcFTT0L@
z<|#{>rcIH2cHaELn!{!tE47kNF<#CS+T3?(y7yNV@4)cK+>t>AjWfevet(iK!*Y42
z$;uCH)zf8`H_mkF?YqLn|E%XI^V3I>XMRjlu4_BmT)RVE^Rq@(kWrhPBKzdiqFUJ+
z?D7th$2?95-d;YrNHblmyFIi!Jy^*0)uTrBofUE=$85K1v2es$Om}!<TsP_XoaGaQ
zD*JDh1Wc)pI$ZlVZ@-n~_pg3$*pJn^zr8uj@tkgDw1eH<bA6WLA7#x=Z?Apldt`fQ
z-xjAD?{?9>A|K~I+i=UNM)!-5_mizs*AsVrpIJ4%g12?;zG<_b?T%tmo>A4r7Jrd%
z*OId@)AtJXELeT`#MvpYo@y<h>YaY^cvQ_L$GUe9-fdG@v}YpAmH@{91J6h77t|b*
zgjidro5jSX|4bJY^mlTa;;1@z!-d$)Ku^JM9;#D<R3=QZDGsrcoocAI@$}^L<<fIM
zZhtgqmWIly(|P~1CJE^4HZ@N0e{|`ikCg3}aNlS9UhX>?{O9_*uGGp4d6SsipCvG!
zF@L#mLG{1>S$4Yo|IW!23gkZE)ZccAZxNqOqw!&fSs6V?a}U2i9dtA8+egOr&bAly
z`nx}txX*q6Z2cx{CfnoP3j&k!ekaX8I`N#HoU(i2iGQ~wUAG>ewXBxqM8B<)?I)|Z
zGh(F`6*%>o9-h)JxMT3>!ZL0@uR|wmm6e}4&S+jyu{JR^_5Gpejh9=uo(-LL*Ya;|
z>Z{r3I7RHl=h!_wd$jIH4gZ6!6ZgLS@$$%nPM6w%D{UDqSBx?yb(ouMIx*Ea>`LIH
zqc2V~ruRD;+eP-w(|6<7*#7JGrq^XMyEEJL{3NV&+x)r~=8Hc1w`E)0rZo>gSH1Lm
z@F>TBd+YfhhjX6`w@qDi_vgQwl`C)iy6$Axj}YjoaNn_1FKQ-ty@4CAmfy+dT{fZb
zLmk5=e39XuxiM4UgeAT6_7cGz3fHS2J8o<_)Lhh<_4yNXXgKfB5|bsh_1|sl|E~Xk
zPH@ussMxe)@2@WHZV>XcIOV}~YEEK;X_L!Lk0m{^F;kxGT;*Nh$I!)@)#7_iXmQgf
z!**|ur=7<8*X)`j&hIsk{n}igOcUjcMTIS|6na!$RA(j`9T4JudGqDD#qI&${#ZZ0
zv(^9l{ncW>+QRQ^Rkfd)*sLFtw`bc;yS$*)Uwy-^l0J05Te@zw?PA}yT@PPQdf;oN
zvhR`n!`=S`%ie9%%4M=jSlYc|^2fYuceVYVr3G(&t7BV!dDf+0PgAV7-?_H!Yp1p8
zS-!HRlQzAMm-o5msp2ua>9X8W9o~@4vmG9dl@Cq1&&6K6u{0y+>c?B2Qy%6suJJ3{
zZ5Fh&W?z2E*WS4%lK(cXHP7=9$zTqOs7+wXs$^=mVchq1UeqjxeE#PSM-9)&L^LMP
za7($CBx+j7BOIEw_n*;e$*ae#D;d))R#vo~jrL8L<tJ8taKg29$zpEL`=9XGtg3Rk
z^Z1yl&8(FM#*%!AK^NHT{>%uNufMLkZ~fe&#;8Mw6cQP)slPo|w8~ZB0Mk{jgW`*r
z*i0CoA9P98vs3;a6R4dWB*}H8;{4v=jE8QoMO=@Zn#7}+w=k?F?X%{JF0sEGN(^gu
zO4yxWwRAtfz3AcPXFpu!Je+>?L!#);d)n%ExlWx`*XNpY+G~Pw$Dg0M4>vFWy#C?m
zJ27krK5gSxee(UZ-SpiPqIbsHw-yHpZ!TJp-_?1JEoULeXT^PCR~@ZyDejiudOv#V
z%zlkN{)fjapK&j|w>9ts!+}#*-tsKHu(s-R=g}(5w=BYELX=deesbK~<n{AKoVV(+
zF4cq6wwyEy^XqC5-IBN|Qj}+#RYZVqzC_7Z%cH9vJ80;3K0Rh-&}VVpbn7wU)hxIE
zD0XzmJ_#>=^)B3Cxm5Jibd%*$-S1b<3|2q(?#;|#%ZhY^<vQD2Sam<dd(K^WPrCow
z)TM#m?~govX|n#=m8)}pJ$yDLQ$POf%Iev{ev5epB&K^V(sVTuRoZz%X)zy@s`&5l
z`Kv8covuuAmt*Qbsj_NuphNGaSxzFE#pnNI`JIjDE`FsSUi>P{&o;JLOU297p=|XI
z7pBWG-iOze-!T-La_8*24=d6?$my~D$`ER;dR+&a8>%|gtaK=F8*^a#F^B&)8`YMx
z+drQ5`gP5l*{#vXGG^Z{nHc9MuOF~=a+Y8Io^8G}ROA#lR2;punlF9J)EQ5@W~!9)
z?m2EgBmYw(ry8$+jEAJ;sjdV~{w}7^3o7oMU%R1x#dhCi1)>_^jYXmw{yq!t2#Bf}
zsw{{pxTGpR$KkcNy4RHAjL0?f{>>NC4w-Pm=h>#X&+8``PFk^TfmQHM-wPLh`yZRK
zI{T#3Zj*@>A4{h;C|2j)oYBA-cXmQP)0WBn9=g9~Jk;Zn7j$!GEMI8!qH&7luOf%o
zsaLAcao(8ny;<`3rk~2E9HtzIfBb!Y{ewOCYX8aHPvp1%k>TEGwxoH+?&>oPa(?`M
zovNowgx2@(+FyNoZ`F=cl{sIYNG#tGe}HG(mSYBOzPv1_p9XF%t*%z)5X`v7;l9@?
zVvVJ$%SROfGvy$@SFL|Psn)HF;qJey%IU+h?qc2b9am&RdtN?KQ0Eg-DcpQ%>Ew>P
zmuG#A7B9Uw;kbN=*8^r>OG)nzN7mCjJ}J4+y`3;Q>GJ|H?n!>!mvpWti{CTf6<eWb
zQt^25+^g45=fuo@bi1T3@7&`nYg`R$9~}=%a=-6AJu&{(n@OfKCR>>WSKYexw*8u=
zLz_^H{S0H1qP7$s7dtLz4U3blY*L<G2XYs!{_#0IR6T#)t0#(APtNquTRB<&_?b42
zRVyCMYfI_ij9PHxv)0BG)#)eKJX;Voi$nV4>>|DV+Jyc2(em8FNvBU_UC@bV@Gp%>
zi4JG4jC-bXPybM_b-}|KhEqjt3vb8z{oJj8cH{Zme=2KcI`+@s&3@-fMeEr$g(6{>
zc9%-GN&me2iub|Wu<ODKZ_^e>=T@0dy?1l#>f4vD-Y!YZR!%tXcEC@OFIw61w&KsI
z)xRyjN*#I=;<4l4y&W1M1}e`2%x5m@pU1VlQ#dAS@3aL=W_N|`w_HB=d99tz9-;qV
z-$tKWx_<xElL-|wdD_0u{L}qMCARGU9ftD`Gn&td7MQZ9NtA0DXs=bC!!|MH!Se6k
zi;mrSJ>9NjzxZ4c@KABy+2svWoON=X)WnTDCC)pjFBa(vea&OJH(kT>n`fKX>IITq
z%bGHZy;6-ipSVqV@n~8vcgf5R>vwMc6~$SeViNnTGTe15=f0fpfkEd*l)|QDvKD8u
z{<-{OS!;E+ExWJr!vjjeYRC52G>OiNklo5>cSJ+B^wXmm0{0Sk=aybc&6eRRpR=g@
z*PRLW0m8EUA2L<+Zcf{g;;S=BcB6-%;I`;M=ify&YhM<dT>N;(h&T3yS?so;({K74
z<~hmiax2>9{Ap|0`AaV1D_)3(My8dwPTsWpTclfbp@Vqc@2KnRo|Qk%zISK#iAAS9
z<ARq=`7}paVd9+E-kMoW+~=d*Vq9Hzi=+k5_;N{!S!(W%Cx=v@a0DC^cyNy6iTESQ
z@afNQ{SdW$BDnn1Rn6j)sauYDP3v)td9e3FmxgEWg+_&fuis~Q7fvXAxaFmi_V0d=
zicpLGD~(h0j;bvSnYQizX{C%6X9dn*e}8k%!;RI+i4!(Pg+4!T7|b~()pP#L?Z+;B
zvpnLOcKo8mpGB{J1lGkBwX`M6DOn!k*>rK2Yw4w*#oIQ?@LZQOJk5C0&?<NubCr|t
zin9u*ZT-FnS*>GIDBql**k~{>yYW!>@s<bQ4=$2jZv6YQ=D)Xxf2Vpi=ou8HeSBN|
zclGu)h86KF%M(9tQn@H|t<>%AQV-JzrodSoOpZ-%uLHRCSx<3$n;%xF&f*aH@b{Db
zi<vsRdY|Yp?=tR9+w|da%ERdsTDPVsrsghanjdyp+4im0cOJbhQ(M>%Pc^&GI7KjZ
z0+Xqqg_lABca*`)Ee@7G3Y`_Mar}$J-!tziTXjlwk{ZhcMpfQG%lTcZhYbCTwh3r8
zE&TRrj(_;vU(KajH!rVzv&XCRdFIiYX$O1`v(`3+i4;#fzVGYh8CRJZbxngEmR^xb
z<z;+1p?T}okeE3KKTi+tPMDJ#_~S|8#@QJX-7Z%Cyy{jG=jUyXI&!|$=g0D9P1D(-
zo|%&qrxhJ*exRr&-87wX&hwX#c1_*CDDCz~O`9oS|69E4DmA=PdFxZ0%Z6#jQ)2s$
zrR=#Hqb)!8y2-~mK|f9@)m#0r%#@q@)MPqqK%;=0Yl&O1o<u-W(YJ@E`{%|TJTLlZ
z4r85P(zPd%OjE4q-AtJg=H=qN)6g$VS0*N>@NdzB<4mD}lNPL8<f$yV@~M({3G)Hg
zCGnDfJk~DiaB0o3FtX>JX0#!Od#Rvd*Xhq2;!STi?>hbc?9#xLBTF<DPHh*Gw6T=l
zxk*nzYVE<DSH;u)_P*M_`tYCQmS_AQm-;CQhh=-VgiU(BU_niYYAR>jvO7nAZmhTb
zDzW!cW6`9|Y!$*z1s<;aI}fCvO0}E6xvC~)`pzPuTsH>Sr6*cX%n_4OoWrZ5>GbHS
zX4Cv#d3zP|(iht6>)Y+&@V5-B+aY9c8Pq!I`d!IIM|LDDTIB|BF=AcFTHs~s+jQ#p
zn~s>NZ#hqiv2}zk+jt{UDZ|%Ifm<qF_XwMz{>S8ryBb4H(pCs{PnNKB?$^uUab2U4
zUA3_=*!k(hXRK2Lqk}dde-q3kYUq0)^4NzpuZxAVkAL!5`EH`u=aP+2L-gY&7-x07
zv)mfQx*$F-w#$I?K)}put+~aDZbw~u?6g+T=*bX||N6W0*W7@G8l88fIVJ|2jO=k?
zk+)HF$_u+(dFfZJqRq`IN6(sg-kG)V3g;uX#3+yRXM1#CZ(pO6y{FVtCdBgo^=YN{
z$FfqVGv_{VpUTX}Q#vQ(`Nh8NcZ9_v*Y#v=F`N@zKmWx_b$0uA6Z;$1@BcQde?djU
z%$bk<{R=KF+cRg`#|!f;e;J;1EbnW}m3j0_V7b>#*X#Z^7fMfM=PfGgVc>AiXgI-q
z@g7G9lZjMw%-!P-JC$zmvh1FvyLmF(;rqQU9nnP`QjGz2_sy$JlwYLX^V$0Gl$okV
zevs`cspb67A35agU2a*gFZR>Yb>{ks${zZBuGe2$vCGWYF6ZaG^~9^rukJy~uF2w+
z+?Hz-|G6-l@PgW|8*56vPFc$Dvpe|Ll==Nl-f6QVnC~q*bH3AgLUG->RJNN(xsN@W
zW4Zo$RNc8_J6`oqxbvaLM4&fDNVa#@la5~#4yeuAvGiY&;K$Po3pA%D2<~Z4urxlI
znYT6dl7!^MX-VR(t2I|L-ac;>HTBD>lQ!w6a?}-K_dZQI)iKRz!!G{P9#y05ibn7H
zzC2HgeZN1aJk8<a)$K8Y?|V{AzE@vW_|&blY8QjP{_Y;BTuakiD#v6lJAX(m@;xEV
zdD!{K#u@p++XG*o`59z=KD$|C-jdn=F|%SOuTj5##%SGwpnHP(D_K&nT1H%A+ZA(S
zaXTB=EeCDY1Xr;w$?a<&75f(X21$ik2|Sm%b>WJ`l(<E*XL}~us4R~N*&lM?#?=kG
zq{4(<s+8KU+V8X5mZ-Yt`=lEzx11I^sV)?>^qeeVs(9>l_V+m6)vFUrP1nq8PE^&&
zNSLyC$%X|s{y`5fEz<NbIQDaOV(F?xSLUk|t;8ma_gp+Mql`f%U!eN&+TBuN;fG&k
zMc8s4_R8#Y3uSuh6m;bii($aRUT-hM$M1^GK2}PEE$!UQ`*J(a>T8EqMpd{lFXy_l
za+~@8#nJb7D!f(FNT2Au%Cv^-hSkSp?}$^UXPfC?4Qx9dX!do_G%-#6&&3O+<_niR
zY!L6YPujb4(v>YfS5k{!OpXlr*>N`bc-jsAy|s?T6>a|a1Sg(vcs<2wL8sPIj<0QA
zdMkb`?Q@B}{%YdZU7NY$W2Zl?ou(+E=)m@tqx{~fCo{PAbx-KJCtW%}wc@MEoX43O
zZ~v`rYLA}RcI}P+y!w*W^&9F`X8k_wexTp=!QxDw@-3&j*T)tfsf>$U*fqPUE$Q(x
z(cKHImmiqDGSz1BmpG-XTLpG=););onCi_?<a_v}>H)t3&Iv1J9x0s=y!C29PB6<h
z;nTC;_qumYeZ-$2cd++qSH|JR;civu=WKFwJG<!NN#`K(_NKo@=h#Hn+|rf{?4QWd
z<Q*WVvd~YR`(SHq`r*qer;Vl+xwCIMIAwWO<I@Azd|nsJ#RzJ@Zk&EIaHHLi%Q>H%
zf+s|__N<l8sqMLUX1mOZMPGdSw#dDh$-Ixd%E|luwzkD*j23WMryrMGvg>&YAL9+)
z?SG@K^DcB3>i<}w-4`*%N2lc6BEO{2wnB|d5gBtIJMMflX~CVCI~y-r+&;LymhqUh
zoYM6}>d!i^oKgI6<)DVT>UOt^s;%AY$}aATHE~>Yl*9bIbDZyz$v!GqE>4l|FyVL@
zX}2hKk@v-5uULcY8rN5MmY7bA`uib$wukg3f#<cqOMWc9cBwZ|XQjr@Qy)JlEoHf*
zvZ&|z9HH8uo-^am*)Xl<ZIZu|mhgdD_zKrK)~PLqCmGj0yLi=RRn-1j?)zs{rp$cI
z=c=Quc-=Xuui>j<)@y|#!Ln0+_GO)$<%3SSeviE{`@v4T&Fjn;OMms+wkJn6Pv!Jw
zbr+*oQ!6}cRlF}o?M@FVu#7skORfE;%5gW@*LU~L7S2ctJCU>P<eqC!B3q;9MWppi
z=HC9KVgk>uUHh$%S!_3Va#x-B&d=+8@70)!$EM6LmtHbC_4m-1bg{si%Un(B`iXJ{
zo_A+|mCv3!FIf52bf2W^t`$2M?0LGVxmWtRO5o-=qjxLnmy4R3M{Rtu!}MI{Lz@64
z$){>sy29+LkGr?dTAf_^YqzW71G{JD$D7OI`jxb=Y`Itb(t6hVef#d#$=o`Aeb!5j
z3+5rtT9aKJLo+O_vyMh&%-FBxtn3@gYjK_Hn(e$Z8nNf(kJjCdzc*87(Haw*SrxPY
zmkFO+erfOF&$gds`F+n`j<&CHYk2ub<xAWe*Q#CSy7NEjE}g*J_Gfvb+r3XorCqA*
z_N?lQuf<e}idx9^3aYfsnd=tC{p(EB+shrlR^3T9ePzr(S#~-1{+AaQvap|uR8`1I
zDyj`iU)y_8lGDk}^P1L{^6n))#j<-kX5PN?#ZxYMcix=opJKj$aOG+DzqZ77YT)nB
z?6Iw{CuRH3S2X#s(E3X0GnvMXp1&XX8fg~KPIBWa5X@O%xju%sbKa_)>d$LZZ_o7q
zSGnnIhFq)R6-{qnAFov&lFGAYr*v*yb@2Z3&$rk%^Td3AW_M>%m+<_*GaH*+fBcy!
z`*d1jVf-20!=I-Yde{9hx_ISz$+_xu=Uvw}?^Hc(6mekF<5>Y3icSIZG}le;)?xFT
zFegT9>6%@0qOYl3p1nVI<`Ye$PL{bgCq<Vna=o*Jr`)NzBS`VMz^u4G+X{F#AIv+j
zQ=(qM`PrvG@`klmw%Zrhe*gG*`F7{4A8hnwcupHEQ9sP9tW@BpXmz~z@i|u28P}#%
zG0#!|btvk6b<O40s3)5qdF<I&Z*$$g{`1%OM{O&kt7p8dS$HKisrc2g^w8rA(ri8k
zZ!z_|^=FZ%XF#F#MeWCnEic}63BPw~YP#1G(PFNxb=&vX{#KU?{?V&&P{y+}TXWaR
zkRxn~vLEBJ*4lbCieJ6eyf|6T<n4@Oe*K<h)0O2io7bLGZnH_+CSjQC?!$k#czRDn
zaqeDawzX#!Gz5(*HZ&wJJLIi@h^t%VX7hYr$&N)+7TsBXgmY3$;1K~Q$)l{oOFukm
znYwAC->Lb>RX;TEycOu%>9j9RYzm_R%kh~er}NlcQkx}SnD1_%X?Y?ssv=u4#NL0i
z>T^a<l?!{^EqFb)FblQ6+c|T3$;FpHulH>^svH0B`Mb-1oWpw6FR@hK-SK2oX=8BD
zGQBS6ltOi$M~=&vh^fl{$}kEHOkCpo>_-y^bGCA8n$m`Si)EQjS{kMa#D3w@E{Xr1
zVcEQ#@51IMlTxl|oLgI#aW8Yr)0OUtVh*1I_zE5c#-9JOC+zh6<#T?9oNvA&YkMZC
zWtHs0Q?XZ$h6Hc2y1r}9>l*&3SLOeIOo%=E`Tend`+v`~|93t9|EK$wUIiA6UED8A
z!ai`WSs=5eXc~K7E!VWy6J~78=oN|#%8Gbzs;@K6;(p|#rw->L->`b0;f*;Y@nBEq
zEU(2ZzL(UMguQm_JX?DG#DCG`4HG#%Y?CZ|*FEad+-@|}?as;klo>}Ie626=ls8V9
z!?=1*<CpNSz8!s^r-<8MYF=q&<NDjdwlwxyOP=wrS-WJOEcq=Wc-djbiA3id!{jw{
z4X35|h#F7Z{^>ef)3eoj`C9G_Lhc6JRuq5nxVhg@`EcX)&xf8iu4cZ@9(Pyofx-<(
z1&KM&T_?!QQxW@o=yv79$~YHG{hHdi3RC@^A0J8IvbelD^xW<mqy22I9sH*@?D0S5
z!x86V@+j8NeDe8#@IO{3p6I3I_x7fK{hXm4V5%Qrx>5Mk_omF$(_4(nLqeH$*Y8rg
zcuHucYi^)R_Eg)%G`1(nopbJ#=`QzMzpKrD!k?IhcHMTlo32ecxJT{b7A1?wbQh~q
zf#*{D4>xV}I34k1!r~`gd|gxd<{j5LRd{aFg+{gIjE-}@O;h<}+Mb;8!QXL5=dWeE
zudr_pzvOGj`BF{m<udJ;W{X`W&fHMDUgFMu_477{PD@<&I_P9;s;;;p<E>`FnK3PR
zua?@8+9O9S48>1%e*Bo+<aEb5;KgZ{*0{)aeq--T%*H(e9XiKqmV_HP*Cu2{S8my`
z?)7K?nE7eNwTq5LTBx6&SJg7ZC_~dh=-~>N2HD&arseb8<y-%#im%w2(>UuY>o0}N
zDLMwHYD#8Vxfb0$qM|F_G<m`f5B~#sQ?kEz2+f|g$1d9I<i*e`t)&*cR^r+2fy+`%
z^fWkof+aUAY~I>xd!x5k{i)6FLa7t2X^+3ucy9k4+^D`jdCDCZ;gU<9T={do)HwNq
z9Nk+d-;y%(Hd@)HTKX$_@_`fk4t}0DXA9^2m1o_BQp@9Bp1=3`esJ6^k9MVy=yd{7
zGHmhYO<{trEf3~Azoqh_P3_^7$#a^8cl_v^e4*;MY2D9R=aWlz`^<m$>3#gWH@~G>
z*^aI~Yc1krsMn!>Wro9|<u(oz(oN%Zwj5PfH^2C$;Kuw8H>>2@jytSsyp9<YBsw)}
z8;(A>vGZ?C&aM~#vMh6N^=0cFFEPJ6t7)HcmY|8lrIx0yrYBtGK1Gs?xm;Z9<apoy
z-+A!pMDti57Znj@;gio~PA51N>zY3I7hwHrzSY3PmQzCIdfp{oxmgQab@D7%lxF{U
zUUYg&pM=Koqc54B>mHe6=P!RmM9Is@-SlFN>)E{*8#P6fRL%%~{$P+lujh2Zy)S<Z
z7pUvASEcIfJJ!73YjbYmWb@^bh3S>WXHxIY$(>LYFSj^sfehchhD)9-&s1Auwl_<k
zkMLQ<+jq3SU94M!;ZI=)qs6wn_wRPjUsjp@c=qk$m)!wL`*`L&d%E)0;!`H`wO{P%
zk~UX}{k6lZG^vdxtVN=XQT4Duef+}H2CK}B=Fcntw%l*czOws!`~U5c+je?Z-a56c
z2hN8Y{**u8^1ooA@0APZDy}-+FA(iJ*EZqP+bYH_o$l${m8>`7%>Jh8)oz<TSMHqc
zZ0Ch_im|7!7{o+bdo^tNBeeffQr&Kw!-ge^yB5wqojCt>!KoUimwpc>>}xs18<nhQ
zc(8YqV9RA2kEtBz+vf}OckPi#In^!j_j!lzziCzXJRfK8uhrgQbB0k*<3_do|HNOO
z)2<&~_?fd-d)?~8D`xIqJmK>DCHWk!QR}vAclc%aWlgL0;q8{1?(}3H+ZMJpwyTe?
z_<Bn2;<n?v_RRBryX?4Rj!yNSs!K@^-t2XfP|ZG5eOowrL*$byGTR<xn4Q$zaaSRE
zky(Ja;A-hK(WNeI>8dQN_VOItz4=7Ptk3UR#WzgrS+z&+^VeBDmUI6cJ92-i<IIJu
zXJ<II9NEdMGrhL|jzZa{zP64usVMR1C6UwjteCc^Yr^Us2X$sny%d@!`)uDi7ekdr
zH}u?<R{s>)9?cc9<^*@(T$@|hFD~Lb8O`}~wnfj}Rc~&-y;jpIqu6v!%h|5`j+atn
z)iU0InR^7Euf5_vMOXR9snbo*6I_m6O#0f!eSQrm$1ItpKF%WVKJD?{!fklRP4%xO
zN2QV0!_SOu?GCD07Mm)Rv?6z}-@l>B>x!9H;Pgd8W-6+u>dQ?&vT0=&HC@rQN!qrU
zY3ht;|AaqF^~x@JE|;J4`s;+;fK8?QHnONzU5qc{4{-7=U;BUe@#fc;GiSYDwRGCb
zm8K2_yP6NqetA)KYu<`2Dz6oe@<;_KxGXxOaj^1BPql%6gvXyRMvHttT<zo*xuv2q
zeNC~}bE|1bg4}`%?ntmbn6z(Cg2VEYr*2vNd~^AUqT*cr-4@;l($>UHtIhE5Iv=_H
ziQk`JHl@wXGOQI(XK8v&Oy0M9*{6%Ghj#Cqb6EBL{yVb|PrcoC|G8z2<u(iXZ*OfJ
zm#5FvI;ZsHjJ9^<vJD>>ooPKYGnmiWN-{!CCwiTXUFAZt$Yp6}n{*;qnS7p@c{0f9
z#3T#hS*(xN_WgPE$AA9g>1xa&^Y>>Ie2w^TH)T$+=**cyyG%71cDcE~n`!at2#arw
z#nHW&dpwsqXw3~~RCkV<(pI@Znsb)XiCK3dV%K*+o*(MA%ral{?z_@R{*<(v-{W8P
zIL&YSEEjy$^(c$W`=Sk9Ut)|n*gmRE?hAIwI`8pqU6z+bjnL2cecSF|n35ajc`54@
zds$fzUoX>-7tj7F?{vMzH|g`G7?X4In>(w_CIwBI;l4H2RP@P8ms28DYl`1_CT2d-
zob+IEzgB+L?iD3TH=ibHhVI|d6!kTDqoQs6bp5p8$hDh(Dm{<?SaUyPs#=l5_t{e!
z7asd&ko?=wS7pjA&+zBsw`C^B)-Lt0ule~r!oI&O)6a9}!jCLdw=KK%Y4vp@lWBWT
z|CT9^wJvjt-CcOxP<?UC>g@2x+!8v13eiW_FtSa!{+ffCOFKoyc%~rRa?z=hdiNE(
zQz|bsmjA4<)Hnb6t9I_5(96Eg+b1?(in=q;?{iYPMtMr_v()hFzem41Uide)=}Yvi
z^~=NWN%#gT7ONM|HSph~bmz#Cj7wTx`TF0i|J2+#?0uNi%UPM3`<i5aj7X!adP8dd
zJF#ySd*Z~cKdJ`%{x`e%X~N}S%@wN47ykXf*XF9ZOMZ^YMaefag)_=O&E0hScKC8T
z%{KK)`I{ehc^s>L;u(8NHfF{B=aZMN-ubKT2{ZGDLyXl)JWp3_b*K<+DKQNA6Y1(M
zyO(MGe8CFe=CI?5*FChqu2_)m5Egtq%Vx)oH%7tROOm%7t?&KdC8#7Lv6M;N%;1pj
zg(JmGmbo7fJzcqX{fAfSjp3$EGY_dqlyH7OU34_|+U1|G=Sc1K-E4bZP;L)rKg(XW
z>YcAO)1R)H$$0F`<uV)Ha!wmL>F(Z+)eCCG8%$q5(6imIp`p*hH0RN4pUQgyb$ZXv
zq@Vh1tYOb`pXXwdG(*mkJuQcMnfTgwh&ML#Mj7R$UTE>qUD6S_wA;4DUVhJ{L!M`C
zO7+rJ7We#aiJD!lxF~hjAIT4^rp&Kh_4?(3@87ld2haam_0Q^g{d&_=Wl!%I+6YUp
z+fm6b-1~a{x+S-t_Q*A#smNPbP<pkswA*RN*)FYLH?QrJJrd5A*fZ_4UiZp{-jb!B
z3+`xYt}yUwI=OYNs<`5hCo&s9?%ch5Rn5lqd>+Q!ylnHf2U8?wp51=vTK4UQufzfz
zc~`t>Sn<MaNt0SfCTnn_w(B9et0Bu9#TpkqYf}69%;?gIoL`S-32y7%&Jh&On(h)<
z;3lh`c6pKd&24K}ZF_p>+wK1Mhder1mrYH7zu?-uIce-$<*(H$y*OfJuIv0_)%SZ9
zYLk-roJx*(E^-w(<-*9xQ^)ar<LP<YKT_w4UjN_vws*tTmkGI=lOFxtck!xunb4a5
z+-Z+{UBCVP_VCx#Wo@-<+G=wWQn#`Gj^O=$gXx<gi+{OsZRp!9;j@>GRqoa;lDz&Q
z#aL%&#>$R`*NQtE_jUE!9F9N!>_^_RYY&p-K3@5IPS)b5$Ip*fl7cyB$NXJ(^y%3v
zTa(u@?pc{te(J`&vx2g!t0oEFk$HQcH;Lo53)8fe0vm6R%x2GX){GAh88_|kVmVzb
z#pAt`>tcXv&4wo9M<3O9?cAJMRB&&C$HLd8p%YtWxUAj%|316@H!YeW;_FP-<A=NM
zbFaOfuB?;#%4gB7+n4`V&VI$^znRyX*{4P0es*`2+ac}jqSZ=0%NJjqX2~bU8grpV
z->aeK^~UU(OQd|lTeDw;_&+@5qy9AL#I-L+q^(`rCY|VhrNt9w6)F=N_4Vtv|L?+X
zeJn{1QtK>Umc4VM-?6Z~>soK-+&Hr5rn9%5OX1NkH7cw-Tf}?XC-sQtoJ`L>7xH;m
ztaH!lI~%MH3Ort9awO{K{xy?>jjlhakVxTsJ;PfhZRrGd!`V~K`&gY!PdUz(Q8~Jp
z&+2(`(WIvw$-lK{hFII(5%$%(-0)zr-3n9Vti#+_-(5T$RmpNgv!CIK%kQPV3Rljq
z_{96O<!VCmi+{K8w!b`b_0WQq{wXg-m+!KRlPFytvodb}{H0sBRIInEUcT_I^$o=(
zIs5c^94q@2D;5QAEsl5*vUru1Yl*Pa6dfy9lY(2JTwCMVR<TYt+?Ce<$wu&FPVTB;
zojJO*vl1WJ%&HBJk6<y}lyraJX7O_dMhmtW_en`E{rvy--nsvOySe2qa#B6*kX|;Y
z<`;|T3l{E@?^_eN^>)iPyj;D?=HH#3tM=AxB8%64yY0wxbGc&iWzA5>M60CR{H2*3
zGg}o^zI<#m4mn_$u)jUFIm+jG^S@m;gCj*Rn`d|!o?>3AXthPZDbb?j;NBpq#sw44
zA77+&Zn?t2>c=WiGn_Jyx|q!4PS6V2pBnhp?eY|RrP(1%^XH41+VchH-fq6}&O-m<
zzcVG`2Y&FaD9=<A+rO*-;eUlS#|=w&C0v!6C4Ya<E%V?f|L0Eo%b9jy;yd59^Ag2m
zayNBwuKwn@;ILD2RZotO*q>>|z2bW;ejk=TVX*&2$JSYASuOJPd={UK*0&COc_^nL
z{I>MTy}nh?{65_@TNzdI()VH3>fB3f9rgd@zD@p~e9KooCe^Qe(UOD%($6hE_jt0r
z6nm?+eC6~*Pel%9uofMT&v_<Q5&8Ud<$dAebBDbr3q`S9u$s>0!L?{noW_Jps(p*f
zc0a87u!-}e)M>4|dT|yaOgnO&F5aJ_7`SZ4-I_RsqXITwf0pD5-IMUv>DN)`x_<0U
zY0uQmZF0Mk4^<@TIz|Of7MW_qVvrE@MKH;$I=FHDr2gxM>oP-5aV`@nTp%p?py!kg
z^To(*UK@j&XZ-roSowEB?9!)dZ+oY8DA)E(;t(vH#M`JKbTQD8uj+Glt?jJ4FRJ7I
z$qF6fzp+)3@$x%~_^HLgPG2q^z4&}{RF3I<yO?!~vl6z1wN<fBd*qXuCK<}IaZ>Q_
z)8bO@*CT=-mnlv;9dzDSZYHM#`}Ng&N-V$R<HAoY)Ox^_8oE5^#@Q(v3(s+OUiy~K
zJ~j9q_X<zhLm!+iotK17*iu}5?$@WL%vsHoKbbr{71pP8g6CxM={=7F1*Sf>Rbo{Y
zd&+lu=~}PE8?RR?zEzIYn{n`O$?hwO9*@$v^e-ePhpltJl$iTD`TEyIA*Q)vt(uaX
zSw)K4D<k*E-F))Q&3fzqg-`getYzgo7rC#?K}f`+|Hz&_@g6siTbG>Uv7h3$-)Zue
zA6?sAFNR<F|J+z#d}`0az~v8Se7;j{;1}?E3yW{_=YzXrTQygiB!@rSYxJH!Ev_rz
zz_C5C2`1Agy1e4x)aZ7-m!-1%%<0v0?!i<n-@~FVn5_J5Sw>&$3XX{^MU#X#@kzTa
z|FT8a?%9Rc`}fxg^oj8wyy#qY{`jL8%YJHVzA)_5do(B9BI<47mKl2l5A&D&c=*+f
zTR4W}Xn2K5-@ED3;zz#~{y+TMSL_^L>!S5@;tpNh^dw_-^OeSEt)8hW(=8s}ytZ^s
zCcDqtTRVi^>(>{>=NG&`a83C0xwKOc&dt#=J=HEBmw#JzO<#!~@3z|Mf#T7H_f?Hj
z?JMS}UNVdS^y8n<MQiUC-4^Cro1MQFc)NUAmbi1O(Vv22X{T7dU8dN5k`|T_4b&7h
zJv3D!>4V(bUvql3+0K5M=lOow(x7(jnDEo3TW!u?b=q1qi{rJ9ucDf^W7RB{i*c13
z4!v7DEt%)&w&^FYb?p{ckjg${C!~-yOMmU;+7A7)AL0r80uwb;HhelZH9dXT=ZdGA
zvVm+uPo94D_+!0pX{E6zkNuSH?uWm$_I=X(m-kCcpV8&1MqW@`qGhGF$H7J6LJ#e(
zo{3t%S-#rz`sa=p`{l1Noy*^>QOhAF`^`YU+jaIc@8ab7u21E<^`>~AT*T}$zrU9^
zaovZi+3Km1M<+e~ot*fMagqP)_LC3Wuiv)OT%{1OOfT_bQ1ty5ONwN*Gn>@>ZXICt
zo+TvSeAX<}%Jqm`;+o#SZ<Uxm_J6)}JZaT!EwkBYXY0>A`MQ=ZZVvA&FH0WVmHZpz
zZ@#K4ekXYJQhxBd?bD3q4;h=xO{r74aoHsP-KF=3=h>bYxc!;OcFW3N8#bhOgv>LL
zG(XJ0etTh`p7TsW!C0nht@9I3Rqk8+`HaQk)PTSM?jt8=n6q@=yc=Njv@Iz5UFA!*
zsGM{EZXL8fy5!F0laWSO4q7krKKnrZ?$z8lv0dz5?JsI>?6S+QTIG@)nY8KaVm0Yc
zZtp#|Jl$2dXrfWJP_A2^w$NIuw->xj6qi5d-TE=)ozwF_L9N;W0WqJChL=rq+0A&|
zQ^b(v=@LiVw;C$x848~4k`*`Z7P&<hhzf=a7K#d<k8;Uar!4p*WJ1@bBU6*lsp#&C
z$)8Z>{6(d!d3DE*u8!3m71xxUj=V??F_J8h;{CUx=Ru70`dlx&L+9#Z?{EKk<I9GH
z2jcA0HyU33S{<;_aLca=NzS<)z3nF#l&reZpksE!GU@P}&fcTX{-`D;pW*-Qk+e9o
zF6R4}6*n4eH*OT4uU*x@Y{sKvcX2n#`L|DTu9$oz_t^7$Dyg{)PMy=bjwm#+`OWR=
zWaIE!pBL^Y^r%`g(batE!H9qo5w_xz{Pz;GOl4&c)q1mM#@Vq7KVKR$@4Sxe68{ey
zE=BD7oalP)#w+G78G+YI%WW@w{=4YNgymgx>@t~bou3$NRWADB?BdjWv{>Hr$(FOz
zjgrHkbnNxe*eK4a`g^U3rJK`TkC`1CJ6-i#E=nn}=Q~;_FS^+IW?pc?<Sh}rSv$CT
zRv*~G)uXO&kT)kS>{9~I^n02UtmJQe3ajv%Gqo$OYD%VHPKoX5l4sX~Yo~D*sohIx
zR%|ntmApD-*$K%9(-U6A9Xadh+r81xZSMI;an5hgb8d}qyAYfF_Iz*A3V+LqB72`r
zQ?gj7IY0cFN<-?opB+NA%U@JYZ+mxYZ}_{v!aJ{Xq$N%ASuC=wW6RtnVltCsBA19p
zmp%<=cRn$-aXrtUbfW@smX}JWqW<g;wDjk{?8YI#B(db{oqs>7V%fT4cYZ&$*M3g*
zTJElb+@=eif{v3u^l3b{5WV7YeqG=Te(BbIDG#zGe(mImX<g|4UQu$jZt5%zSw}ZL
zrXNd~7`M(_`&_DRpLAQ@A;sm{GQTVfU)-yH+sl4*uBwXxpNZfJ)gu)O6W>{N9MiNv
z6nWj^%W3halRKQ_mzC{iTQq;C#%qTX&Ww^<3${#{#I0`8*(W5)Y>}vP+u3gSPv!Z=
z6Hb_Jdm|HB-mAOYU|Wvj>wi-oY?4mybbGO+)%(b838h30Nuj`NA7qy7Q&%k7cXPGM
z4zH%wDiv&#64cL_>|7%H(XDv?0rx+T8dfdYyL8g#uXEOfhG@ntJre2_v-HU4X+jwv
zo7MbO&o@82Wu2>W`Iv;#nvFHzFJzy~uAeFxE?GEL@O-oz$I6wZZOfiWtjN$zzLt56
zMO7f^fqv1!8QYE=kErOny)y3l>_<V4mzGsLSg5uC%GE^=+gC;8Tz}IzH;U`c_D2`j
zW%x%rxqr!D(Pez~e0XduXxt;HU)y@O`KiLrRZ`RczCHc_PHooiol$RA>W5wXYr8v1
zGPjF+E9+?u+uZ^MzH^reeE6_sYpU+EU;n1*mF)J3lq<Yye|LYvZmm+$*;OmN{lmlm
zOnSOy?{A^~|8DdBotEp~{rWD;E&cd+|2{H?U(}o&A!c^_@t&`dIo@%)T-~OrXP+1d
zTB}}}l{r!Svc_}Ku<!>*yv^?jxQkqLYYbx1F%@bGR?1qsxN(E7;;yHAH&s+0{P0Z6
zXWgMET0Zmo4R%h9(N=U75NL2;x57A1@X@FIi?2=3KfTTW?X~>;x7Krfen0e9cf6-$
z@jK?d^t1zcLQL#0^j?|A#vA>7b3IR9_8!j*Pg#yAmHoG)BKF8QDKBHo)SZ!$|43od
z{N6cirn>*$zP$F{cH+h-Co*(O(;73ppXQoPO;6gr^r45pVajFI_3u<~h_u|F8nLH#
zb3}6Vr5SqHuIm`(=jSg;Ib*DvtPmKb*wf$QF2<qkV=zH~!s^G*H*wr?3^z&R?fiUX
zmG{fjrzUhZ@9WqUD($_9>0ZEP6Y>5Ke)o$WEtj3Lg>^24EIlEtydsEk$A>wG_1!Nn
zG*Ml9s%@5EMz6c?hdPaEh7*3toQ(0UURP~(;`m90S!<)YmW%H-=@z|lWzUf~|3r<Q
z(|2)Bk$Qb@;X>`c>G?9}+nx%?-aS1bzJ@`51<N#@?K;yX9>%Q}QJFl^@Ko53);BXQ
z?wocz{rAy*|M#Cup84)z-Jxo0;s0fCWll)?Y`*Cg-#xM2BS^@}NO;jUN9p#6%YpBL
zjhKEsP1gOR{_XRDh#z4wGg2Ep)AozxY`y$SgsUKWyK3D1jJbP0UUFG|VOpQcldNE=
zhnxDP-saq0@a%Ya{n5(xtAAMsM_9}C_8qXiKE<`|7(Yiq<AN>Aj-7H1>-V2;|L?K!
zr$hVi@Bb@hzkmPXpS|(Fgv*lUi^VN3EuQ=1T<25HNB{QU-TRtbwqMw<T|QJd{NppX
zCI9Tsy{%7q_jh^i_pfIk+3x!IB1|XoSvcSI$gk)0!fF<k=`Ht;6blM7IMn><*6$hq
zjG9T7p^QNrBsE?nJ<RK!UF!Vg>yF>@N5Ac;)O%QcX-BoEP22A9#bKYhcdy=36<?Nr
zKKWf%#ATZ_wMAFd7P@rYh`SV{_`;XPf-7B#Cs*uO;IxRcpPrjr7Fu3a)0@3u(PuBm
z3oWyrgcxLqs{DSm{hITvqpsV}#7{k4$>%lu@vP}b_nZG;`$~TDM!!di0^a6)IVCn0
z0a4X@lL8NM$Vx7l<~l<xF6Dlveh2%xmuXokcAa~Ef+iR@KY0ApsWalpvIyDvvRoT`
zT0^_G{kpeLGmho)&l0UX^{Ujp0Z*>XbUGHj>shGt^VH4$Ywy3!zyGiE5byqpx1}2#
zc&8qVm=>{a`vKhutyq;w(vMGcN8Vmhw7oL>jPtR1hUfd_ZWdTRnrK!j{_5(P{7uOx
z(vEDAHMA``A8V47RiVVT;<V}}8D?&$>Vt}&1_w`zifK-EvJ*FoFnN1%%5hQMV5i9!
zmTOE|YF5FLrq&@GcIudwX1(0>1N_gj(&u=b(h}5++O<=_LTb0*o@*NWDlYte@ak-U
zrH}Xj*A}z#=88k+85JuIPt;>mxy9J&{Qb@u?_Dpx{8_ETfA!V9V2l3?0_^8`2rpso
z%GT=Wy0)>U;A)DWxR&JfEha~%mCRTcaJ^+l<jy~q^S3Rp-TQW?z%J#bkpWIyr<~}R
zHm&;1io)w23%!G$RI@Fgt@V9NFL*1$pY{9yJ>9?gV@~e==WW4NMoUBVbdT*w;w)Kb
z-^1mX**wABh|lMDS5VFpu9cpu>TT;iOd}g7S6*CSzT`nu$THQbC(|+_cd&i^DYbIK
zr&aqnMXQ!MepI%dvFh-G-Ji35Fa`cSC$Q47{99YN{pv*Hsb^Qu?99>Je6%R-ZBbgK
zrEy@`gTU3yjDex@YnDl=^d+2H-LAb<$;4gd0Dp{3g{^*!-%Q(6^NUyMmkDslJ*yPd
zc>3Y_(LEo^;wt8e2cF}OpD!MF);n*{k2Z$VDpS2T=T2Go#$SB!En{PgNT^T7%v&i-
zm-e{5Kd?CRv&fIoE9Q5X%AE`6(Vow8xT`C%^yr4oiv(t--u|9ed9|@AIQ<?==9UXx
zuCI3bU5m)>eK<?y`qI7o&i$Eh{yDAq8SlA2_upB6WhtG!B`i|bhJBst@{2{sCBB~#
z5~`~!)w}*q^Y7i60o%E~PF_4<JvFG~39nL>iO<T-ipP&KsH!P`2ozEHcHsGvZCS^s
zT0Q&{^!LdYrl&joXC;QM*rlt{d)iMw&1IYMq`9nHKAcqch?*@B`ssZMxBha^@|8=(
z=2*|zu-*Ki(!4ZArA6LiN-9}f7clyMn7~r>tk5euf49TB_lvoI>iz%slrQnF@0Dx9
zGdZGEtcpaZK6h!4;WJou;BVzxab^3{=L1YHmK7G*s4%QzUgy}Aw&hs;R4>Ep##3%F
zZhv#9Pj8RruKiKxj4mxZarpYT>~ER(Ikc_5`yTmuvC+$mbvuWs#r8uxGtSLk{J&Va
zMeq`bylD9$7w@U+94;Lun$I#etFLJKH9Jan$-EZ6N!jKv-6YRCxrl9-xf0B9K{chV
zC}xh{ls8U6FF%{Oi)iG`SgiDNkG%p*s)Nj}DIM#5Hl=6xUF=UdcTFZKN;%!m^0!cW
zvgUfxKQnc%O~|`G;au*_BHoKvD-EB%{P1%g*S}{EJ{KRqD_eGsoA<}g{%5l;9ged3
z?rEtPUKg!%a88DU&b6%9*VAsUKU=Xg?CGzlr=oFFR-2sWu6p+J(X_)mIhd|{?O$~B
z=9%fK2R6JoUt`p6SYFh4{!DweZ1}1O1Nr=!{prshtA74i`Yc)Wd#d#=F^SKswdF7U
zxF=Y#IO|GWQ_-wlDvJ`8IK4EdPx3gb^61s?gW?}1TFG@d{>|3#c9?oaNiE+YBR#yo
z{OfxQ#dk%53O_3fryt*5eZ0QdBud<TQ{mwax7W5wT5z4<%ei4C-}2+{WBYzK!E1tj
z+245$TTcHtFSB!#;Qy8Sz5k!w-TF^|j;z&<a~4|`Ht*q+O*zbFeY-ALc=F*eC5K2!
z##_f!4fgXerB*vG=s3U1?$SfulHL8jAB^wzuq-W66%n~#@crrQ<L5U@H>j81d2^w?
z%IbV48|$R?rS<s-W+w1nyrkH+%xi;0=@y=*E&<M4yv<W81sDC7*|_t5(0S|3n&;c|
zH$SmHu*bbqW7l^^`DOD{Dr04=&Y#}?XqQ!w08hQ{65W^5PKy0P#_D?mZXWlmnQ~Ii
zv#2IxiP*>bAc1qQ44LL^a^LcHqu%=T{mz#k_h?PGm0J<N`P+e;w|ingn?}3M1<knq
zIU4mXVe%ZU;?3bHKJ!?&OjT;=xv21@hjCKzw1CVSpLaS&UCh6$53;UNU97eKbj@D1
z#pmqT`u~ZQno!6W%YBM%{*sia$ujoLD-0ADe!VZNX|ekBt|zWrpM<vb9pz0sxkmC_
z-ub;Y`p@F8E&L0fYV+Vue19kX_rd?0lY47rW9KqO6h$n2b93dXd3W>9PG|CFRu8i9
zKQNo)nD;r0=9WjS_5UJMPItWjwCO>gX49kSs#klHk7TZ{bh?m|(dE`HZt>(>&#BH8
zE%HaM@p^2qbMc?o<Mr&t4R%M>Rp|_+=u>XjVqgD%_u?UM$e~&9w_N?P=GqT~7f)sX
zTy6<G%%#;RG<C+af1&|QyB9oZ>_2y9`ZWj6Ooz_6k{NfHrvzLEY2EnnSI?|xyR%M)
z&VRCynQOVV!Je55Uzwce71b+}{iImY(a9m^<6*LkBV!xq1^)=YKVOoP`c|s#J#yj(
zgZOlhYg(t~JUgT5CV0TDz`>Sz@;gKM6=xomY`Rq<=<gb0ZaYOZ`&jV3Vu2Sf)Ab7e
z7f3L<?_b*{d#>0tr{GK{`|pe;Mt|>Ca461a)0ks_+B16I@v5EXncAQu%qE-3ZJJQ{
z%71%g$*;f;B`ZVmjnUTJiphd$@iKKk%5FYv58YSD_p^E77vD*NOBWlRtL9g%=rx<T
zXGZ?64gcPMyL`s7*6Xm+_9h#Vmt5Ulbyx5B9B1C=d;G)x(&Hbd?{Q{Jzn1H_^y1w5
z2~8On!k&F?aGUhmkHam8;W=}}q16Y^N(TNG3Ua;AmwM^h%EcwS7cY77;>?U#ufyS~
zUCgHEGR|eJnCxX3q1ZGfCVSc5KrL0b6^<WfoG=zzxtdFWE#CRx?!`yVMHEc#d#+}X
zztL%ErN!m3c=qpb1>U=@CQDu|dU=0i@rxa0Z)W(~B!@ld$-K~$^*d`@={XVB74eHX
z8bvN<JaZ^@s%@^nxZ|Uv>$^`Y-Ad*6)lOQKe)Z{<x$^J-i<#c_OUhlKYfv4!ParFm
zomqfw)5mGMlCtKWDX-XMV`U*?JA2<IBViLR+u6ac)ka5ZjDj4_KP)<TLI0R__uo1D
zAEo=}b#GH=dg5YTs@|R4pcOA$etn^beoc(#I?dyEj&yxH8#1GMS@FJEfxnH4V}75L
zj#_qgpZdX%(@f0{Rx}58P5!FvcG1}F;nz;nb8U;VH*q~Yd)sN#e1krRtv7DY+`ck&
zyZzF9f3=^!mpTpHVvS;=867>Ggan**m$NlhUGi`?IBYV@WnPwV^M^S`{bhk?IuG&k
z=g4N-6u5WS-hU<X{6~K6yHCpJ_BzfDJy#QcV&UwH$J+82zb(AbzjLBYOpwy-wb7b$
z#RMxi+swDAJ<3+8>{`@wS|O##?$0-^(@pt1Hr`14uU)q;g=cE?T<v#_y>G6VRxn2`
z+OD$X`=#hPB?^tkEQLy3=X$oE+wfrhi?``6`Ii^Wu8}!iyymlG*w+<1av9Qtk7ot!
zyuo1%nv=VKw7!=?H@fuXf;DFiXSPg8SiC{2QZhp1*4^XFt64MZr5vP_KKt|qX=y7M
zMqQnpXnfPrl-K`C+sqIB4U5<|N0r-}J~ipwn3g+FUCqBCbPe+orF6TRlnB$N<&n{=
z*F?K8x)#UyK2(2D{D?<yR$Kb9XP@26tX5i{3^Yr2xwvY#$8pQQiPtY{-Bgr*t)3Fp
z{q)l=$FEBlhs`ToUvNuC<M>XlTUxJ}g#D%GM>>|6+|gv}^kOvf$d?Fy5E69lrF`@G
zXIcAqZZp=swWvTtyY_rrK<v_|k2l@DxAcj6Lddg8w-}RZ9<?so<Q{)_>6vn`)lE+f
zPEWFG486GV(pS^(I^tE1nt^)j=j4>Wa1Q6ts?u9oc<?lb-3|?zg<4Y5D--V>N$;Dl
z^|$!jxARWSTW{MJm<XliYjbRiyUiE6{Q^f;h6{U+%l3nUCKtW5UvNYhrZ(-i>wdFE
zB3h?&7pIM1z}+`Y57z$PJ<WK*?Pt*@D{_DR_*wsH!tR`6v%3C&xoLM5yYiO56_Yr*
zEjM(l?(=Q;>uSW^f^<Htw5eXbrSEvgHm~1_chw{O)_lHf6t&K;yWL82hQ_Wxe>B7w
ziQ2HP4DM)Td%DiTENw^o^<Vop?7hF$tL~c4^G`qbT@01HlpD!kfAyGjy2!4I9sky4
zIk1~9XlA@{P;5c7)P;jg7aH~E%x>=Qev&kAZ++0C<2TC>L_W24U<ea)b}=~iW%cgL
zP0uz3^_bqhv18@JlNH6bOSYw?vM-r^<>s2hW%qaWFHbMl^gs7R?Ha=#y*mr$p3eXD
zprBM{J^%5@B8}fn>&=Dl_w9Pt?Dc`M|LsSeBilpnMeyDE;8EfCUTvlS$-uWO+LvsZ
zZrOf8_}GSXSt36~7EL-+d6rqcvGv7_!v`15iafrdR_zN@%q!=InZcWnZn_(|tuHZg
z>6L_;G9^jxk3GEjw{o`HzqN6N4NT`&{bAe7l^!0(*L2}({O(srCyT_YT|B>{JkIZa
zmCdiLZ5w`H`54e+61^w&-;v5Cyh^K1aHvXN*H+xVSHo}VpZ{-Tz5DN&3GMs7{zNW+
zb>hY!Hg6OSY#JI9`io6}oROMsaj>V{+`it^wtG_4UE9mTH~Mmt?*wIQc&+($LaQ!x
z>&uI=|Mo{b)4zXsX5b8`y1Wtv{hY3iQ+@qEl=?o{bJEFs%C%KI9z1We{s;FT-=p5Y
zA*23!oKvv$w(uL?M|=;4F{xzyeEh%k`k6<@(~6b|w`Xaap36`yd*GBad(x&^lZx`*
zO-a%C9OfX(^-L?Z+fa0q*Nh3q?|#Ieny||<@q1<Xy&R9X)}OcaEH{3)=c!rk-Bl5i
z)^pF+wuv1(|NNcZ<7ZO2GoBXR`=%J$9Gm!SvH$$#44bD4US?Y`lXv-!opU;?)$O<4
zl$*b`b<3{x`zn_wy!?H?a$;8D9;1I(bdTMi+IGcH=fc*u5Mh;)NfJsbQ%rBq@SYYu
zb@Jy0i%x2OKEv<)%4_p8nXWZ!W|<pj-O>+ZarHC%zdQ9G?>5H8&knlYUa(2_jn71b
z@E@O^9+|Y`qFKh<OTWJI#KlZ>t&%@yb#&3GcN4-i#a4IDJTKJ#x8~oEAM4I-s<nNh
zWj8%?-j&$<_P1{(tbF+N?W)AX+WWIAxZY1aJYkDNOytt6M5oocKd0TD{?~tF&FAGg
zb1$df@czHJZ9yQHYEX}jfo6}${cWnMP9+O=o<1nKSj6B=3|EKG?M*CaZ%>=@PTOwM
zUwQAyMW3IY-?ie4PVnrK-u1f=-JWowgQY$`Q6}cay(_PHj~zOyc9h5dh|ks7qg6(4
zZ*0E#?rGWS-(gzo%M6ZpyB)dmcc#Ur)ZS}zCy9w!Y;>)bT+*^<)`~_OzWMU)?@v73
zryI5Uiteuui7!o8U&u`lo3FaY?)Ii%TnB_(-xb*ete?5Z;?C^p`@B|6Kd&ve^@SfR
z*OaapcUA_^W3zT2zpYWp5ck0UU%|dd$+MqltaxRy)I6|jahF-+*=z0}JjH!j6{n^-
zWeAo@tqYvO?RRZg)RT(CiiV#LH`U$~xiLG)@%mqLk%XDkB_<o5=w^}NQBYdIDsXT2
z-abWNg|hd3t`h<#ADNvHA?X_XcuVoOruGEy<wwJgXLR1H{Pmvy{{5}19eyTmmEi1V
zY!cE+&97xUEV22HwC?FYP0_V`XWW0(zpCf%qs28EvA^f$-JDnHw(HZ?60^H%+hYH>
zXb4L^uJH1bdUyKLS+R>-Q~zDD>O6bNWr^;-4+gzA56g!cWR$P6K4c&~+j8U2f+m~t
zxv?5&x@VuVyl23)=lh0FE3Z9yVX)*&_bj0fD}j%!%!c7iZx^}F;c0MGd)=g^kyLtO
z6HjB3z=XH2S1)t8<j<O{^na@uPv5NeuO^I1i+{aHnziDh@8M@$D?UvWFur|us@_F8
z%QY(nPMR=Y-gok7=AxZn=3Qo)5qdJn?(~(U4J=dd?EP7)c{eretxQ|axk$4)3!-#i
z-Md_~;-1$oSAK&d9a4X0_DZ&{mHa9+V<PXFg0KKpR&k|p)>oAmZhB`=)%`H5spW3w
zrjvWhJiaU5jh|hjy>jsi*QVIW#o8CP3av<t5mB~&@x(lQx^Ur|*)NxMUCpwns~4X*
zJ-ox_%EkFJzBP61$#9*w{m#Z&eEl7N&ZzFz_;hw@xoBl|^NG{86Q5fv>HjhmzC2^0
zl%LLu4b!B2^VL4>W%4qsKH4VCy<bAodSRT>r!BXaZ(@5ECZ1_ND}Ax;WY6N4$v=;q
z%-W;<sotcr`+UcDgObT5=T9GvJDC_%BygB>SIiN%1&vyk%l-G<+i_HT%CRuPm-g58
zdMD|8z7~<zYZ|}v&Md9oopG6Gq&0c3U)Sb+)OX3`_A>3ImAXdvLo-wI3s0PUG{Iud
z0+H;08ktviRCHc4S(eY#?=++5mYVt&?Qc61k8W!D6t24LdylTYrvGlm>KEr1+SiNz
z{V2D9r&WJea)e3bsYRCO(i;}2%n04-xXNDq$rHiz+UG1~?+AXFm09s&S=e#bkIS51
z`>vI?G09udJ>`$f*LPXYkJj#4x#7#QcWYPO=xZpSRdj8_i|M*k#YEgTFSh@<uaSAl
zSC5~w*REoFJFDwWU-!N=;al7G$X7HraJ#bZx#OeFd(&<GX(O-B80LyoYqyrO{dvY>
zc#F5*=GD}T1#xZRW_R0oUR$z>mnRp@{%}w6$Mh2)b_(3(l?=;QJ^YDHvdvb~tlH>~
zG?T?nzKQ(m_sokWgsv+-ntk#^LZ`o!YJ!F1a-Oi1xkU@&l@9MRY}?#<?qmQ@%O}Q=
zNf)OFZ}r#}6!-Q?M%~*s#ghqlr*JOImcOB}^U_%tyL;7wE3f9sU9<lja!x*NnU{Fs
z(YzZrEUuvinz`XW)@Z5m*{z-xH}}UH0r8g>8ih;WeJXsl`O)>?YkoxkT=Rq1PW#U1
z$WGh&S6BN!`@L@Iuc>qAgp~#HsEa+ES91Tks-5=LA8Wd1$`yY(u<48C29+u2#P+r%
z>=b_R-DcCYcjj9{<r~+_hOFk@xqgm<;nkHn7oJRgV6yF(1N+mdzUMADatK}hmnE`y
zfs-(^)#lYd+4}z*9Sf~5aO{uf5K3cz91weKhu0pdV7{53CboRpqS@ZX>T)+Pv{Uk+
zMd7-PzfzB9dB5*0oIA5z_1M|fhk1J@Ydg<QnDgp+)zSJKU$di{t5z^^J-HCjV=dWy
zGv&j<Xb;Pin@mDe<@|lr!=8PKZMopvd!Jc}ufsy&(eCDs$<N$gF0foAYUDkcfv4bv
zY4?VQx97BK-dIy?skCzMHQD|D=LIHf#Z-h}k%-!>p7p}_%8Meq3%U-m6Ix`1^4_~;
z+!9?8ICFZ1@aIeK79KlwcT1yGgy;(Q-dTTI7qn#sE^hAp8F1~deUsFmN2~Ac`Lb>W
zqxpiid(OR6uX+Y9z8+(m`7U9<#*!5axp$pW%n9sBVHUo#$oo{<QC=tAvx<h5(&m4+
zsc1|UbFl8_Oy=DyD3rGGt!;VDt#z%94_voruV%a0qFb`NOpo*D*@8XCUHrbg&f0j@
zT8Z~&tGdT!=7UNOQ&?UoabDP}?>NiqpxN)Q;uG1v@?GlCt`IZ5;N0VBar(GqX3FW!
z6ZRC^luW(Pap}bCO0iFCE5shL&1=2$IC90r^ukTIW@QAs@h*DD$fetoa8q=T$AM4t
zHX81#IKGW<i^YXU4&Cqhb^SUHx*t<;J6v+<fvG|Ny(Uw~hCcnLtJZ7qut)x7ikutT
zZ}?nrQ+c5F%OZhm4h#=EZ*LJdbqJcWCA2%s=JLVMe}yae{Z35s-f7>l&-GpN6vy2>
zN=cV4MJ`vpvLTA&%*F*}Pw$y+?c)DvcjWhK;ruTh8Y(Rry2V|Q>ozkT+j34vdi&$^
z(iyMcO!(k@Xnz{#bT{?<kRr*wA9Q9-SzD@>vaH16#*(%1dtcZ~w0ut!Sa<R$d+P_L
zR)f%ap@vg-eCYhxvmmMULxhidoVJp@$f4<6AH6kOvK8$tTEs0{j21hq`!r^!2P{px
zvw6YA1wH4|_lxUU^}bSVw6tj1JWo#Mkglz*N6U1NmIbeKf|p51%Wi5}5qoxG__Qz?
z<J){SbKgAl^uAV^yDwenfTQd!bw-&h3&SmM$9u^}ExaGQ!&&|L>6mjy&!djcn84b6
zqH>x{FW-ajJnL3{_~p>V%*m(ngKxqEneGoQZPIfi51hy~aZ1;n;k9DN#%ouf^ooCK
zWVAPUbfAM-d0%voMdfS>{!1AjQhy%UYARRCqUn5g6UWQ;bx(dORlc1Oy!VD<veqyD
zC)%It<ffn8TEE2i%9_)UHm<C_V*0z|dfLu<_qwg#{=So4Pygfdz4!6k_u1?6Vz1Y4
zoS3z5SMm9jS<`(NRepc>^Zxw0__AW-{>u67`+rv!8`VXqJdS_%h<(S-b)mn@#7ft;
z-7o7C6VF~Bzh~>eb<c}FTu;xdvQYVD7oV}#_siX|;Ou>z*$a)|UH&}%{=A^;9}mb~
z-LyQ-u<hN?pO??i?@p{cYjJ7I-|9o#Z6}=m^KSK)pWRFTW=V9<Wn%1}7$~j0GEFsm
zHRJpx4(BI*bQ90$NJuhMXt^Y1*p~6MvgO5<YUj%8gdYVBCmGe)XVm;oDB5(4Wpc<t
zrg;WZ&vtUlNNg87opdC(RiWn3n|*(tpZptiujlulJBr7TZ#q<!WzP1Zs3z#2dtC9!
z>4v{9d|j~5<onXwUfRb_O{o1hQPlW}`t?Oe?AuzuTzM3v@%!z)D4t}q++Y9Cr@wq3
zAO7BEU0dMwzlMp`>6~k_Z0F~$;ydtj8rwh9%4g?<q<`7j{R%ku_~Bu%z2_J|?yC9S
zGmW2LU2%)P^6aTo4<)CWX{4Q6buqbvuk^=4kK(FDQ+eflKTj+CI4M^$`tKw2o|4C3
zF7A18*DQBUytcmh7X8qv<*VL*_mY%Ye!=s&&U7D(*?S-MwX0+q73Ti0T3@n8VIGI*
zj+hUVf>@R)@SS;j_+i_phl`t=SKQrHQ!&f((AL?!iW2Txwc*?kx{Oq7`h;HOhiyG~
zdriyr2PK~lN-c{OS&-!y-x!#iDVse<eC^HOQ|7(?^Qi9c?cShEqE0W4?=Y7<eSZ0^
zfSq^078PxqYG>D~KAZRYB@X2ZH~A@3c$^|jt;F}1t*^L|IOo*dE+)I6ysm1s<g$HB
zJ)2g2Z``JOe}2>Ub?+W($?xUW*izWGc~-IIXQ`OY5t9EogJl;!ln=i9cE_96YYH=_
zo{8k<WICKPX<h2RMM0}e&%F2F|MySGk%#;D*Zr9^ukLS1n}uzCjhFrRhy2O*8^eOM
z^iwVW%{5=KMtte-=gZ@Ny^4Lj!@2QcRnT_j^QW(Jv;57Jd9?q!>4W`u^yBT;<XvI^
zBovYD+I+Tr?ZNP;Oc(EM`~K5!{a!o%j;^3vg_*LCB`$bK26x@;UbFVJW`UY=;GJUr
z{=3Cp-yVjR2feeYk*%t{dieVtabv4>v)#>~oZR?(-uCZnL~j2)xKR6In0(AtE)PYE
q(~FzWh<si-Dg8pE_?-3)7yhhfNxAzqKi=UV|El@lC%CIJGXMb8uLscp

literal 0
HcmV?d00001

diff --git a/extract.sh b/extract.sh
new file mode 100755
index 0000000..163a995
--- /dev/null
+++ b/extract.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+echo "why3 extract --recursive --modular -D ocaml64 -D ocaml64_bv.drv *.mlw -o ../../ocaml/extract -L ."
+why3 extract --recursive --modular -D ocaml64 -D ocaml64_bv.drv *.mlw -o ../../ocaml/extract -L .
diff --git a/imp.mlw b/imp.mlw
new file mode 100644
index 0000000..8f72e11
--- /dev/null
+++ b/imp.mlw
@@ -0,0 +1,88 @@
+theory Imp
+
+  use state.State
+  use bool.Bool
+  use int.Int
+  use bv_op.BV_OP
+
+  (* ************************ SYNTAX ************************ *)
+  type aexpr =
+    | Anum int
+    | Avar id
+    | Aadd aexpr aexpr 
+    | Asub aexpr aexpr
+    | Aaddu aexpr aexpr
+
+  type bexpr =
+    | Btrue
+    | Bfalse
+    | Bnot bexpr
+    | Beq aexpr aexpr
+    | Ble aexpr aexpr
+    | Band bexpr bexpr
+    
+  type com =
+    | Cskip
+    | Cassign id aexpr
+    | Cseq com com
+    | Cif bexpr com com
+    | Cwhile bexpr com
+
+
+  (* ************************  SEMANTICS ************************ *)
+  function aeval  (st:state) (e:aexpr) : int =
+    match e with
+      | Anum n      -> n
+      | Avar x      -> st[x]
+      | Aadd e1 e2  -> aeval st e1 + aeval st e2
+      | Asub e1 e2  -> aeval st e1 - aeval st e2
+      | Aaddu e1 e2 -> bv_add (aeval st e1) (aeval st e2)
+    end
+
+  function beval (st:state) (b:bexpr) : bool =
+    match b with
+      | Btrue      -> true
+      | Bfalse     -> false
+      | Bnot b'    -> notb (beval st b')
+      | Beq a1 a2  -> aeval st a1 = aeval st a2
+      | Ble a1 a2  -> aeval st a1 <= aeval st a2  
+      | Band b1 b2 -> andb (beval st b1) (beval st b2)
+      
+    end
+
+  inductive ceval state com state =
+    (* skip *)
+    | E_Skip : forall m. ceval m Cskip m
+
+    (* assignement *)
+    | E_Ass  : forall m a x. ceval m (Cassign x a) m[x <- aeval m a]
+
+    (* sequence *)
+    | E_Seq : forall cmd1 cmd2 m0 m1 m2.
+        ceval m0 cmd1 m1 -> ceval m1 cmd2 m2 -> ceval m0 (Cseq cmd1 cmd2) m2
+
+    (* if then else *)
+    | E_IfTrue : forall m0 m1 cond cmd1 cmd2. beval m0 cond ->
+        ceval m0 cmd1 m1 -> ceval m0 (Cif cond cmd1 cmd2) m1
+
+    | E_IfFalse : forall m0 m1 cond cmd1 cmd2. not beval m0 cond ->
+        ceval m0 cmd2 m1 -> ceval m0 (Cif cond cmd1 cmd2) m1
+
+    (* while *)
+    | E_WhileEnd : forall cond m body. not beval m cond ->
+        ceval m (Cwhile cond body) m
+
+    | E_WhileLoop : forall mi mj mf cond body. beval mi cond ->
+        ceval mi body mj -> ceval mj (Cwhile cond body) mf ->
+          ceval mi (Cwhile cond body) mf
+
+
+  (* Determinstic semantics *)
+  lemma ceval_deterministic_aux : forall c mi mf1. ceval mi c mf1 ->
+      forall mf2. ([@inversion] ceval mi c mf2) -> mf1 = mf2
+
+  lemma ceval_deterministic : forall c mi mf1 mf2.
+      ceval mi c mf1 ->  ceval mi c mf2 -> mf1 = mf2
+
+end
+
diff --git a/imp/why3session.xml b/imp/why3session.xml
new file mode 100644
index 0000000..64bd48c
--- /dev/null
+++ b/imp/why3session.xml
@@ -0,0 +1,2149 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!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="2.2.0" timelimit="10" steplimit="0" memlimit="1000"/>
+<prover id="1" name="Alt-Ergo" version="2.0.0" timelimit="5" steplimit="0" memlimit="2000"/>
+<prover id="2" name="Z3" version="4.7.1" alternative="counterexamples" timelimit="5" steplimit="0" memlimit="2000"/>
+<prover id="3" name="Eprover" version="2.0" timelimit="10" steplimit="0" memlimit="1000"/>
+<prover id="4" name="CVC4" version="1.6" alternative="counterexamples" timelimit="10" steplimit="0" memlimit="2000"/>
+<file name="../state.mlw" proved="true">
+<theory name="State" proved="true">
+ <goal name="VC get" expl="VC for get" proved="true">
+ <proof prover="1"><result status="valid" time="0.00" steps="1"/></proof>
+ </goal>
+ <goal name="VC set" expl="VC for set" proved="true">
+ <proof prover="1"><result status="valid" time="0.00" steps="1"/></proof>
+ </goal>
+ <goal name="VC mixfix []" expl="VC for mixfix []" proved="true">
+ <proof prover="1"><result status="valid" time="0.00" steps="1"/></proof>
+ </goal>
+ <goal name="VC mixfix [&lt;-]" expl="VC for mixfix [<-]" proved="true">
+ <proof prover="1"><result status="valid" time="0.00" steps="1"/></proof>
+ </goal>
+ <goal name="VC const" expl="VC for const" proved="true">
+ <proof prover="1" timelimit="10"><result status="valid" time="0.00" steps="2"/></proof>
+ </goal>
+</theory>
+<theory name="Reg" proved="true">
+ <goal name="VC read" expl="VC for read" proved="true">
+ <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.00" steps="0"/></proof>
+ </goal>
+ <goal name="VC write" expl="VC for write" proved="true">
+ <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.00" steps="0"/></proof>
+ </goal>
+ <goal name="VC const" expl="VC for const" proved="true">
+ <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.00" steps="2"/></proof>
+ </goal>
+</theory>
+</file>
+<file name="../specs.mlw" proved="true">
+<theory name="VM_instr_spec" proved="true">
+ <goal name="VC ifunf" expl="VC for ifunf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC ifunf.0" expl="precondition" proved="true">
+  <proof prover="3" timelimit="5"><result status="valid" time="0.25"/></proof>
+  </goal>
+  <goal name="VC ifunf.1" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.02" steps="152"/></proof>
+  </goal>
+  <goal name="VC ifunf.2" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.02" steps="152"/></proof>
+  </goal>
+  <goal name="VC ifunf.3" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.02" steps="152"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC iimmf" expl="VC for iimmf" proved="true">
+ <transf name="split_vc" proved="true" >
+  <goal name="VC iimmf.0" expl="precondition" proved="true">
+  <proof prover="2"><result status="valid" time="0.13"/></proof>
+  </goal>
+  <goal name="VC iimmf.1" expl="precondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.10" steps="451"/></proof>
+  </goal>
+  <goal name="VC iimmf.2" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.06" steps="162"/></proof>
+  </goal>
+  <goal name="VC iimmf.3" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.06" steps="162"/></proof>
+  </goal>
+  <goal name="VC iimmf.4" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.07" steps="390"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC iloadf" expl="VC for iloadf" proved="true">
+ <transf name="split_vc" proved="true" >
+  <goal name="VC iloadf.0" expl="precondition" proved="true">
+  <proof prover="2" timelimit="10" memlimit="1000"><result status="valid" time="0.10"/></proof>
+  </goal>
+  <goal name="VC iloadf.1" expl="precondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.22" steps="451"/></proof>
+  </goal>
+  <goal name="VC iloadf.2" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.04" steps="162"/></proof>
+  </goal>
+  <goal name="VC iloadf.3" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.05" steps="162"/></proof>
+  </goal>
+  <goal name="VC iloadf.4" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.09" steps="390"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC istoref" expl="VC for istoref" proved="true">
+ <transf name="split_vc" proved="true" >
+  <goal name="VC istoref.0" expl="precondition" proved="true">
+  <proof prover="4"><result status="valid" time="0.25"/></proof>
+  </goal>
+  <goal name="VC istoref.1" expl="precondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.11" steps="451"/></proof>
+  </goal>
+  <goal name="VC istoref.2" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.05" steps="162"/></proof>
+  </goal>
+  <goal name="VC istoref.3" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.04" steps="162"/></proof>
+  </goal>
+  <goal name="VC istoref.4" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.09" steps="390"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC ipushf" expl="VC for ipushf" proved="true">
+ <transf name="split_vc" proved="true" >
+  <goal name="VC ipushf.0" expl="precondition" proved="true">
+  <proof prover="4"><result status="valid" time="0.27"/></proof>
+  </goal>
+  <goal name="VC ipushf.1" expl="precondition" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="0.11" steps="449"/></proof>
+  </goal>
+  <goal name="VC ipushf.2" expl="postcondition" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="0.11" steps="162"/></proof>
+  </goal>
+  <goal name="VC ipushf.3" expl="postcondition" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="0.09" steps="162"/></proof>
+  </goal>
+  <goal name="VC ipushf.4" expl="postcondition" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="0.09" steps="390"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC ipopf" expl="VC for ipopf" proved="true">
+ <transf name="split_vc" proved="true" >
+  <goal name="VC ipopf.0" expl="precondition" proved="true">
+  <proof prover="4"><result status="valid" time="0.29"/></proof>
+  </goal>
+  <goal name="VC ipopf.1" expl="precondition" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="0.13" steps="518"/></proof>
+  </goal>
+  <goal name="VC ipopf.2" expl="postcondition" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="0.07" steps="162"/></proof>
+  </goal>
+  <goal name="VC ipopf.3" expl="postcondition" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="0.09" steps="162"/></proof>
+  </goal>
+  <goal name="VC ipopf.4" expl="postcondition" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="0.09" steps="390"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC iaddrf" expl="VC for iaddrf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC iaddrf.0" expl="precondition" proved="true">
+  <transf name="compute_specified" proved="true" >
+   <goal name="VC iaddrf.0.0" expl="precondition" proved="true">
+   <transf name="introduce_premises" proved="true" >
+    <goal name="VC iaddrf.0.0.0" expl="precondition" proved="true">
+    <proof prover="2" timelimit="10" memlimit="1000"><result status="valid" time="0.39"/></proof>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC iaddrf.1" expl="precondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.12" steps="453"/></proof>
+  </goal>
+  <goal name="VC iaddrf.2" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.05" steps="162"/></proof>
+  </goal>
+  <goal name="VC iaddrf.3" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.06" steps="162"/></proof>
+  </goal>
+  <goal name="VC iaddrf.4" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.10" steps="390"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC iaddurf" expl="VC for iaddurf" proved="true">
+ <transf name="split_vc" proved="true" >
+  <goal name="VC iaddurf.0" expl="precondition" proved="true">
+  <proof prover="4" memlimit="1000"><result status="valid" time="0.28"/></proof>
+  </goal>
+  <goal name="VC iaddurf.1" expl="precondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.10" steps="453"/></proof>
+  </goal>
+  <goal name="VC iaddurf.2" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.05" steps="162"/></proof>
+  </goal>
+  <goal name="VC iaddurf.3" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.06" steps="162"/></proof>
+  </goal>
+  <goal name="VC iaddurf.4" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.10" steps="390"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC isubrf" expl="VC for isubrf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC isubrf.0" expl="precondition" proved="true">
+  <transf name="compute_specified" proved="true" >
+   <goal name="VC isubrf.0.0" expl="precondition" proved="true">
+   <transf name="introduce_premises" proved="true" >
+    <goal name="VC isubrf.0.0.0" expl="precondition" proved="true">
+    <proof prover="2" timelimit="10" memlimit="1000"><result status="valid" time="0.55"/></proof>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC isubrf.1" expl="precondition" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="0.11" steps="453"/></proof>
+  </goal>
+  <goal name="VC isubrf.2" expl="postcondition" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="0.11" steps="162"/></proof>
+  </goal>
+  <goal name="VC isubrf.3" expl="postcondition" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="0.09" steps="162"/></proof>
+  </goal>
+  <goal name="VC isubrf.4" expl="postcondition" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="0.09" steps="390"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC ibeqrf" expl="VC for ibeqrf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC ibeqrf.0" expl="precondition" proved="true">
+  <proof prover="4"><result status="valid" time="0.33"/></proof>
+  </goal>
+  <goal name="VC ibeqrf.1" expl="precondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.25" steps="475"/></proof>
+  </goal>
+  <goal name="VC ibeqrf.2" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.05" steps="162"/></proof>
+  </goal>
+  <goal name="VC ibeqrf.3" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.06" steps="162"/></proof>
+  </goal>
+  <goal name="VC ibeqrf.4" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.10" steps="390"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC ibnerf" expl="VC for ibnerf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC ibnerf.0" expl="precondition" proved="true">
+  <proof prover="4" memlimit="1000"><result status="valid" time="0.20"/></proof>
+  </goal>
+  <goal name="VC ibnerf.1" expl="precondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.12" steps="477"/></proof>
+  </goal>
+  <goal name="VC ibnerf.2" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.05" steps="162"/></proof>
+  </goal>
+  <goal name="VC ibnerf.3" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.04" steps="162"/></proof>
+  </goal>
+  <goal name="VC ibnerf.4" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.10" steps="390"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC iblerf" expl="VC for iblerf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC iblerf.0" expl="precondition" proved="true">
+  <proof prover="4" memlimit="1000"><result status="valid" time="0.28"/></proof>
+  </goal>
+  <goal name="VC iblerf.1" expl="precondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.25" steps="476"/></proof>
+  </goal>
+  <goal name="VC iblerf.2" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.05" steps="162"/></proof>
+  </goal>
+  <goal name="VC iblerf.3" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.06" steps="162"/></proof>
+  </goal>
+  <goal name="VC iblerf.4" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.11" steps="390"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC ibgtrf" expl="VC for ibgtrf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC ibgtrf.0" expl="precondition" proved="true">
+  <proof prover="4" memlimit="1000"><result status="valid" time="0.24"/></proof>
+  </goal>
+  <goal name="VC ibgtrf.1" expl="precondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.25" steps="478"/></proof>
+  </goal>
+  <goal name="VC ibgtrf.2" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.05" steps="162"/></proof>
+  </goal>
+  <goal name="VC ibgtrf.3" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.07" steps="162"/></proof>
+  </goal>
+  <goal name="VC ibgtrf.4" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.11" steps="390"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC iconstf" expl="VC for iconstf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC iconstf.0" expl="precondition" proved="true">
+  <proof prover="2"><result status="valid" time="0.04"/></proof>
+  </goal>
+  <goal name="VC iconstf.1" expl="precondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.19" steps="449"/></proof>
+  </goal>
+  <goal name="VC iconstf.2" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.14" steps="162"/></proof>
+  </goal>
+  <goal name="VC iconstf.3" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.13" steps="162"/></proof>
+  </goal>
+  <goal name="VC iconstf.4" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.14" steps="390"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC ivarf" expl="VC for ivarf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC ivarf.0" expl="precondition" proved="true">
+  <proof prover="2"><result status="valid" time="0.02"/></proof>
+  </goal>
+  <goal name="VC ivarf.1" expl="precondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.15" steps="449"/></proof>
+  </goal>
+  <goal name="VC ivarf.2" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.14" steps="162"/></proof>
+  </goal>
+  <goal name="VC ivarf.3" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.14" steps="162"/></proof>
+  </goal>
+  <goal name="VC ivarf.4" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.17" steps="390"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC create_binop" expl="VC for create_binop" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC create_binop.0" expl="precondition" proved="true">
+  <proof prover="4"><result status="valid" time="0.44"/></proof>
+  </goal>
+  <goal name="VC create_binop.1" expl="precondition" proved="true">
+  <transf name="compute_specified" proved="true" >
+   <goal name="VC create_binop.1.0" expl="precondition" proved="true">
+   <transf name="introduce_premises" proved="true" >
+    <goal name="VC create_binop.1.0.0" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC create_binop.1.0.0.0" expl="precondition" proved="true">
+     <proof prover="4" memlimit="1000"><result status="valid" time="0.22"/></proof>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC create_binop.2" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.13" steps="162"/></proof>
+  </goal>
+  <goal name="VC create_binop.3" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.14" steps="162"/></proof>
+  </goal>
+  <goal name="VC create_binop.4" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.13" steps="162"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC iaddf" expl="VC for iaddf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC iaddf.0" expl="precondition" proved="true">
+  <transf name="compute_specified" proved="true" >
+   <goal name="VC iaddf.0.0" expl="precondition" proved="true">
+   <transf name="introduce_premises" proved="true" >
+    <goal name="VC iaddf.0.0.0" expl="precondition" proved="true">
+    <proof prover="2"><result status="valid" time="0.05"/></proof>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC iaddf.1" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.06" steps="152"/></proof>
+  </goal>
+  <goal name="VC iaddf.2" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.06" steps="152"/></proof>
+  </goal>
+  <goal name="VC iaddf.3" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.16" steps="154"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC iadduf" expl="VC for iadduf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC iadduf.0" expl="precondition" proved="true">
+  <proof prover="2" timelimit="10" memlimit="1000"><result status="valid" time="0.03"/></proof>
+  </goal>
+  <goal name="VC iadduf.1" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.05" steps="152"/></proof>
+  </goal>
+  <goal name="VC iadduf.2" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.05" steps="152"/></proof>
+  </goal>
+  <goal name="VC iadduf.3" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.18" steps="154"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC isubf" expl="VC for isubf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC isubf.0" expl="precondition" proved="true">
+  <transf name="compute_specified" proved="true" >
+   <goal name="VC isubf.0.0" expl="precondition" proved="true">
+   <transf name="introduce_premises" proved="true" >
+    <goal name="VC isubf.0.0.0" expl="precondition" proved="true">
+    <proof prover="2"><result status="valid" time="0.05"/></proof>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC isubf.1" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.06" steps="152"/></proof>
+  </goal>
+  <goal name="VC isubf.2" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.06" steps="152"/></proof>
+  </goal>
+  <goal name="VC isubf.3" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.06" steps="154"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC inil" expl="VC for inil" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC inil.0" expl="precondition" proved="true">
+  <proof prover="3" timelimit="5"><result status="valid" time="0.24"/></proof>
+  </goal>
+  <goal name="VC inil.1" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.15" steps="152"/></proof>
+  </goal>
+  <goal name="VC inil.2" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.14" steps="152"/></proof>
+  </goal>
+  <goal name="VC inil.3" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.13" steps="154"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC ibranchf" expl="VC for ibranchf" proved="true">
+ <transf name="split_vc" proved="true" >
+  <goal name="VC ibranchf.0" expl="precondition" proved="true">
+  <proof prover="2"><result status="valid" time="0.05"/></proof>
+  </goal>
+  <goal name="VC ibranchf.1" expl="precondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.12" steps="453"/></proof>
+  </goal>
+  <goal name="VC ibranchf.2" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.08" steps="162"/></proof>
+  </goal>
+  <goal name="VC ibranchf.3" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.06" steps="162"/></proof>
+  </goal>
+  <goal name="VC ibranchf.4" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.20" steps="390"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC create_cjump" expl="VC for create_cjump" proved="true">
+ <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.33" steps="1090"/></proof>
+ </goal>
+ <goal name="VC ibeqf" expl="VC for ibeqf" proved="true">
+ <proof prover="2"><result status="valid" time="0.07"/></proof>
+ </goal>
+ <goal name="VC ibnef" expl="VC for ibnef" proved="true">
+ <proof prover="2"><result status="valid" time="0.07"/></proof>
+ </goal>
+ <goal name="VC iblef" expl="VC for iblef" proved="true">
+ <proof prover="2"><result status="valid" time="0.06"/></proof>
+ </goal>
+ <goal name="VC ibgtf" expl="VC for ibgtf" proved="true">
+ <proof prover="2"><result status="valid" time="0.06"/></proof>
+ </goal>
+ <goal name="VC isetvarf" expl="VC for isetvarf" proved="true">
+ <transf name="split_vc" proved="true" >
+  <goal name="VC isetvarf.0" expl="precondition" proved="true">
+  <proof prover="4"><result status="valid" time="0.35"/></proof>
+  </goal>
+  <goal name="VC isetvarf.1" expl="precondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.29" steps="552"/></proof>
+  </goal>
+  <goal name="VC isetvarf.2" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.14" steps="162"/></proof>
+  </goal>
+  <goal name="VC isetvarf.3" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.13" steps="162"/></proof>
+  </goal>
+  <goal name="VC isetvarf.4" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.16" steps="390"/></proof>
+  </goal>
+ </transf>
+ </goal>
+</theory>
+</file>
+<file name="../compiler.mlw" proved="true">
+<theory name="Compile_aexpr" proved="true">
+ <goal name="VC compile_aexpr" expl="VC for compile_aexpr" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC compile_aexpr.0" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.24" steps="485"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.1" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.24" steps="524"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.2" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.11" steps="486"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.3" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.12" steps="525"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.4" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.12" steps="486"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.5" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.21" steps="525"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.6" expl="precondition" proved="true">
+  <transf name="split_goal_right" proved="true" >
+   <goal name="VC compile_aexpr.6.0" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_aexpr.6.0.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_aexpr.6.0.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_aexpr.6.0.0.0.0" expl="precondition" proved="true">
+      <proof prover="0"><result status="valid" time="0.11" steps="445"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_aexpr.6.1" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_aexpr.6.1.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_aexpr.6.1.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_aexpr.6.1.0.0.0" expl="precondition" proved="true">
+      <proof prover="0"><result status="valid" time="0.24" steps="445"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_aexpr.6.2" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_aexpr.6.2.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_aexpr.6.2.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_aexpr.6.2.0.0.0" expl="precondition" proved="true">
+      <proof prover="0"><result status="valid" time="0.30" steps="645"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_aexpr.6.3" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_aexpr.6.3.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_aexpr.6.3.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_aexpr.6.3.0.0.0" expl="precondition" proved="true">
+      <proof prover="0"><result status="valid" time="0.16" steps="696"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_aexpr.6.4" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_aexpr.6.4.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_aexpr.6.4.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_aexpr.6.4.0.0.0" expl="precondition" proved="true">
+      <proof prover="0"><result status="valid" time="0.17" steps="646"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC compile_aexpr.7" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.11" steps="158"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.8" expl="postcondition" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.10" steps="158"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC compile_aexpr_natural" expl="VC for compile_aexpr_natural" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="1.08" steps="841"/></proof>
+ </goal>
+</theory>
+<theory name="Compile_bexpr" proved="true">
+ <goal name="VC compile_bexpr" expl="VC for compile_bexpr" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC compile_bexpr.0" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.12" steps="434"/></proof>
+  </goal>
+  <goal name="VC compile_bexpr.1" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.22" steps="440"/></proof>
+  </goal>
+  <goal name="VC compile_bexpr.2" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.25" steps="519"/></proof>
+  </goal>
+  <goal name="VC compile_bexpr.3" expl="precondition" proved="true">
+  <transf name="split_goal_right" proved="true" >
+   <goal name="VC compile_bexpr.3.0" expl="precondition" proved="true">
+   <transf name="split_goal_right" proved="true" >
+    <goal name="VC compile_bexpr.3.0.0" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_bexpr.3.0.0.0" expl="precondition" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="VC compile_bexpr.3.0.0.0.0" expl="precondition" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="VC compile_bexpr.3.0.0.0.0.0" expl="precondition" proved="true">
+       <proof prover="0"><result status="valid" time="0.13" steps="453"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+    <goal name="VC compile_bexpr.3.0.1" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_bexpr.3.0.1.0" expl="precondition" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="VC compile_bexpr.3.0.1.0.0" expl="precondition" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="VC compile_bexpr.3.0.1.0.0.0" expl="precondition" proved="true">
+       <proof prover="0"><result status="valid" time="0.13" steps="422"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_bexpr.3.1" expl="precondition" proved="true">
+   <transf name="split_goal_right" proved="true" >
+    <goal name="VC compile_bexpr.3.1.0" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_bexpr.3.1.0.0" expl="precondition" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="VC compile_bexpr.3.1.0.0.0" expl="precondition" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="VC compile_bexpr.3.1.0.0.0.0" expl="precondition" proved="true">
+       <proof prover="0"><result status="valid" time="0.19" steps="422"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+    <goal name="VC compile_bexpr.3.1.1" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_bexpr.3.1.1.0" expl="precondition" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="VC compile_bexpr.3.1.1.0.0" expl="precondition" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="VC compile_bexpr.3.1.1.0.0.0" expl="precondition" proved="true">
+       <proof prover="0"><result status="valid" time="0.20" steps="462"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_bexpr.3.2" expl="precondition" proved="true">
+   <transf name="split_goal_right" proved="true" >
+    <goal name="VC compile_bexpr.3.2.0" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_bexpr.3.2.0.0" expl="precondition" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="VC compile_bexpr.3.2.0.0.0" expl="precondition" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="VC compile_bexpr.3.2.0.0.0.0" expl="precondition" proved="true">
+       <proof prover="0"><result status="valid" time="0.23" steps="852"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_bexpr.3.3" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_bexpr.3.3.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_bexpr.3.3.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_bexpr.3.3.0.0.0" expl="precondition" proved="true">
+      <proof prover="0"><result status="valid" time="0.68" steps="1627"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_bexpr.3.4" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_bexpr.3.4.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_bexpr.3.4.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_bexpr.3.4.0.0.0" expl="precondition" proved="true">
+      <proof prover="0"><result status="valid" time="0.85" steps="1614"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_bexpr.3.5" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_bexpr.3.5.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_bexpr.3.5.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_bexpr.3.5.0.0.0" expl="precondition" proved="true">
+      <proof prover="0"><result status="valid" time="0.58" steps="1336"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC compile_bexpr.4" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.08" steps="158"/></proof>
+  </goal>
+  <goal name="VC compile_bexpr.5" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.18" steps="158"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC compile_bexpr_natural" expl="VC for compile_bexpr_natural" proved="true">
+ <transf name="split_vc" proved="true" >
+  <goal name="VC compile_bexpr_natural.0" expl="assertion" proved="true">
+  <proof prover="0"><result status="valid" time="0.22" steps="381"/></proof>
+  </goal>
+  <goal name="VC compile_bexpr_natural.1" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.22" steps="548"/></proof>
+  </goal>
+ </transf>
+ </goal>
+</theory>
+<theory name="Compile_aexpr_reg" proved="true">
+ <goal name="VC compile_aexpr" expl="VC for compile_aexpr" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC compile_aexpr.0" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.27" steps="491"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.1" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.14" steps="530"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.2" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.25" steps="492"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.3" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.24" steps="531"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.4" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.16" steps="492"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.5" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.18" steps="531"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.6" expl="precondition" proved="true">
+  <transf name="split_goal_right" proved="true" >
+   <goal name="VC compile_aexpr.6.0" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_aexpr.6.0.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_aexpr.6.0.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_aexpr.6.0.0.0.0" expl="precondition" proved="true">
+      <proof prover="0"><result status="valid" time="0.17" steps="585"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_aexpr.6.1" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_aexpr.6.1.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_aexpr.6.1.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_aexpr.6.1.0.0.0" expl="precondition" proved="true">
+      <proof prover="0"><result status="valid" time="0.17" steps="513"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_aexpr.6.2" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_aexpr.6.2.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_aexpr.6.2.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_aexpr.6.2.0.0.0" expl="precondition" proved="true">
+      <proof prover="0"><result status="valid" time="0.98" steps="1928"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_aexpr.6.3" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_aexpr.6.3.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_aexpr.6.3.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_aexpr.6.3.0.0.0" expl="precondition" proved="true">
+      <proof prover="4" memlimit="1000"><result status="valid" time="1.04"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_aexpr.6.4" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_aexpr.6.4.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_aexpr.6.4.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_aexpr.6.4.0.0.0" expl="precondition" proved="true">
+      <proof prover="0"><result status="valid" time="0.97" steps="1929"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC compile_aexpr.7" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.18" steps="158"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr.8" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.18" steps="158"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC compile_aexpr_natural" expl="VC for compile_aexpr_natural" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC compile_aexpr_natural.0" expl="assertion" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="0.08" steps="156"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr_natural.1" expl="assertion" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="0.22" steps="379"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr_natural.2" expl="assertion" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="0.28" steps="526"/></proof>
+  </goal>
+  <goal name="VC compile_aexpr_natural.3" expl="postcondition" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="0.24" steps="686"/></proof>
+  </goal>
+ </transf>
+ </goal>
+</theory>
+<theory name="Compile_bexpr_reg" proved="true">
+ <goal name="VC compile_bexpr" expl="VC for compile_bexpr" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC compile_bexpr.0" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.13" steps="434"/></proof>
+  </goal>
+  <goal name="VC compile_bexpr.1" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.26" steps="440"/></proof>
+  </goal>
+  <goal name="VC compile_bexpr.2" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.24" steps="519"/></proof>
+  </goal>
+  <goal name="VC compile_bexpr.3" expl="precondition" proved="true">
+  <transf name="split_goal_right" proved="true" >
+   <goal name="VC compile_bexpr.3.0" expl="precondition" proved="true">
+   <transf name="split_goal_right" proved="true" >
+    <goal name="VC compile_bexpr.3.0.0" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_bexpr.3.0.0.0" expl="precondition" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="VC compile_bexpr.3.0.0.0.0" expl="precondition" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="VC compile_bexpr.3.0.0.0.0.0" expl="precondition" proved="true">
+       <proof prover="0"><result status="valid" time="0.15" steps="489"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+    <goal name="VC compile_bexpr.3.0.1" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_bexpr.3.0.1.0" expl="precondition" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="VC compile_bexpr.3.0.1.0.0" expl="precondition" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="VC compile_bexpr.3.0.1.0.0.0" expl="precondition" proved="true">
+       <proof prover="0"><result status="valid" time="0.14" steps="438"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_bexpr.3.1" expl="precondition" proved="true">
+   <transf name="split_goal_right" proved="true" >
+    <goal name="VC compile_bexpr.3.1.0" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_bexpr.3.1.0.0" expl="precondition" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="VC compile_bexpr.3.1.0.0.0" expl="precondition" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="VC compile_bexpr.3.1.0.0.0.0" expl="precondition" proved="true">
+       <proof prover="0"><result status="valid" time="0.13" steps="438"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+    <goal name="VC compile_bexpr.3.1.1" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_bexpr.3.1.1.0" expl="precondition" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="VC compile_bexpr.3.1.1.0.0" expl="precondition" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="VC compile_bexpr.3.1.1.0.0.0" expl="precondition" proved="true">
+       <proof prover="0"><result status="valid" time="0.19" steps="489"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_bexpr.3.2" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_bexpr.3.2.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_bexpr.3.2.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_bexpr.3.2.0.0.0" expl="precondition" proved="true">
+      <proof prover="0"><result status="valid" time="0.37" steps="876"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_bexpr.3.3" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_bexpr.3.3.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_bexpr.3.3.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_bexpr.3.3.0.0.0" expl="precondition" proved="true">
+      <proof prover="0"><result status="valid" time="1.24" steps="2763"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_bexpr.3.4" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_bexpr.3.4.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_bexpr.3.4.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_bexpr.3.4.0.0.0" expl="precondition" proved="true">
+      <proof prover="0"><result status="valid" time="1.19" steps="2899"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_bexpr.3.5" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_bexpr.3.5.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_bexpr.3.5.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_bexpr.3.5.0.0.0" expl="precondition" proved="true">
+      <proof prover="0"><result status="valid" time="0.71" steps="1534"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC compile_bexpr.4" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.18" steps="158"/></proof>
+  </goal>
+  <goal name="VC compile_bexpr.5" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.17" steps="158"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC compile_bexpr_natural" expl="VC for compile_bexpr_natural" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC compile_bexpr_natural.0" expl="assertion" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="0.22" steps="381"/></proof>
+  </goal>
+  <goal name="VC compile_bexpr_natural.1" expl="assertion" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="0.28" steps="454"/></proof>
+  </goal>
+  <goal name="VC compile_bexpr_natural.2" expl="postcondition" proved="true">
+  <transf name="split_goal_right" proved="true" >
+   <goal name="VC compile_bexpr_natural.2.0" expl="postcondition" proved="true">
+   <proof prover="0" memlimit="2000"><result status="valid" time="0.31" steps="679"/></proof>
+   </goal>
+   <goal name="VC compile_bexpr_natural.2.1" expl="postcondition" proved="true">
+   <proof prover="0" memlimit="2000"><result status="valid" time="0.29" steps="677"/></proof>
+   </goal>
+  </transf>
+  </goal>
+ </transf>
+ </goal>
+</theory>
+<theory name="Compile_com" proved="true">
+ <goal name="loop_variant_lemma" proved="true">
+ <proof prover="0"><result status="valid" time="0.29" steps="427"/></proof>
+ </goal>
+ <goal name="loop_variant_acc" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="loop_variant_acc.0" proved="true">
+  <proof prover="0"><result status="valid" time="0.25" steps="492"/></proof>
+  </goal>
+  <goal name="loop_variant_acc.1" proved="true">
+  <proof prover="3"><result status="valid" time="7.98"/></proof>
+  </goal>
+  <goal name="loop_variant_acc.2" proved="true">
+  <transf name="induction_pr" proved="true" >
+   <goal name="loop_variant_acc.2.0" proved="true">
+   <proof prover="0"><result status="valid" time="0.08" steps="162"/></proof>
+   </goal>
+   <goal name="loop_variant_acc.2.1" proved="true">
+   <proof prover="0"><result status="valid" time="0.22" steps="162"/></proof>
+   </goal>
+   <goal name="loop_variant_acc.2.2" proved="true">
+   <proof prover="0"><result status="valid" time="0.24" steps="168"/></proof>
+   </goal>
+   <goal name="loop_variant_acc.2.3" proved="true">
+   <proof prover="0"><result status="valid" time="0.24" steps="167"/></proof>
+   </goal>
+   <goal name="loop_variant_acc.2.4" proved="true">
+   <proof prover="0"><result status="valid" time="0.23" steps="167"/></proof>
+   </goal>
+   <goal name="loop_variant_acc.2.5" proved="true">
+   <transf name="simplify_trivial_quantification_in_goal" proved="true" >
+    <goal name="loop_variant_acc.2.5.0" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="loop_variant_acc.2.5.0.0" proved="true">
+     <transf name="introduce_premises" proved="true" >
+      <goal name="loop_variant_acc.2.5.0.0.0" proved="true">
+      <transf name="apply" proved="true" arg1="Acc">
+       <goal name="loop_variant_acc.2.5.0.0.0.0" proved="true">
+       <transf name="compute_specified" proved="true" >
+        <goal name="loop_variant_acc.2.5.0.0.0.0.0" proved="true">
+        <transf name="introduce_premises" proved="true" >
+         <goal name="loop_variant_acc.2.5.0.0.0.0.0.0" proved="true">
+         <proof prover="3"><result status="valid" time="0.47"/></proof>
+         </goal>
+        </transf>
+        </goal>
+       </transf>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="loop_variant_acc.2.6" proved="true">
+   <transf name="simplify_trivial_quantification_in_goal" proved="true" >
+    <goal name="loop_variant_acc.2.6.0" proved="true">
+    <proof prover="0" memlimit="2000"><result status="valid" time="0.17" steps="552"/></proof>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC compile_com" expl="VC for compile_com" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC compile_com.0" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.26" steps="438"/></proof>
+  </goal>
+  <goal name="VC compile_com.1" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.17" steps="479"/></proof>
+  </goal>
+  <goal name="VC compile_com.2" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.24" steps="444"/></proof>
+  </goal>
+  <goal name="VC compile_com.3" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.17" steps="493"/></proof>
+  </goal>
+  <goal name="VC compile_com.4" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.14" steps="439"/></proof>
+  </goal>
+  <goal name="VC compile_com.5" expl="precondition" proved="true">
+  <transf name="split_goal_right" proved="true" >
+   <goal name="VC compile_com.5.0" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_com.5.0.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_com.5.0.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_com.5.0.0.0.0" expl="precondition" proved="true">
+      <proof prover="0"><result status="valid" time="0.26" steps="410"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_com.5.1" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_com.5.1.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_com.5.1.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_com.5.1.0.0.0" expl="precondition" proved="true">
+      <proof prover="0"><result status="valid" time="0.17" steps="582"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_com.5.2" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_com.5.2.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_com.5.2.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_com.5.2.0.0.0" expl="precondition" proved="true">
+      <proof prover="0"><result status="valid" time="0.89" steps="1929"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_com.5.3" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_com.5.3.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_com.5.3.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_com.5.3.0.0.0" expl="precondition" proved="true">
+      <proof prover="0"><result status="valid" time="0.84" steps="1855"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_com.5.4" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_com.5.4.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_com.5.4.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_com.5.4.0.0.0" expl="precondition" proved="true">
+      <transf name="split_goal_right" proved="true" >
+       <goal name="VC compile_com.5.4.0.0.0.0" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.11" steps="198"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.1" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.20" steps="206"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.2" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.20" steps="206"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.3" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.19" steps="206"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.4" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.27" steps="486"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.5" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.33" steps="521"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.6" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.14" steps="252"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.7" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.24" steps="270"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.8" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.24" steps="270"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.9" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.23" steps="270"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.10" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.10" steps="268"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.11" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.23" steps="290"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.12" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.23" steps="288"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.13" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.11" steps="270"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.14" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.81" steps="1439"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.15" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.23" steps="294"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.16" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.29" steps="307"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.17" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.21" steps="307"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.18" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.18" steps="307"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.19" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="3.91" steps="10128"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.20" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.23" steps="327"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.21" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.15" steps="322"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.22" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.11" steps="250"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.23" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.11" steps="268"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.24" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.11" steps="268"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.25" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="1.33" steps="2890"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.26" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.23" steps="268"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.27" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.16" steps="268"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.28" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.15" steps="266"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.29" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.13" steps="292"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.30" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.18" steps="302"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.31" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.17" steps="302"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.32" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.15" steps="302"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.33" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.15" steps="302"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC compile_com.6" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.22" steps="158"/></proof>
+  </goal>
+  <goal name="VC compile_com.7" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.09" steps="158"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC compile_com_natural" expl="VC for compile_com_natural" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC compile_com_natural.0" expl="assertion" proved="true">
+  <transf name="compute_specified" proved="true" >
+   <goal name="VC compile_com_natural.0.0" expl="assertion" proved="true">
+   <transf name="introduce_premises" proved="true" >
+    <goal name="VC compile_com_natural.0.0.0" expl="assertion" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_com_natural.0.0.0.0" expl="assertion" proved="true">
+     <proof prover="0" memlimit="2000"><result status="valid" time="0.28" steps="418"/></proof>
+     <proof prover="3"><result status="valid" time="0.60"/></proof>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC compile_com_natural.1" expl="postcondition" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="0.24" steps="501"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC compile_program" expl="VC for compile_program" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC compile_program.0" expl="assertion" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="0.13" steps="158"/></proof>
+  </goal>
+  <goal name="VC compile_program.1" expl="postcondition" proved="true">
+  <proof prover="3" memlimit="2000"><result status="valid" time="0.61"/></proof>
+  </goal>
+ </transf>
+ </goal>
+</theory>
+<theory name="Compile_com_reg" proved="true">
+ <goal name="loop_variant_lemma" proved="true">
+ <proof prover="0"><result status="valid" time="0.24" steps="427"/></proof>
+ </goal>
+ <goal name="loop_variant_acc" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="loop_variant_acc.0" proved="true">
+  <proof prover="0"><result status="valid" time="0.25" steps="492"/></proof>
+  </goal>
+  <goal name="loop_variant_acc.1" proved="true">
+  <proof prover="3"><result status="valid" time="8.36"/></proof>
+  </goal>
+  <goal name="loop_variant_acc.2" proved="true">
+  <transf name="induction_pr" proved="true" >
+   <goal name="loop_variant_acc.2.0" proved="true">
+   <proof prover="0"><result status="valid" time="0.09" steps="162"/></proof>
+   </goal>
+   <goal name="loop_variant_acc.2.1" proved="true">
+   <proof prover="0"><result status="valid" time="0.11" steps="162"/></proof>
+   </goal>
+   <goal name="loop_variant_acc.2.2" proved="true">
+   <proof prover="0"><result status="valid" time="0.25" steps="168"/></proof>
+   </goal>
+   <goal name="loop_variant_acc.2.3" proved="true">
+   <proof prover="0"><result status="valid" time="0.24" steps="167"/></proof>
+   </goal>
+   <goal name="loop_variant_acc.2.4" proved="true">
+   <proof prover="0"><result status="valid" time="0.11" steps="167"/></proof>
+   </goal>
+   <goal name="loop_variant_acc.2.5" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="loop_variant_acc.2.5.0" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="loop_variant_acc.2.5.0.0" proved="true">
+     <transf name="apply" proved="true" arg1="Acc">
+      <goal name="loop_variant_acc.2.5.0.0.0" proved="true">
+      <transf name="compute_specified" proved="true" >
+       <goal name="loop_variant_acc.2.5.0.0.0.0" proved="true">
+       <transf name="introduce_premises" proved="true" >
+        <goal name="loop_variant_acc.2.5.0.0.0.0.0" proved="true">
+        <proof prover="3"><result status="valid" time="0.60"/></proof>
+        </goal>
+       </transf>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="loop_variant_acc.2.6" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="loop_variant_acc.2.6.0" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="loop_variant_acc.2.6.0.0" proved="true">
+     <proof prover="4" timelimit="5"><result status="valid" time="0.55"/></proof>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC compile_com" expl="VC for compile_com" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC compile_com.0" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.26" steps="438"/></proof>
+  </goal>
+  <goal name="VC compile_com.1" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.26" steps="479"/></proof>
+  </goal>
+  <goal name="VC compile_com.2" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.19" steps="444"/></proof>
+  </goal>
+  <goal name="VC compile_com.3" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.20" steps="493"/></proof>
+  </goal>
+  <goal name="VC compile_com.4" expl="variant decrease" proved="true">
+  <proof prover="0"><result status="valid" time="0.17" steps="439"/></proof>
+  </goal>
+  <goal name="VC compile_com.5" expl="precondition" proved="true">
+  <transf name="split_goal_right" proved="true" >
+   <goal name="VC compile_com.5.0" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_com.5.0.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_com.5.0.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_com.5.0.0.0.0" expl="precondition" proved="true">
+      <proof prover="0"><result status="valid" time="0.14" steps="410"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_com.5.1" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_com.5.1.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_com.5.1.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_com.5.1.0.0.0" expl="precondition" proved="true">
+      <transf name="split_goal_right" proved="true" >
+       <goal name="VC compile_com.5.1.0.0.0.0" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.10" steps="172"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.1.0.0.0.1" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.22" steps="195"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.1.0.0.0.2" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.21" steps="205"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.1.0.0.0.3" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.21" steps="205"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.1.0.0.0.4" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.27" steps="459"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_com.5.2" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_com.5.2.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_com.5.2.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_com.5.2.0.0.0" expl="precondition" proved="true">
+      <transf name="split_goal_right" proved="true" >
+       <goal name="VC compile_com.5.2.0.0.0.0" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.12" steps="170"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.2.0.0.0.1" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.31" steps="563"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.2.0.0.0.2" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.08" steps="192"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.2.0.0.0.3" expl="VC for compile_com" proved="true">
+       <proof prover="2" timelimit="10" memlimit="1000"><result status="valid" time="0.06"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.2.0.0.0.4" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.10" steps="218"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.2.0.0.0.5" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.11" steps="218"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.2.0.0.0.6" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.11" steps="220"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_com.5.3" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_com.5.3.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_com.5.3.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_com.5.3.0.0.0" expl="precondition" proved="true">
+      <proof prover="0" memlimit="2000"><result status="valid" time="0.76" steps="1894"/></proof>
+      <transf name="split_goal_right" proved="true" >
+       <goal name="VC compile_com.5.3.0.0.0.0" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.12" steps="196"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.3.0.0.0.1" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.20" steps="216"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.3.0.0.0.2" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.20" steps="216"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.3.0.0.0.3" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.09" steps="216"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.3.0.0.0.4" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.21" steps="226"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.3.0.0.0.5" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="1.42" steps="2962"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.3.0.0.0.6" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.21" steps="250"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.3.0.0.0.7" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.22" steps="250"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.3.0.0.0.8" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.19" steps="255"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.3.0.0.0.9" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.20" steps="222"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.3.0.0.0.10" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.54" steps="850"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.3.0.0.0.11" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.15" steps="244"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.3.0.0.0.12" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.20" steps="261"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.3.0.0.0.13" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.21" steps="261"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.3.0.0.0.14" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.22" steps="261"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.3.0.0.0.15" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.15" steps="250"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.3.0.0.0.16" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.16" steps="250"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.3.0.0.0.17" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.15" steps="250"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.3.0.0.0.18" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.13" steps="250"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.3.0.0.0.19" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.22" steps="250"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+   <goal name="VC compile_com.5.4" expl="precondition" proved="true">
+   <transf name="compute_specified" proved="true" >
+    <goal name="VC compile_com.5.4.0" expl="precondition" proved="true">
+    <transf name="introduce_premises" proved="true" >
+     <goal name="VC compile_com.5.4.0.0" expl="precondition" proved="true">
+     <transf name="compute_specified" proved="true" >
+      <goal name="VC compile_com.5.4.0.0.0" expl="precondition" proved="true">
+      <transf name="split_goal_right" proved="true" >
+       <goal name="VC compile_com.5.4.0.0.0.0" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.23" steps="198"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.1" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.21" steps="206"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.2" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.09" steps="206"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.3" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.27" steps="486"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.4" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.16" steps="519"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.5" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.22" steps="248"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.6" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.16" steps="269"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.7" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.22" steps="269"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.8" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.11" steps="269"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.9" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.11" steps="269"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.10" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.11" steps="269"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.11" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.23" steps="277"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.12" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="1.83" steps="4302"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.13" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.24" steps="301"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.14" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.32" steps="311"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.15" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.27" steps="311"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.16" expl="VC for compile_com" proved="true">
+       <proof prover="0" memlimit="2000"><result status="valid" time="2.88" steps="6082"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.17" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.33" steps="329"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.18" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.24" steps="327"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.19" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.10" steps="246"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.20" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.19" steps="275"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.21" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.15" steps="275"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.22" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="1.57" steps="3688"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.23" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.17" steps="269"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.24" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.18" steps="269"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.25" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.18" steps="269"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.26" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.17" steps="269"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.27" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.17" steps="269"/></proof>
+       </goal>
+       <goal name="VC compile_com.5.4.0.0.0.28" expl="VC for compile_com" proved="true">
+       <proof prover="0"><result status="valid" time="0.17" steps="269"/></proof>
+       </goal>
+      </transf>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC compile_com.6" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.22" steps="158"/></proof>
+  </goal>
+  <goal name="VC compile_com.7" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.22" steps="158"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC compile_com_natural" expl="VC for compile_com_natural" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC compile_com_natural.0" expl="assertion" proved="true">
+  <transf name="compute_specified" proved="true" >
+   <goal name="VC compile_com_natural.0.0" expl="assertion" proved="true">
+   <transf name="introduce_premises" proved="true" >
+    <goal name="VC compile_com_natural.0.0.0" expl="assertion" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC compile_com_natural.0.0.0.0" expl="assertion" proved="true">
+     <proof prover="0" memlimit="2000"><result status="valid" time="0.25" steps="455"/></proof>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC compile_com_natural.1" expl="postcondition" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="0.25" steps="496"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC compile_program" expl="VC for compile_program" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC compile_program.0" expl="assertion" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="0.21" steps="405"/></proof>
+  </goal>
+  <goal name="VC compile_program.1" expl="postcondition" proved="true">
+  <proof prover="3" memlimit="2000"><result status="valid" time="0.56"/></proof>
+  </goal>
+ </transf>
+ </goal>
+</theory>
+</file>
+<file name="../logic.mlw" proved="true">
+<theory name="Compiler_logic" proved="true">
+ <goal name="VC hl" expl="VC for hl" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.01" steps="148"/></proof>
+ </goal>
+ <goal name="VC wp" expl="VC for wp" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.01" steps="148"/></proof>
+ </goal>
+ <goal name="seq_wp_lemma" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.01" steps="148"/></proof>
+ </goal>
+ <goal name="VC infix --" expl="VC for infix --" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.15" steps="606"/></proof>
+ </goal>
+ <goal name="fork_wp_lemma" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.12" steps="365"/></proof>
+ </goal>
+ <goal name="VC infix %" expl="VC for infix %" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.15" steps="423"/></proof>
+ </goal>
+ <goal name="towp_wp_lemma" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.14" steps="385"/></proof>
+ </goal>
+ <goal name="VC prefix $" expl="VC for prefix $" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.13" steps="398"/></proof>
+ </goal>
+ <goal name="VC hoare" expl="VC for hoare" proved="true">
+ <proof prover="2" memlimit="1000"><result status="valid" time="0.03"/></proof>
+ </goal>
+ <goal name="pconj_lemma" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.01" steps="149"/></proof>
+ </goal>
+ <goal name="loop_wp_lemma" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.87" steps="2024"/></proof>
+ <proof prover="2"><result status="valid" time="0.04"/></proof>
+ </goal>
+ <goal name="VC make_loop" expl="VC for make_loop" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC make_loop.0" expl="assertion" proved="true">
+  <transf name="induction_pr" proved="true" >
+   <goal name="VC make_loop.0.0" expl="assertion" proved="true">
+   <proof prover="2" memlimit="1000"><result status="valid" time="0.04"/></proof>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC make_loop.1" expl="precondition" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="0.12" steps="390"/></proof>
+  </goal>
+  <goal name="VC make_loop.2" expl="postcondition" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="0.02" steps="150"/></proof>
+  </goal>
+  <goal name="VC make_loop.3" expl="postcondition" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="0.02" steps="150"/></proof>
+  </goal>
+ </transf>
+ </goal>
+</theory>
+</file>
+<file name="../vm.mlw" proved="true">
+<theory name="ReflTransClosure" proved="true">
+ <goal name="transition_star_one" proved="true">
+ <proof prover="2" memlimit="1000"><result status="valid" time="0.01"/></proof>
+ </goal>
+ <goal name="transition_star_transitive" proved="true">
+ <transf name="induction_pr" proved="true" >
+  <goal name="transition_star_transitive.0" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.00" steps="8"/></proof>
+  </goal>
+  <goal name="transition_star_transitive.1" proved="true">
+  <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.00" steps="16"/></proof>
+  </goal>
+ </transf>
+ </goal>
+</theory>
+<theory name="Vm" proved="true">
+ <goal name="codeseq_at_app_right" proved="true">
+ <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.01" steps="407"/></proof>
+ </goal>
+ <goal name="codeseq_at_app_left" proved="true">
+ <proof prover="0" timelimit="5" memlimit="2000"><result status="valid" time="0.13" steps="460"/></proof>
+ </goal>
+ <goal name="list_app_eq_nil" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.05" steps="403"/></proof>
+ </goal>
+ <goal name="list_app_eq_left_cons" proved="true">
+ <transf name="induction_ty_lex" proved="true" >
+  <goal name="list_app_eq_left_cons.0" proved="true">
+  <transf name="split_goal_right" proved="true" >
+   <goal name="list_app_eq_left_cons.0.0" proved="true">
+   <proof prover="0" memlimit="2000"><result status="valid" time="0.05" steps="392"/></proof>
+   </goal>
+   <goal name="list_app_eq_left_cons.0.1" proved="true">
+   <transf name="introduce_premises" proved="true" >
+    <goal name="list_app_eq_left_cons.0.1.0" proved="true">
+    <transf name="subst_all" proved="true" >
+     <goal name="list_app_eq_left_cons.0.1.0.0" proved="true">
+     <proof prover="4"><result status="valid" time="0.13"/></proof>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="list_app_eq_last" proved="true">
+ <transf name="induction_ty_lex" proved="true" >
+  <goal name="list_app_eq_last.0" proved="true">
+  <transf name="split_goal_right" proved="true" >
+   <goal name="list_app_eq_last.0.0" proved="true">
+   <proof prover="0" memlimit="2000"><result status="valid" time="0.05" steps="405"/></proof>
+   </goal>
+   <goal name="list_app_eq_last.0.1" proved="true">
+   <transf name="introduce_premises" proved="true" >
+    <goal name="list_app_eq_last.0.1.0" proved="true">
+    <transf name="subst_all" proved="true" >
+     <goal name="list_app_eq_last.0.1.0.0" proved="true">
+     <proof prover="0" memlimit="2000"><result status="valid" time="0.05" steps="451"/></proof>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="list_app_eq_left" proved="true">
+ <transf name="induction_ty_lex" proved="true" >
+  <goal name="list_app_eq_left.0" proved="true">
+  <transf name="split_goal_right" proved="true" >
+   <goal name="list_app_eq_left.0.0" proved="true">
+   <proof prover="0" memlimit="2000"><result status="valid" time="0.04" steps="154"/></proof>
+   </goal>
+   <goal name="list_app_eq_left.0.1" proved="true">
+   <transf name="introduce_premises" proved="true" >
+    <goal name="list_app_eq_left.0.1.0" proved="true">
+    <transf name="subst_all" proved="true" >
+     <goal name="list_app_eq_left.0.1.0.0" proved="true">
+     <proof prover="4"><result status="valid" time="0.32"/></proof>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="codeseq_at_right" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.06" steps="432"/></proof>
+ </goal>
+ <goal name="VC push" expl="VC for push" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.00" steps="146"/></proof>
+ </goal>
+ <goal name="VC iimm" expl="VC for iimm" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.02" steps="146"/></proof>
+ </goal>
+ <goal name="VC iload" expl="VC for iload" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.02" steps="146"/></proof>
+ </goal>
+ <goal name="VC istore" expl="VC for istore" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.02" steps="146"/></proof>
+ </goal>
+ <goal name="VC ipushr" expl="VC for ipushr" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.03" steps="146"/></proof>
+ </goal>
+ <goal name="VC ipopr" expl="VC for ipopr" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.03" steps="146"/></proof>
+ </goal>
+ <goal name="VC iaddr" expl="VC for iaddr" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.02" steps="146"/></proof>
+ </goal>
+ <goal name="VC iaddur" expl="VC for iaddur" proved="true">
+ <proof prover="0"><result status="valid" time="0.03" steps="146"/></proof>
+ </goal>
+ <goal name="VC isubr" expl="VC for isubr" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.02" steps="146"/></proof>
+ </goal>
+ <goal name="VC ibeqr" expl="VC for ibeqr" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.02" steps="146"/></proof>
+ </goal>
+ <goal name="VC ibner" expl="VC for ibner" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.02" steps="146"/></proof>
+ </goal>
+ <goal name="VC ibler" expl="VC for ibler" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.02" steps="146"/></proof>
+ </goal>
+ <goal name="VC ibgtr" expl="VC for ibgtr" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.02" steps="146"/></proof>
+ </goal>
+ <goal name="VC iconst" expl="VC for iconst" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.00" steps="146"/></proof>
+ </goal>
+ <goal name="VC ivar" expl="VC for ivar" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.00" steps="146"/></proof>
+ </goal>
+ <goal name="VC isetvar" expl="VC for isetvar" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.00" steps="146"/></proof>
+ </goal>
+ <goal name="VC iadd" expl="VC for iadd" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.00" steps="146"/></proof>
+ </goal>
+ <goal name="VC iaddu" expl="VC for iaddu" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.01" steps="146"/></proof>
+ </goal>
+ <goal name="VC isub" expl="VC for isub" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.00" steps="146"/></proof>
+ </goal>
+ <goal name="VC ibeq" expl="VC for ibeq" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.00" steps="146"/></proof>
+ </goal>
+ <goal name="VC ible" expl="VC for ible" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.01" steps="146"/></proof>
+ </goal>
+ <goal name="VC ibne" expl="VC for ibne" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.00" steps="146"/></proof>
+ </goal>
+ <goal name="VC ibgt" expl="VC for ibgt" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.00" steps="146"/></proof>
+ </goal>
+ <goal name="VC ibranch" expl="VC for ibranch" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.01" steps="146"/></proof>
+ </goal>
+ <goal name="VC ihalt" expl="VC for ihalt" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.00" steps="146"/></proof>
+ </goal>
+ <goal name="trans_deterministic_aux" proved="true">
+ <transf name="inversion_pr" proved="true" >
+  <goal name="trans_deterministic_aux.0" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="1.23" steps="3225"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.1" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="1.25" steps="3225"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.2" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="1.23" steps="3227"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.3" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="1.35" steps="3495"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.4" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="1.25" steps="3240"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.5" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="1.25" steps="3249"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.6" proved="true">
+  <proof prover="0"><result status="valid" time="1.47" steps="4083"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.7" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="1.27" steps="3241"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.8" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="2.30" steps="3630"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.9" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="1.77" steps="3633"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.10" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="2.63" steps="3881"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.11" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="1.92" steps="3855"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.12" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="1.30" steps="3247"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.13" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="1.26" steps="3247"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.14" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="1.25" steps="3239"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.15" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="1.84" steps="3305"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.16" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="1.40" steps="3934"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.17" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="1.32" steps="3084"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.18" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="2.00" steps="3751"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.19" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="1.57" steps="3614"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.20" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="1.69" steps="3738"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.21" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="1.56" steps="3800"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.22" proved="true">
+  <proof prover="0" memlimit="2000"><result status="valid" time="1.68" steps="3668"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="trans_deterministic" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.10" steps="376"/></proof>
+ </goal>
+ <goal name="trans_deterministic_star" proved="true">
+ <proof prover="0" memlimit="2000"><result status="valid" time="0.10" steps="152"/></proof>
+ </goal>
+</theory>
+</file>
+<file name="../bv_op.mlw" proved="true">
+<theory name="BV_OP" proved="true">
+ <goal name="VC bv_add" expl="VC for bv_add" proved="true">
+ <proof prover="0" timelimit="5"><result status="valid" time="0.00" steps="138"/></proof>
+ </goal>
+</theory>
+</file>
+<file name="../imp.mlw" proved="true">
+<theory name="Imp" proved="true">
+ <goal name="ceval_deterministic_aux" proved="true">
+ <transf name="induction_pr" proved="true" >
+  <goal name="ceval_deterministic_aux.0" proved="true">
+  <proof prover="0" timelimit="5"><result status="valid" time="0.14" steps="465"/></proof>
+  </goal>
+  <goal name="ceval_deterministic_aux.1" proved="true">
+  <proof prover="0" timelimit="5"><result status="valid" time="0.15" steps="524"/></proof>
+  </goal>
+  <goal name="ceval_deterministic_aux.2" proved="true">
+  <transf name="simplify_trivial_quantification_in_goal" proved="true" >
+   <goal name="ceval_deterministic_aux.2.0" proved="true">
+   <proof prover="0" timelimit="5"><result status="valid" time="0.22" steps="722"/></proof>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="ceval_deterministic_aux.3" proved="true">
+  <transf name="simplify_trivial_quantification_in_goal" proved="true" >
+   <goal name="ceval_deterministic_aux.3.0" proved="true">
+   <proof prover="0" timelimit="5"><result status="valid" time="0.19" steps="613"/></proof>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="ceval_deterministic_aux.4" proved="true">
+  <transf name="simplify_trivial_quantification_in_goal" proved="true" >
+   <goal name="ceval_deterministic_aux.4.0" proved="true">
+   <proof prover="0" timelimit="5"><result status="valid" time="0.17" steps="671"/></proof>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="ceval_deterministic_aux.5" proved="true">
+  <proof prover="0" timelimit="5"><result status="valid" time="0.16" steps="501"/></proof>
+  </goal>
+  <goal name="ceval_deterministic_aux.6" proved="true">
+  <transf name="simplify_trivial_quantification_in_goal" proved="true" >
+   <goal name="ceval_deterministic_aux.6.0" proved="true">
+   <proof prover="0" timelimit="5"><result status="valid" time="0.21" steps="805"/></proof>
+   </goal>
+  </transf>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="ceval_deterministic" proved="true">
+ <proof prover="0" timelimit="5"><result status="valid" time="0.12" steps="374"/></proof>
+ </goal>
+</theory>
+</file>
+</why3session>
diff --git a/imp/why3shapes.gz b/imp/why3shapes.gz
new file mode 100644
index 0000000000000000000000000000000000000000..a89b14d39911b97c0c8c2df4932fb67dba368b31
GIT binary patch
literal 38000
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

literal 0
HcmV?d00001

diff --git a/imp_ex_assignment.mlw b/imp_ex_assignment.mlw
new file mode 100644
index 0000000..64edbff
--- /dev/null
+++ b/imp_ex_assignment.mlw
@@ -0,0 +1,47 @@
+module Imp_ex
+
+  use imp.Imp
+  use state.State
+  use bool.Bool
+  use int.Int
+  use bv_op.BV_OP 
+
+  let rec aeval_ex  (st:state) (e:aexpr) : int 
+    variant { e }
+    ensures { result = aeval st e }
+  =
+    match e with
+      | Anum n      -> n
+      | Avar x      -> st[x]
+      | Aadd e1 e2  -> aeval_ex st e1 + aeval_ex st e2
+      | Aaddu e1 e2 -> bv_add (aeval_ex st e1) (aeval_ex st e2)
+      | Asub e1 e2  -> aeval_ex st e1 - aeval_ex st e2
+    end
+
+
+  let rec beval_ex (st:state) (b:bexpr) : bool 
+    variant { b }
+    ensures { result = beval st b }
+  =
+    match b with
+      | Btrue      -> true
+      | Bfalse     -> false
+      | Bnot b'    -> notb (beval_ex st b')
+      | Band b1 b2 -> andb (beval_ex st b1) (beval_ex st b2)
+      | Beq a1 a2  -> aeval_ex st a1 = aeval_ex st a2
+      | Ble a1 a2  -> aeval_ex st a1 <= aeval_ex st a2
+    end
+
+
+  let rec ceval_ex (st:state) (c:com): state
+    (* diverges (* uncomment when actually diverging*) *)   
+    ensures { ceval st c result }
+    =
+    match c with
+    | Cskip -> st
+    | Cassign id aexpr -> st
+    | Cseq c1 c2 -> st 
+    | Cif bexpr c1 c2 -> st
+    | Cwhile bexpr com -> st
+    end
+end
\ No newline at end of file
diff --git a/imp_test.mlw b/imp_test.mlw
new file mode 100644
index 0000000..c39818a
--- /dev/null
+++ b/imp_test.mlw
@@ -0,0 +1,40 @@
+module Imp_test
+
+  use state.State
+  use imp.Imp
+  use int.Int
+
+  constant st : state = const 0
+  
+  goal ex1: (* 1 + 2 *)
+    aeval st (Aadd (Anum 1) (Anum 2)) = 3
+    
+  goal ex2: (* (1 - 2) + 2 *)
+    aeval st (Aadd (Asub (Anum 1) (Anum 2)) (Anum 2)) = 1
+    
+  goal ex3: (* a = 0, a + 2 *) 
+    aeval st (Aadd (Avar (Id 1)) (Anum 2)) = 2
+
+  goal ex4: (* a = 7, a + 2 *)
+    let st' = st[(Id 1) <- 7] in (* <-- update the state, st[Id 1] = 7 *)
+    aeval st' (Aadd (Avar (Id 1)) (Anum 2)) = 9
+
+  constant a_id : id = Id 1 (* <-- we introduce the constant a_id *)
+  
+  goal ex5: (* a = 7, a + 2 *)
+    let st = st[a_id <- 7] in        (* <-- used in the following *)
+    aeval st (Aadd (Avar a_id) (Anum 2)) = 9 
+    
+  goal ex6: (* on primitive "+" *)
+    forall a. a > 2 -> 2 + a > 4  
+    
+  goal ex7: (* addition on "imp" expression *)
+    forall a. a > 2 ->
+    aeval st (Aadd (Anum a) (Anum 2)) > 4
+
+  goal ex8: (* addition via state *)
+    forall a. a > 2 ->
+      let st = st[a_id <- a] in 
+      aeval st (Aadd (Avar a_id) (Anum 2)) > 4
+    
+end
diff --git a/imp_test/why3session.xml b/imp_test/why3session.xml
new file mode 100644
index 0000000..a511523
--- /dev/null
+++ b/imp_test/why3session.xml
@@ -0,0 +1,238 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE why3session PUBLIC "-//Why3//proof session v5//EN"
+"http://why3.lri.fr/why3session.dtd">
+<why3session shape_version="5">
+<prover id="0" name="Alt-Ergo" version="2.0.0" timelimit="1" steplimit="0" memlimit="1000"/>
+<prover id="1" name="CVC4" version="1.4" timelimit="1" steplimit="0" memlimit="1000"/>
+<file name="../state.mlw" proved="true">
+<theory name="State" proved="true">
+ <goal name="VC get" expl="VC for get" proved="true">
+ <proof prover="0"><result status="valid" time="0.00" steps="1"/></proof>
+ </goal>
+ <goal name="VC set" expl="VC for set" proved="true">
+ <proof prover="0"><result status="valid" time="0.00" steps="1"/></proof>
+ </goal>
+ <goal name="VC mixfix []" expl="VC for mixfix []" proved="true">
+ <proof prover="0"><result status="valid" time="0.00" steps="1"/></proof>
+ </goal>
+ <goal name="VC mixfix [&lt;-]" expl="VC for mixfix [<-]" proved="true">
+ <proof prover="0"><result status="valid" time="0.00" steps="1"/></proof>
+ </goal>
+ <goal name="VC const" expl="VC for const" proved="true">
+ <proof prover="0"><result status="valid" time="0.00" steps="2"/></proof>
+ </goal>
+</theory>
+<theory name="Reg" proved="true">
+ <goal name="VC read" expl="VC for read" proved="true">
+ <proof prover="0"><result status="valid" time="0.00" steps="1"/></proof>
+ </goal>
+ <goal name="VC write" expl="VC for write" proved="true">
+ <proof prover="0"><result status="valid" time="0.00" steps="1"/></proof>
+ </goal>
+ <goal name="VC const" expl="VC for const" proved="true">
+ <proof prover="0"><result status="valid" time="0.00" steps="2"/></proof>
+ </goal>
+</theory>
+</file>
+<file name="../imp_test.mlw">
+<theory name="Imp_test">
+ <goal name="ex1">
+ <proof prover="0" obsolete="true"><result status="valid" time="0.02" steps="82"/></proof>
+ </goal>
+ <goal name="ex2">
+ <proof prover="0" obsolete="true"><result status="valid" time="0.03" steps="101"/></proof>
+ </goal>
+ <goal name="ex3">
+ <proof prover="0" obsolete="true"><result status="valid" time="0.02" steps="97"/></proof>
+ <proof prover="1" obsolete="true"><result status="timeout" time="1.00"/></proof>
+ </goal>
+ <goal name="ex4" proved="true">
+ <proof prover="0"><result status="valid" time="0.02" steps="97"/></proof>
+ </goal>
+ <goal name="ex5">
+ <proof prover="0" obsolete="true"><result status="valid" time="0.02" steps="97"/></proof>
+ </goal>
+ <goal name="ex6">
+ <proof prover="0" obsolete="true"><result status="valid" time="0.01" steps="74"/></proof>
+ </goal>
+ <goal name="ex7">
+ <proof prover="0" obsolete="true"><result status="valid" time="0.02" steps="84"/></proof>
+ </goal>
+ <goal name="ex8">
+ <proof prover="0" obsolete="true"><result status="valid" time="0.03" steps="100"/></proof>
+ </goal>
+</theory>
+</file>
+<file name="../imp_ex.mlw" proved="true">
+<theory name="Imp_Ex" proved="true">
+ <goal name="VC aeval_ex" expl="VC for aeval_ex" proved="true">
+ <proof prover="0"><result status="valid" time="0.52" steps="783"/></proof>
+ </goal>
+ <goal name="VC beval_ex" expl="VC for beval_ex" proved="true">
+ <proof prover="0"><result status="valid" time="0.22" steps="667"/></proof>
+ </goal>
+ <goal name="VC ceval_ex" expl="VC for ceval_ex" proved="true">
+ <proof prover="0"><result status="valid" time="0.08" steps="237"/></proof>
+ </goal>
+</theory>
+</file>
+<file name="../imp_ex_assignment.mlw">
+<theory name="Imp_ex">
+ <goal name="VC aeval_ex" expl="VC for aeval_ex" proved="true">
+ <proof prover="0"><result status="valid" time="0.68" steps="783"/></proof>
+ </goal>
+ <goal name="VC beval_ex" expl="VC for beval_ex" proved="true">
+ <proof prover="0"><result status="valid" time="0.20" steps="667"/></proof>
+ </goal>
+ <goal name="VC ceval_ex" expl="VC for ceval_ex">
+ <transf name="split_vc" >
+  <goal name="VC ceval_ex.0" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.02" steps="74"/></proof>
+  </goal>
+  <goal name="VC ceval_ex.1" expl="postcondition">
+  <proof prover="0"><result status="timeout" time="1.00"/></proof>
+  </goal>
+  <goal name="VC ceval_ex.2" expl="postcondition">
+  <proof prover="0"><result status="timeout" time="1.00"/></proof>
+  </goal>
+  <goal name="VC ceval_ex.3" expl="postcondition">
+  <proof prover="0"><result status="timeout" time="1.00"/></proof>
+  </goal>
+  <goal name="VC ceval_ex.4" expl="postcondition">
+  <proof prover="0"><result status="timeout" time="1.00"/></proof>
+  </goal>
+ </transf>
+ </goal>
+</theory>
+</file>
+<file name="../imp.mlw" proved="true">
+<theory name="Imp" proved="true">
+ <goal name="ceval_deterministic_aux" proved="true">
+ <transf name="induction_pr" proved="true" >
+  <goal name="ceval_deterministic_aux.0" proved="true">
+  <proof prover="0"><result status="valid" time="0.05" steps="135"/></proof>
+  </goal>
+  <goal name="ceval_deterministic_aux.1" proved="true">
+  <proof prover="0"><result status="valid" time="0.08" steps="180"/></proof>
+  </goal>
+  <goal name="ceval_deterministic_aux.2" proved="true">
+  <transf name="induction_pr" proved="true" >
+   <goal name="ceval_deterministic_aux.2.0" proved="true">
+   <proof prover="0"><result status="valid" time="0.02" steps="84"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.2.1" proved="true">
+   <proof prover="0"><result status="valid" time="0.03" steps="86"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.2.2" proved="true">
+   <proof prover="0" obsolete="true"><result status="timeout" time="1.00"/></proof>
+   <proof prover="1"><result status="valid" time="0.11"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.2.3" proved="true">
+   <proof prover="0"><result status="valid" time="0.03" steps="86"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.2.4" proved="true">
+   <proof prover="0"><result status="valid" time="0.03" steps="86"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.2.5" proved="true">
+   <proof prover="0"><result status="valid" time="0.02" steps="85"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.2.6" proved="true">
+   <proof prover="0"><result status="valid" time="0.02" steps="87"/></proof>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="ceval_deterministic_aux.3" proved="true">
+  <transf name="induction_pr" proved="true" >
+   <goal name="ceval_deterministic_aux.3.0" proved="true">
+   <proof prover="0"><result status="valid" time="0.02" steps="84"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.3.1" proved="true">
+   <proof prover="0"><result status="valid" time="0.02" steps="86"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.3.2" proved="true">
+   <proof prover="0"><result status="valid" time="0.03" steps="86"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.3.3" proved="true">
+   <proof prover="0" obsolete="true"><result status="timeout" time="1.00"/></proof>
+   <proof prover="1"><result status="valid" time="0.06"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.3.4" proved="true">
+   <proof prover="0"><result status="valid" time="0.03" steps="86"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.3.5" proved="true">
+   <proof prover="0"><result status="valid" time="0.03" steps="85"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.3.6" proved="true">
+   <proof prover="0"><result status="valid" time="0.02" steps="87"/></proof>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="ceval_deterministic_aux.4" proved="true">
+  <transf name="induction_pr" proved="true" >
+   <goal name="ceval_deterministic_aux.4.0" proved="true">
+   <proof prover="0"><result status="valid" time="0.02" steps="84"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.4.1" proved="true">
+   <proof prover="0"><result status="valid" time="0.03" steps="86"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.4.2" proved="true">
+   <proof prover="0"><result status="valid" time="0.02" steps="86"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.4.3" proved="true">
+   <proof prover="0"><result status="valid" time="0.03" steps="86"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.4.4" proved="true">
+   <proof prover="0" obsolete="true"><result status="timeout" time="1.00"/></proof>
+   <proof prover="1"><result status="valid" time="0.06"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.4.5" proved="true">
+   <proof prover="0"><result status="valid" time="0.02" steps="85"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.4.6" proved="true">
+   <proof prover="0"><result status="valid" time="0.02" steps="87"/></proof>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="ceval_deterministic_aux.5" proved="true">
+  <proof prover="0"><result status="valid" time="0.05" steps="133"/></proof>
+  </goal>
+  <goal name="ceval_deterministic_aux.6" proved="true">
+  <transf name="induction_pr" proved="true" >
+   <goal name="ceval_deterministic_aux.6.0" proved="true">
+   <proof prover="0"><result status="valid" time="0.02" steps="85"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.6.1" proved="true">
+   <proof prover="0"><result status="valid" time="0.03" steps="87"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.6.2" proved="true">
+   <proof prover="0"><result status="valid" time="0.03" steps="87"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.6.3" proved="true">
+   <proof prover="0"><result status="valid" time="0.03" steps="87"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.6.4" proved="true">
+   <proof prover="0"><result status="valid" time="0.02" steps="87"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.6.5" proved="true">
+   <proof prover="0"><result status="valid" time="0.02" steps="86"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.6.6" proved="true">
+   <proof prover="0" obsolete="true"><result status="timeout" time="1.00"/></proof>
+   <proof prover="1"><result status="valid" time="0.11"/></proof>
+   </goal>
+  </transf>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="ceval_deterministic" proved="true">
+ <proof prover="0"><result status="valid" time="0.03" steps="107"/></proof>
+ </goal>
+ <goal name="VC beval">
+ <proof prover="0"><result status="valid" time="0.02" steps="73"/></proof>
+ </goal>
+ <goal name="VC aeval">
+ <proof prover="0"><result status="valid" time="0.01" steps="73"/></proof>
+ </goal>
+</theory>
+</file>
+</why3session>
diff --git a/imp_test/why3session.xml.bak b/imp_test/why3session.xml.bak
new file mode 100644
index 0000000..428557c
--- /dev/null
+++ b/imp_test/why3session.xml.bak
@@ -0,0 +1,238 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE why3session PUBLIC "-//Why3//proof session v5//EN"
+"http://why3.lri.fr/why3session.dtd">
+<why3session shape_version="5">
+<prover id="0" name="Alt-Ergo" version="2.0.0" timelimit="1" steplimit="0" memlimit="1000"/>
+<prover id="1" name="CVC4" version="1.4" timelimit="1" steplimit="0" memlimit="1000"/>
+<file name="../state.mlw" proved="true">
+<theory name="State" proved="true">
+ <goal name="VC get" expl="VC for get" proved="true">
+ <proof prover="0"><result status="valid" time="0.00" steps="1"/></proof>
+ </goal>
+ <goal name="VC set" expl="VC for set" proved="true">
+ <proof prover="0"><result status="valid" time="0.00" steps="1"/></proof>
+ </goal>
+ <goal name="VC mixfix []" expl="VC for mixfix []" proved="true">
+ <proof prover="0"><result status="valid" time="0.00" steps="1"/></proof>
+ </goal>
+ <goal name="VC mixfix [&lt;-]" expl="VC for mixfix [<-]" proved="true">
+ <proof prover="0"><result status="valid" time="0.00" steps="1"/></proof>
+ </goal>
+ <goal name="VC const" expl="VC for const" proved="true">
+ <proof prover="0"><result status="valid" time="0.00" steps="2"/></proof>
+ </goal>
+</theory>
+<theory name="Reg" proved="true">
+ <goal name="VC read" expl="VC for read" proved="true">
+ <proof prover="0"><result status="valid" time="0.00" steps="1"/></proof>
+ </goal>
+ <goal name="VC write" expl="VC for write" proved="true">
+ <proof prover="0"><result status="valid" time="0.00" steps="1"/></proof>
+ </goal>
+ <goal name="VC const" expl="VC for const" proved="true">
+ <proof prover="0"><result status="valid" time="0.00" steps="2"/></proof>
+ </goal>
+</theory>
+</file>
+<file name="../imp_test.mlw">
+<theory name="Imp_test">
+ <goal name="ex1" proved="true">
+ <proof prover="0"><result status="valid" time="0.02" steps="82"/></proof>
+ </goal>
+ <goal name="ex2" proved="true">
+ <proof prover="0"><result status="valid" time="0.03" steps="101"/></proof>
+ </goal>
+ <goal name="ex3" proved="true">
+ <proof prover="0"><result status="valid" time="0.02" steps="97"/></proof>
+ <proof prover="1" obsolete="true"><result status="timeout" time="1.00"/></proof>
+ </goal>
+ <goal name="ex4">
+ <proof prover="0" obsolete="true"><result status="valid" time="0.02" steps="97"/></proof>
+ </goal>
+ <goal name="ex5">
+ <proof prover="0" obsolete="true"><result status="valid" time="0.02" steps="97"/></proof>
+ </goal>
+ <goal name="ex6">
+ <proof prover="0" obsolete="true"><result status="valid" time="0.01" steps="74"/></proof>
+ </goal>
+ <goal name="ex7">
+ <proof prover="0" obsolete="true"><result status="valid" time="0.02" steps="84"/></proof>
+ </goal>
+ <goal name="ex8">
+ <proof prover="0" obsolete="true"><result status="valid" time="0.03" steps="100"/></proof>
+ </goal>
+</theory>
+</file>
+<file name="../imp_ex_assignment.mlw">
+<theory name="Imp_ex">
+ <goal name="VC aeval_ex" expl="VC for aeval_ex" proved="true">
+ <proof prover="0"><result status="valid" time="0.68" steps="783"/></proof>
+ </goal>
+ <goal name="VC beval_ex" expl="VC for beval_ex" proved="true">
+ <proof prover="0"><result status="valid" time="0.20" steps="667"/></proof>
+ </goal>
+ <goal name="VC ceval_ex" expl="VC for ceval_ex">
+ <transf name="split_vc" >
+  <goal name="VC ceval_ex.0" expl="postcondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.02" steps="74"/></proof>
+  </goal>
+  <goal name="VC ceval_ex.1" expl="postcondition">
+  <proof prover="0"><result status="timeout" time="1.00"/></proof>
+  </goal>
+  <goal name="VC ceval_ex.2" expl="postcondition">
+  <proof prover="0"><result status="timeout" time="1.00"/></proof>
+  </goal>
+  <goal name="VC ceval_ex.3" expl="postcondition">
+  <proof prover="0"><result status="timeout" time="1.00"/></proof>
+  </goal>
+  <goal name="VC ceval_ex.4" expl="postcondition">
+  <proof prover="0"><result status="timeout" time="1.00"/></proof>
+  </goal>
+ </transf>
+ </goal>
+</theory>
+</file>
+<file name="../imp_ex.mlw" proved="true">
+<theory name="Imp_Ex" proved="true">
+ <goal name="VC aeval_ex" expl="VC for aeval_ex" proved="true">
+ <proof prover="0"><result status="valid" time="0.52" steps="783"/></proof>
+ </goal>
+ <goal name="VC beval_ex" expl="VC for beval_ex" proved="true">
+ <proof prover="0"><result status="valid" time="0.22" steps="667"/></proof>
+ </goal>
+ <goal name="VC ceval_ex" expl="VC for ceval_ex" proved="true">
+ <proof prover="0"><result status="valid" time="0.08" steps="237"/></proof>
+ </goal>
+</theory>
+</file>
+<file name="../imp.mlw" proved="true">
+<theory name="Imp" proved="true">
+ <goal name="ceval_deterministic_aux" proved="true">
+ <transf name="induction_pr" proved="true" >
+  <goal name="ceval_deterministic_aux.0" proved="true">
+  <proof prover="0"><result status="valid" time="0.05" steps="135"/></proof>
+  </goal>
+  <goal name="ceval_deterministic_aux.1" proved="true">
+  <proof prover="0"><result status="valid" time="0.08" steps="180"/></proof>
+  </goal>
+  <goal name="ceval_deterministic_aux.2" proved="true">
+  <transf name="induction_pr" proved="true" >
+   <goal name="ceval_deterministic_aux.2.0" proved="true">
+   <proof prover="0"><result status="valid" time="0.02" steps="84"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.2.1" proved="true">
+   <proof prover="0"><result status="valid" time="0.03" steps="86"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.2.2" proved="true">
+   <proof prover="0" obsolete="true"><result status="timeout" time="1.00"/></proof>
+   <proof prover="1"><result status="valid" time="0.11"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.2.3" proved="true">
+   <proof prover="0"><result status="valid" time="0.03" steps="86"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.2.4" proved="true">
+   <proof prover="0"><result status="valid" time="0.03" steps="86"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.2.5" proved="true">
+   <proof prover="0"><result status="valid" time="0.02" steps="85"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.2.6" proved="true">
+   <proof prover="0"><result status="valid" time="0.02" steps="87"/></proof>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="ceval_deterministic_aux.3" proved="true">
+  <transf name="induction_pr" proved="true" >
+   <goal name="ceval_deterministic_aux.3.0" proved="true">
+   <proof prover="0"><result status="valid" time="0.02" steps="84"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.3.1" proved="true">
+   <proof prover="0"><result status="valid" time="0.02" steps="86"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.3.2" proved="true">
+   <proof prover="0"><result status="valid" time="0.03" steps="86"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.3.3" proved="true">
+   <proof prover="0" obsolete="true"><result status="timeout" time="1.00"/></proof>
+   <proof prover="1"><result status="valid" time="0.06"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.3.4" proved="true">
+   <proof prover="0"><result status="valid" time="0.03" steps="86"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.3.5" proved="true">
+   <proof prover="0"><result status="valid" time="0.03" steps="85"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.3.6" proved="true">
+   <proof prover="0"><result status="valid" time="0.02" steps="87"/></proof>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="ceval_deterministic_aux.4" proved="true">
+  <transf name="induction_pr" proved="true" >
+   <goal name="ceval_deterministic_aux.4.0" proved="true">
+   <proof prover="0"><result status="valid" time="0.02" steps="84"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.4.1" proved="true">
+   <proof prover="0"><result status="valid" time="0.03" steps="86"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.4.2" proved="true">
+   <proof prover="0"><result status="valid" time="0.02" steps="86"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.4.3" proved="true">
+   <proof prover="0"><result status="valid" time="0.03" steps="86"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.4.4" proved="true">
+   <proof prover="0" obsolete="true"><result status="timeout" time="1.00"/></proof>
+   <proof prover="1"><result status="valid" time="0.06"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.4.5" proved="true">
+   <proof prover="0"><result status="valid" time="0.02" steps="85"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.4.6" proved="true">
+   <proof prover="0"><result status="valid" time="0.02" steps="87"/></proof>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="ceval_deterministic_aux.5" proved="true">
+  <proof prover="0"><result status="valid" time="0.05" steps="133"/></proof>
+  </goal>
+  <goal name="ceval_deterministic_aux.6" proved="true">
+  <transf name="induction_pr" proved="true" >
+   <goal name="ceval_deterministic_aux.6.0" proved="true">
+   <proof prover="0"><result status="valid" time="0.02" steps="85"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.6.1" proved="true">
+   <proof prover="0"><result status="valid" time="0.03" steps="87"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.6.2" proved="true">
+   <proof prover="0"><result status="valid" time="0.03" steps="87"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.6.3" proved="true">
+   <proof prover="0"><result status="valid" time="0.03" steps="87"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.6.4" proved="true">
+   <proof prover="0"><result status="valid" time="0.02" steps="87"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.6.5" proved="true">
+   <proof prover="0"><result status="valid" time="0.02" steps="86"/></proof>
+   </goal>
+   <goal name="ceval_deterministic_aux.6.6" proved="true">
+   <proof prover="0" obsolete="true"><result status="timeout" time="1.00"/></proof>
+   <proof prover="1"><result status="valid" time="0.11"/></proof>
+   </goal>
+  </transf>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="ceval_deterministic" proved="true">
+ <proof prover="0"><result status="valid" time="0.03" steps="107"/></proof>
+ </goal>
+ <goal name="VC beval">
+ <proof prover="0"><result status="valid" time="0.02" steps="73"/></proof>
+ </goal>
+ <goal name="VC aeval">
+ <proof prover="0"><result status="valid" time="0.01" steps="73"/></proof>
+ </goal>
+</theory>
+</file>
+</why3session>
diff --git a/imp_test/why3shapes.gz b/imp_test/why3shapes.gz
new file mode 100644
index 0000000000000000000000000000000000000000..527dbbaaa0a8756a227cdfe895f87a3dc77d2479
GIT binary patch
literal 3238
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

literal 0
HcmV?d00001

diff --git a/imp_test/why3shapes.gz.bak b/imp_test/why3shapes.gz.bak
new file mode 100644
index 0000000000000000000000000000000000000000..f0927eda25523e6df29d23ed01f9d1f0349555b8
GIT binary patch
literal 3230
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
azw9I<6y;~|C!u`vFZo8M6UK_33=9BI`cpsv

literal 0
HcmV?d00001

diff --git a/logic.mlw b/logic.mlw
new file mode 100644
index 0000000..ba4af07
--- /dev/null
+++ b/logic.mlw
@@ -0,0 +1,160 @@
+
+(* Program logic (hoare logic + weakest preconditions) over
+   Virtual Machine language. *)
+module Compiler_logic
+
+  use int.Int
+  use list.List
+  use list.Length
+  use list.Append
+  use vm.Vm
+  use state.State
+
+  function fst (p: ('a,'b)) : 'a = let (x,_) = p in x
+  meta rewrite_def function fst
+
+  function snd (p: ('a,'b)) : 'b = let (_,y) = p in y
+  meta rewrite_def function snd
+
+  predicate (-->) (x y:'a) = [@rewrite] x = y
+  meta rewrite_def predicate (-->)
+
+  (* Unary predicates over machine states *)
+  type pred  = machine_state -> bool
+
+  (* Binary predicates over machine states *)
+  type rel  = machine_state -> pred
+
+  (* pre/post-conditions types, as parameterized unary/binary predicates.
+     'a represents auxiliary variables
+     pos is an auxiliary variable representing the absolute position at which
+     the code is loaded. *)
+  type pre 'a = 'a -> pos -> pred
+  type post 'a = 'a -> pos -> rel
+
+  (* Machine transition valid whatever the global code is. *)
+  predicate contextual_irrelevance (c:code) (p:pos) (ms1 ms2:machine_state) =
+    forall c_glob. codeseq_at c_glob p c -> transition_star c_glob ms1 ms2
+
+  (* Hoare triples with explicit pre & post *)
+  type hl 'a = { code: code; ghost pre : pre 'a; ghost post: post 'a }
+    (* (Total) correctness for hoare triple. *)
+    invariant { forall x:'a,p ms. pre x p ms ->
+      exists ms'. post x p ms ms' /\ contextual_irrelevance code p ms ms' }
+    by { code = Nil; pre = (fun _ _ _ -> false); post = fun _ _ _ _ -> true }
+
+  (* Predicate transformer type. Same auxiliary variables as for
+     Hoare triples. *)
+  type wp_trans 'a = 'a -> pos -> pred -> pred
+
+  (* Code with backward predicate transformer. *)
+  type wp 'a = { wcode : code; ghost wp : wp_trans 'a }
+    (* Similar invariant for backward predicate transformers *)
+    invariant { forall x:'a,p post ms. wp x p post ms ->
+      exists ms'. post ms' /\ contextual_irrelevance wcode p ms ms' }
+    by { wcode = Nil; wp = fun _ _ _ _ -> false }
+
+  (* WP combinator for sequence. Similar to the standard WP calculus
+     for sequence. The initial machine state is memorized in auxiliary
+     variables for potential use in the second code specification. *)
+  function seq_wp
+    (l1:int) (w1:wp_trans 'a) (w2:wp_trans ('a,machine_state)) : wp_trans 'a =
+    fun x p q ms -> w1 x p (w2 (x,ms) (p+l1) q) ms
+
+  lemma seq_wp_lemma: [@rewrite] forall l1,w1: wp_trans 'a,w2 x p q ms.
+      seq_wp l1 w1 w2 x p q ms = w1 x p (w2 (x,ms) (p+l1) q) ms
+
+  (* Code combinator for sequence, with wp. *)
+  let (--) (s1 : wp 'a) (s2 : wp ('a, machine_state)) : wp 'a
+    ensures  { result.wcode.length --> s1.wcode.length + s2.wcode.length }
+    ensures  { result.wp --> seq_wp s1.wcode.length s1.wp s2.wp }
+  = let code = s1.wcode ++ s2.wcode in
+    let res = { wcode = code; wp = seq_wp s1.wcode.length s1.wp s2.wp } in
+    assert { forall x: 'a, p post ms. res.wp x p post ms ->
+      not (exists ms'. post ms' /\ contextual_irrelevance res.wcode p ms ms') ->
+        (forall ms'. s2.wp (x,ms) (p + s1.wcode.length) post ms' /\
+           contextual_irrelevance res.wcode p ms ms' -> false) && false };
+    res
+
+  function fork_wp (w:wp_trans 'a) (cond:pre 'a) : wp_trans 'a =
+    fun x p q ms -> if cond x p ms then w x p q ms else q ms
+
+  lemma fork_wp_lemma: [@rewrite] forall w:wp_trans 'a,cond x p q ms.
+    fork_wp w cond x p q ms =
+      ((not cond x p ms -> q ms) /\ (cond x p ms -> w x p q ms))
+
+  (* Code combinator for conditional execution.
+     Similar to WP calculus for (if cond then s). *)
+
+  let (%) (s:wp 'a) (ghost cond:pre 'a) : wp 'a
+    ensures  { result.wp --> fork_wp s.wp cond }
+    ensures  { result.wcode.length --> s.wcode.length }
+  = { wcode = s.wcode; wp = fork_wp s.wp cond }
+
+  (* WP transformer for hoare triples. *)
+  function towp_wp (pr:pre 'a) (ps:post 'a) : wp_trans 'a =
+    fun x p q ms -> pr x p ms && (forall ms'. ps x p ms ms' -> q ms')
+
+  lemma towp_wp_lemma: [@rewrite]
+    forall pr ps, x:'a, p q ms. towp_wp pr ps x p q ms =
+      (pr x p ms && (forall ms'. ps x p ms ms' -> q ms'))
+
+  (* Unwrap code with hoare triple into code with wp.
+     Analogous to procedure call/abstract block. *)
+  let ($_) (c:hl 'a) : wp 'a
+    ensures  { result.wcode.length --> c.code.length }
+    ensures  { result.wp --> towp_wp c.pre c.post }
+  = { wcode = c.code; wp = towp_wp c.pre c.post }
+
+  (* Equip code with pre/post-condition. That is here that proof happen.
+     (P -> wp (c,Q)). Anologous to checking function/abstract block
+     specification. *)
+  let hoare (ghost pre:pre 'a) (c:wp 'a) (ghost post:post 'a) : hl 'a
+    requires { forall x p ms. pre x p ms -> (c.wp x p (post x p ms)) ms }
+    ensures { result.pre --> pre }
+    ensures { result.post --> post }
+    ensures  { result.code.length --> c.wcode.length }
+  = { code = c.wcode ; pre = pre; post = post }
+
+  function trivial_pre: pre 'a = fun _ p ms -> let VMS p' _ _ _ = ms in p = p'
+  meta rewrite_def function trivial_pre 
+
+  (* Accessibility predicate. *)
+  inductive acc ('a -> 'a -> bool) 'a =
+    | Acc : forall r, x:'a. (forall y. r y x -> acc r y) -> acc r x
+
+  (* Utility: some flavor of conjonction. *)
+  function pconj (p1:pred) (x:machine_state)
+                 (p2:machine_state -> pred) : pred =
+                 fun y -> p1 y && p2 y x
+  lemma pconj_lemma:[@rewrite] forall p1 x p2 y. pconj p1 x p2 y <-> p1 y && p2 y x
+
+  (* WP combinator for looping construction. Similar to weakest precondition
+     for while loops. *)
+
+  function loop_wp (w:wp_trans 'a) (inv cont:pre 'a)
+                                   (var:post 'a) : wp_trans 'a =
+    fun x p q ms -> inv x p ms && acc (var x p) ms && forall ms'. inv x p ms' ->
+      if cont x p ms'
+      then w x p (pconj (inv x p) ms' (var x p)) ms'
+      else w x p q ms'
+
+  lemma loop_wp_lemma: [@rewrite] forall w:wp_trans 'a,inv cont var x p q ms.
+    loop_wp w inv cont var x p q ms <->
+      inv x p ms && acc (var x p) ms && forall ms'. inv x p ms' ->
+        (cont x p ms' -> w x p (pconj (inv x p) ms' (var x p)) ms')
+        /\ (not cont x p ms' -> w x p q ms')
+
+  (* Code combinator for looping construct. *)
+  let make_loop (c:wp 'a) (ghost inv cont:pre 'a)
+                          (ghost var:post 'a) : wp 'a
+    ensures { result.wp --> loop_wp c.wp inv cont var }
+    ensures { result.wcode.length --> c.wcode.length }
+  = let ghost wpt = loop_wp c.wp inv cont var in
+    assert { forall x p q ms0. wpt x p q ms0 ->
+      forall ms. inv x p ms -> acc (var x p) ms ->
+        exists ms'. contextual_irrelevance c.wcode p ms ms' /\ q ms'
+    };
+    { wcode = c.wcode; wp = wpt }
+
+end
diff --git a/logic/why3session.xml b/logic/why3session.xml
new file mode 100644
index 0000000..db8eea6
--- /dev/null
+++ b/logic/why3session.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE why3session PUBLIC "-//Why3//proof session v5//EN"
+"http://why3.lri.fr/why3session.dtd">
+<why3session shape_version="4">
+<prover id="3" name="Z3" version="4.7.1" alternative="counterexamples" timelimit="5" steplimit="0" memlimit="2000"/>
+<prover id="4" name="CVC4" version="1.6" alternative="counterexamples" timelimit="5" steplimit="0" memlimit="1000"/>
+<prover id="5" name="Alt-Ergo" version="2.0.0" timelimit="1" steplimit="0" memlimit="1000"/>
+<file name="../logic.mlw" proved="true">
+<theory name="Compiler_logic" proved="true">
+ <goal name="VC hl" expl="VC for hl" proved="true">
+ <proof prover="5"><result status="valid" time="0.01" steps="76"/></proof>
+ </goal>
+ <goal name="VC wp" expl="VC for wp" proved="true">
+ <proof prover="5"><result status="valid" time="0.02" steps="76"/></proof>
+ </goal>
+ <goal name="seq_wp_lemma" proved="true">
+ <proof prover="5"><result status="valid" time="0.02" steps="75"/></proof>
+ </goal>
+ <goal name="VC infix --" expl="VC for infix --" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC infix --.0" expl="precondition" proved="true">
+  <proof prover="5"><result status="valid" time="0.02" steps="161"/></proof>
+  </goal>
+  <goal name="VC infix --.1" expl="assertion" proved="true">
+  <proof prover="5"><result status="valid" time="0.05" steps="98"/></proof>
+  </goal>
+  <goal name="VC infix --.2" expl="postcondition" proved="true">
+  <proof prover="5"><result status="valid" time="0.02" steps="84"/></proof>
+  </goal>
+  <goal name="VC infix --.3" expl="postcondition" proved="true">
+  <proof prover="5"><result status="valid" time="0.03" steps="78"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="fork_wp_lemma" proved="true">
+ <proof prover="5"><result status="valid" time="0.03" steps="84"/></proof>
+ </goal>
+ <goal name="VC infix %" expl="VC for infix %" proved="true">
+ <proof prover="4"><result status="valid" time="0.21"/></proof>
+ </goal>
+ <goal name="towp_wp_lemma" proved="true">
+ <proof prover="5"><result status="valid" time="0.04" steps="96"/></proof>
+ </goal>
+ <goal name="VC prefix $" expl="VC for prefix $" proved="true">
+ <proof prover="5"><result status="valid" time="0.05" steps="103"/></proof>
+ </goal>
+ <goal name="VC hoare" expl="VC for hoare" proved="true">
+ <proof prover="3"><result status="valid" time="0.07"/></proof>
+ </goal>
+ <goal name="pconj_lemma" proved="true">
+ <proof prover="5"><result status="valid" time="0.03" steps="79"/></proof>
+ </goal>
+ <goal name="loop_wp_lemma" proved="true">
+ <proof prover="3"><result status="valid" time="0.06"/></proof>
+ </goal>
+ <goal name="VC make_loop" expl="VC for make_loop" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC make_loop.0" expl="assertion" proved="true">
+  <transf name="induction_pr" proved="true" >
+   <goal name="VC make_loop.0.0" expl="assertion" proved="true">
+   <proof prover="3"><result status="valid" time="0.07"/></proof>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC make_loop.1" expl="precondition" proved="true">
+  <proof prover="5"><result status="valid" time="0.02" steps="94"/></proof>
+  </goal>
+  <goal name="VC make_loop.2" expl="postcondition" proved="true">
+  <proof prover="5"><result status="valid" time="0.05" steps="77"/></proof>
+  </goal>
+  <goal name="VC make_loop.3" expl="postcondition" proved="true">
+  <proof prover="5"><result status="valid" time="0.02" steps="77"/></proof>
+  </goal>
+ </transf>
+ </goal>
+</theory>
+</file>
+</why3session>
diff --git a/logic/why3shapes.gz b/logic/why3shapes.gz
new file mode 100644
index 0000000000000000000000000000000000000000..a1dff018b0ac3096ed3ce784d017d8a1e930ca39
GIT binary patch
literal 1434
zcmb2|=3oGW|8FC_^QFxN_Pq{&abaE)gUr54kHEz%7?|Dsj>a`VTwS<0s_V^_pFii;
zdftj%d(^jyiIs<A+E#0o^nE{{9h}ItL`2HzN@JmFh0D1$UI{xMT<b3VdfVzf-|PNp
zp55)szkGekoo9bXo-cFuzk}@)KK%W=?a|Z~Pk8UyKl#1>b@|=z>x=KN4A~Ggb)8SD
zc6+_dz9qh_Z#~bhzn{N8H+W;2<L)2dYCCOe7ckw^ySYY)YwgVI*BUnqFo%1so?`LY
z@W>e-{_~&zrB<XYRr@eOb=8GQ8(n2tSk30Hm2ub^S-5xx_Y3228;1so$PXDYryk5T
z%Z%M+YPamX{Jih#ceA#~US*fkes*sX^S(FRSKeE9{}pfUnOAGgS5Me<eq!_o8^y`f
z5;+2wWGHj>Jo30z_VD)h8~;CZPnx$WSYrFjhv%2~|Bxv&3|&)q^-tq$<DZQ_>)+4*
zc<G@3j+5p;%li25`aR+O<XU*br0VO86{qA3FDi$gIR5TLFOz74Z)N6-mrhA$JH9=<
zHMc(I_8#Ho#lJrPe3s_s`bhACdsu;Dj>Cn=OB<DM?Z^`=KUiGe%U*7KD&OyY6n}o$
zMMmbMoz;!5Pp6j8WX(1;nCK9_^ParWO|kd$-<9)!4qGL)er4w_=E8}Mvj6N4Sgf7G
zk<e&4*LRDN#!=Q)0)e+y99Z-5qoHip>A0D3C%(K_mKG10QM^Gd(z8?}TQPLfk?kB|
zFSgu!FE`&W=l8xhrN3WY{(oq>NTj3Z!xbAlBpf1I!zvxR9o@d9U0bdy`sUkI=KtJ$
z8LUP>I3{c^m?$}wh2w0XlJnx&LT<MerE|j<|NMGx$J;AWFEwk9*RI=s=DBpO-mzJ;
zHv2E0wz0KlX-rR8%Hqx4ae=FIEBP8Utute}5^vo4YjghdLi=;kyVM%2csGP5J;}8D
zx@E@u&?7!7GM#%CbbVH2eqZ(Xy&G44n9>s!l^rsgg)ECEh|H5#wuyQ_saN>jm4`vc
z`ZgBtE}gx4<GqUon$q*i&i_80<8dX{Fl)`6ZYJKgIl+ImrH;<@j{BCgAZ_)%SIZYp
zcinG%sk&>o)ndMt1`3@o>bFhcw@~!k-ZW46(bIolkC&Diyn9pS6|<@DU8&FIzf<28
z3$+;WnW%W)xY(<ws%9yZ|Hay7iKf`}L+J&|S?4UfCqBEmuy3OAiDORht0rD<-gICW
zOH$$&5nc|q1K+OZ2l}p#iOqQyTJ$%7k*nDF^>mqbfr)>n6$jjsPMz#IsY$NM$Ih+Y
z=j^mjwOI*jCpYIA81-JZ{rPzP!w*aJLZvD%N$3{r$~dmFXtLTOM%l<I-d>^J>CsV1
zvtD|t$DM0^HsjiqnH`%ZKY#RQ$?LjD-Af+&%+lyrJR_68Zu!kJ{mlkv^U8M@&a$0Y
zuj)Ewl5)^HhbQ+WpE+9YN{bLwvE1h`UH^FbmxcGT^m_Y#?+ko-b+24SQ0j!NuRm2b
z-rf}SInv40R-yIult=6M7qQ+9+ZMcOU!%>`2i(mZk&Q1iekLtGHEUzDT4vCbP0x2<
zY|&E;(zkvWw0`zAeurO-T#@Eq*;uV(KW`N<eECaF$hfF`p5Z)}$ti~O-u)N$>6`mK
z)T4y?la7L^c`T<??}H)@x7ur}5=*8{EXrGEVUXavfs2J{QQ`{KraDQsI4)=78Cn`)
zYgb-Bb%JGATD{rPW!C~lUq=Kli*er>;eIQAOXkL9tux|ZNwJk5{JGe6U5kJY+xrRZ
z+95tZ+<aF8s+YXee6eU{+})o$yRQfB{u6a8rs({$Z^uhazCPDfkMVb(!Y<-@e)(dv
z(<>I0Tsc|iY&EMdMZeOuVDjFRjB7XDshnoWk#DKcoHC`ZFyzzPr_WgD#1`h<PR@yU
zyJ;e%DzSaiX+gQ`o4S{5SCA~2Z{q%N!n=uT%Q+&R+nf+MwXFN`ruyHn+FR>>h)-X-
Kjk#NvfdK$$$IUwc

literal 0
HcmV?d00001

diff --git a/ocaml64_bv.drv b/ocaml64_bv.drv
new file mode 100644
index 0000000..55f3afd
--- /dev/null
+++ b/ocaml64_bv.drv
@@ -0,0 +1,72 @@
+
+(** OCaml bv, driver for 64-bit architecture *)
+
+printer "ocaml"
+
+
+
+module bv.BV32
+  syntax type     t     "int32"
+
+  syntax val zeros      "SHOULD_NOT_BE_HERE"
+  syntax val one      "SHOULD_NOT_BE_HERE"
+  syntax val ones      "SHOULD_NOT_BE_HERE"
+  syntax val bw_and      "SHOULD_NOT_BE_HERE"
+  syntax val bw_or      "SHOULD_NOT_BE_HERE"
+  syntax val bw_xor      "SHOULD_NOT_BE_HERE"
+  syntax val bw_not      "SHOULD_NOT_BE_HERE"
+  syntax val lsr      "SHOULD_NOT_BE_HERE"
+  syntax val asr      "SHOULD_NOT_BE_HERE"
+  syntax val lsl      "SHOULD_NOT_BE_HERE"
+  syntax val to_uint      "SHOULD_NOT_BE_HERE"
+  syntax val to_int      "Z.of_int (Int32.to_int %1)"
+  syntax val of_int      "Int32.of_int(Z.to_int %1)"
+  syntax val add      "Int32.add %1 %2"
+  syntax val sub      "SHOULD_NOT_BE_HERE"
+  syntax val neg      "SHOULD_NOT_BE_HERE"
+  syntax val mul      "SHOULD_NOT_BE_HERE"
+  syntax val udiv      "SHOULD_NOT_BE_HERE"
+  syntax val urem      "SHOULD_NOT_BE_HERE"
+ syntax val nth      "SHOULD_NOT_BE_HERE"
+ syntax val lsr_bv      "SHOULD_NOT_BE_HERE"
+ syntax val asr_bv      "SHOULD_NOT_BE_HERE"
+  syntax val lsl_bv      "SHOULD_NOT_BE_HERE"
+  syntax val rotate_right_bv      "SHOULD_NOT_BE_HERE"
+ syntax val rotate_left_bv      "SHOULD_NOT_BE_HERE"
+ syntax val nth_bv      "SHOULD_NOT_BE_HERE"
+syntax val eq      "SHOULD_NOT_BE_HERE"
+syntax val nth_bv      "SHOULD_NOT_BE_HERE"
+syntax val nth_bv      "SHOULD_NOT_BE_HERE"
+
+(*
+  syntax literal   int63    "%1"
+  syntax converter of_int   "%1"
+
+  syntax val of_int "Z.to_int %1"
+  syntax val to_int "Z.of_int %1"
+
+  syntax constant min_int63 "Z.of_int min_int"
+  syntax constant max_int63 "Z.of_int max_int"
+  syntax constant min_int   "min_int"
+  syntax constant max_int   "max_int"
+  syntax constant zero      "0"
+  syntax constant one       "1"
+  syntax val      ( + )     "%1 + %2"
+  syntax val      ( - )     "%1 - %2"
+  syntax val      (-_)      "- %1"
+  syntax val      ( * )     "%1 * %2"
+  syntax val      ( / )     "%1 / %2"
+  syntax val      ( % )     "%1 mod %2"
+  syntax val      (=)       "%1 = %2"
+  syntax val      (<=)      "%1 <= %2"
+  syntax val      (<)       "%1 < %2"
+  syntax val      (>=)      "%1 >= %2"
+  syntax val      (>)       "%1 > %2"
+*)
+
+(*
+  syntax val      to_bv     "(fun x -> x)"
+  syntax val      of_bv     "(fun x -> x)"
+  *)
+end
+
diff --git a/specs.mlw b/specs.mlw
new file mode 100644
index 0000000..bc69e2d
--- /dev/null
+++ b/specs.mlw
@@ -0,0 +1,460 @@
+
+module VM_instr_spec
+
+  meta compute_max_steps 0x10000
+
+  use int.Int
+  use list.List
+  use list.Length
+  use vm.Vm
+  use state.State
+  use state.Reg
+  use logic.Compiler_logic
+  use bv_op.BV_OP
+
+  function ifun_post (f:machine_state -> machine_state) : post 'a =
+    fun _ _ ms ms' -> ms' = f ms
+  meta rewrite_def function ifun_post 
+
+  (* General specification builder for determinstic machine
+     instructions. *)
+  let ifunf (ghost pre:pre 'a) (code_f:code)
+    (ghost f:machine_state -> machine_state) : hl 'a
+    requires { forall c p. codeseq_at c p code_f ->
+        forall x ms. pre x p ms -> transition c ms (f ms) }
+    ensures { result.pre --> pre }
+    ensures { result.post --> ifun_post f }
+    ensures { result.code --> code_f }
+  = { pre = pre; code = code_f; post = ifun_post f }
+
+  (* Register based VM instructions *)
+
+  (* Iimm spec *)
+  function iimm_post (x:idr) (n:int) : post 'a =
+    fun _ p ms ms' -> forall s r m. ms  = VMS p r s m -> ms' = VMS (p+1) (write r x n) s m
+  meta rewrite_def function iimm_post
+
+  function iimm_fun (x:idr) (n:int) : machine_state -> machine_state =
+    fun ms -> let (VMS p r s m) = ms in VMS (p+1) (write r x n) s m
+  meta rewrite_def function iimm_fun
+
+  let iimmf (x:idr) (n: int) : hl 'a
+    ensures { result.pre --> trivial_pre }
+    ensures { result.post --> iimm_post x n }
+    ensures { result.code.length --> 1 }
+  = hoare trivial_pre ($ ifunf trivial_pre (iimm x n) (iimm_fun x n)) (iimm_post x n)
+  
+  (* Iload spec *)
+  function iload_post (x:idr) (n:id) : post 'a =
+    fun _ p ms ms' -> forall s r m. ms  = VMS p r s m -> ms' = VMS (p+1) (write r x m[n]) s m
+  meta rewrite_def function iload_post
+
+  function iload_fun (x:idr) (n:id) : machine_state -> machine_state =
+    fun ms -> let (VMS p r s m) = ms in VMS (p+1) (write r x m[n]) s m
+  meta rewrite_def function iload_fun
+
+  let iloadf (x:idr) (n: id) : hl 'a
+    ensures { result.pre --> trivial_pre }
+    ensures { result.post --> iload_post x n }
+    ensures { result.code.length --> 1 }
+  = hoare trivial_pre ($ ifunf trivial_pre (iload x n) (iload_fun x n)) (iload_post x n)
+  
+  (* Istore spec *)
+  function istore_post (x:idr) (n:id) : post 'a =
+    fun _ p ms ms' -> forall s r m. ms  = VMS p r s m -> ms' = VMS (p+1) r s m[n <- read r x] 
+  meta rewrite_def function istore_post
+
+  function istore_fun (x:idr) (n:id) : machine_state -> machine_state =
+    fun ms -> let (VMS p r s m) = ms in VMS (p+1) r s m[n <- read r x]
+  meta rewrite_def function istore_fun
+
+  let istoref (x:idr) (n: id) : hl 'a
+    ensures { result.pre --> trivial_pre }
+    ensures { result.post --> istore_post x n }
+    ensures { result.code.length --> 1 }
+  = hoare trivial_pre ($ ifunf trivial_pre (istore x n) (istore_fun x n)) (istore_post x n)
+  
+  (* Ipush spec *)
+  function ipush_post (x:idr) : post 'a =
+    fun _ p ms ms' -> forall s r m. ms  = VMS p r s m -> ms' = VMS (p + 1) r (push (read r x) s) m 
+  meta rewrite_def function ipush_post
+
+  function ipush_fun (x:idr) : machine_state -> machine_state =
+    fun ms -> let (VMS p r s m) = ms in VMS (p + 1) r (push (read r x) s) m          
+  meta rewrite_def function ipush_fun
+
+  let ipushf (x:idr) : hl 'a
+    ensures { result.pre --> trivial_pre }
+    ensures { result.post --> ipush_post x }
+    ensures { result.code.length --> 1 }
+  = hoare trivial_pre ($ ifunf trivial_pre (ipushr x) (ipush_fun x)) (ipush_post x)
+  
+  (* Ipop spec *)
+  constant ipop_pre : pre 'a =
+    fun _ p ms -> exists n r s m. ms = VMS p r (push n s) m
+  meta rewrite_def function ipop_pre
+
+  function ipop_post (x:idr) : post 'a =
+    fun _ p ms ms' -> forall s r n m. ms = VMS p r (push n s) m-> ms' = VMS (p + 1) (write r x n) s m
+  meta rewrite_def function ipop_post
+
+  function ipop_fun (x:idr) : machine_state -> machine_state =
+    fun ms ->
+      match ms with
+      | VMS p r (Cons n s) m ->  VMS (p + 1) (write r x n) s m
+      | _ -> ms (* fail *)
+      end      
+  meta rewrite_def function ipop_fun
+
+  let ipopf (x:idr) : hl 'a
+    ensures { result.pre --> ipop_pre }
+    ensures { result.post --> ipop_post x }
+    ensures { result.code.length --> 1 }
+  = hoare ipop_pre ($ ifunf ipop_pre (ipopr x) (ipop_fun x)) (ipop_post x)
+  
+  (* Iaddr spec *)
+  function iaddr_post (x1 x2 x3:idr) : post 'a =
+    fun _ p ms ms' -> forall s r m. 
+      ms  = VMS p r s m -> 
+      ms' = VMS (p+1) (write r x3 (read r x1 + read r x2)) s m
+  meta rewrite_def function iaddr_post
+
+  function iaddr_fun (x1 x2 x3:idr) : machine_state -> machine_state =
+    fun ms -> 
+      let (VMS p r s m) = ms in 
+      VMS (p+1) (write r x3 (read r x1 + read r x2)) s m
+  meta rewrite_def function iaddr_fun
+
+  let iaddrf (x1 x2 x3: idr) : hl 'a
+    ensures { result.pre --> trivial_pre }
+    ensures { result.post --> iaddr_post x1 x2 x3}
+    ensures { result.code.length --> 1 }
+  = 
+    let c = $ ifunf trivial_pre (iaddr x1 x2 x3) (iaddr_fun x1 x2 x3) in
+    hoare trivial_pre c (iaddr_post x1 x2 x3)
+  
+  (* Iaddur spec *)
+  function iaddur_post (x1 x2 x3:idr) : post 'a =
+    fun _ p ms ms' -> forall s r m. 
+      ms  = VMS p r s m -> 
+      ms' = VMS (p+1) (write r x3 (bv_add (read r x1) (read r x2))) s m
+  meta rewrite_def function iaddur_post
+
+  function iaddur_fun (x1 x2 x3:idr) : machine_state -> machine_state =
+    fun ms -> 
+      let (VMS p r s m) = ms in 
+      VMS (p+1) (write r x3 (bv_add (read r x1) (read r x2))) s m
+  meta rewrite_def function iaddur_fun
+
+  let iaddurf (x1 x2 x3: idr) : hl 'a
+    ensures { result.pre --> trivial_pre }
+    ensures { result.post --> iaddur_post x1 x2 x3}
+    ensures { result.code.length --> 1 }
+  = 
+    let c = $ ifunf trivial_pre (iaddur x1 x2 x3) (iaddur_fun x1 x2 x3) in
+    hoare trivial_pre c (iaddur_post x1 x2 x3)
+  
+  (* Isubr spec *)
+  function isubr_post (x1 x2 x3:idr) : post 'a =
+    fun _ p ms ms' -> forall s r m. 
+      ms  = VMS p r s m -> 
+      ms' = VMS (p + 1) (write r x3 (read r x1 - read r x2)) s m
+  meta rewrite_def function isubr_post
+
+  function isubr_fun (x1 x2 x3:idr) : machine_state -> machine_state =
+    fun ms -> 
+      let (VMS p r s m) = ms in 
+      VMS (p + 1) (write r x3 (read r x1 - read r x2)) s m
+  meta rewrite_def function isubr_fun
+
+  let isubrf (x1 x2 x3: idr) : hl 'a
+    ensures { result.pre --> trivial_pre }
+    ensures { result.post --> isubr_post x1 x2 x3}
+    ensures { result.code.length --> 1 }
+  = 
+    let c = $ ifunf trivial_pre (isubr x1 x2 x3) (isubr_fun x1 x2 x3) in
+    hoare trivial_pre c (isubr_post x1 x2 x3)
+  
+  (* Ibeqr spec *)
+  function ibeqr_post (x1:idr) (x2:idr) (ofs:int): post 'a =
+    fun _ p ms ms' -> forall s r m. 
+      ms  = VMS p r s m -> 
+      ms' = VMS (if read r x1 = read r x2 then p + 1 + ofs else p + 1) r s m
+  meta rewrite_def function ibeqr_post
+
+  function ibeqr_fun (x1:idr) (x2:idr) (ofs:int) : machine_state -> machine_state =
+    fun ms -> 
+    let (VMS p r s m) = ms in 
+    VMS (if read r x1 = read r x2 then p + 1 + ofs else p + 1) r s m
+  meta rewrite_def function ibeqr_fun
+
+  let ibeqrf (x1:idr) (x2: idr) (ofs:int) : hl 'a
+    ensures { result.pre --> trivial_pre }
+    ensures { result.post --> ibeqr_post x1 x2 ofs }
+    ensures { result.code.length --> 1 }
+  = hoare trivial_pre ($ ifunf trivial_pre (ibeqr x1 x2 ofs) (ibeqr_fun x1 x2 ofs)) (ibeqr_post x1 x2 ofs)
+  
+  (* Ibner spec *)
+  function ibner_post (x1:idr) (x2:idr) (ofs:int): post 'a =
+    fun _ p ms ms' -> forall s r m. 
+      ms  = VMS p r s m -> 
+      ms' = VMS (if read r x1 <> read r x2 then p + 1 + ofs else p + 1) r s m
+  meta rewrite_def function ibner_post
+
+  function ibner_fun (x1:idr) (x2:idr) (ofs:int) : machine_state -> machine_state =
+    fun ms -> 
+    let (VMS p r s m) = ms in 
+    VMS (if read r x1 <> read r x2 then p + 1 + ofs else p + 1) r s m
+  meta rewrite_def function ibner_fun
+
+  let ibnerf (x1:idr) (x2: idr) (ofs:int) : hl 'a
+    ensures { result.pre --> trivial_pre }
+    ensures { result.post --> ibner_post x1 x2 ofs }
+    ensures { result.code.length --> 1 }
+  = hoare trivial_pre ($ ifunf trivial_pre (ibner x1 x2 ofs) (ibner_fun x1 x2 ofs)) (ibner_post x1 x2 ofs)
+  
+  (* Ibler spec *)
+  function ibler_post (x1:idr) (x2:idr) (ofs:int): post 'a =
+    fun _ p ms ms' -> forall s r m. 
+      ms  = VMS p r s m -> 
+      ms' = VMS (if read r x1 <= read r x2 then p + 1 + ofs else p + 1) r s m
+  meta rewrite_def function ibler_post
+
+  function ibler_fun (x1:idr) (x2:idr) (ofs:int) : machine_state -> machine_state =
+    fun ms -> 
+    let (VMS p r s m) = ms in 
+    VMS (if read r x1 <= read r x2 then p + 1 + ofs else p + 1) r s m
+  meta rewrite_def function ibler_fun
+
+  let iblerf (x1:idr) (x2: idr) (ofs:int) : hl 'a
+    ensures { result.pre --> trivial_pre }
+    ensures { result.post --> ibler_post x1 x2 ofs }
+    ensures { result.code.length --> 1 }
+  = hoare trivial_pre ($ ifunf trivial_pre (ibler x1 x2 ofs) (ibler_fun x1 x2 ofs)) (ibler_post x1 x2 ofs)
+
+  (* Ibgtr spec *)
+  function ibgtr_post (x1:idr) (x2:idr) (ofs:int): post 'a =
+    fun _ p ms ms' -> forall s r m. 
+      ms  = VMS p r s m -> 
+      ms' = VMS (if read r x1 <= read r x2 then p + 1 else p + 1 + ofs) r s m
+  meta rewrite_def function ibgtr_post
+
+  function ibgtr_fun (x1:idr) (x2:idr) (ofs:int) : machine_state -> machine_state =
+    fun ms -> 
+    let (VMS p r s m) = ms in 
+    VMS (if read r x1 <= read r x2 then p + 1 else p + 1 + ofs) r s m
+  meta rewrite_def function ibgtr_fun
+
+  let ibgtrf (x1:idr) (x2: idr) (ofs:int) : hl 'a
+    ensures { result.pre --> trivial_pre }
+    ensures { result.post --> ibgtr_post x1 x2 ofs }
+    ensures { result.code.length --> 1 }
+  = hoare trivial_pre ($ ifunf trivial_pre (ibgtr x1 x2 ofs) (ibgtr_fun x1 x2 ofs)) (ibgtr_post x1 x2 ofs)
+  
+  (* original vm *)
+  
+  (* Iconst spec *)
+  function iconst_post (n:int) : post 'a =
+    fun _ p ms ms' -> forall s r m. ms  = VMS p r s m -> ms' = VMS (p+1) r (push n s) m
+  meta rewrite_def function iconst_post
+
+  function iconst_fun (n:int) : machine_state -> machine_state =
+    fun ms -> let (VMS p r s m) = ms in VMS (p+1) r (push n s) m
+  meta rewrite_def function iconst_fun
+
+  let iconstf (n: int) : hl 'a
+    ensures { result.pre --> trivial_pre }
+    ensures { result.post --> iconst_post n }
+    ensures { result.code.length --> 1 }
+  = hoare trivial_pre ($ ifunf trivial_pre n.iconst n.iconst_fun) n.iconst_post
+
+  (* Ivar spec *)
+  function ivar_post (x:id) : post 'a =
+    fun _ p ms ms' -> forall r s m. ms = VMS p r s m -> ms' = VMS (p+1) r (push m[x] s) m
+  meta rewrite_def function ivar_post
+
+  function ivar_fun (x:id) : machine_state -> machine_state =
+    fun ms -> let (VMS p r s m) = ms in VMS (p+1) r (push m[x] s) m
+  meta rewrite_def function ivar_fun
+
+  let ivarf (x: id) : hl 'a
+    ensures { result.pre --> trivial_pre }
+    ensures { result.post --> ivar_post x }
+    ensures { result.code.length --> 1 }
+  = hoare trivial_pre ($ ifunf trivial_pre x.ivar x.ivar_fun) x.ivar_post
+
+  (* Binary arithmetic operators specification (Iadd, Isub, Imul)
+     via a generic builder. *)
+  type binop = int -> int -> int
+
+  constant ibinop_pre : pre 'a =
+    fun _ p ms -> exists n1 n2 r s m. ms = VMS p r (push n2 (push n1 s)) m
+  meta rewrite_def function ibinop_pre
+
+  function ibinop_post (op : binop) : post 'a =
+   fun _ p ms ms' -> forall n1 n2 r s m. ms = VMS p r (push n2 (push n1 s)) m ->
+     ms' = VMS (p+1) r (push (op n1 n2) s) m
+  meta rewrite_def function ibinop_post
+
+  function ibinop_fun (op:binop) : machine_state -> machine_state =
+    fun ms -> match ms with
+      | VMS p r (Cons n2 (Cons n1 s)) m -> VMS (p+1) r (push (op n1 n2) s) m
+      | _ -> ms
+      end
+  meta rewrite_def function ibinop_fun
+
+  let create_binop (code_b:code) (ghost op:binop) : hl 'a
+    requires { forall c p. 
+      codeseq_at c p code_b ->
+      forall n1 n2 r s m. transition c 
+        (VMS p r (push n2 (push n1 s)) m)
+ 	      (VMS (p+1) r (push (op n1 n2) s) m) 
+ 	  }
+    ensures { result.pre --> ibinop_pre }
+    ensures { result.post --> ibinop_post op }
+    ensures { result.code.length --> code_b.length }
+  = hoare ibinop_pre ($ ifunf ibinop_pre code_b op.ibinop_fun) op.ibinop_post
+
+  constant plus : binop = fun x y -> x + y
+  meta rewrite_def function plus
+
+  constant sub : binop = fun x y -> x - y
+  meta rewrite_def function sub
+
+  constant mul : binop = fun x y -> x * y
+  meta rewrite_def function mul
+
+  let iaddf () : hl 'a
+    ensures { result.pre --> ibinop_pre }
+    ensures { result.post --> ibinop_post plus }
+    ensures { result.code.length --> 1 }
+  = create_binop iadd plus
+  
+  let iadduf () : hl 'a
+    ensures { result.pre --> ibinop_pre }
+    ensures { result.post --> ibinop_post bv_add }
+    ensures { result.code.length --> 1 }
+  = create_binop iaddu bv_add
+
+  let isubf () : hl 'a
+    ensures { result.pre --> ibinop_pre }
+    ensures { result.post --> ibinop_post sub }
+    ensures { result.code.length --> 1 }
+  = create_binop isub sub
+
+  (* Inil spec *)
+  function inil_post : post 'a =
+    fun _ _ ms ms' -> ms = ms'
+  meta rewrite_def function inil_post
+
+  let inil () : hl 'a
+    ensures { result.pre --> trivial_pre }
+    ensures { result.post --> inil_post }
+    ensures { result.code.length --> 0 }
+  = { pre = trivial_pre; code = Nil; post = inil_post }
+
+  (* Ibranch specification *)
+  function ibranch_post (ofs: ofs) : post 'a =
+    fun _ p ms ms' -> forall r s m. ms = VMS p r s m -> ms' = VMS (p + 1 + ofs) r s m
+  meta rewrite_def function ibranch_post
+
+  function ibranch_fun (ofs:ofs) : machine_state -> machine_state =
+    fun ms -> let (VMS p r s m) = ms in VMS (p+1+ofs) r s m
+  meta rewrite_def function ibranch_fun
+
+  let ibranchf (ofs:ofs) : hl 'a
+    ensures { result.pre --> trivial_pre }
+    ensures { result.post --> ibranch_post ofs }
+    ensures { result.code.length --> 1 }
+  = let cf = $ ifunf trivial_pre (ibranch ofs) (ibranch_fun ofs) in
+    hoare trivial_pre cf (ibranch_post ofs)
+
+  (* Conditional jump specification via a generic builder. *)
+  type cond = int -> int -> bool
+
+  function icjump_post (cond:cond) (ofs:ofs) : post 'a =
+    fun _ p ms ms' -> forall n1 n2 r s m. ms = VMS p r (push n2 (push n1 s)) m ->
+      (cond n1 n2 -> ms' = VMS (p + ofs + 1) r s m) /\
+      (not cond n1 n2 -> ms' = VMS (p+1) r s m)
+  meta rewrite_def function icjump_post
+
+  function icjump_fun (cond:cond) (ofs:ofs) : machine_state -> machine_state =
+    fun ms -> match ms with
+      | VMS p r (Cons n2 (Cons n1 s)) m ->
+        if cond n1 n2 then VMS (p+ofs+1) r s m else VMS (p+1) r s m
+      | _ -> ms
+      end
+  meta rewrite_def function icjump_fun
+
+  let create_cjump (code_cd:code) (ghost cond:cond) (ghost ofs:ofs) : hl 'a
+    requires { forall c p1 n1 n2 r s m. codeseq_at c p1 code_cd ->
+      let p2 = (if cond n1 n2 then p1 + ofs + 1 else p1 + 1) in
+      transition c (VMS p1 r (push n2 (push n1 s)) m) (VMS p2 r s m) }
+    ensures { result.pre --> ibinop_pre }
+    ensures { result.post --> icjump_post cond ofs }
+    ensures { result.code.length --> code_cd.length }
+  = let c = $ ifunf ibinop_pre code_cd (icjump_fun cond ofs) in
+    hoare ibinop_pre c (icjump_post cond ofs)
+
+  (*  binary Boolean operators specification (Ibeq, Ibne, Ible, Ibgt) *)
+  constant beq : cond = fun x y -> x = y
+  meta rewrite_def function beq
+
+  constant bne : cond = fun x y -> x <> y
+  meta rewrite_def function bne
+
+  constant ble : cond = fun x y -> x <= y
+  meta rewrite_def function ble
+
+  constant bgt : cond = fun x y -> x > y
+  meta rewrite_def function bgt
+
+  let ibeqf (ofs:ofs) : hl 'a
+    ensures { result.pre --> ibinop_pre }
+    ensures { result.post --> icjump_post beq ofs }
+    ensures { result.code.length --> 1 }
+  = create_cjump (ibeq ofs) beq ofs
+
+  let ibnef (ofs:ofs) : hl 'a
+    ensures { result.pre --> ibinop_pre }
+    ensures { result.post --> icjump_post bne ofs }
+    ensures { result.code.length --> 1 }
+  = create_cjump (ibne ofs) bne ofs
+
+  let iblef (ofs:ofs) : hl 'a
+    ensures { result.pre --> ibinop_pre }
+    ensures { result.post --> icjump_post ble ofs }
+    ensures { result.code.length --> 1 }
+  = create_cjump (ible ofs) ble ofs
+
+  let ibgtf (ofs:ofs) : hl 'a
+    ensures { result.pre --> ibinop_pre }
+    ensures { result.post --> icjump_post bgt ofs }
+    ensures { result.code.length --> 1 }
+  = create_cjump (ibgt ofs) bgt ofs
+
+  (* Isetvar specification *)
+  constant isetvar_pre : pre 'a =
+    fun _ p ms -> exists n r s m. ms = VMS p r (push n s) m
+  meta rewrite_def function isetvar_pre
+
+  function isetvar_post (x:id) : post 'a =
+    fun _ p ms ms' -> forall r s n m.
+      ms = VMS p r (push n s) m -> ms' = VMS (p+1) r s m[x <- n]
+  meta rewrite_def function isetvar_post
+
+  function isetvar_fun (x:id) : machine_state -> machine_state =
+    fun ms -> match ms with
+      | VMS p r (Cons n s) m -> VMS (p+1) r s m[x <- n]
+      | _ -> ms
+      end
+  meta rewrite_def function isetvar_fun
+
+  let isetvarf (x: id) : hl 'a
+    ensures { result.pre --> isetvar_pre }
+    ensures { result.post --> isetvar_post x }
+    ensures { result.code.length --> 1 }
+  = let c = $ ifunf isetvar_pre (isetvar x) (isetvar_fun x) in
+    hoare isetvar_pre c (isetvar_post x)
+
+end
diff --git a/specs/why3session.xml b/specs/why3session.xml
new file mode 100644
index 0000000..37ccff2
--- /dev/null
+++ b/specs/why3session.xml
@@ -0,0 +1,465 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE why3session PUBLIC "-//Why3//proof session v5//EN"
+"http://why3.lri.fr/why3session.dtd">
+<why3session shape_version="5">
+<prover id="0" name="Z3" version="4.7.1" alternative="counterexamples" timelimit="5" steplimit="0" memlimit="2000"/>
+<prover id="1" name="CVC4" version="1.6" alternative="counterexamples" timelimit="5" steplimit="0" memlimit="2000"/>
+<prover id="2" name="Eprover" version="2.1" timelimit="5" steplimit="0" memlimit="2000"/>
+<prover id="3" name="Alt-Ergo" version="2.0.0" timelimit="5" steplimit="0" memlimit="2000"/>
+<file name="../specs.mlw" proved="true">
+<theory name="VM_instr_spec" proved="true">
+ <goal name="VC ifunf" expl="VC for ifunf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC ifunf.0" expl="precondition" proved="true">
+  <proof prover="2"><result status="valid" time="0.32"/></proof>
+  </goal>
+  <goal name="VC ifunf.1" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.06" steps="78"/></proof>
+  </goal>
+  <goal name="VC ifunf.2" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.07" steps="78"/></proof>
+  </goal>
+  <goal name="VC ifunf.3" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.06" steps="78"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC iimmf" expl="VC for iimmf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC iimmf.0" expl="precondition" proved="true">
+  <proof prover="0"><result status="valid" time="1.13"/></proof>
+  </goal>
+  <goal name="VC iimmf.1" expl="precondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.10" steps="113"/></proof>
+  </goal>
+  <goal name="VC iimmf.2" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.10" steps="83"/></proof>
+  </goal>
+  <goal name="VC iimmf.3" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.07" steps="83"/></proof>
+  </goal>
+  <goal name="VC iimmf.4" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.14" steps="105"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC iloadf" expl="VC for iloadf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC iloadf.0" expl="precondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.79"/></proof>
+  </goal>
+  <goal name="VC iloadf.1" expl="precondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.15" steps="113"/></proof>
+  </goal>
+  <goal name="VC iloadf.2" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.10" steps="83"/></proof>
+  </goal>
+  <goal name="VC iloadf.3" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.10" steps="83"/></proof>
+  </goal>
+  <goal name="VC iloadf.4" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.14" steps="105"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC istoref" expl="VC for istoref" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC istoref.0" expl="precondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.31"/></proof>
+  </goal>
+  <goal name="VC istoref.1" expl="precondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.16" steps="113"/></proof>
+  </goal>
+  <goal name="VC istoref.2" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.10" steps="83"/></proof>
+  </goal>
+  <goal name="VC istoref.3" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.10" steps="83"/></proof>
+  </goal>
+  <goal name="VC istoref.4" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.14" steps="105"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC ipushf" expl="VC for ipushf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC ipushf.0" expl="precondition" proved="true">
+  <proof prover="1"><result status="valid" time="0.24"/></proof>
+  </goal>
+  <goal name="VC ipushf.1" expl="precondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.11" steps="113"/></proof>
+  </goal>
+  <goal name="VC ipushf.2" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.07" steps="83"/></proof>
+  </goal>
+  <goal name="VC ipushf.3" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.08" steps="83"/></proof>
+  </goal>
+  <goal name="VC ipushf.4" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.08" steps="105"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC ipopf" expl="VC for ipopf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC ipopf.0" expl="precondition" proved="true">
+  <proof prover="1"><result status="valid" time="0.31"/></proof>
+  </goal>
+  <goal name="VC ipopf.1" expl="precondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.13" steps="155"/></proof>
+  </goal>
+  <goal name="VC ipopf.2" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.08" steps="83"/></proof>
+  </goal>
+  <goal name="VC ipopf.3" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.07" steps="83"/></proof>
+  </goal>
+  <goal name="VC ipopf.4" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.09" steps="105"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC iaddrf" expl="VC for iaddrf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC iaddrf.0" expl="precondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.39"/></proof>
+  </goal>
+  <goal name="VC iaddrf.1" expl="precondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.16" steps="113"/></proof>
+  </goal>
+  <goal name="VC iaddrf.2" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.10" steps="83"/></proof>
+  </goal>
+  <goal name="VC iaddrf.3" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.11" steps="83"/></proof>
+  </goal>
+  <goal name="VC iaddrf.4" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.14" steps="105"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC isubrf" expl="VC for isubrf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC isubrf.0" expl="precondition" proved="true">
+  <proof prover="2"><result status="valid" time="3.43"/></proof>
+  </goal>
+  <goal name="VC isubrf.1" expl="precondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.10" steps="113"/></proof>
+  </goal>
+  <goal name="VC isubrf.2" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.09" steps="83"/></proof>
+  </goal>
+  <goal name="VC isubrf.3" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.10" steps="83"/></proof>
+  </goal>
+  <goal name="VC isubrf.4" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.11" steps="105"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC ibeqrf" expl="VC for ibeqrf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC ibeqrf.0" expl="precondition" proved="true">
+  <proof prover="1"><result status="valid" time="0.26"/></proof>
+  </goal>
+  <goal name="VC ibeqrf.1" expl="precondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.19" steps="154"/></proof>
+  </goal>
+  <goal name="VC ibeqrf.2" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.11" steps="83"/></proof>
+  </goal>
+  <goal name="VC ibeqrf.3" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.12" steps="83"/></proof>
+  </goal>
+  <goal name="VC ibeqrf.4" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.15" steps="105"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC ibnerf" expl="VC for ibnerf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC ibnerf.0" expl="precondition" proved="true">
+  <proof prover="1"><result status="valid" time="0.26"/></proof>
+  </goal>
+  <goal name="VC ibnerf.1" expl="precondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.21" steps="154"/></proof>
+  </goal>
+  <goal name="VC ibnerf.2" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.12" steps="83"/></proof>
+  </goal>
+  <goal name="VC ibnerf.3" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.11" steps="83"/></proof>
+  </goal>
+  <goal name="VC ibnerf.4" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.15" steps="105"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC iblerf" expl="VC for iblerf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC iblerf.0" expl="precondition" proved="true">
+  <proof prover="1"><result status="valid" time="0.27"/></proof>
+  </goal>
+  <goal name="VC iblerf.1" expl="precondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.22" steps="154"/></proof>
+  </goal>
+  <goal name="VC iblerf.2" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.12" steps="83"/></proof>
+  </goal>
+  <goal name="VC iblerf.3" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.09" steps="83"/></proof>
+  </goal>
+  <goal name="VC iblerf.4" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.16" steps="105"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC ibgtrf" expl="VC for ibgtrf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC ibgtrf.0" expl="precondition" proved="true">
+  <proof prover="1"><result status="valid" time="0.28"/></proof>
+  </goal>
+  <goal name="VC ibgtrf.1" expl="precondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.21" steps="154"/></proof>
+  </goal>
+  <goal name="VC ibgtrf.2" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.13" steps="83"/></proof>
+  </goal>
+  <goal name="VC ibgtrf.3" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.12" steps="83"/></proof>
+  </goal>
+  <goal name="VC ibgtrf.4" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.16" steps="105"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC iconstf" expl="VC for iconstf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC iconstf.0" expl="precondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.05"/></proof>
+  </goal>
+  <goal name="VC iconstf.1" expl="precondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.17" steps="113"/></proof>
+  </goal>
+  <goal name="VC iconstf.2" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.13" steps="83"/></proof>
+  </goal>
+  <goal name="VC iconstf.3" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.13" steps="83"/></proof>
+  </goal>
+  <goal name="VC iconstf.4" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.16" steps="105"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC ivarf" expl="VC for ivarf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC ivarf.0" expl="precondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.07"/></proof>
+  </goal>
+  <goal name="VC ivarf.1" expl="precondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.15" steps="113"/></proof>
+  </goal>
+  <goal name="VC ivarf.2" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.11" steps="83"/></proof>
+  </goal>
+  <goal name="VC ivarf.3" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.11" steps="83"/></proof>
+  </goal>
+  <goal name="VC ivarf.4" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.16" steps="105"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC create_binop" expl="VC for create_binop" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC create_binop.0" expl="precondition" proved="true">
+  <proof prover="1"><result status="valid" time="0.91"/></proof>
+  </goal>
+  <goal name="VC create_binop.1" expl="precondition" proved="true">
+  <transf name="compute_specified" proved="true" >
+   <goal name="VC create_binop.1.0" expl="precondition" proved="true">
+   <transf name="introduce_premises" proved="true" >
+    <goal name="VC create_binop.1.0.0" expl="precondition" proved="true">
+    <transf name="compute_specified" proved="true" >
+     <goal name="VC create_binop.1.0.0.0" expl="precondition" proved="true">
+     <proof prover="1"><result status="valid" time="0.52"/></proof>
+     <proof prover="3"><result status="valid" time="0.11" steps="127"/></proof>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC create_binop.2" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.09" steps="83"/></proof>
+  </goal>
+  <goal name="VC create_binop.3" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.09" steps="83"/></proof>
+  </goal>
+  <goal name="VC create_binop.4" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.11" steps="83"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC iaddf" expl="VC for iaddf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC iaddf.0" expl="precondition" proved="true">
+  <transf name="compute_specified" proved="true" >
+   <goal name="VC iaddf.0.0" expl="precondition" proved="true">
+   <transf name="introduce_premises" proved="true" >
+    <goal name="VC iaddf.0.0.0" expl="precondition" proved="true">
+    <proof prover="0"><result status="valid" time="0.05"/></proof>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC iaddf.1" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.12" steps="78"/></proof>
+  </goal>
+  <goal name="VC iaddf.2" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.12" steps="78"/></proof>
+  </goal>
+  <goal name="VC iaddf.3" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.13" steps="79"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC iadduf" expl="VC for iadduf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC iadduf.0" expl="precondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.08"/></proof>
+  </goal>
+  <goal name="VC iadduf.1" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.14" steps="78"/></proof>
+  </goal>
+  <goal name="VC iadduf.2" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.13" steps="78"/></proof>
+  </goal>
+  <goal name="VC iadduf.3" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.14" steps="79"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC isubf" expl="VC for isubf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC isubf.0" expl="precondition" proved="true">
+  <transf name="compute_specified" proved="true" >
+   <goal name="VC isubf.0.0" expl="precondition" proved="true">
+   <transf name="introduce_premises" proved="true" >
+    <goal name="VC isubf.0.0.0" expl="precondition" proved="true">
+    <proof prover="0"><result status="valid" time="0.04"/></proof>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC isubf.1" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.10" steps="78"/></proof>
+  </goal>
+  <goal name="VC isubf.2" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.12" steps="78"/></proof>
+  </goal>
+  <goal name="VC isubf.3" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.12" steps="79"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC imulf" expl="VC for imulf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC imulf.0" expl="precondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.07"/></proof>
+  </goal>
+  <goal name="VC imulf.1" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.13" steps="78"/></proof>
+  </goal>
+  <goal name="VC imulf.2" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.08" steps="78"/></proof>
+  </goal>
+  <goal name="VC imulf.3" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.15" steps="79"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC inil" expl="VC for inil" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC inil.0" expl="precondition" proved="true">
+  <transf name="compute_specified" proved="true" >
+   <goal name="VC inil.0.0" expl="precondition" proved="true">
+   <transf name="introduce_premises" proved="true" >
+    <goal name="VC inil.0.0.0" expl="precondition" proved="true">
+    <proof prover="2"><result status="valid" time="0.47"/></proof>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="VC inil.1" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.13" steps="78"/></proof>
+  </goal>
+  <goal name="VC inil.2" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.12" steps="78"/></proof>
+  </goal>
+  <goal name="VC inil.3" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.14" steps="80"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC ibranchf" expl="VC for ibranchf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC ibranchf.0" expl="precondition" proved="true">
+  <proof prover="0"><result status="valid" time="0.05"/></proof>
+  </goal>
+  <goal name="VC ibranchf.1" expl="precondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.17" steps="113"/></proof>
+  </goal>
+  <goal name="VC ibranchf.2" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.12" steps="83"/></proof>
+  </goal>
+  <goal name="VC ibranchf.3" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.13" steps="83"/></proof>
+  </goal>
+  <goal name="VC ibranchf.4" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.17" steps="105"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="VC create_cjump" expl="VC for create_cjump" proved="true">
+ <proof prover="3" timelimit="10"><result status="valid" time="0.33" steps="478"/></proof>
+ </goal>
+ <goal name="VC ibeqf" expl="VC for ibeqf" proved="true">
+ <proof prover="0"><result status="valid" time="0.07"/></proof>
+ </goal>
+ <goal name="VC ibnef" expl="VC for ibnef" proved="true">
+ <proof prover="0"><result status="valid" time="0.08"/></proof>
+ </goal>
+ <goal name="VC iblef" expl="VC for iblef" proved="true">
+ <proof prover="0"><result status="valid" time="0.08"/></proof>
+ </goal>
+ <goal name="VC ibgtf" expl="VC for ibgtf" proved="true">
+ <proof prover="0"><result status="valid" time="0.08"/></proof>
+ </goal>
+ <goal name="VC isetvarf" expl="VC for isetvarf" proved="true">
+ <transf name="split_goal_right" proved="true" >
+  <goal name="VC isetvarf.0" expl="precondition" proved="true">
+  <proof prover="1"><result status="valid" time="0.34"/></proof>
+  </goal>
+  <goal name="VC isetvarf.1" expl="precondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.24" steps="176"/></proof>
+  </goal>
+  <goal name="VC isetvarf.2" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.13" steps="83"/></proof>
+  </goal>
+  <goal name="VC isetvarf.3" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.12" steps="83"/></proof>
+  </goal>
+  <goal name="VC isetvarf.4" expl="postcondition" proved="true">
+  <proof prover="3"><result status="valid" time="0.16" steps="105"/></proof>
+  </goal>
+ </transf>
+ </goal>
+</theory>
+</file>
+</why3session>
diff --git a/specs/why3shapes.gz b/specs/why3shapes.gz
new file mode 100644
index 0000000000000000000000000000000000000000..b4dbd45a390852ce7522c2e32b2da7010aee57d3
GIT binary patch
literal 6546
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%0D}FPb
z-rD)UwtWBI4b?aEIQ2sn7Kh}t3x{;9n&mJ-U=PcKb$PlwXXgZd-%}jbA{}b8(zUjy
z#HqW%VP-_^rpU$IVqGk!Jvpaq$2|S4shh<wk$>@P|F?(V%lEIfTXoR6=I^hqb48yD
z%`U4;`uIpD^wU;}>8s3RZd?g@ab-Ez)!&~#s~xzt{C<7(<F)bYugYoL-}QJ9BE@({
z$injk%Sn;WWe%#HXKv-aWbgeX>QEOU8WkvT{Mmt~g^yfBJ>FJ$z7COoYMWGNzU%om
z*{YATqNAPpR3nTy_bimSeJCW>abk-`+N`a4H|NL-|DM$=WTp6I3u}|pZKb7IE`k~d
zeb}O<&qln>Rp(Lu|M?8B-!G@|I}cOJnP+S;om%5r)n+?q-otgf51;(4yEEr(*6oXH
zw!MtDJat>rJ4Horv-RrSZO^XmzMXp}>wU`E8LV=ru3u1pn*HEo4etyA@98gWJyx9l
zy>GAL@oNbT*-o97lP8!T*9v>P+2XI&T#ws3e(idso^!Tc_j%^V{P=y(W}jQJ>7?Ig
zWj@nsPFr((S5N9r(9tY87P}|!uH2cZg6ns#KdE+jb&~7jskHOgLO+-_UPx-3c=hd$
z5|e}Nhc}+;zO_m|{F%ZLZ3WHqr-C_`U0X8q_L4MJrP3!Zn{wHUdUcJ{mfq>m<h{r8
zO^9=QbL6d<;@j@dR&9+z{<DMU-*}h;>Y`4SRPpFE^cFv)G?97biF0Y)p_Xy^j^;})
zJ^TOr)AJCmw?>|o=bg+8HDgaMJXSqvs(;7l?UNRii~qbBmh?sS_Pia+x99y>ol|WT
zb=7>@ndq3dA8&F4&V0-bDEs7Ey|JWQc6Nwa_67aI_d*%%Kc|Q0y`8X6b^m={|NoJC
zXS`eg?fIB0J#p5mO65hlj`iVpL&I+DxOI2a|7{GLel4l>%Kc`hy1up1)$N$T>P?>0
z_f+P54(VyGPLjEE#BIu<-HCkjF62-1tgL>+k+<;ugTKcO44kDBU#RYv+4}D0J&!+S
z{a;wy*jx9@R7<^h9Jj9Ky62Nx;WKZ2H}LgrGYd)Dv~KRQX33pzMc*XfxN?x$-kF`>
z=5@lFX0?gmeGPII4K^4C{;|`Jbx8MewVd2@=~m{J*~cYpo!P%{=G#_MaR2p#xDtVr
zYMV?&-sfCU)p{+c9F@<-Z5THDIH!#>d;J^9qMzTd9hAS@SM;f<da}zo%dLWYU$uNm
zo4)sx)d_Fc>6v%=?LJ@rIs5q6R<-Z_(SQHFcU*F9ZS8*5S>ozJ=kL8PcUkfv%7sh)
z$fc(}JoouERsQB#i3v#sxTdD>5L+6n>TM`~LS}F0{i4bDH*3x7Nu509d)uVri)NoR
zp0*+FqitYpUDox9vZa51I&ZVKK2e)~z&6-eu9!#Hdcs=q@b|Y=7%~%6k{F+w%HH&P
z$C`VCU%xW8d6K}q(l1AiMV#h}xP<kblZlAjb$#!fyfCxX&yuc6<Z=6Iu9)^o_`s&T
j^u5-sp0izkZ7JTR_HFv?t>1#8e%C*Jd$Qc-G6MquWIEAA

literal 0
HcmV?d00001

diff --git a/state.mlw b/state.mlw
new file mode 100644
index 0000000..a655477
--- /dev/null
+++ b/state.mlw
@@ -0,0 +1,45 @@
+
+module State
+
+  use int.Int
+  
+  type id = Id int
+  type state = id -> int
+
+  let function get (f: state) (x: id) = f x
+
+  let function set (f: state) (x: id) (v: int) : state =
+    fun (y: id) -> 
+      match (x, y) with
+      | (Id xv, Id yv) -> if xv = yv then v else (f y) 
+      end
+  meta rewrite_def function set
+
+  let function ([]) f x = f x
+  let function ([<-]) f x v = set f x v
+  
+  let function const (v: int) : state
+    ensures { forall x. result[x] = v }
+  = fun _ -> v
+
+end
+
+module Reg
+
+  use int.Int
+  
+  type idr = int
+  type regs = idr -> int
+
+  let function read (f: regs) (x: idr) = f x
+
+  let function write (f: regs) (x: idr) (v: int) : regs =
+    fun (y: idr) -> if x = y then v else (f y) 
+      
+  meta rewrite_def function write
+  
+  let function const (v: int) : regs
+    ensures { forall x. read result x = v }
+  = fun _ -> v
+
+end
\ No newline at end of file
diff --git a/state/why3session.xml b/state/why3session.xml
new file mode 100644
index 0000000..ef343d7
--- /dev/null
+++ b/state/why3session.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE why3session PUBLIC "-//Why3//proof session v5//EN"
+"http://why3.lri.fr/why3session.dtd">
+<why3session shape_version="5">
+<prover id="0" name="Alt-Ergo" version="2.0.0" timelimit="10" steplimit="0" memlimit="2000"/>
+<file name="../state.mlw" proved="true">
+<theory name="State" proved="true">
+ <goal name="VC get" expl="VC for get" proved="true">
+ <proof prover="0"><result status="valid" time="0.00" steps="1"/></proof>
+ </goal>
+ <goal name="VC set" expl="VC for set" proved="true">
+ <proof prover="0"><result status="valid" time="0.00" steps="1"/></proof>
+ </goal>
+ <goal name="VC mixfix []" expl="VC for mixfix []" proved="true">
+ <proof prover="0"><result status="valid" time="0.00" steps="1"/></proof>
+ </goal>
+ <goal name="VC mixfix [&lt;-]" expl="VC for mixfix [<-]" proved="true">
+ <proof prover="0"><result status="valid" time="0.00" steps="1"/></proof>
+ </goal>
+ <goal name="VC const" expl="VC for const" proved="true">
+ <proof prover="0"><result status="valid" time="0.00" steps="2"/></proof>
+ </goal>
+</theory>
+<theory name="Reg" proved="true">
+ <goal name="VC read" expl="VC for read" proved="true">
+ <proof prover="0"><result status="valid" time="0.00" steps="1"/></proof>
+ </goal>
+ <goal name="VC write" expl="VC for write" proved="true">
+ <proof prover="0"><result status="valid" time="0.00" steps="1"/></proof>
+ </goal>
+ <goal name="VC const" expl="VC for const" proved="true">
+ <proof prover="0"><result status="valid" time="0.00" steps="2"/></proof>
+ </goal>
+</theory>
+</file>
+</why3session>
diff --git a/state/why3shapes.gz b/state/why3shapes.gz
new file mode 100644
index 0000000000000000000000000000000000000000..9385862b7ce325e4052d89cfc878cb53955eef3e
GIT binary patch
literal 283
zcmb2|=3oGW|E&{zvzQHeTE7=}?Q}@Y`5VzD#?>m5XttF5=A=_Pw;YTv$n57+jhy0S
zzD@9b_4|_%n!Bd7dLQ(eJIRA}rJ7go)+2lNohh_A`+nd1;G<_e7wakdamXB)#(plx
z(W^pu{`w@369?YSY>A0joq4Hm?Q+33H}j9j%R1j0?ceuSSU21~Q_xTF%tUE1qZEFP
zwXgG^d`xukRy#1Iy}FdWTu|fj)Zo>p&c5b-b^QG2b+?~St+`aa>b|@E_s_G!Bc>mo
zb*ykkK#Y4;xUxoIkJeV3F!M)QwkOa2eUkONB`b|<pNqbtEbDZ+D;F6`AAINkWtF@8
p{p2f8o`kOHHo1H!x_Cva;3^@Pf4hH~zM6mS{w!U;sn-}87y$iqh~EGJ

literal 0
HcmV?d00001

diff --git a/vm.mlw b/vm.mlw
new file mode 100644
index 0000000..d8c4e5b
--- /dev/null
+++ b/vm.mlw
@@ -0,0 +1,298 @@
+
+(* Utility module: reflexive transitive closure of a parameterized
+   relation. *)
+module ReflTransClosure
+
+  type parameter
+  type state
+  predicate transition parameter state state
+
+  inductive transition_star parameter (x y:state) =
+    | Refl: forall p x. transition_star p x x
+    | Step: forall p x y z.
+        transition p x y -> transition_star p y z -> transition_star p x z
+
+  lemma transition_star_one: forall p s1 s2.
+    transition p s1 s2 -> transition_star p s1 s2
+
+  lemma transition_star_transitive: forall p s1 s2 s3.
+    transition_star p s1 s2 -> transition_star p s2 s3 ->
+      transition_star p s1 s3
+
+end
+
+
+(*****************************************************************************)
+
+(* The machine operates on a code c (a fixed list of instructions)
+   and three variable components:
+    - a program counter,      denoting a position in c
+    - a register file,        containing integers
+    - an evaluation stack,    containing integers
+    - a memory state,         assigning integer values to variables
+*)
+
+theory Vm
+
+  use state.State
+  use state.Reg
+  use int.Int
+  use list.List
+  use list.Length
+  use list.Append
+  use int.EuclideanDivision
+  use bv_op.BV_OP
+
+  type pos = int                           (* code position                   *)
+  type stack = list int                    (* stack contains just integers    *)
+
+  (* virtual machine configuration *) 
+  type machine_state = VMS pos regs stack state 
+
+
+  type ofs = int
+  (* The instruction set of the machine. *)
+  type instr =
+  (* new instructions, register based                                         *)
+  | Iload idr id       (* load register with variable                         *)
+  | Iimm idr int       (* load register with value n                          *)
+  | Istore idr id      (* store a register to variable                        *)
+  | Ipushr idr         (* push register on stack                              *)
+  | Ipopr idr          (* pop register from stack                             *)
+  | Iaddr idr idr idr  (* add two registers, store result in third            *)
+  | Iaddur idr idr idr (* add two registers, store result in third (wrapping) *)
+  | Isubr idr idr idr  (* subtract two registers, store result in third       *)
+  | Ibeqr idr idr ofs  (* skip ofs forward if r1 =  r2                        *)
+  | Ibner idr idr ofs  (* skip ofs forward if r1 <> r2                        *)
+  | Ibler idr idr ofs  (* skip ofs forward if r1 <= r2                        *)
+  | Ibgtr idr idr ofs  (* skip ofs forward if r1 >  r2                        *)
+
+  (* original/old instructions for stack machine                              *)
+  | Iconst int         (* push n on stack                                     *)
+  | Ivar id            (* push the value of variable                          *)
+  | Isetvar id         (* pop an integer, assign it to variable               *)
+  | Ibranch ofs        (* skip ofs instructions                               *)
+  | Iadd               (* pop two values, push their sum                      *)
+  | Iaddu              (* pop two values, push their sum (wrapping)           *)
+  | Isub               (* pop two values, push their difference               *)
+  | Ibeq ofs           (* pop n2, pop n1, skip ofs forward if n1 =  n2        *)
+  | Ibne ofs           (* pop n2, pop n1, skip ofs forward if n1 <> n2        *)
+  | Ible ofs           (* pop n2, pop n1, skip ofs forward if n1 <= n2        *)
+  | Ibgt ofs           (* pop n2, pop n1, skip ofs forward if n1 >  n2        *)
+  | Ihalt              (* end of program                                      *)
+
+  type code = list instr
+
+  (* Read pointer to code *)
+  inductive codeseq_at code pos code =
+    | codeseq_at_intro : forall c1 c2 c3.
+        codeseq_at (c1 ++ c2 ++ c3) (length c1) c2
+
+  lemma codeseq_at_app_right: forall c c1 c2 p.
+    codeseq_at c p (c1 ++ c2) -> codeseq_at c (p + length c1) c2
+
+  lemma codeseq_at_app_left: forall c c1 c2 p.
+    codeseq_at c p (c1 ++ c2) -> codeseq_at c p c1
+
+  lemma list_app_eq_nil: forall c3 c11 c1  i i'.
+   length c11 = length c1 ->
+   (c11 ++ Cons i (Nil: list instr))
+  = ((c1 ++ Cons i' (Nil: list instr)) ++ c3) ->
+   c3 = Nil
+
+  lemma list_app_eq_left_cons:
+    forall c1 [@induction] c2, i1 i2:'a.
+    c1 ++ Cons i1 Nil = c2 ++ Cons i2 Nil ->
+    c1 = c2
+
+  lemma list_app_eq_last:
+    forall c1 [@induction] c2 i, i':'a. length c1 = length c2 ->
+    c1 ++ Cons i Nil = c2 ++ Cons i' Nil ->
+    i = i'
+
+  (* more general *)
+  lemma list_app_eq_left:
+    forall c1 [@induction] c2 d1 d2:list 'a. length c1 = length d1 ->
+    c1 ++ c2 = d1 ++ d2 ->
+    c1 = d1
+
+  lemma codeseq_at_right: forall c1 [@induction] i.
+    let c = c1 ++ (Cons i Nil) in
+    forall i'.
+    codeseq_at c (length c1) (Cons i' Nil) -> i' = i
+
+  let function push (n:int) (s:stack) : stack = Cons n s
+
+  (* new instructions *)
+  let function iimm   (x:idr) (n:int)               = Cons (Iimm x n)         Nil
+  let function iload  (x:idr) (n:id)                = Cons (Iload x n)        Nil
+  let function istore (x:idr) (n:id)                = Cons (Istore x n)       Nil
+  let function ipushr (x:idr)                       = Cons (Ipushr x)         Nil
+  let function ipopr  (x:idr)                       = Cons (Ipopr x)          Nil
+  let function iaddr  (x1 x2 x3:idr)                = Cons (Iaddr x1 x2 x3)   Nil
+  let function iaddur (x1 x2 x3:idr)                = Cons (Iaddur x1 x2 x3)  Nil
+  let function isubr  (x1 x2 x3:idr)                = Cons (Isubr x1 x2 x3)   Nil
+  let function ibeqr  (x1 x2:idr) (ofs:ofs) : code  = Cons (Ibeqr x1 x2 ofs)  Nil
+  let function ibner  (x1 x2:idr) (ofs:ofs) : code  = Cons (Ibner x1 x2 ofs)  Nil
+  let function ibler  (x1 x2:idr) (ofs:ofs) : code  = Cons (Ibler x1 x2 ofs)  Nil
+  let function ibgtr  (x1 x2:idr) (ofs:ofs) : code  = Cons (Ibgtr x1 x2 ofs)  Nil
+
+  (* original instructions *)
+  let function iconst (n:int) : code    = Cons (Iconst n)     Nil
+  let function ivar (x:id) : code       = Cons (Ivar x)       Nil
+  let function isetvar (x:id) : code    = Cons (Isetvar x)    Nil
+  let constant iadd : code              = Cons Iadd           Nil
+  let constant iaddu : code             = Cons Iaddu          Nil
+  let constant isub : code              = Cons Isub           Nil
+  let function ibeq (ofs:ofs) : code    = Cons (Ibeq ofs)     Nil
+  let function ible (ofs:ofs) : code    = Cons (Ible ofs)     Nil
+  let function ibne (ofs:ofs) : code    = Cons (Ibne ofs)     Nil
+  let function ibgt (ofs:ofs) : code    = Cons (Ibgt ofs)     Nil
+  let function ibranch (ofs:ofs) : code = Cons (Ibranch ofs)  Nil
+  let constant ihalt : code             = Cons Ihalt          Nil      
+
+  (* The semantics of the virtual machine is given in small-step style,
+    as a transition relation between machine states: tupels 
+    (program counter, evaluation stack, variable state, register state). 
+     
+    The transition relation is parameterized by the code c. There is one 
+    transition rule for each kind of instruction, except Ihalt, 
+    which has no transition. *)
+
+  inductive transition code machine_state machine_state =
+    (* new/added specifications *)
+    | trans_imm : forall c p x n. codeseq_at c p (iimm x n) ->
+        forall s m r. transition c
+          (VMS p r s m)
+          (VMS (p + 1) (write r x n) s m)
+
+    | trans_load : forall c p x n. codeseq_at c p (iload x n) ->
+        forall s m r. transition c
+          (VMS p r s m)
+          (VMS (p + 1) (write r x m[n]) s m)
+
+    | trans_store : forall c p x n. codeseq_at c p (istore x n) ->
+        forall s m r. transition c
+          (VMS p r s m)
+          (VMS (p + 1) r s m[n <- read r x])
+
+    | trans_pushr : forall c p x. codeseq_at c p (ipushr x) ->
+        forall s m r. transition c
+          (VMS p r s m)
+          (VMS (p + 1) r (push (read r x) s) m)
+
+    | trans_popr : forall c p x n. codeseq_at c p (ipopr x) ->
+        forall s m r. transition c
+          (VMS p r (push n s) m)
+          (VMS (p + 1) (write r x n) s m)
+
+    | trans_addr : forall c p x1 x2 x3. codeseq_at c p (iaddr x1 x2 x3) ->
+        forall s m r. transition c
+          (VMS p r s m)
+          (VMS (p + 1) (write r x3 (read r x1 + read r x2)) s m)
+
+    | trans_addur : forall c p x1 x2 x3. codeseq_at c p (iaddur x1 x2 x3) ->
+        forall s m r. transition c
+          (VMS p r s m)
+          (VMS (p + 1) (write r x3 (bv_add (read r x1) (read r x2))) s m)
+
+    | trans_subr : forall c p x1 x2 x3. codeseq_at c p (isubr x1 x2 x3) ->
+        forall s m r. transition c
+          (VMS p r s m)
+          (VMS (p + 1) (write r x3 (read r x1 - read r x2)) s m)
+
+    | trans_beqr: forall c p x1 x2 r ofs. codeseq_at c p (ibeqr x1 x2 ofs) ->
+        forall s m. transition c
+        (VMS p r s m)
+        (VMS (if read r x1 = read r x2 then p + 1 + ofs else p + 1) r s m)
+
+    | trans_bner: forall c p x1 x2 r ofs. codeseq_at c p (ibner x1 x2 ofs) ->
+        forall s m. transition c
+        (VMS p r s m)
+        (VMS (if read r x1 <> read r x2 then p + 1 + ofs else p + 1) r s m)
+
+    | trans_bler: forall c p r x1 x2 ofs. codeseq_at c p (ibler x1 x2 ofs) ->
+        forall s m. transition c
+        (VMS p r s m)
+        (VMS (if read r x1 <= read r x2 then p + 1 + ofs else p + 1) r s m)
+
+    | trans_bgtr: forall c p r x1 x2 ofs. codeseq_at c p (ibgtr x1 x2 ofs) ->
+        forall s m. transition c
+        (VMS p r s m)
+        (VMS (if read r x1 <=  read r x2 then p + 1 else p + 1 + ofs) r s m)
+
+    (* original specifications *)
+    | trans_const : forall c p r n. codeseq_at c p (iconst n) ->
+        forall s m. transition c (VMS p r s m) (VMS (p + 1) r (push n s) m)
+
+    | trans_var : forall c p r x. codeseq_at c p (ivar x) ->
+        forall s m. transition c (VMS p r s m) (VMS (p + 1) r (push m[x] s) m)
+
+    | trans_set_var: forall c p r x. codeseq_at c p (isetvar x) ->
+        forall n s m. transition c (VMS p r (push n s) m) (VMS (p + 1) r s m[x<-n])
+
+    | trans_add : forall c p r. codeseq_at c p iadd ->
+        forall n1 n2 s m. transition c
+          (VMS p r (push n2 (push n1 s)) m)
+          (VMS (p + 1) r (push (n1 + n2) s) m)
+
+    | trans_addu : forall c p r. codeseq_at c p iaddu ->
+        forall n1 n2 s m. transition c
+        (VMS p r (push n2 (push n1 s)) m)
+        (VMS (p + 1) r (push (bv_add n1 n2) s) m)
+
+    | trans_sub : forall c p r. codeseq_at c p isub ->
+        forall n1 n2 s m. transition c
+        (VMS p r (push n2 (push n1 s)) m)
+        (VMS (p + 1) r (push (n1 - n2) s) m)
+
+    | trans_beq: forall c p1 r ofs. codeseq_at c p1 (ibeq ofs) ->
+        forall s m n1 n2. transition c
+        (VMS p1 r (push n2 (push n1 s)) m)
+        (VMS (if n1 = n2 then p1 + 1 + ofs else p1 + 1) r s m)
+
+    | trans_bne: forall c p1 r ofs. codeseq_at c p1 (ibne ofs) ->
+        forall s m n1 n2. transition c
+        (VMS p1 r (push n2 (push n1 s)) m)
+        (VMS (if n1 = n2 then p1 + 1 else p1 + 1 + ofs) r s m)
+
+    | trans_ble: forall c p1 r ofs. codeseq_at c p1 (ible ofs) ->
+        forall s m n1 n2. transition c
+        (VMS p1 r (push n2 (push n1 s)) m)
+        (VMS (if n1 <= n2 then p1 + 1 + ofs else p1 + 1) r s m)
+
+    | trans_bgt: forall c p1 r ofs. codeseq_at c p1 (ibgt ofs) ->
+        forall s m n1 n2. transition c
+        (VMS p1 r (push n2 (push n1 s)) m)
+        (VMS (if n1 <= n2 then p1 + 1 else p1 + 1 + ofs) r s m)
+
+    | trans_branch: forall c p r ofs. codeseq_at c p (ibranch ofs) ->
+        forall s m. transition c (VMS p r s m) (VMS (p + 1 + ofs) r s m)
+
+  (* As usual with small-step semantics, we form sequences of machine
+     transitions to define the behavior of a code. We always start with pc
+     = 0 and an empty evaluation stack. We stop successfully if pc points
+     to an Ihalt instruction and the evaluation stack is empty. *)
+
+   clone export ReflTransClosure with type parameter = code,
+     type state = machine_state, predicate transition = transition
+
+   predicate vm_terminates (c:code) (mi mf:state) =
+     exists p r. codeseq_at c p ihalt /\
+       transition_star c (VMS 0 r Nil mi) (VMS p r Nil mf)
+
+   predicate vm_terminates_reg (c:code) (mi mf:state) =
+     forall r.
+     exists p r'. codeseq_at c p ihalt /\
+       transition_star c (VMS 0 r Nil mi) (VMS p r' Nil mf)
+
+  lemma trans_deterministic_aux : forall c mi mf1. transition c mi mf1 ->
+      forall mf2. ([@inversion] transition c mi mf2) -> mf1 = mf2
+
+  lemma trans_deterministic : forall c mi mf1 mf2.
+      transition c mi mf1 -> transition c mi mf2 -> mf1 = mf2
+
+  lemma trans_deterministic_star : forall c mi mf1 mf2.
+      transition c mi mf1 -> transition c mi mf2 -> mf1 = mf2
+
+end(* Determinstic semantics *)
diff --git a/vm/why3session.xml b/vm/why3session.xml
new file mode 100644
index 0000000..e938597
--- /dev/null
+++ b/vm/why3session.xml
@@ -0,0 +1,336 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!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="1.30" timelimit="1" steplimit="0" memlimit="1000"/>
+<prover id="1" name="Eprover" version="1.8-001" timelimit="5" steplimit="0" memlimit="1000"/>
+<prover id="2" name="Alt-Ergo" version="2.0.0" timelimit="10" steplimit="0" memlimit="2000"/>
+<prover id="3" name="Z3" version="4.7.1" alternative="counterexamples" timelimit="10" steplimit="0" memlimit="1000"/>
+<prover id="4" name="CVC4" version="1.6" alternative="counterexamples" timelimit="10" steplimit="0" memlimit="1000"/>
+<prover id="6" name="Alt-Ergo" version="2.2.0" timelimit="10" steplimit="0" memlimit="1000"/>
+<file name="../vm.mlw" proved="true">
+<theory name="ReflTransClosure" proved="true">
+ <goal name="transition_star_one" proved="true">
+ <proof prover="1"><result status="valid" time="0.01"/></proof>
+ </goal>
+ <goal name="transition_star_transitive" proved="true">
+ <transf name="induction_pr" proved="true" >
+  <goal name="transition_star_transitive.0" proved="true">
+  <transf name="simplify_trivial_quantification_in_goal" proved="true" >
+   <goal name="transition_star_transitive.0.0" proved="true">
+   <proof prover="0"><result status="valid" time="0.00" steps="1"/></proof>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="transition_star_transitive.1" proved="true">
+  <transf name="simplify_trivial_quantification_in_goal" proved="true" >
+   <goal name="transition_star_transitive.1.0" proved="true">
+   <proof prover="0"><result status="valid" time="0.00" steps="7"/></proof>
+   </goal>
+  </transf>
+  </goal>
+ </transf>
+ </goal>
+</theory>
+<theory name="Vm" proved="true">
+ <goal name="codeseq_at_app_right" proved="true">
+ <proof prover="2" timelimit="1" memlimit="1000"><result status="valid" time="0.01" steps="114"/></proof>
+ </goal>
+ <goal name="codeseq_at_app_left" proved="true">
+ <proof prover="2" timelimit="1" memlimit="1000"><result status="valid" time="0.03" steps="144"/></proof>
+ </goal>
+ <goal name="list_app_eq_nil" proved="true">
+ <proof prover="2"><result status="valid" time="0.04" steps="121"/></proof>
+ </goal>
+ <goal name="list_app_eq_left_cons" proved="true">
+ <transf name="induction_ty_lex" proved="true" >
+  <goal name="list_app_eq_left_cons.0" proved="true">
+  <transf name="split_goal_right" proved="true" >
+   <goal name="list_app_eq_left_cons.0.0" proved="true">
+   <proof prover="2" memlimit="1000"><result status="valid" time="0.07" steps="116"/></proof>
+   </goal>
+   <goal name="list_app_eq_left_cons.0.1" proved="true">
+   <transf name="introduce_premises" proved="true" >
+    <goal name="list_app_eq_left_cons.0.1.0" proved="true">
+    <transf name="subst_all" proved="true" >
+     <goal name="list_app_eq_left_cons.0.1.0.0" proved="true">
+     <proof prover="4"><result status="valid" time="0.12"/></proof>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="list_app_eq_last" proved="true">
+ <transf name="induction_ty_lex" proved="true" >
+  <goal name="list_app_eq_last.0" proved="true">
+  <transf name="split_goal_right" proved="true" >
+   <goal name="list_app_eq_last.0.0" proved="true">
+   <proof prover="6"><result status="valid" time="0.08" steps="407"/></proof>
+   </goal>
+   <goal name="list_app_eq_last.0.1" proved="true">
+   <transf name="introduce_premises" proved="true" >
+    <goal name="list_app_eq_last.0.1.0" proved="true">
+    <transf name="subst_all" proved="true" >
+     <goal name="list_app_eq_last.0.1.0.0" proved="true">
+     <proof prover="2"><result status="valid" time="0.05" steps="145"/></proof>
+     <transf name="cut" proved="true" arg1="(c2 = Cons x1 x)">
+      <goal name="list_app_eq_last.0.1.0.0.0" proved="true">
+      <proof prover="6"><result status="valid" time="0.08" steps="413"/></proof>
+      </goal>
+      <goal name="list_app_eq_last.0.1.0.0.1" proved="true">
+      <proof prover="3"><result status="valid" time="0.02"/></proof>
+      <proof prover="4"><result status="valid" time="0.05"/></proof>
+      <proof prover="6"><result status="valid" time="0.03" steps="154"/></proof>
+      </goal>
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="list_app_eq_left" proved="true">
+ <transf name="induction_ty_lex" proved="true" >
+  <goal name="list_app_eq_left.0" proved="true">
+  <transf name="split_goal_right" proved="true" >
+   <goal name="list_app_eq_left.0.0" proved="true">
+   <proof prover="2" memlimit="1000"><result status="valid" time="0.06" steps="98"/></proof>
+   </goal>
+   <goal name="list_app_eq_left.0.1" proved="true">
+   <transf name="introduce_premises" proved="true" >
+    <goal name="list_app_eq_left.0.1.0" proved="true">
+    <transf name="subst_all" proved="true" >
+     <goal name="list_app_eq_left.0.1.0.0" proved="true">
+     <proof prover="4" memlimit="2000"><result status="valid" time="0.32"/></proof>
+     </goal>
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="codeseq_at_right" proved="true">
+ <proof prover="2"><result status="valid" time="0.05" steps="123"/></proof>
+ </goal>
+ <goal name="VC push" expl="VC for push" proved="true">
+ <proof prover="2"><result status="valid" time="0.01" steps="75"/></proof>
+ </goal>
+ <goal name="VC iimm" expl="VC for iimm" proved="true">
+ <proof prover="2"><result status="valid" time="0.03" steps="75"/></proof>
+ </goal>
+ <goal name="VC iload" expl="VC for iload" proved="true">
+ <proof prover="2"><result status="valid" time="0.03" steps="75"/></proof>
+ </goal>
+ <goal name="VC istore" expl="VC for istore" proved="true">
+ <proof prover="2"><result status="valid" time="0.03" steps="75"/></proof>
+ </goal>
+ <goal name="VC iaddr" expl="VC for iaddr" proved="true">
+ <proof prover="2"><result status="valid" time="0.02" steps="75"/></proof>
+ </goal>
+ <goal name="VC isubr" expl="VC for isubr" proved="true">
+ <proof prover="2"><result status="valid" time="0.03" steps="75"/></proof>
+ </goal>
+ <goal name="VC ibeqr" expl="VC for ibeqr" proved="true">
+ <proof prover="2"><result status="valid" time="0.03" steps="75"/></proof>
+ </goal>
+ <goal name="VC ibner" expl="VC for ibner" proved="true">
+ <proof prover="2"><result status="valid" time="0.03" steps="75"/></proof>
+ </goal>
+ <goal name="VC ibler" expl="VC for ibler" proved="true">
+ <proof prover="2"><result status="valid" time="0.03" steps="75"/></proof>
+ </goal>
+ <goal name="VC ibgtr" expl="VC for ibgtr" proved="true">
+ <proof prover="2"><result status="valid" time="0.03" steps="75"/></proof>
+ </goal>
+ <goal name="VC iconst" expl="VC for iconst" proved="true">
+ <proof prover="2"><result status="valid" time="0.01" steps="75"/></proof>
+ </goal>
+ <goal name="VC ivar" expl="VC for ivar" proved="true">
+ <proof prover="2"><result status="valid" time="0.01" steps="75"/></proof>
+ </goal>
+ <goal name="VC isetvar" expl="VC for isetvar" proved="true">
+ <proof prover="2"><result status="valid" time="0.01" steps="75"/></proof>
+ </goal>
+ <goal name="VC iadd" expl="VC for iadd" proved="true">
+ <proof prover="2"><result status="valid" time="0.01" steps="75"/></proof>
+ </goal>
+ <goal name="VC iaddu" expl="VC for iaddu" proved="true">
+ <proof prover="2"><result status="valid" time="0.03" steps="75"/></proof>
+ </goal>
+ <goal name="VC isub" expl="VC for isub" proved="true">
+ <proof prover="2"><result status="valid" time="0.01" steps="75"/></proof>
+ </goal>
+ <goal name="VC imul" expl="VC for imul" proved="true">
+ <proof prover="2"><result status="valid" time="0.01" steps="75"/></proof>
+ </goal>
+ <goal name="VC ibeq" expl="VC for ibeq" proved="true">
+ <proof prover="2"><result status="valid" time="0.01" steps="75"/></proof>
+ </goal>
+ <goal name="VC ible" expl="VC for ible" proved="true">
+ <proof prover="2"><result status="valid" time="0.00" steps="75"/></proof>
+ </goal>
+ <goal name="VC ibne" expl="VC for ibne" proved="true">
+ <proof prover="2"><result status="valid" time="0.01" steps="75"/></proof>
+ </goal>
+ <goal name="VC ibgt" expl="VC for ibgt" proved="true">
+ <proof prover="2"><result status="valid" time="0.01" steps="75"/></proof>
+ </goal>
+ <goal name="VC ibranch" expl="VC for ibranch" proved="true">
+ <proof prover="2"><result status="valid" time="0.01" steps="75"/></proof>
+ </goal>
+ <goal name="VC ihalt" expl="VC for ihalt" proved="true">
+ <proof prover="2"><result status="valid" time="0.01" steps="75"/></proof>
+ </goal>
+ <goal name="g" proved="true">
+ <proof prover="2"><result status="valid" time="0.64" steps="2212"/></proof>
+ <transf name="inversion_pr" proved="true" >
+  <goal name="g.0" proved="true">
+  <proof prover="2"><result status="valid" time="0.08" steps="130"/></proof>
+  </goal>
+  <goal name="g.1" proved="true">
+  <proof prover="2"><result status="valid" time="0.07" steps="130"/></proof>
+  </goal>
+  <goal name="g.2" proved="true">
+  <proof prover="2"><result status="valid" time="0.07" steps="130"/></proof>
+  </goal>
+  <goal name="g.3" proved="true">
+  <proof prover="2"><result status="valid" time="0.08" steps="130"/></proof>
+  </goal>
+  <goal name="g.4" proved="true">
+  <proof prover="2"><result status="valid" time="0.10" steps="130"/></proof>
+  </goal>
+  <goal name="g.5" proved="true">
+  <proof prover="2"><result status="valid" time="0.10" steps="132"/></proof>
+  </goal>
+  <goal name="g.6" proved="true">
+  <proof prover="2"><result status="valid" time="0.08" steps="132"/></proof>
+  </goal>
+  <goal name="g.7" proved="true">
+  <proof prover="2"><result status="valid" time="0.10" steps="132"/></proof>
+  </goal>
+  <goal name="g.8" proved="true">
+  <proof prover="2"><result status="valid" time="0.10" steps="132"/></proof>
+  </goal>
+  <goal name="g.9" proved="true">
+  <proof prover="2"><result status="valid" time="0.10" steps="134"/></proof>
+  </goal>
+  <goal name="g.10" proved="true">
+  <proof prover="2"><result status="valid" time="0.07" steps="134"/></proof>
+  </goal>
+  <goal name="g.11" proved="true">
+  <proof prover="2"><result status="valid" time="0.07" steps="134"/></proof>
+  </goal>
+  <goal name="g.12" proved="true">
+  <proof prover="2"><result status="valid" time="0.08" steps="144"/></proof>
+  </goal>
+  <goal name="g.13" proved="true">
+  <proof prover="2"><result status="valid" time="0.07" steps="145"/></proof>
+  </goal>
+  <goal name="g.14" proved="true">
+  <proof prover="2"><result status="valid" time="0.11" steps="144"/></proof>
+  </goal>
+  <goal name="g.15" proved="true">
+  <proof prover="2"><result status="valid" time="0.13" steps="144"/></proof>
+  </goal>
+  <goal name="g.16" proved="true">
+  <proof prover="2"><result status="valid" time="0.08" steps="143"/></proof>
+  </goal>
+  <goal name="g.17" proved="true">
+  <proof prover="2"><result status="valid" time="0.09" steps="143"/></proof>
+  </goal>
+  <goal name="g.18" proved="true">
+  <proof prover="2"><result status="valid" time="0.10" steps="140"/></proof>
+  </goal>
+  <goal name="g.19" proved="true">
+  <proof prover="2"><result status="valid" time="0.07" steps="140"/></proof>
+  </goal>
+  <goal name="g.20" proved="true">
+  <proof prover="2"><result status="valid" time="0.06" steps="128"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="trans_deterministic_aux" proved="true">
+ <transf name="inversion_pr" proved="true" >
+  <goal name="trans_deterministic_aux.0" proved="true">
+  <proof prover="2"><result status="valid" time="1.22" steps="2215"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.1" proved="true">
+  <proof prover="2"><result status="valid" time="1.26" steps="2215"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.2" proved="true">
+  <proof prover="2"><result status="valid" time="1.27" steps="2216"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.3" proved="true">
+  <proof prover="2"><result status="valid" time="1.23" steps="2215"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.4" proved="true">
+  <proof prover="2"><result status="valid" time="1.32" steps="2215"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.5" proved="true">
+  <proof prover="2"><result status="valid" time="1.18" steps="2558"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.6" proved="true">
+  <proof prover="2"><result status="valid" time="1.49" steps="2558"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.7" proved="true">
+  <proof prover="2"><result status="valid" time="1.38" steps="2558"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.8" proved="true">
+  <proof prover="2"><result status="valid" time="1.73" steps="2589"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.9" proved="true">
+  <proof prover="2"><result status="valid" time="0.93" steps="2353"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.10" proved="true">
+  <proof prover="2"><result status="valid" time="1.32" steps="2353"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.11" proved="true">
+  <proof prover="2"><result status="valid" time="1.30" steps="2365"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.12" proved="true">
+  <proof prover="2"><result status="valid" time="1.15" steps="1939"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.13" proved="true">
+  <proof prover="2"><result status="valid" time="1.08" steps="2409"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.14" proved="true">
+  <proof prover="2"><result status="valid" time="1.02" steps="1951"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.15" proved="true">
+  <proof prover="2"><result status="valid" time="1.79" steps="1939"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.16" proved="true">
+  <proof prover="2"><result status="valid" time="1.54" steps="2817"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.17" proved="true">
+  <proof prover="2"><result status="valid" time="1.52" steps="2865"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.18" proved="true">
+  <proof prover="2"><result status="valid" time="1.18" steps="2676"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.19" proved="true">
+  <proof prover="2"><result status="valid" time="1.48" steps="2697"/></proof>
+  </goal>
+  <goal name="trans_deterministic_aux.20" proved="true">
+  <proof prover="2"><result status="valid" time="0.90" steps="2163"/></proof>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="trans_deterministic" proved="true">
+ <proof prover="2"><result status="valid" time="0.07" steps="101"/></proof>
+ </goal>
+ <goal name="trans_deterministic_star" proved="true">
+ <proof prover="2"><result status="valid" time="0.06" steps="93"/></proof>
+ </goal>
+</theory>
+</file>
+</why3session>
diff --git a/vm/why3shapes.gz b/vm/why3shapes.gz
new file mode 100644
index 0000000000000000000000000000000000000000..be97a25c828fa3e2dcd96df3f98f9fad508359f1
GIT binary patch
literal 3510
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
J!2(ML1^_Ud$7%oo

literal 0
HcmV?d00001

-- 
GitLab