From 3adbe18d36df3767e98f30b760ccd9c6ace640ad Mon Sep 17 00:00:00 2001
From: Nadrieril
Date: Fri, 24 May 2024 17:01:16 +0200
Subject: Rename some subdirectories for consistency

---
 tests/coq/hashmap_main/HashmapMain_Funs.v          |  589 ++++++++
 tests/coq/hashmap_main/HashmapMain_FunsExternal.v  |   24 +
 .../HashmapMain_FunsExternal_Template.v            |   26 +
 tests/coq/hashmap_main/HashmapMain_Types.v         |   40 +
 tests/coq/hashmap_main/HashmapMain_TypesExternal.v |   14 +
 .../HashmapMain_TypesExternal_Template.v           |   15 +
 tests/coq/hashmap_main/Makefile                    |   23 +
 tests/coq/hashmap_main/Primitives.v                |  981 ++++++++++++
 tests/coq/hashmap_main/_CoqProject                 |   12 +
 tests/coq/hashmap_on_disk/HashmapMain_Funs.v       |  589 --------
 .../coq/hashmap_on_disk/HashmapMain_FunsExternal.v |   24 -
 .../HashmapMain_FunsExternal_Template.v            |   26 -
 tests/coq/hashmap_on_disk/HashmapMain_Types.v      |   40 -
 .../hashmap_on_disk/HashmapMain_TypesExternal.v    |   14 -
 .../HashmapMain_TypesExternal_Template.v           |   15 -
 tests/coq/hashmap_on_disk/Makefile                 |   23 -
 tests/coq/hashmap_on_disk/Primitives.v             |  981 ------------
 tests/coq/hashmap_on_disk/_CoqProject              |   12 -
 .../hashmap_main/HashmapMain.Clauses.Template.fst  |   72 +
 tests/fstar/hashmap_main/HashmapMain.Clauses.fst   |   61 +
 tests/fstar/hashmap_main/HashmapMain.Funs.fst      |  446 ++++++
 .../hashmap_main/HashmapMain.FunsExternal.fsti     |   18 +
 .../fstar/hashmap_main/HashmapMain.Properties.fst  |   48 +
 tests/fstar/hashmap_main/HashmapMain.Types.fst     |   24 +
 .../hashmap_main/HashmapMain.TypesExternal.fsti    |   10 +
 tests/fstar/hashmap_main/Makefile                  |   49 +
 tests/fstar/hashmap_main/Primitives.fst            |  929 ++++++++++++
 .../HashmapMain.Clauses.Template.fst               |   72 -
 .../fstar/hashmap_on_disk/HashmapMain.Clauses.fst  |   61 -
 tests/fstar/hashmap_on_disk/HashmapMain.Funs.fst   |  446 ------
 .../hashmap_on_disk/HashmapMain.FunsExternal.fsti  |   18 -
 .../hashmap_on_disk/HashmapMain.Properties.fst     |   48 -
 tests/fstar/hashmap_on_disk/HashmapMain.Types.fst  |   24 -
 .../hashmap_on_disk/HashmapMain.TypesExternal.fsti |   10 -
 tests/fstar/hashmap_on_disk/Makefile               |   49 -
 tests/fstar/hashmap_on_disk/Primitives.fst         |  929 ------------
 tests/hol4/constants/Holmakefile                   |    5 +
 tests/hol4/constants/constantsScript.sml           |  217 +++
 tests/hol4/constants/constantsTheory.sig           |  538 +++++++
 tests/hol4/external/Holmakefile                    |    5 +
 tests/hol4/external/external_FunsScript.sml        |  108 ++
 tests/hol4/external/external_FunsTheory.sig        |  105 ++
 tests/hol4/external/external_OpaqueScript.sml      |   25 +
 tests/hol4/external/external_OpaqueTheory.sig      |   11 +
 tests/hol4/external/external_TypesScript.sml       |   13 +
 tests/hol4/external/external_TypesTheory.sig       |   11 +
 tests/hol4/hashmap_main/Holmakefile                |    5 +
 tests/hol4/hashmap_main/hashmapMain_FunsScript.sml |  647 ++++++++
 tests/hol4/hashmap_main/hashmapMain_FunsTheory.sig |  598 ++++++++
 .../hol4/hashmap_main/hashmapMain_OpaqueScript.sml |   15 +
 .../hol4/hashmap_main/hashmapMain_OpaqueTheory.sig |   11 +
 .../hol4/hashmap_main/hashmapMain_TypesScript.sml  |   27 +
 .../hol4/hashmap_main/hashmapMain_TypesTheory.sig  |  568 +++++++
 tests/hol4/hashmap_on_disk/Holmakefile             |    5 -
 .../hashmap_on_disk/hashmapMain_FunsScript.sml     |  647 --------
 .../hashmap_on_disk/hashmapMain_FunsTheory.sig     |  598 --------
 .../hashmap_on_disk/hashmapMain_OpaqueScript.sml   |   15 -
 .../hashmap_on_disk/hashmapMain_OpaqueTheory.sig   |   11 -
 .../hashmap_on_disk/hashmapMain_TypesScript.sml    |   27 -
 .../hashmap_on_disk/hashmapMain_TypesTheory.sig    |  568 -------
 tests/hol4/loops/Holmakefile                       |    5 +
 tests/hol4/loops/loops_FunsScript.sml              |  755 +++++++++
 tests/hol4/loops/loops_FunsTheory.sig              |  731 +++++++++
 tests/hol4/loops/loops_TypesScript.sml             |   13 +
 tests/hol4/loops/loops_TypesTheory.sig             |   94 ++
 tests/hol4/misc-constants/Holmakefile              |    5 -
 tests/hol4/misc-constants/constantsScript.sml      |  217 ---
 tests/hol4/misc-constants/constantsTheory.sig      |  538 -------
 tests/hol4/misc-external/Holmakefile               |    5 -
 tests/hol4/misc-external/external_FunsScript.sml   |  108 --
 tests/hol4/misc-external/external_FunsTheory.sig   |  105 --
 tests/hol4/misc-external/external_OpaqueScript.sml |   25 -
 tests/hol4/misc-external/external_OpaqueTheory.sig |   11 -
 tests/hol4/misc-external/external_TypesScript.sml  |   13 -
 tests/hol4/misc-external/external_TypesTheory.sig  |   11 -
 tests/hol4/misc-loops/Holmakefile                  |    5 -
 tests/hol4/misc-loops/loops_FunsScript.sml         |  755 ---------
 tests/hol4/misc-loops/loops_FunsTheory.sig         |  731 ---------
 tests/hol4/misc-loops/loops_TypesScript.sml        |   13 -
 tests/hol4/misc-loops/loops_TypesTheory.sig        |   94 --
 tests/hol4/misc-no_nested_borrows/Holmakefile      |    5 -
 .../noNestedBorrowsScript.sml                      |  592 --------
 .../noNestedBorrowsTheory.sig                      | 1598 --------------------
 tests/hol4/misc-paper/Holmakefile                  |    5 -
 tests/hol4/misc-paper/paperScript.sml              |  136 --
 tests/hol4/misc-paper/paperTheory.sig              |  210 ---
 tests/hol4/misc-polonius_list/Holmakefile          |    5 -
 .../hol4/misc-polonius_list/poloniusListScript.sml |   37 -
 .../hol4/misc-polonius_list/poloniusListTheory.sig |  120 --
 tests/hol4/no_nested_borrows/Holmakefile           |    5 +
 .../no_nested_borrows/noNestedBorrowsScript.sml    |  592 ++++++++
 .../no_nested_borrows/noNestedBorrowsTheory.sig    | 1598 ++++++++++++++++++++
 tests/hol4/paper/Holmakefile                       |    5 +
 tests/hol4/paper/paperScript.sml                   |  136 ++
 tests/hol4/paper/paperTheory.sig                   |  210 +++
 tests/hol4/polonius_list/Holmakefile               |    5 +
 tests/hol4/polonius_list/poloniusListScript.sml    |   37 +
 tests/hol4/polonius_list/poloniusListTheory.sig    |  120 ++
 tests/test_runner/run_test.ml                      |   20 +-
 99 files changed, 10603 insertions(+), 10609 deletions(-)
 create mode 100644 tests/coq/hashmap_main/HashmapMain_Funs.v
 create mode 100644 tests/coq/hashmap_main/HashmapMain_FunsExternal.v
 create mode 100644 tests/coq/hashmap_main/HashmapMain_FunsExternal_Template.v
 create mode 100644 tests/coq/hashmap_main/HashmapMain_Types.v
 create mode 100644 tests/coq/hashmap_main/HashmapMain_TypesExternal.v
 create mode 100644 tests/coq/hashmap_main/HashmapMain_TypesExternal_Template.v
 create mode 100644 tests/coq/hashmap_main/Makefile
 create mode 100644 tests/coq/hashmap_main/Primitives.v
 create mode 100644 tests/coq/hashmap_main/_CoqProject
 delete mode 100644 tests/coq/hashmap_on_disk/HashmapMain_Funs.v
 delete mode 100644 tests/coq/hashmap_on_disk/HashmapMain_FunsExternal.v
 delete mode 100644 tests/coq/hashmap_on_disk/HashmapMain_FunsExternal_Template.v
 delete mode 100644 tests/coq/hashmap_on_disk/HashmapMain_Types.v
 delete mode 100644 tests/coq/hashmap_on_disk/HashmapMain_TypesExternal.v
 delete mode 100644 tests/coq/hashmap_on_disk/HashmapMain_TypesExternal_Template.v
 delete mode 100644 tests/coq/hashmap_on_disk/Makefile
 delete mode 100644 tests/coq/hashmap_on_disk/Primitives.v
 delete mode 100644 tests/coq/hashmap_on_disk/_CoqProject
 create mode 100644 tests/fstar/hashmap_main/HashmapMain.Clauses.Template.fst
 create mode 100644 tests/fstar/hashmap_main/HashmapMain.Clauses.fst
 create mode 100644 tests/fstar/hashmap_main/HashmapMain.Funs.fst
 create mode 100644 tests/fstar/hashmap_main/HashmapMain.FunsExternal.fsti
 create mode 100644 tests/fstar/hashmap_main/HashmapMain.Properties.fst
 create mode 100644 tests/fstar/hashmap_main/HashmapMain.Types.fst
 create mode 100644 tests/fstar/hashmap_main/HashmapMain.TypesExternal.fsti
 create mode 100644 tests/fstar/hashmap_main/Makefile
 create mode 100644 tests/fstar/hashmap_main/Primitives.fst
 delete mode 100644 tests/fstar/hashmap_on_disk/HashmapMain.Clauses.Template.fst
 delete mode 100644 tests/fstar/hashmap_on_disk/HashmapMain.Clauses.fst
 delete mode 100644 tests/fstar/hashmap_on_disk/HashmapMain.Funs.fst
 delete mode 100644 tests/fstar/hashmap_on_disk/HashmapMain.FunsExternal.fsti
 delete mode 100644 tests/fstar/hashmap_on_disk/HashmapMain.Properties.fst
 delete mode 100644 tests/fstar/hashmap_on_disk/HashmapMain.Types.fst
 delete mode 100644 tests/fstar/hashmap_on_disk/HashmapMain.TypesExternal.fsti
 delete mode 100644 tests/fstar/hashmap_on_disk/Makefile
 delete mode 100644 tests/fstar/hashmap_on_disk/Primitives.fst
 create mode 100644 tests/hol4/constants/Holmakefile
 create mode 100644 tests/hol4/constants/constantsScript.sml
 create mode 100644 tests/hol4/constants/constantsTheory.sig
 create mode 100644 tests/hol4/external/Holmakefile
 create mode 100644 tests/hol4/external/external_FunsScript.sml
 create mode 100644 tests/hol4/external/external_FunsTheory.sig
 create mode 100644 tests/hol4/external/external_OpaqueScript.sml
 create mode 100644 tests/hol4/external/external_OpaqueTheory.sig
 create mode 100644 tests/hol4/external/external_TypesScript.sml
 create mode 100644 tests/hol4/external/external_TypesTheory.sig
 create mode 100644 tests/hol4/hashmap_main/Holmakefile
 create mode 100644 tests/hol4/hashmap_main/hashmapMain_FunsScript.sml
 create mode 100644 tests/hol4/hashmap_main/hashmapMain_FunsTheory.sig
 create mode 100644 tests/hol4/hashmap_main/hashmapMain_OpaqueScript.sml
 create mode 100644 tests/hol4/hashmap_main/hashmapMain_OpaqueTheory.sig
 create mode 100644 tests/hol4/hashmap_main/hashmapMain_TypesScript.sml
 create mode 100644 tests/hol4/hashmap_main/hashmapMain_TypesTheory.sig
 delete mode 100644 tests/hol4/hashmap_on_disk/Holmakefile
 delete mode 100644 tests/hol4/hashmap_on_disk/hashmapMain_FunsScript.sml
 delete mode 100644 tests/hol4/hashmap_on_disk/hashmapMain_FunsTheory.sig
 delete mode 100644 tests/hol4/hashmap_on_disk/hashmapMain_OpaqueScript.sml
 delete mode 100644 tests/hol4/hashmap_on_disk/hashmapMain_OpaqueTheory.sig
 delete mode 100644 tests/hol4/hashmap_on_disk/hashmapMain_TypesScript.sml
 delete mode 100644 tests/hol4/hashmap_on_disk/hashmapMain_TypesTheory.sig
 create mode 100644 tests/hol4/loops/Holmakefile
 create mode 100644 tests/hol4/loops/loops_FunsScript.sml
 create mode 100644 tests/hol4/loops/loops_FunsTheory.sig
 create mode 100644 tests/hol4/loops/loops_TypesScript.sml
 create mode 100644 tests/hol4/loops/loops_TypesTheory.sig
 delete mode 100644 tests/hol4/misc-constants/Holmakefile
 delete mode 100644 tests/hol4/misc-constants/constantsScript.sml
 delete mode 100644 tests/hol4/misc-constants/constantsTheory.sig
 delete mode 100644 tests/hol4/misc-external/Holmakefile
 delete mode 100644 tests/hol4/misc-external/external_FunsScript.sml
 delete mode 100644 tests/hol4/misc-external/external_FunsTheory.sig
 delete mode 100644 tests/hol4/misc-external/external_OpaqueScript.sml
 delete mode 100644 tests/hol4/misc-external/external_OpaqueTheory.sig
 delete mode 100644 tests/hol4/misc-external/external_TypesScript.sml
 delete mode 100644 tests/hol4/misc-external/external_TypesTheory.sig
 delete mode 100644 tests/hol4/misc-loops/Holmakefile
 delete mode 100644 tests/hol4/misc-loops/loops_FunsScript.sml
 delete mode 100644 tests/hol4/misc-loops/loops_FunsTheory.sig
 delete mode 100644 tests/hol4/misc-loops/loops_TypesScript.sml
 delete mode 100644 tests/hol4/misc-loops/loops_TypesTheory.sig
 delete mode 100644 tests/hol4/misc-no_nested_borrows/Holmakefile
 delete mode 100644 tests/hol4/misc-no_nested_borrows/noNestedBorrowsScript.sml
 delete mode 100644 tests/hol4/misc-no_nested_borrows/noNestedBorrowsTheory.sig
 delete mode 100644 tests/hol4/misc-paper/Holmakefile
 delete mode 100644 tests/hol4/misc-paper/paperScript.sml
 delete mode 100644 tests/hol4/misc-paper/paperTheory.sig
 delete mode 100644 tests/hol4/misc-polonius_list/Holmakefile
 delete mode 100644 tests/hol4/misc-polonius_list/poloniusListScript.sml
 delete mode 100644 tests/hol4/misc-polonius_list/poloniusListTheory.sig
 create mode 100644 tests/hol4/no_nested_borrows/Holmakefile
 create mode 100644 tests/hol4/no_nested_borrows/noNestedBorrowsScript.sml
 create mode 100644 tests/hol4/no_nested_borrows/noNestedBorrowsTheory.sig
 create mode 100644 tests/hol4/paper/Holmakefile
 create mode 100644 tests/hol4/paper/paperScript.sml
 create mode 100644 tests/hol4/paper/paperTheory.sig
 create mode 100644 tests/hol4/polonius_list/Holmakefile
 create mode 100644 tests/hol4/polonius_list/poloniusListScript.sml
 create mode 100644 tests/hol4/polonius_list/poloniusListTheory.sig

diff --git a/tests/coq/hashmap_main/HashmapMain_Funs.v b/tests/coq/hashmap_main/HashmapMain_Funs.v
new file mode 100644
index 00000000..f6467d5a
--- /dev/null
+++ b/tests/coq/hashmap_main/HashmapMain_Funs.v
@@ -0,0 +1,589 @@
+(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
+(** [hashmap_main]: function definitions *)
+Require Import Primitives.
+Import Primitives.
+Require Import Coq.ZArith.ZArith.
+Require Import List.
+Import ListNotations.
+Local Open Scope Primitives_scope.
+Require Import HashmapMain_Types.
+Include HashmapMain_Types.
+Require Import HashmapMain_FunsExternal.
+Include HashmapMain_FunsExternal.
+Module HashmapMain_Funs.
+
+(** [hashmap_main::hashmap::hash_key]:
+    Source: 'tests/src/hashmap.rs', lines 35:0-35:32 *)
+Definition hashmap_hash_key (k : usize) : result usize :=
+  Ok k.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::allocate_slots]: loop 0:
+    Source: 'tests/src/hashmap.rs', lines 58:4-64:5 *)
+Fixpoint hashmap_HashMap_allocate_slots_loop
+  (T : Type) (n : nat) (slots : alloc_vec_Vec (hashmap_List_t T)) (n1 : usize)
+  :
+  result (alloc_vec_Vec (hashmap_List_t T))
+  :=
+  match n with
+  | O => Fail_ OutOfFuel
+  | S n2 =>
+    if n1 s> 0%usize
+    then (
+      slots1 <- alloc_vec_Vec_push (hashmap_List_t T) slots Hashmap_List_Nil;
+      n3 <- usize_sub n1 1%usize;
+      hashmap_HashMap_allocate_slots_loop T n2 slots1 n3)
+    else Ok slots
+  end
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::allocate_slots]:
+    Source: 'tests/src/hashmap.rs', lines 58:4-58:76 *)
+Definition hashmap_HashMap_allocate_slots
+  (T : Type) (n : nat) (slots : alloc_vec_Vec (hashmap_List_t T)) (n1 : usize)
+  :
+  result (alloc_vec_Vec (hashmap_List_t T))
+  :=
+  hashmap_HashMap_allocate_slots_loop T n slots n1
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::new_with_capacity]:
+    Source: 'tests/src/hashmap.rs', lines 67:4-71:13 *)
+Definition hashmap_HashMap_new_with_capacity
+  (T : Type) (n : nat) (capacity : usize) (max_load_dividend : usize)
+  (max_load_divisor : usize) :
+  result (hashmap_HashMap_t T)
+  :=
+  slots <-
+    hashmap_HashMap_allocate_slots T n (alloc_vec_Vec_new (hashmap_List_t T))
+      capacity;
+  i <- usize_mul capacity max_load_dividend;
+  i1 <- usize_div i max_load_divisor;
+  Ok
+    {|
+      hashmap_HashMap_num_entries := 0%usize;
+      hashmap_HashMap_max_load_factor := (max_load_dividend, max_load_divisor);
+      hashmap_HashMap_max_load := i1;
+      hashmap_HashMap_slots := slots
+    |}
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::new]:
+    Source: 'tests/src/hashmap.rs', lines 83:4-83:24 *)
+Definition hashmap_HashMap_new
+  (T : Type) (n : nat) : result (hashmap_HashMap_t T) :=
+  hashmap_HashMap_new_with_capacity T n 32%usize 4%usize 5%usize
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::clear]: loop 0:
+    Source: 'tests/src/hashmap.rs', lines 88:4-96:5 *)
+Fixpoint hashmap_HashMap_clear_loop
+  (T : Type) (n : nat) (slots : alloc_vec_Vec (hashmap_List_t T)) (i : usize) :
+  result (alloc_vec_Vec (hashmap_List_t T))
+  :=
+  match n with
+  | O => Fail_ OutOfFuel
+  | S n1 =>
+    let i1 := alloc_vec_Vec_len (hashmap_List_t T) slots in
+    if i s< i1
+    then (
+      p <-
+        alloc_vec_Vec_index_mut (hashmap_List_t T) usize
+          (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t T)) slots
+          i;
+      let (_, index_mut_back) := p in
+      i2 <- usize_add i 1%usize;
+      slots1 <- index_mut_back Hashmap_List_Nil;
+      hashmap_HashMap_clear_loop T n1 slots1 i2)
+    else Ok slots
+  end
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::clear]:
+    Source: 'tests/src/hashmap.rs', lines 88:4-88:27 *)
+Definition hashmap_HashMap_clear
+  (T : Type) (n : nat) (self : hashmap_HashMap_t T) :
+  result (hashmap_HashMap_t T)
+  :=
+  hm <- hashmap_HashMap_clear_loop T n self.(hashmap_HashMap_slots) 0%usize;
+  Ok
+    {|
+      hashmap_HashMap_num_entries := 0%usize;
+      hashmap_HashMap_max_load_factor := self.(hashmap_HashMap_max_load_factor);
+      hashmap_HashMap_max_load := self.(hashmap_HashMap_max_load);
+      hashmap_HashMap_slots := hm
+    |}
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::len]:
+    Source: 'tests/src/hashmap.rs', lines 98:4-98:30 *)
+Definition hashmap_HashMap_len
+  (T : Type) (self : hashmap_HashMap_t T) : result usize :=
+  Ok self.(hashmap_HashMap_num_entries)
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::insert_in_list]: loop 0:
+    Source: 'tests/src/hashmap.rs', lines 105:4-122:5 *)
+Fixpoint hashmap_HashMap_insert_in_list_loop
+  (T : Type) (n : nat) (key : usize) (value : T) (ls : hashmap_List_t T) :
+  result (bool * (hashmap_List_t T))
+  :=
+  match n with
+  | O => Fail_ OutOfFuel
+  | S n1 =>
+    match ls with
+    | Hashmap_List_Cons ckey cvalue tl =>
+      if ckey s= key
+      then Ok (false, Hashmap_List_Cons ckey value tl)
+      else (
+        p <- hashmap_HashMap_insert_in_list_loop T n1 key value tl;
+        let (b, tl1) := p in
+        Ok (b, Hashmap_List_Cons ckey cvalue tl1))
+    | Hashmap_List_Nil =>
+      Ok (true, Hashmap_List_Cons key value Hashmap_List_Nil)
+    end
+  end
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::insert_in_list]:
+    Source: 'tests/src/hashmap.rs', lines 105:4-105:71 *)
+Definition hashmap_HashMap_insert_in_list
+  (T : Type) (n : nat) (key : usize) (value : T) (ls : hashmap_List_t T) :
+  result (bool * (hashmap_List_t T))
+  :=
+  hashmap_HashMap_insert_in_list_loop T n key value ls
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::insert_no_resize]:
+    Source: 'tests/src/hashmap.rs', lines 125:4-125:54 *)
+Definition hashmap_HashMap_insert_no_resize
+  (T : Type) (n : nat) (self : hashmap_HashMap_t T) (key : usize) (value : T) :
+  result (hashmap_HashMap_t T)
+  :=
+  hash <- hashmap_hash_key key;
+  let i := alloc_vec_Vec_len (hashmap_List_t T) self.(hashmap_HashMap_slots) in
+  hash_mod <- usize_rem hash i;
+  p <-
+    alloc_vec_Vec_index_mut (hashmap_List_t T) usize
+      (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t T))
+      self.(hashmap_HashMap_slots) hash_mod;
+  let (l, index_mut_back) := p in
+  p1 <- hashmap_HashMap_insert_in_list T n key value l;
+  let (inserted, l1) := p1 in
+  if inserted
+  then (
+    i1 <- usize_add self.(hashmap_HashMap_num_entries) 1%usize;
+    v <- index_mut_back l1;
+    Ok
+      {|
+        hashmap_HashMap_num_entries := i1;
+        hashmap_HashMap_max_load_factor :=
+          self.(hashmap_HashMap_max_load_factor);
+        hashmap_HashMap_max_load := self.(hashmap_HashMap_max_load);
+        hashmap_HashMap_slots := v
+      |})
+  else (
+    v <- index_mut_back l1;
+    Ok
+      {|
+        hashmap_HashMap_num_entries := self.(hashmap_HashMap_num_entries);
+        hashmap_HashMap_max_load_factor :=
+          self.(hashmap_HashMap_max_load_factor);
+        hashmap_HashMap_max_load := self.(hashmap_HashMap_max_load);
+        hashmap_HashMap_slots := v
+      |})
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::move_elements_from_list]: loop 0:
+    Source: 'tests/src/hashmap.rs', lines 191:4-204:5 *)
+Fixpoint hashmap_HashMap_move_elements_from_list_loop
+  (T : Type) (n : nat) (ntable : hashmap_HashMap_t T) (ls : hashmap_List_t T) :
+  result (hashmap_HashMap_t T)
+  :=
+  match n with
+  | O => Fail_ OutOfFuel
+  | S n1 =>
+    match ls with
+    | Hashmap_List_Cons k v tl =>
+      ntable1 <- hashmap_HashMap_insert_no_resize T n1 ntable k v;
+      hashmap_HashMap_move_elements_from_list_loop T n1 ntable1 tl
+    | Hashmap_List_Nil => Ok ntable
+    end
+  end
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::move_elements_from_list]:
+    Source: 'tests/src/hashmap.rs', lines 191:4-191:72 *)
+Definition hashmap_HashMap_move_elements_from_list
+  (T : Type) (n : nat) (ntable : hashmap_HashMap_t T) (ls : hashmap_List_t T) :
+  result (hashmap_HashMap_t T)
+  :=
+  hashmap_HashMap_move_elements_from_list_loop T n ntable ls
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::move_elements]: loop 0:
+    Source: 'tests/src/hashmap.rs', lines 179:4-188:5 *)
+Fixpoint hashmap_HashMap_move_elements_loop
+  (T : Type) (n : nat) (ntable : hashmap_HashMap_t T)
+  (slots : alloc_vec_Vec (hashmap_List_t T)) (i : usize) :
+  result ((hashmap_HashMap_t T) * (alloc_vec_Vec (hashmap_List_t T)))
+  :=
+  match n with
+  | O => Fail_ OutOfFuel
+  | S n1 =>
+    let i1 := alloc_vec_Vec_len (hashmap_List_t T) slots in
+    if i s< i1
+    then (
+      p <-
+        alloc_vec_Vec_index_mut (hashmap_List_t T) usize
+          (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t T)) slots
+          i;
+      let (l, index_mut_back) := p in
+      let (ls, l1) := core_mem_replace (hashmap_List_t T) l Hashmap_List_Nil in
+      ntable1 <- hashmap_HashMap_move_elements_from_list T n1 ntable ls;
+      i2 <- usize_add i 1%usize;
+      slots1 <- index_mut_back l1;
+      hashmap_HashMap_move_elements_loop T n1 ntable1 slots1 i2)
+    else Ok (ntable, slots)
+  end
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::move_elements]:
+    Source: 'tests/src/hashmap.rs', lines 179:4-179:95 *)
+Definition hashmap_HashMap_move_elements
+  (T : Type) (n : nat) (ntable : hashmap_HashMap_t T)
+  (slots : alloc_vec_Vec (hashmap_List_t T)) (i : usize) :
+  result ((hashmap_HashMap_t T) * (alloc_vec_Vec (hashmap_List_t T)))
+  :=
+  hashmap_HashMap_move_elements_loop T n ntable slots i
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::try_resize]:
+    Source: 'tests/src/hashmap.rs', lines 148:4-148:28 *)
+Definition hashmap_HashMap_try_resize
+  (T : Type) (n : nat) (self : hashmap_HashMap_t T) :
+  result (hashmap_HashMap_t T)
+  :=
+  max_usize <- scalar_cast U32 Usize core_u32_max;
+  let capacity :=
+    alloc_vec_Vec_len (hashmap_List_t T) self.(hashmap_HashMap_slots) in
+  n1 <- usize_div max_usize 2%usize;
+  let (i, i1) := self.(hashmap_HashMap_max_load_factor) in
+  i2 <- usize_div n1 i;
+  if capacity s<= i2
+  then (
+    i3 <- usize_mul capacity 2%usize;
+    ntable <- hashmap_HashMap_new_with_capacity T n i3 i i1;
+    p <-
+      hashmap_HashMap_move_elements T n ntable self.(hashmap_HashMap_slots)
+        0%usize;
+    let (ntable1, _) := p in
+    Ok
+      {|
+        hashmap_HashMap_num_entries := self.(hashmap_HashMap_num_entries);
+        hashmap_HashMap_max_load_factor := (i, i1);
+        hashmap_HashMap_max_load := ntable1.(hashmap_HashMap_max_load);
+        hashmap_HashMap_slots := ntable1.(hashmap_HashMap_slots)
+      |})
+  else
+    Ok
+      {|
+        hashmap_HashMap_num_entries := self.(hashmap_HashMap_num_entries);
+        hashmap_HashMap_max_load_factor := (i, i1);
+        hashmap_HashMap_max_load := self.(hashmap_HashMap_max_load);
+        hashmap_HashMap_slots := self.(hashmap_HashMap_slots)
+      |}
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::insert]:
+    Source: 'tests/src/hashmap.rs', lines 137:4-137:48 *)
+Definition hashmap_HashMap_insert
+  (T : Type) (n : nat) (self : hashmap_HashMap_t T) (key : usize) (value : T) :
+  result (hashmap_HashMap_t T)
+  :=
+  self1 <- hashmap_HashMap_insert_no_resize T n self key value;
+  i <- hashmap_HashMap_len T self1;
+  if i s> self1.(hashmap_HashMap_max_load)
+  then hashmap_HashMap_try_resize T n self1
+  else Ok self1
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::contains_key_in_list]: loop 0:
+    Source: 'tests/src/hashmap.rs', lines 214:4-227:5 *)
+Fixpoint hashmap_HashMap_contains_key_in_list_loop
+  (T : Type) (n : nat) (key : usize) (ls : hashmap_List_t T) : result bool :=
+  match n with
+  | O => Fail_ OutOfFuel
+  | S n1 =>
+    match ls with
+    | Hashmap_List_Cons ckey _ tl =>
+      if ckey s= key
+      then Ok true
+      else hashmap_HashMap_contains_key_in_list_loop T n1 key tl
+    | Hashmap_List_Nil => Ok false
+    end
+  end
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::contains_key_in_list]:
+    Source: 'tests/src/hashmap.rs', lines 214:4-214:68 *)
+Definition hashmap_HashMap_contains_key_in_list
+  (T : Type) (n : nat) (key : usize) (ls : hashmap_List_t T) : result bool :=
+  hashmap_HashMap_contains_key_in_list_loop T n key ls
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::contains_key]:
+    Source: 'tests/src/hashmap.rs', lines 207:4-207:49 *)
+Definition hashmap_HashMap_contains_key
+  (T : Type) (n : nat) (self : hashmap_HashMap_t T) (key : usize) :
+  result bool
+  :=
+  hash <- hashmap_hash_key key;
+  let i := alloc_vec_Vec_len (hashmap_List_t T) self.(hashmap_HashMap_slots) in
+  hash_mod <- usize_rem hash i;
+  l <-
+    alloc_vec_Vec_index (hashmap_List_t T) usize
+      (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t T))
+      self.(hashmap_HashMap_slots) hash_mod;
+  hashmap_HashMap_contains_key_in_list T n key l
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get_in_list]: loop 0:
+    Source: 'tests/src/hashmap.rs', lines 232:4-245:5 *)
+Fixpoint hashmap_HashMap_get_in_list_loop
+  (T : Type) (n : nat) (key : usize) (ls : hashmap_List_t T) : result T :=
+  match n with
+  | O => Fail_ OutOfFuel
+  | S n1 =>
+    match ls with
+    | Hashmap_List_Cons ckey cvalue tl =>
+      if ckey s= key
+      then Ok cvalue
+      else hashmap_HashMap_get_in_list_loop T n1 key tl
+    | Hashmap_List_Nil => Fail_ Failure
+    end
+  end
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get_in_list]:
+    Source: 'tests/src/hashmap.rs', lines 232:4-232:70 *)
+Definition hashmap_HashMap_get_in_list
+  (T : Type) (n : nat) (key : usize) (ls : hashmap_List_t T) : result T :=
+  hashmap_HashMap_get_in_list_loop T n key ls
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get]:
+    Source: 'tests/src/hashmap.rs', lines 247:4-247:55 *)
+Definition hashmap_HashMap_get
+  (T : Type) (n : nat) (self : hashmap_HashMap_t T) (key : usize) : result T :=
+  hash <- hashmap_hash_key key;
+  let i := alloc_vec_Vec_len (hashmap_List_t T) self.(hashmap_HashMap_slots) in
+  hash_mod <- usize_rem hash i;
+  l <-
+    alloc_vec_Vec_index (hashmap_List_t T) usize
+      (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t T))
+      self.(hashmap_HashMap_slots) hash_mod;
+  hashmap_HashMap_get_in_list T n key l
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get_mut_in_list]: loop 0:
+    Source: 'tests/src/hashmap.rs', lines 253:4-262:5 *)
+Fixpoint hashmap_HashMap_get_mut_in_list_loop
+  (T : Type) (n : nat) (ls : hashmap_List_t T) (key : usize) :
+  result (T * (T -> result (hashmap_List_t T)))
+  :=
+  match n with
+  | O => Fail_ OutOfFuel
+  | S n1 =>
+    match ls with
+    | Hashmap_List_Cons ckey cvalue tl =>
+      if ckey s= key
+      then
+        let back := fun (ret : T) => Ok (Hashmap_List_Cons ckey ret tl) in
+        Ok (cvalue, back)
+      else (
+        p <- hashmap_HashMap_get_mut_in_list_loop T n1 tl key;
+        let (t, back) := p in
+        let back1 :=
+          fun (ret : T) =>
+            tl1 <- back ret; Ok (Hashmap_List_Cons ckey cvalue tl1) in
+        Ok (t, back1))
+    | Hashmap_List_Nil => Fail_ Failure
+    end
+  end
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get_mut_in_list]:
+    Source: 'tests/src/hashmap.rs', lines 253:4-253:86 *)
+Definition hashmap_HashMap_get_mut_in_list
+  (T : Type) (n : nat) (ls : hashmap_List_t T) (key : usize) :
+  result (T * (T -> result (hashmap_List_t T)))
+  :=
+  hashmap_HashMap_get_mut_in_list_loop T n ls key
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get_mut]:
+    Source: 'tests/src/hashmap.rs', lines 265:4-265:67 *)
+Definition hashmap_HashMap_get_mut
+  (T : Type) (n : nat) (self : hashmap_HashMap_t T) (key : usize) :
+  result (T * (T -> result (hashmap_HashMap_t T)))
+  :=
+  hash <- hashmap_hash_key key;
+  let i := alloc_vec_Vec_len (hashmap_List_t T) self.(hashmap_HashMap_slots) in
+  hash_mod <- usize_rem hash i;
+  p <-
+    alloc_vec_Vec_index_mut (hashmap_List_t T) usize
+      (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t T))
+      self.(hashmap_HashMap_slots) hash_mod;
+  let (l, index_mut_back) := p in
+  p1 <- hashmap_HashMap_get_mut_in_list T n l key;
+  let (t, get_mut_in_list_back) := p1 in
+  let back :=
+    fun (ret : T) =>
+      l1 <- get_mut_in_list_back ret;
+      v <- index_mut_back l1;
+      Ok
+        {|
+          hashmap_HashMap_num_entries := self.(hashmap_HashMap_num_entries);
+          hashmap_HashMap_max_load_factor :=
+            self.(hashmap_HashMap_max_load_factor);
+          hashmap_HashMap_max_load := self.(hashmap_HashMap_max_load);
+          hashmap_HashMap_slots := v
+        |} in
+  Ok (t, back)
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::remove_from_list]: loop 0:
+    Source: 'tests/src/hashmap.rs', lines 273:4-299:5 *)
+Fixpoint hashmap_HashMap_remove_from_list_loop
+  (T : Type) (n : nat) (key : usize) (ls : hashmap_List_t T) :
+  result ((option T) * (hashmap_List_t T))
+  :=
+  match n with
+  | O => Fail_ OutOfFuel
+  | S n1 =>
+    match ls with
+    | Hashmap_List_Cons ckey t tl =>
+      if ckey s= key
+      then
+        let (mv_ls, _) :=
+          core_mem_replace (hashmap_List_t T) (Hashmap_List_Cons ckey t tl)
+            Hashmap_List_Nil in
+        match mv_ls with
+        | Hashmap_List_Cons _ cvalue tl1 => Ok (Some cvalue, tl1)
+        | Hashmap_List_Nil => Fail_ Failure
+        end
+      else (
+        p <- hashmap_HashMap_remove_from_list_loop T n1 key tl;
+        let (o, tl1) := p in
+        Ok (o, Hashmap_List_Cons ckey t tl1))
+    | Hashmap_List_Nil => Ok (None, Hashmap_List_Nil)
+    end
+  end
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::remove_from_list]:
+    Source: 'tests/src/hashmap.rs', lines 273:4-273:69 *)
+Definition hashmap_HashMap_remove_from_list
+  (T : Type) (n : nat) (key : usize) (ls : hashmap_List_t T) :
+  result ((option T) * (hashmap_List_t T))
+  :=
+  hashmap_HashMap_remove_from_list_loop T n key ls
+.
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::remove]:
+    Source: 'tests/src/hashmap.rs', lines 302:4-302:52 *)
+Definition hashmap_HashMap_remove
+  (T : Type) (n : nat) (self : hashmap_HashMap_t T) (key : usize) :
+  result ((option T) * (hashmap_HashMap_t T))
+  :=
+  hash <- hashmap_hash_key key;
+  let i := alloc_vec_Vec_len (hashmap_List_t T) self.(hashmap_HashMap_slots) in
+  hash_mod <- usize_rem hash i;
+  p <-
+    alloc_vec_Vec_index_mut (hashmap_List_t T) usize
+      (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t T))
+      self.(hashmap_HashMap_slots) hash_mod;
+  let (l, index_mut_back) := p in
+  p1 <- hashmap_HashMap_remove_from_list T n key l;
+  let (x, l1) := p1 in
+  match x with
+  | None =>
+    v <- index_mut_back l1;
+    Ok (None,
+      {|
+        hashmap_HashMap_num_entries := self.(hashmap_HashMap_num_entries);
+        hashmap_HashMap_max_load_factor :=
+          self.(hashmap_HashMap_max_load_factor);
+        hashmap_HashMap_max_load := self.(hashmap_HashMap_max_load);
+        hashmap_HashMap_slots := v
+      |})
+  | Some x1 =>
+    i1 <- usize_sub self.(hashmap_HashMap_num_entries) 1%usize;
+    v <- index_mut_back l1;
+    Ok (Some x1,
+      {|
+        hashmap_HashMap_num_entries := i1;
+        hashmap_HashMap_max_load_factor :=
+          self.(hashmap_HashMap_max_load_factor);
+        hashmap_HashMap_max_load := self.(hashmap_HashMap_max_load);
+        hashmap_HashMap_slots := v
+      |})
+  end
+.
+
+(** [hashmap_main::hashmap::test1]:
+    Source: 'tests/src/hashmap.rs', lines 323:0-323:10 *)
+Definition hashmap_test1 (n : nat) : result unit :=
+  hm <- hashmap_HashMap_new u64 n;
+  hm1 <- hashmap_HashMap_insert u64 n hm 0%usize 42%u64;
+  hm2 <- hashmap_HashMap_insert u64 n hm1 128%usize 18%u64;
+  hm3 <- hashmap_HashMap_insert u64 n hm2 1024%usize 138%u64;
+  hm4 <- hashmap_HashMap_insert u64 n hm3 1056%usize 256%u64;
+  i <- hashmap_HashMap_get u64 n hm4 128%usize;
+  if negb (i s= 18%u64)
+  then Fail_ Failure
+  else (
+    p <- hashmap_HashMap_get_mut u64 n hm4 1024%usize;
+    let (_, get_mut_back) := p in
+    hm5 <- get_mut_back 56%u64;
+    i1 <- hashmap_HashMap_get u64 n hm5 1024%usize;
+    if negb (i1 s= 56%u64)
+    then Fail_ Failure
+    else (
+      p1 <- hashmap_HashMap_remove u64 n hm5 1024%usize;
+      let (x, hm6) := p1 in
+      match x with
+      | None => Fail_ Failure
+      | Some x1 =>
+        if negb (x1 s= 56%u64)
+        then Fail_ Failure
+        else (
+          i2 <- hashmap_HashMap_get u64 n hm6 0%usize;
+          if negb (i2 s= 42%u64)
+          then Fail_ Failure
+          else (
+            i3 <- hashmap_HashMap_get u64 n hm6 128%usize;
+            if negb (i3 s= 18%u64)
+            then Fail_ Failure
+            else (
+              i4 <- hashmap_HashMap_get u64 n hm6 1056%usize;
+              if negb (i4 s= 256%u64) then Fail_ Failure else Ok tt)))
+      end))
+.
+
+(** [hashmap_main::insert_on_disk]:
+    Source: 'tests/src/hashmap_main.rs', lines 13:0-13:43 *)
+Definition insert_on_disk
+  (n : nat) (key : usize) (value : u64) (st : state) : result (state * unit) :=
+  p <- hashmap_utils_deserialize st;
+  let (st1, hm) := p in
+  hm1 <- hashmap_HashMap_insert u64 n hm key value;
+  hashmap_utils_serialize hm1 st1
+.
+
+(** [hashmap_main::main]:
+    Source: 'tests/src/hashmap_main.rs', lines 22:0-22:13 *)
+Definition main : result unit :=
+  Ok tt.
+
+End HashmapMain_Funs.
diff --git a/tests/coq/hashmap_main/HashmapMain_FunsExternal.v b/tests/coq/hashmap_main/HashmapMain_FunsExternal.v
new file mode 100644
index 00000000..fb5f23cd
--- /dev/null
+++ b/tests/coq/hashmap_main/HashmapMain_FunsExternal.v
@@ -0,0 +1,24 @@
+(** [hashmap_main]: external function declarations *)
+Require Import Primitives.
+Import Primitives.
+Require Import Coq.ZArith.ZArith.
+Require Import List.
+Import ListNotations.
+Local Open Scope Primitives_scope.
+Require Export HashmapMain_Types.
+Import HashmapMain_Types.
+Module HashmapMain_FunsExternal.
+
+(** [hashmap_main::hashmap_utils::deserialize]: forward function
+    Source: 'src/hashmap_utils.rs', lines 10:0-10:43 *)
+Axiom hashmap_utils_deserialize
+  : state -> result (state * (hashmap_HashMap_t u64))
+.
+
+(** [hashmap_main::hashmap_utils::serialize]: forward function
+    Source: 'src/hashmap_utils.rs', lines 5:0-5:42 *)
+Axiom hashmap_utils_serialize
+  : hashmap_HashMap_t u64 -> state -> result (state * unit)
+.
+
+End HashmapMain_FunsExternal.
diff --git a/tests/coq/hashmap_main/HashmapMain_FunsExternal_Template.v b/tests/coq/hashmap_main/HashmapMain_FunsExternal_Template.v
new file mode 100644
index 00000000..66835e8c
--- /dev/null
+++ b/tests/coq/hashmap_main/HashmapMain_FunsExternal_Template.v
@@ -0,0 +1,26 @@
+(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
+(** [hashmap_main]: external functions.
+-- This is a template file: rename it to "FunsExternal.lean" and fill the holes. *)
+Require Import Primitives.
+Import Primitives.
+Require Import Coq.ZArith.ZArith.
+Require Import List.
+Import ListNotations.
+Local Open Scope Primitives_scope.
+Require Import HashmapMain_Types.
+Include HashmapMain_Types.
+Module HashmapMain_FunsExternal_Template.
+
+(** [hashmap_main::hashmap_utils::deserialize]:
+    Source: 'tests/src/hashmap_utils.rs', lines 11:0-11:43 *)
+Axiom hashmap_utils_deserialize
+  : state -> result (state * (hashmap_HashMap_t u64))
+.
+
+(** [hashmap_main::hashmap_utils::serialize]:
+    Source: 'tests/src/hashmap_utils.rs', lines 6:0-6:42 *)
+Axiom hashmap_utils_serialize
+  : hashmap_HashMap_t u64 -> state -> result (state * unit)
+.
+
+End HashmapMain_FunsExternal_Template.
diff --git a/tests/coq/hashmap_main/HashmapMain_Types.v b/tests/coq/hashmap_main/HashmapMain_Types.v
new file mode 100644
index 00000000..5656bd9c
--- /dev/null
+++ b/tests/coq/hashmap_main/HashmapMain_Types.v
@@ -0,0 +1,40 @@
+(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
+(** [hashmap_main]: type definitions *)
+Require Import Primitives.
+Import Primitives.
+Require Import Coq.ZArith.ZArith.
+Require Import List.
+Import ListNotations.
+Local Open Scope Primitives_scope.
+Require Import HashmapMain_TypesExternal.
+Include HashmapMain_TypesExternal.
+Module HashmapMain_Types.
+
+(** [hashmap_main::hashmap::List]
+    Source: 'tests/src/hashmap.rs', lines 27:0-27:16 *)
+Inductive hashmap_List_t (T : Type) :=
+| Hashmap_List_Cons : usize -> T -> hashmap_List_t T -> hashmap_List_t T
+| Hashmap_List_Nil : hashmap_List_t T
+.
+
+Arguments Hashmap_List_Cons { _ }.
+Arguments Hashmap_List_Nil { _ }.
+
+(** [hashmap_main::hashmap::HashMap]
+    Source: 'tests/src/hashmap.rs', lines 43:0-43:21 *)
+Record hashmap_HashMap_t (T : Type) :=
+mkhashmap_HashMap_t {
+  hashmap_HashMap_num_entries : usize;
+  hashmap_HashMap_max_load_factor : (usize * usize);
+  hashmap_HashMap_max_load : usize;
+  hashmap_HashMap_slots : alloc_vec_Vec (hashmap_List_t T);
+}
+.
+
+Arguments mkhashmap_HashMap_t { _ }.
+Arguments hashmap_HashMap_num_entries { _ }.
+Arguments hashmap_HashMap_max_load_factor { _ }.
+Arguments hashmap_HashMap_max_load { _ }.
+Arguments hashmap_HashMap_slots { _ }.
+
+End HashmapMain_Types.
diff --git a/tests/coq/hashmap_main/HashmapMain_TypesExternal.v b/tests/coq/hashmap_main/HashmapMain_TypesExternal.v
new file mode 100644
index 00000000..28651c14
--- /dev/null
+++ b/tests/coq/hashmap_main/HashmapMain_TypesExternal.v
@@ -0,0 +1,14 @@
+(** [hashmap_main]: external types.
+-- This is a template file: rename it to "TypesExternal.lean" and fill the holes. *)
+Require Import Primitives.
+Import Primitives.
+Require Import Coq.ZArith.ZArith.
+Require Import List.
+Import ListNotations.
+Local Open Scope Primitives_scope.
+Module HashmapMain_TypesExternal.
+
+(** The state type used in the state-error monad *)
+Axiom state : Type.
+
+End HashmapMain_TypesExternal.
diff --git a/tests/coq/hashmap_main/HashmapMain_TypesExternal_Template.v b/tests/coq/hashmap_main/HashmapMain_TypesExternal_Template.v
new file mode 100644
index 00000000..391b2775
--- /dev/null
+++ b/tests/coq/hashmap_main/HashmapMain_TypesExternal_Template.v
@@ -0,0 +1,15 @@
+(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
+(** [hashmap_main]: external types.
+-- This is a template file: rename it to "TypesExternal.lean" and fill the holes. *)
+Require Import Primitives.
+Import Primitives.
+Require Import Coq.ZArith.ZArith.
+Require Import List.
+Import ListNotations.
+Local Open Scope Primitives_scope.
+Module HashmapMain_TypesExternal_Template.
+
+(** The state type used in the state-error monad *)
+Axiom state : Type.
+
+End HashmapMain_TypesExternal_Template.
diff --git a/tests/coq/hashmap_main/Makefile b/tests/coq/hashmap_main/Makefile
new file mode 100644
index 00000000..1a5aee4a
--- /dev/null
+++ b/tests/coq/hashmap_main/Makefile
@@ -0,0 +1,23 @@
+# This file was automatically generated - modify ../Makefile.template instead
+# Makefile originally taken from coq-club
+
+%: Makefile.coq phony
+	+make -f Makefile.coq $@
+
+all: Makefile.coq
+	+make -f Makefile.coq all
+
+clean: Makefile.coq
+	+make -f Makefile.coq clean
+	rm -f Makefile.coq
+
+Makefile.coq: _CoqProject Makefile
+	coq_makefile -f _CoqProject | sed 's/$$(COQCHK) $$(COQCHKFLAGS) $$(COQLIBS)/$$(COQCHK) $$(COQCHKFLAGS) $$(subst -Q,-R,$$(COQLIBS))/' > Makefile.coq
+
+_CoqProject: ;
+
+Makefile: ;
+
+phony: ;
+
+.PHONY: all clean phony
diff --git a/tests/coq/hashmap_main/Primitives.v b/tests/coq/hashmap_main/Primitives.v
new file mode 100644
index 00000000..b29fce43
--- /dev/null
+++ b/tests/coq/hashmap_main/Primitives.v
@@ -0,0 +1,981 @@
+Require Import Lia.
+Require Coq.Strings.Ascii.
+Require Coq.Strings.String.
+Require Import Coq.Program.Equality.
+Require Import Coq.ZArith.ZArith.
+Require Import Coq.ZArith.Znat.
+Require Import List.
+Import ListNotations.
+
+Module Primitives.
+
+  (* TODO: use more *)
+Declare Scope Primitives_scope.
+
+(*** Result *)
+
+Inductive error :=
+  | Failure
+  | OutOfFuel.
+
+Inductive result A :=
+  | Ok : A -> result A
+  | Fail_ : error -> result A.
+
+Arguments Ok {_} a.
+Arguments Fail_ {_}.
+
+Definition bind {A B} (m: result A) (f: A -> result B) : result B :=
+  match m with
+  | Fail_ e => Fail_ e
+  | Ok x => f x
+  end.
+
+Definition return_ {A: Type} (x: A) : result A := Ok x.
+Definition fail_ {A: Type} (e: error) : result A := Fail_ e.
+
+Notation "x <- c1 ; c2" := (bind c1 (fun x => c2))
+  (at level 61, c1 at next level, right associativity).
+
+(** Monadic assert *)
+Definition massert (b: bool) : result unit :=
+  if b then Ok tt else Fail_ Failure.
+
+(** Normalize and unwrap a successful result (used for globals) *)
+Definition eval_result_refl {A} {x} (a: result A) (p: a = Ok x) : A :=
+  match a as r return (r = Ok x -> A) with
+  | Ok a' => fun _  => a'
+  | Fail_ e   => fun p' =>
+      False_rect _ (eq_ind (Fail_ e)
+          (fun e : result A =>
+          match e with
+          | Ok _ => False
+          | Fail_ e => True
+          end)
+        I (Ok x) p')
+  end p.
+
+Notation "x %global" := (eval_result_refl x eq_refl) (at level 40).
+Notation "x %return" := (eval_result_refl x eq_refl) (at level 40).
+
+(* Sanity check *)
+Check (if true then Ok (1 + 2) else Fail_ Failure)%global = 3.
+
+(*** Misc *)
+
+Definition string := Coq.Strings.String.string.
+Definition char := Coq.Strings.Ascii.ascii.
+Definition char_of_byte := Coq.Strings.Ascii.ascii_of_byte.
+
+Definition core_mem_replace (a : Type) (x : a) (y : a) : a * a := (x, x) .
+
+Record mut_raw_ptr (T : Type) := { mut_raw_ptr_v : T }.
+Record const_raw_ptr (T : Type) := { const_raw_ptr_v : T }.
+
+(*** Scalars *)
+
+Definition i8_min   : Z := -128%Z.
+Definition i8_max   : Z := 127%Z.
+Definition i16_min  : Z := -32768%Z.
+Definition i16_max  : Z := 32767%Z.
+Definition i32_min  : Z := -2147483648%Z.
+Definition i32_max  : Z := 2147483647%Z.
+Definition i64_min  : Z := -9223372036854775808%Z.
+Definition i64_max  : Z := 9223372036854775807%Z.
+Definition i128_min : Z := -170141183460469231731687303715884105728%Z.
+Definition i128_max : Z := 170141183460469231731687303715884105727%Z.
+Definition u8_min   : Z := 0%Z.
+Definition u8_max   : Z := 255%Z.
+Definition u16_min  : Z := 0%Z.
+Definition u16_max  : Z := 65535%Z.
+Definition u32_min  : Z := 0%Z.
+Definition u32_max  : Z := 4294967295%Z.
+Definition u64_min  : Z := 0%Z.
+Definition u64_max  : Z := 18446744073709551615%Z.
+Definition u128_min : Z := 0%Z.
+Definition u128_max : Z := 340282366920938463463374607431768211455%Z.
+
+(** The bounds of [isize] and [usize] vary with the architecture. *)
+Axiom isize_min : Z.
+Axiom isize_max : Z.
+Definition usize_min : Z := 0%Z.
+Axiom usize_max : Z.
+
+Open Scope Z_scope.
+
+(** We provide those lemmas to reason about the bounds of [isize] and [usize] *)
+Axiom isize_min_bound : isize_min <= i32_min.
+Axiom isize_max_bound : i32_max <= isize_max.
+Axiom usize_max_bound : u32_max <= usize_max.
+
+Inductive scalar_ty :=
+  | Isize
+  | I8
+  | I16
+  | I32
+  | I64
+  | I128
+  | Usize
+  | U8
+  | U16
+  | U32
+  | U64
+  | U128
+.
+
+Definition scalar_min (ty: scalar_ty) : Z :=
+  match ty with
+  | Isize => isize_min
+  | I8 => i8_min
+  | I16 => i16_min
+  | I32 => i32_min
+  | I64 => i64_min
+  | I128 => i128_min
+  | Usize => usize_min
+  | U8 => u8_min
+  | U16 => u16_min
+  | U32 => u32_min
+  | U64 => u64_min
+  | U128 => u128_min
+end.
+
+Definition scalar_max (ty: scalar_ty) : Z :=
+  match ty with
+  | Isize => isize_max
+  | I8 => i8_max
+  | I16 => i16_max
+  | I32 => i32_max
+  | I64 => i64_max
+  | I128 => i128_max
+  | Usize => usize_max
+  | U8 => u8_max
+  | U16 => u16_max
+  | U32 => u32_max
+  | U64 => u64_max
+  | U128 => u128_max
+end.
+
+(** We use the following conservative bounds to make sure we can compute bound
+    checks in most situations *)
+Definition scalar_min_cons (ty: scalar_ty) : Z :=
+  match ty with
+  | Isize => i32_min
+  | Usize => u32_min
+  | _ => scalar_min ty
+end.
+
+Definition scalar_max_cons (ty: scalar_ty) : Z :=
+  match ty with
+  | Isize => i32_max
+  | Usize => u32_max
+  | _ => scalar_max ty
+end.
+
+Lemma scalar_min_cons_valid : forall ty, scalar_min ty <= scalar_min_cons ty .
+Proof.
+  destruct ty; unfold scalar_min_cons, scalar_min; try lia.
+  - pose isize_min_bound; lia.
+  - apply Z.le_refl.
+Qed.
+
+Lemma scalar_max_cons_valid : forall ty, scalar_max ty >= scalar_max_cons ty .
+Proof.
+  destruct ty; unfold scalar_max_cons, scalar_max; try lia.
+  - pose isize_max_bound; lia.
+  - pose usize_max_bound. lia.
+Qed.
+
+Definition scalar (ty: scalar_ty) : Type :=
+ { x: Z | scalar_min ty <= x <= scalar_max ty }.
+
+Definition to_Z {ty} (x: scalar ty) : Z := proj1_sig x.
+
+(** Bounds checks: we start by using the conservative bounds, to make sure we
+    can compute in most situations, then we use the real bounds (for [isize]
+    and [usize]). *)
+Definition scalar_ge_min (ty: scalar_ty) (x: Z) : bool :=
+  Z.leb (scalar_min_cons ty) x || Z.leb (scalar_min ty) x.
+
+Definition scalar_le_max (ty: scalar_ty) (x: Z) : bool :=
+  Z.leb x (scalar_max_cons ty) || Z.leb x (scalar_max ty).
+
+Lemma scalar_ge_min_valid (ty: scalar_ty) (x: Z) :
+  scalar_ge_min ty x = true -> scalar_min ty <= x .
+Proof.
+  unfold scalar_ge_min.
+  pose (scalar_min_cons_valid ty).
+  lia.
+Qed.
+
+Lemma scalar_le_max_valid (ty: scalar_ty) (x: Z) :
+  scalar_le_max ty x = true -> x <= scalar_max ty .
+Proof.
+  unfold scalar_le_max.
+  pose (scalar_max_cons_valid ty).
+  lia.
+Qed.
+
+Definition scalar_in_bounds (ty: scalar_ty) (x: Z) : bool :=
+  scalar_ge_min ty x && scalar_le_max ty x .
+
+Lemma scalar_in_bounds_valid (ty: scalar_ty) (x: Z) :
+  scalar_in_bounds ty x = true -> scalar_min ty <= x <= scalar_max ty .
+Proof.
+  unfold scalar_in_bounds.
+  intros H.
+  destruct (scalar_ge_min ty x) eqn:Hmin.
+  - destruct (scalar_le_max ty x) eqn:Hmax.
+    + pose (scalar_ge_min_valid ty x Hmin).
+      pose (scalar_le_max_valid ty x Hmax).
+      lia.
+    + inversion H.
+  - inversion H.
+Qed.
+
+Import Sumbool.
+
+Definition mk_scalar (ty: scalar_ty) (x: Z) : result (scalar ty) :=
+  match sumbool_of_bool (scalar_in_bounds ty x) with
+  | left H => Ok (exist _ x (scalar_in_bounds_valid _ _ H))
+  | right _ => Fail_ Failure
+  end.
+
+Definition scalar_add {ty} (x y: scalar ty) : result (scalar ty) := mk_scalar ty (to_Z x + to_Z y).
+
+Definition scalar_sub {ty} (x y: scalar ty) : result (scalar ty) := mk_scalar ty (to_Z x - to_Z y).
+
+Definition scalar_mul {ty} (x y: scalar ty) : result (scalar ty) := mk_scalar ty (to_Z x * to_Z y).
+
+Definition scalar_div {ty} (x y: scalar ty) : result (scalar ty) :=
+  if to_Z y =? 0 then Fail_ Failure else
+  mk_scalar ty (to_Z x / to_Z y).
+
+Definition scalar_rem {ty} (x y: scalar ty) : result (scalar ty) := mk_scalar ty (Z.rem (to_Z x) (to_Z y)).
+  
+Definition scalar_neg {ty} (x: scalar ty) : result (scalar ty) := mk_scalar ty (-(to_Z x)).
+
+Axiom scalar_xor : forall ty, scalar ty -> scalar ty -> scalar ty. (* TODO *)
+Axiom scalar_or : forall ty, scalar ty -> scalar ty -> scalar ty. (* TODO *)
+Axiom scalar_and : forall ty, scalar ty -> scalar ty -> scalar ty. (* TODO *)
+Axiom scalar_shl : forall ty0 ty1, scalar ty0 -> scalar ty1 -> result (scalar ty0). (* TODO *)
+Axiom scalar_shr : forall ty0 ty1, scalar ty0 -> scalar ty1 -> result (scalar ty0). (* TODO *)
+
+(** Cast an integer from a [src_ty] to a [tgt_ty] *)
+(* TODO: check the semantics of casts in Rust *)
+Definition scalar_cast (src_ty tgt_ty : scalar_ty) (x : scalar src_ty) : result (scalar tgt_ty) :=
+  mk_scalar tgt_ty (to_Z x).
+
+(* This can't fail, but for now we make all casts faillible (easier for the translation) *)
+Definition scalar_cast_bool (tgt_ty : scalar_ty) (x : bool) : result (scalar tgt_ty) :=
+  mk_scalar tgt_ty (if x then 1 else 0).
+
+(** Comparisons *)
+Definition scalar_leb {ty : scalar_ty} (x : scalar ty) (y : scalar ty) : bool :=
+  Z.leb (to_Z x) (to_Z y) .
+
+Definition scalar_ltb {ty : scalar_ty} (x : scalar ty) (y : scalar ty) : bool :=
+  Z.ltb (to_Z x) (to_Z y) .
+
+Definition scalar_geb {ty : scalar_ty} (x : scalar ty) (y : scalar ty) : bool :=
+  Z.geb (to_Z x) (to_Z y) .
+
+Definition scalar_gtb {ty : scalar_ty} (x : scalar ty) (y : scalar ty) : bool :=
+  Z.gtb (to_Z x) (to_Z y) .
+
+Definition scalar_eqb {ty : scalar_ty} (x : scalar ty) (y : scalar ty) : bool :=
+  Z.eqb (to_Z x) (to_Z y) .
+
+Definition scalar_neqb {ty : scalar_ty} (x : scalar ty) (y : scalar ty) : bool :=
+  negb (Z.eqb (to_Z x) (to_Z y)) .
+
+
+(** The scalar types *)
+Definition isize := scalar Isize.
+Definition i8    := scalar I8.
+Definition i16   := scalar I16.
+Definition i32   := scalar I32.
+Definition i64   := scalar I64.
+Definition i128  := scalar I128.
+Definition usize := scalar Usize.
+Definition u8    := scalar U8.
+Definition u16   := scalar U16.
+Definition u32   := scalar U32.
+Definition u64   := scalar U64.
+Definition u128  := scalar U128.
+
+(** Negaion *)
+Definition isize_neg := @scalar_neg Isize.
+Definition i8_neg    := @scalar_neg I8.
+Definition i16_neg   := @scalar_neg I16.
+Definition i32_neg   := @scalar_neg I32.
+Definition i64_neg   := @scalar_neg I64.
+Definition i128_neg  := @scalar_neg I128.
+
+(** Division *)
+Definition isize_div := @scalar_div Isize.
+Definition i8_div    := @scalar_div I8.
+Definition i16_div   := @scalar_div I16.
+Definition i32_div   := @scalar_div I32.
+Definition i64_div   := @scalar_div I64.
+Definition i128_div  := @scalar_div I128.
+Definition usize_div := @scalar_div Usize.
+Definition u8_div    := @scalar_div U8.
+Definition u16_div   := @scalar_div U16.
+Definition u32_div   := @scalar_div U32.
+Definition u64_div   := @scalar_div U64.
+Definition u128_div  := @scalar_div U128.
+
+(** Remainder *)
+Definition isize_rem := @scalar_rem Isize.
+Definition i8_rem    := @scalar_rem I8.
+Definition i16_rem   := @scalar_rem I16.
+Definition i32_rem   := @scalar_rem I32.
+Definition i64_rem   := @scalar_rem I64.
+Definition i128_rem  := @scalar_rem I128.
+Definition usize_rem := @scalar_rem Usize.
+Definition u8_rem    := @scalar_rem U8.
+Definition u16_rem   := @scalar_rem U16.
+Definition u32_rem   := @scalar_rem U32.
+Definition u64_rem   := @scalar_rem U64.
+Definition u128_rem  := @scalar_rem U128.
+
+(** Addition *)
+Definition isize_add := @scalar_add Isize.
+Definition i8_add    := @scalar_add I8.
+Definition i16_add   := @scalar_add I16.
+Definition i32_add   := @scalar_add I32.
+Definition i64_add   := @scalar_add I64.
+Definition i128_add  := @scalar_add I128.
+Definition usize_add := @scalar_add Usize.
+Definition u8_add    := @scalar_add U8.
+Definition u16_add   := @scalar_add U16.
+Definition u32_add   := @scalar_add U32.
+Definition u64_add   := @scalar_add U64.
+Definition u128_add  := @scalar_add U128.
+
+(** Substraction *)
+Definition isize_sub := @scalar_sub Isize.
+Definition i8_sub    := @scalar_sub I8.
+Definition i16_sub   := @scalar_sub I16.
+Definition i32_sub   := @scalar_sub I32.
+Definition i64_sub   := @scalar_sub I64.
+Definition i128_sub  := @scalar_sub I128.
+Definition usize_sub := @scalar_sub Usize.
+Definition u8_sub    := @scalar_sub U8.
+Definition u16_sub   := @scalar_sub U16.
+Definition u32_sub   := @scalar_sub U32.
+Definition u64_sub   := @scalar_sub U64.
+Definition u128_sub  := @scalar_sub U128.
+
+(** Multiplication *)
+Definition isize_mul := @scalar_mul Isize.
+Definition i8_mul    := @scalar_mul I8.
+Definition i16_mul   := @scalar_mul I16.
+Definition i32_mul   := @scalar_mul I32.
+Definition i64_mul   := @scalar_mul I64.
+Definition i128_mul  := @scalar_mul I128.
+Definition usize_mul := @scalar_mul Usize.
+Definition u8_mul    := @scalar_mul U8.
+Definition u16_mul   := @scalar_mul U16.
+Definition u32_mul   := @scalar_mul U32.
+Definition u64_mul   := @scalar_mul U64.
+Definition u128_mul  := @scalar_mul U128.
+
+(** Xor *)
+Definition u8_xor := @scalar_xor U8.
+Definition u16_xor := @scalar_xor U16.
+Definition u32_xor := @scalar_xor U32.
+Definition u64_xor := @scalar_xor U64.
+Definition u128_xor := @scalar_xor U128.
+Definition usize_xor := @scalar_xor Usize.
+Definition i8_xor := @scalar_xor I8.
+Definition i16_xor := @scalar_xor I16.
+Definition i32_xor := @scalar_xor I32.
+Definition i64_xor := @scalar_xor I64.
+Definition i128_xor := @scalar_xor I128.
+Definition isize_xor := @scalar_xor Isize.
+
+(** Or *)
+Definition u8_or := @scalar_or U8.
+Definition u16_or := @scalar_or U16.
+Definition u32_or := @scalar_or U32.
+Definition u64_or := @scalar_or U64.
+Definition u128_or := @scalar_or U128.
+Definition usize_or := @scalar_or Usize.
+Definition i8_or := @scalar_or I8.
+Definition i16_or := @scalar_or I16.
+Definition i32_or := @scalar_or I32.
+Definition i64_or := @scalar_or I64.
+Definition i128_or := @scalar_or I128.
+Definition isize_or := @scalar_or Isize.
+
+(** And *)
+Definition u8_and := @scalar_and U8.
+Definition u16_and := @scalar_and U16.
+Definition u32_and := @scalar_and U32.
+Definition u64_and := @scalar_and U64.
+Definition u128_and := @scalar_and U128.
+Definition usize_and := @scalar_and Usize.
+Definition i8_and := @scalar_and I8.
+Definition i16_and := @scalar_and I16.
+Definition i32_and := @scalar_and I32.
+Definition i64_and := @scalar_and I64.
+Definition i128_and := @scalar_and I128.
+Definition isize_and := @scalar_and Isize.
+
+(** Shift left *)
+Definition u8_shl {ty} := @scalar_shl U8 ty.
+Definition u16_shl {ty} := @scalar_shl U16 ty.
+Definition u32_shl {ty} := @scalar_shl U32 ty.
+Definition u64_shl {ty} := @scalar_shl U64 ty.
+Definition u128_shl {ty} := @scalar_shl U128 ty.
+Definition usize_shl {ty} := @scalar_shl Usize ty.
+Definition i8_shl {ty} := @scalar_shl I8 ty.
+Definition i16_shl {ty} := @scalar_shl I16 ty.
+Definition i32_shl {ty} := @scalar_shl I32 ty.
+Definition i64_shl {ty} := @scalar_shl I64 ty.
+Definition i128_shl {ty} := @scalar_shl I128 ty.
+Definition isize_shl {ty} := @scalar_shl Isize ty.
+
+(** Shift right *)
+Definition u8_shr {ty} := @scalar_shr U8 ty.
+Definition u16_shr {ty} := @scalar_shr U16 ty.
+Definition u32_shr {ty} := @scalar_shr U32 ty.
+Definition u64_shr {ty} := @scalar_shr U64 ty.
+Definition u128_shr {ty} := @scalar_shr U128 ty.
+Definition usize_shr {ty} := @scalar_shr Usize ty.
+Definition i8_shr {ty} := @scalar_shr I8 ty.
+Definition i16_shr {ty} := @scalar_shr I16 ty.
+Definition i32_shr {ty} := @scalar_shr I32 ty.
+Definition i64_shr {ty} := @scalar_shr I64 ty.
+Definition i128_shr {ty} := @scalar_shr I128 ty.
+Definition isize_shr {ty} := @scalar_shr Isize ty.
+
+(** Small utility *)
+Definition usize_to_nat (x: usize) : nat := Z.to_nat (to_Z x).
+
+(** Notations *)
+Notation "x %isize" := ((mk_scalar Isize x)%return) (at level 9).
+Notation "x %i8"    := ((mk_scalar I8    x)%return) (at level 9).
+Notation "x %i16"   := ((mk_scalar I16   x)%return) (at level 9).
+Notation "x %i32"   := ((mk_scalar I32   x)%return) (at level 9).
+Notation "x %i64"   := ((mk_scalar I64   x)%return) (at level 9).
+Notation "x %i128"  := ((mk_scalar I128  x)%return) (at level 9).
+Notation "x %usize" := ((mk_scalar Usize x)%return) (at level 9).
+Notation "x %u8"    := ((mk_scalar U8    x)%return) (at level 9).
+Notation "x %u16"   := ((mk_scalar U16   x)%return) (at level 9).
+Notation "x %u32"   := ((mk_scalar U32   x)%return) (at level 9).
+Notation "x %u64"   := ((mk_scalar U64   x)%return) (at level 9).
+Notation "x %u128"  := ((mk_scalar U128  x)%return) (at level 9).
+
+Notation "x s= y" := (scalar_eqb x y)  (at level 80) : Primitives_scope.
+Notation "x s<> y" := (scalar_neqb x y) (at level 80) : Primitives_scope.
+Notation "x s<= y" := (scalar_leb x y)  (at level 80) : Primitives_scope.
+Notation "x s< y" := (scalar_ltb x y)  (at level 80) : Primitives_scope.
+Notation "x s>= y" := (scalar_geb x y)  (at level 80) : Primitives_scope.
+Notation "x s> y" := (scalar_gtb x y)  (at level 80) : Primitives_scope.
+
+(** Constants *)
+Definition core_u8_max    := u8_max %u32.
+Definition core_u16_max   := u16_max %u32.
+Definition core_u32_max   := u32_max %u32.
+Definition core_u64_max   := u64_max %u64.
+Definition core_u128_max  := u64_max %u128.
+Axiom core_usize_max : usize. (** TODO *)
+Definition core_i8_max    := i8_max %i32.
+Definition core_i16_max   := i16_max %i32.
+Definition core_i32_max   := i32_max %i32.
+Definition core_i64_max   := i64_max %i64.
+Definition core_i128_max  := i64_max %i128.
+Axiom core_isize_max : isize. (** TODO *)
+
+(*** core *)
+
+(** Trait declaration: [core::clone::Clone] *)
+Record core_clone_Clone (self : Type) := {
+  clone : self -> result self
+}.
+
+Definition core_clone_impls_CloneBool_clone (b : bool) : bool := b.
+
+Definition core_clone_CloneBool : core_clone_Clone bool := {|
+  clone := fun b => Ok (core_clone_impls_CloneBool_clone b)
+|}.
+
+Definition core_clone_impls_CloneUsize_clone (x : usize) : usize := x.
+Definition core_clone_impls_CloneU8_clone (x : u8) : u8 := x.
+Definition core_clone_impls_CloneU16_clone (x : u16) : u16 := x.
+Definition core_clone_impls_CloneU32_clone (x : u32) : u32 := x.
+Definition core_clone_impls_CloneU64_clone (x : u64) : u64 := x.
+Definition core_clone_impls_CloneU128_clone (x : u128) : u128 := x.
+
+Definition core_clone_impls_CloneIsize_clone (x : isize) : isize := x.
+Definition core_clone_impls_CloneI8_clone (x : i8) : i8 := x.
+Definition core_clone_impls_CloneI16_clone (x : i16) : i16 := x.
+Definition core_clone_impls_CloneI32_clone (x : i32) : i32 := x.
+Definition core_clone_impls_CloneI64_clone (x : i64) : i64 := x.
+Definition core_clone_impls_CloneI128_clone (x : i128) : i128 := x.
+
+Definition core_clone_CloneUsize : core_clone_Clone usize := {|
+  clone := fun x => Ok (core_clone_impls_CloneUsize_clone x)
+|}.
+
+Definition core_clone_CloneU8 : core_clone_Clone u8 := {|
+  clone := fun x => Ok (core_clone_impls_CloneU8_clone x)
+|}.
+
+Definition core_clone_CloneU16 : core_clone_Clone u16 := {|
+  clone := fun x => Ok (core_clone_impls_CloneU16_clone x)
+|}.
+
+Definition core_clone_CloneU32 : core_clone_Clone u32 := {|
+  clone := fun x => Ok (core_clone_impls_CloneU32_clone x)
+|}.
+
+Definition core_clone_CloneU64 : core_clone_Clone u64 := {|
+  clone := fun x => Ok (core_clone_impls_CloneU64_clone x)
+|}.
+
+Definition core_clone_CloneU128 : core_clone_Clone u128 := {|
+  clone := fun x => Ok (core_clone_impls_CloneU128_clone x)
+|}.
+
+Definition core_clone_CloneIsize : core_clone_Clone isize := {|
+  clone := fun x => Ok (core_clone_impls_CloneIsize_clone x)
+|}.
+
+Definition core_clone_CloneI8 : core_clone_Clone i8 := {|
+  clone := fun x => Ok (core_clone_impls_CloneI8_clone x)
+|}.
+
+Definition core_clone_CloneI16 : core_clone_Clone i16 := {|
+  clone := fun x => Ok (core_clone_impls_CloneI16_clone x)
+|}.
+
+Definition core_clone_CloneI32 : core_clone_Clone i32 := {|
+  clone := fun x => Ok (core_clone_impls_CloneI32_clone x)
+|}.
+
+Definition core_clone_CloneI64 : core_clone_Clone i64 := {|
+  clone := fun x => Ok (core_clone_impls_CloneI64_clone x)
+|}.
+
+Definition core_clone_CloneI128 : core_clone_Clone i128 := {|
+  clone := fun x => Ok (core_clone_impls_CloneI128_clone x)
+|}.
+
+(** [core::option::{core::option::Option<T>}::unwrap] *)
+Definition core_option_Option_unwrap (T : Type) (x : option T) : result T :=
+  match x with
+  | None => Fail_ Failure
+  | Some x => Ok x
+  end.
+
+(*** core::ops *)
+
+(* Trait declaration: [core::ops::index::Index] *)
+Record core_ops_index_Index (Self Idx : Type) := mk_core_ops_index_Index {
+  core_ops_index_Index_Output : Type;
+  core_ops_index_Index_index : Self -> Idx -> result core_ops_index_Index_Output;
+}.
+Arguments mk_core_ops_index_Index {_ _}.
+Arguments core_ops_index_Index_Output {_ _}.
+Arguments core_ops_index_Index_index {_ _}.
+
+(* Trait declaration: [core::ops::index::IndexMut] *)
+Record core_ops_index_IndexMut (Self Idx : Type) := mk_core_ops_index_IndexMut {
+  core_ops_index_IndexMut_indexInst : core_ops_index_Index Self Idx;
+  core_ops_index_IndexMut_index_mut :
+    Self ->
+    Idx ->
+    result (core_ops_index_IndexMut_indexInst.(core_ops_index_Index_Output) *
+            (core_ops_index_IndexMut_indexInst.(core_ops_index_Index_Output) -> result Self));
+}.
+Arguments mk_core_ops_index_IndexMut {_ _}.
+Arguments core_ops_index_IndexMut_indexInst {_ _}.
+Arguments core_ops_index_IndexMut_index_mut {_ _}.
+
+(* Trait declaration [core::ops::deref::Deref] *)
+Record core_ops_deref_Deref (Self : Type) := mk_core_ops_deref_Deref {
+  core_ops_deref_Deref_target : Type;
+  core_ops_deref_Deref_deref : Self -> result core_ops_deref_Deref_target;
+}.
+Arguments mk_core_ops_deref_Deref {_}.
+Arguments core_ops_deref_Deref_target {_}.
+Arguments core_ops_deref_Deref_deref {_}.
+
+(* Trait declaration [core::ops::deref::DerefMut] *)
+Record core_ops_deref_DerefMut (Self : Type) := mk_core_ops_deref_DerefMut {
+  core_ops_deref_DerefMut_derefInst : core_ops_deref_Deref Self;
+  core_ops_deref_DerefMut_deref_mut :
+    Self ->
+    result (core_ops_deref_DerefMut_derefInst.(core_ops_deref_Deref_target) *
+            (core_ops_deref_DerefMut_derefInst.(core_ops_deref_Deref_target) -> result Self));
+}.
+Arguments mk_core_ops_deref_DerefMut {_}.
+Arguments core_ops_deref_DerefMut_derefInst {_}.
+Arguments core_ops_deref_DerefMut_deref_mut {_}.
+
+Record core_ops_range_Range (T : Type) := mk_core_ops_range_Range {
+  core_ops_range_Range_start : T;
+  core_ops_range_Range_end_ : T;
+}.
+Arguments mk_core_ops_range_Range {_}.
+Arguments core_ops_range_Range_start {_}.
+Arguments core_ops_range_Range_end_ {_}.
+
+(*** [alloc] *)
+
+Definition alloc_boxed_Box_deref (T : Type) (x : T) : result T := Ok x.
+Definition alloc_boxed_Box_deref_mut (T : Type) (x : T) : result (T * (T -> result T)) :=
+  Ok (x, fun x => Ok x).
+
+(* Trait instance *)
+Definition alloc_boxed_Box_coreopsDerefInst (Self : Type) : core_ops_deref_Deref Self := {|
+  core_ops_deref_Deref_target := Self;
+  core_ops_deref_Deref_deref := alloc_boxed_Box_deref Self;
+|}.
+
+(* Trait instance *)
+Definition alloc_boxed_Box_coreopsDerefMutInst (Self : Type) : core_ops_deref_DerefMut Self := {|
+  core_ops_deref_DerefMut_derefInst := alloc_boxed_Box_coreopsDerefInst Self;
+  core_ops_deref_DerefMut_deref_mut := alloc_boxed_Box_deref_mut Self;
+|}.
+
+
+(*** Arrays *)
+Definition array T (n : usize) := { l: list T | Z.of_nat (length l) = to_Z n}.
+
+Lemma le_0_usize_max : 0 <= usize_max.
+Proof.
+  pose (H := usize_max_bound).
+  unfold u32_max in H.
+  lia.
+Qed.
+
+Lemma eqb_imp_eq (x y : Z) : Z.eqb x y = true -> x = y.
+Proof.
+  lia.
+Qed.
+
+(* TODO: finish the definitions *)
+Axiom mk_array : forall (T : Type) (n : usize) (l : list T), array T n.
+
+(* For initialization *)
+Axiom array_repeat : forall (T : Type) (n : usize) (x : T), array T n.
+
+Axiom array_index_usize : forall (T : Type) (n : usize) (x : array T n) (i : usize), result T.
+Axiom array_update_usize : forall (T : Type) (n : usize) (x : array T n) (i : usize) (nx : T), result (array T n).
+
+Definition array_index_mut_usize (T : Type) (n : usize) (a : array T n) (i : usize) :
+  result (T * (T -> result (array T n))) :=
+  match array_index_usize T n a i with
+  | Fail_ e => Fail_ e
+  | Ok x => Ok (x, array_update_usize T n a i)
+  end.
+
+(*** Slice *)
+Definition slice T := { l: list T | Z.of_nat (length l) <= usize_max}.
+
+Axiom slice_len : forall (T : Type) (s : slice T), usize.
+Axiom slice_index_usize : forall (T : Type) (x : slice T) (i : usize), result T.
+Axiom slice_update_usize : forall (T : Type) (x : slice T) (i : usize) (nx : T), result (slice T).
+
+Definition slice_index_mut_usize (T : Type) (s : slice T) (i : usize) :
+  result (T * (T -> result (slice T))) :=
+  match slice_index_usize T s i with
+  | Fail_ e => Fail_ e
+  | Ok x => Ok (x, slice_update_usize T s i)
+  end.
+
+(*** Subslices *)
+
+Axiom array_to_slice : forall (T : Type) (n : usize) (x : array T n), result (slice T).
+Axiom array_from_slice : forall (T : Type) (n : usize) (x : array T n) (s : slice T), result (array T n).
+
+Definition array_to_slice_mut (T : Type) (n : usize) (a : array T n) :
+  result (slice T * (slice T -> result (array T n))) :=
+  match array_to_slice T n a with
+  | Fail_ e => Fail_ e
+  | Ok x => Ok (x, array_from_slice T n a)
+  end.
+
+Axiom array_subslice: forall (T : Type) (n : usize) (x : array T n) (r : core_ops_range_Range usize), result (slice T).
+Axiom array_update_subslice: forall (T : Type) (n : usize) (x : array T n) (r : core_ops_range_Range usize) (ns : slice T), result (array T n).
+
+Axiom slice_subslice: forall (T : Type) (x : slice T) (r : core_ops_range_Range usize), result (slice T).
+Axiom slice_update_subslice: forall (T : Type) (x : slice T) (r : core_ops_range_Range usize) (ns : slice T), result (slice T).
+
+(*** Vectors *)
+
+Definition alloc_vec_Vec T := { l: list T | Z.of_nat (length l) <= usize_max }.
+
+Definition alloc_vec_Vec_to_list {T: Type} (v: alloc_vec_Vec T) : list T := proj1_sig v.
+
+Definition alloc_vec_Vec_length {T: Type} (v: alloc_vec_Vec T) : Z := Z.of_nat (length (alloc_vec_Vec_to_list v)).
+
+Definition alloc_vec_Vec_new (T: Type) : alloc_vec_Vec T := (exist _ [] le_0_usize_max).
+
+Lemma alloc_vec_Vec_len_in_usize {T} (v: alloc_vec_Vec T) : usize_min <= alloc_vec_Vec_length v <= usize_max.
+Proof.
+  unfold alloc_vec_Vec_length, usize_min.
+  split.
+  - lia.
+  - apply (proj2_sig v).
+Qed.
+
+Definition alloc_vec_Vec_len (T: Type) (v: alloc_vec_Vec T) : usize :=
+  exist _ (alloc_vec_Vec_length v) (alloc_vec_Vec_len_in_usize v).
+
+Fixpoint list_update {A} (l: list A) (n: nat) (a: A)
+  : list A :=
+  match l with
+  | []     => []
+  | x :: t => match n with
+    | 0%nat => a :: t
+    | S m => x :: (list_update t m a)
+end end.
+
+Definition alloc_vec_Vec_bind {A B} (v: alloc_vec_Vec A) (f: list A -> result (list B)) : result (alloc_vec_Vec B) :=
+  l <- f (alloc_vec_Vec_to_list v) ;
+  match sumbool_of_bool (scalar_le_max Usize (Z.of_nat (length l))) with
+  | left H => Ok (exist _ l (scalar_le_max_valid _ _ H))
+  | right _ => Fail_ Failure
+  end.
+
+Definition alloc_vec_Vec_push (T: Type) (v: alloc_vec_Vec T) (x: T) : result (alloc_vec_Vec T) :=
+  alloc_vec_Vec_bind v (fun l => Ok (l ++ [x])).
+
+Definition alloc_vec_Vec_insert (T: Type) (v: alloc_vec_Vec T) (i: usize) (x: T) : result (alloc_vec_Vec T) :=
+  alloc_vec_Vec_bind v (fun l =>
+    if to_Z i <? Z.of_nat (length l)
+    then Ok (list_update l (usize_to_nat i) x)
+    else Fail_ Failure).
+
+(* Helper *)
+Axiom alloc_vec_Vec_index_usize : forall {T : Type} (v : alloc_vec_Vec T) (i : usize), result T.
+
+(* Helper *)
+Axiom alloc_vec_Vec_update_usize : forall {T : Type} (v : alloc_vec_Vec T) (i : usize) (x : T), result (alloc_vec_Vec T).
+
+Definition alloc_vec_Vec_index_mut_usize {T : Type} (v: alloc_vec_Vec T) (i: usize) :
+  result (T * (T -> result (alloc_vec_Vec T))) :=
+  match alloc_vec_Vec_index_usize v i with
+  | Ok x =>
+    Ok (x, alloc_vec_Vec_update_usize v i)
+  | Fail_ e => Fail_ e
+  end.
+
+(* Trait declaration: [core::slice::index::private_slice_index::Sealed] *)
+Definition core_slice_index_private_slice_index_Sealed (self : Type) := unit.
+
+(* Trait declaration: [core::slice::index::SliceIndex] *)
+Record core_slice_index_SliceIndex (Self T : Type) := mk_core_slice_index_SliceIndex {
+  core_slice_index_SliceIndex_sealedInst : core_slice_index_private_slice_index_Sealed Self;
+  core_slice_index_SliceIndex_Output : Type;
+  core_slice_index_SliceIndex_get : Self -> T -> result (option core_slice_index_SliceIndex_Output);
+  core_slice_index_SliceIndex_get_mut :
+    Self -> T -> result (option core_slice_index_SliceIndex_Output * (option core_slice_index_SliceIndex_Output -> result T));
+  core_slice_index_SliceIndex_get_unchecked : Self -> const_raw_ptr T -> result (const_raw_ptr core_slice_index_SliceIndex_Output);
+  core_slice_index_SliceIndex_get_unchecked_mut : Self -> mut_raw_ptr T -> result (mut_raw_ptr core_slice_index_SliceIndex_Output);
+  core_slice_index_SliceIndex_index : Self -> T -> result core_slice_index_SliceIndex_Output;
+  core_slice_index_SliceIndex_index_mut :
+    Self -> T -> result (core_slice_index_SliceIndex_Output * (core_slice_index_SliceIndex_Output -> result T));
+}.
+Arguments mk_core_slice_index_SliceIndex {_ _}.
+Arguments core_slice_index_SliceIndex_sealedInst {_ _}.
+Arguments core_slice_index_SliceIndex_Output {_ _}.
+Arguments core_slice_index_SliceIndex_get {_ _}.
+Arguments core_slice_index_SliceIndex_get_mut {_ _}.
+Arguments core_slice_index_SliceIndex_get_unchecked {_ _}.
+Arguments core_slice_index_SliceIndex_get_unchecked_mut {_ _}.
+Arguments core_slice_index_SliceIndex_index {_ _}.
+Arguments core_slice_index_SliceIndex_index_mut {_ _}.
+
+(* [core::slice::index::[T]::index]: forward function *)
+Definition core_slice_index_Slice_index
+  (T Idx : Type) (inst : core_slice_index_SliceIndex Idx (slice T))
+  (s : slice T) (i : Idx) : result inst.(core_slice_index_SliceIndex_Output) :=
+  x <- inst.(core_slice_index_SliceIndex_get) i s;
+  match x with
+  | None => Fail_ Failure
+  | Some x => Ok x
+  end.
+
+(* [core::slice::index::Range:::get]: forward function *)
+Axiom core_slice_index_RangeUsize_get : forall (T : Type) (i : core_ops_range_Range usize) (s : slice T), result (option (slice T)).
+
+(* [core::slice::index::Range::get_mut]: forward function *)
+Axiom core_slice_index_RangeUsize_get_mut :
+  forall (T : Type),
+    core_ops_range_Range usize -> slice T ->
+    result (option (slice T) * (option (slice T) -> result (slice T))).
+
+(* [core::slice::index::Range::get_unchecked]: forward function *)
+Definition core_slice_index_RangeUsize_get_unchecked
+  (T : Type) :
+  core_ops_range_Range usize -> const_raw_ptr (slice T) -> result (const_raw_ptr (slice T)) :=
+  (* Don't know what the model should be - for now we always fail to make
+     sure code which uses it fails *)
+  fun _ _ => Fail_ Failure.
+
+(* [core::slice::index::Range::get_unchecked_mut]: forward function *)
+Definition core_slice_index_RangeUsize_get_unchecked_mut
+  (T : Type) :
+  core_ops_range_Range usize -> mut_raw_ptr (slice T) -> result (mut_raw_ptr (slice T)) :=
+  (* Don't know what the model should be - for now we always fail to make
+    sure code which uses it fails *)
+  fun _ _ => Fail_ Failure.
+
+(* [core::slice::index::Range::index]: forward function *)
+Axiom core_slice_index_RangeUsize_index :
+  forall (T : Type), core_ops_range_Range usize -> slice T -> result (slice T).
+
+(* [core::slice::index::Range::index_mut]: forward function *)
+Axiom core_slice_index_RangeUsize_index_mut :
+  forall (T : Type), core_ops_range_Range usize -> slice T -> result (slice T * (slice T -> result (slice T))).
+
+(* [core::slice::index::[T]::index_mut]: forward function *)
+Axiom core_slice_index_Slice_index_mut :
+  forall (T Idx : Type) (inst : core_slice_index_SliceIndex Idx (slice T)),
+  slice T -> Idx ->
+  result (inst.(core_slice_index_SliceIndex_Output) *
+          (inst.(core_slice_index_SliceIndex_Output) -> result (slice T))).
+
+(* [core::array::[T; N]::index]: forward function *)
+Axiom core_array_Array_index :
+  forall (T Idx : Type) (N : usize) (inst : core_ops_index_Index (slice T) Idx)
+  (a : array T N) (i : Idx), result inst.(core_ops_index_Index_Output).
+
+(* [core::array::[T; N]::index_mut]: forward function *)
+Axiom core_array_Array_index_mut :
+  forall (T Idx : Type) (N : usize) (inst : core_ops_index_IndexMut (slice T) Idx)
+  (a : array T N) (i : Idx),
+  result (inst.(core_ops_index_IndexMut_indexInst).(core_ops_index_Index_Output) *
+          (inst.(core_ops_index_IndexMut_indexInst).(core_ops_index_Index_Output) -> result (array T N))).
+
+(* Trait implementation: [core::slice::index::private_slice_index::Range] *)
+Definition core_slice_index_private_slice_index_SealedRangeUsizeInst
+  : core_slice_index_private_slice_index_Sealed (core_ops_range_Range usize) := tt.
+
+(* Trait implementation: [core::slice::index::Range] *)
+Definition core_slice_index_SliceIndexRangeUsizeSliceTInst (T : Type) :
+  core_slice_index_SliceIndex (core_ops_range_Range usize) (slice T) := {|
+  core_slice_index_SliceIndex_sealedInst := core_slice_index_private_slice_index_SealedRangeUsizeInst;
+  core_slice_index_SliceIndex_Output := slice T;
+  core_slice_index_SliceIndex_get := core_slice_index_RangeUsize_get T;
+  core_slice_index_SliceIndex_get_mut := core_slice_index_RangeUsize_get_mut T;
+  core_slice_index_SliceIndex_get_unchecked := core_slice_index_RangeUsize_get_unchecked T;
+  core_slice_index_SliceIndex_get_unchecked_mut := core_slice_index_RangeUsize_get_unchecked_mut T;
+  core_slice_index_SliceIndex_index := core_slice_index_RangeUsize_index T;
+  core_slice_index_SliceIndex_index_mut := core_slice_index_RangeUsize_index_mut T;
+|}.
+
+(* Trait implementation: [core::slice::index::[T]] *)
+Definition core_ops_index_IndexSliceTIInst (T Idx : Type)
+  (inst : core_slice_index_SliceIndex Idx (slice T)) :
+  core_ops_index_Index (slice T) Idx := {|
+  core_ops_index_Index_Output := inst.(core_slice_index_SliceIndex_Output);
+  core_ops_index_Index_index := core_slice_index_Slice_index T Idx inst;
+|}.
+
+(* Trait implementation: [core::slice::index::[T]] *)
+Definition core_ops_index_IndexMutSliceTIInst (T Idx : Type)
+  (inst : core_slice_index_SliceIndex Idx (slice T)) :
+  core_ops_index_IndexMut (slice T) Idx := {|
+  core_ops_index_IndexMut_indexInst := core_ops_index_IndexSliceTIInst T Idx inst;
+  core_ops_index_IndexMut_index_mut := core_slice_index_Slice_index_mut T Idx inst;
+|}.
+
+(* Trait implementation: [core::array::[T; N]] *)
+Definition core_ops_index_IndexArrayInst (T Idx : Type) (N : usize)
+  (inst : core_ops_index_Index (slice T) Idx) :
+  core_ops_index_Index (array T N) Idx := {|
+  core_ops_index_Index_Output := inst.(core_ops_index_Index_Output);
+  core_ops_index_Index_index := core_array_Array_index T Idx N inst;
+|}.
+
+(* Trait implementation: [core::array::[T; N]] *)
+Definition core_ops_index_IndexMutArrayInst (T Idx : Type) (N : usize)
+  (inst : core_ops_index_IndexMut (slice T) Idx) :
+  core_ops_index_IndexMut (array T N) Idx := {|
+  core_ops_index_IndexMut_indexInst := core_ops_index_IndexArrayInst T Idx N inst.(core_ops_index_IndexMut_indexInst);
+  core_ops_index_IndexMut_index_mut := core_array_Array_index_mut T Idx N inst;
+|}.
+
+(* [core::slice::index::usize::get]: forward function *)
+Axiom core_slice_index_usize_get : forall (T : Type), usize -> slice T -> result (option T).
+
+(* [core::slice::index::usize::get_mut]: forward function *)
+Axiom core_slice_index_usize_get_mut :
+  forall (T : Type), usize -> slice T -> result (option T * (option T -> result (slice T))).
+
+(* [core::slice::index::usize::get_unchecked]: forward function *)
+Axiom core_slice_index_usize_get_unchecked :
+  forall (T : Type), usize -> const_raw_ptr (slice T) -> result (const_raw_ptr T).
+
+(* [core::slice::index::usize::get_unchecked_mut]: forward function *)
+Axiom core_slice_index_usize_get_unchecked_mut :
+  forall (T : Type), usize -> mut_raw_ptr (slice T) -> result (mut_raw_ptr T).
+
+(* [core::slice::index::usize::index]: forward function *)
+Axiom core_slice_index_usize_index : forall (T : Type), usize -> slice T -> result T.
+
+(* [core::slice::index::usize::index_mut]: forward function *)
+Axiom core_slice_index_usize_index_mut :
+  forall (T : Type), usize -> slice T -> result (T * (T -> result (slice T))).
+
+(* Trait implementation: [core::slice::index::private_slice_index::usize] *)
+Definition core_slice_index_private_slice_index_SealedUsizeInst
+  : core_slice_index_private_slice_index_Sealed usize := tt.
+
+(* Trait implementation: [core::slice::index::usize] *)
+Definition core_slice_index_SliceIndexUsizeSliceTInst (T : Type) :
+  core_slice_index_SliceIndex usize (slice T) := {|
+  core_slice_index_SliceIndex_sealedInst := core_slice_index_private_slice_index_SealedUsizeInst;
+  core_slice_index_SliceIndex_Output := T;
+  core_slice_index_SliceIndex_get := core_slice_index_usize_get T;
+  core_slice_index_SliceIndex_get_mut := core_slice_index_usize_get_mut T;
+  core_slice_index_SliceIndex_get_unchecked := core_slice_index_usize_get_unchecked T;
+  core_slice_index_SliceIndex_get_unchecked_mut := core_slice_index_usize_get_unchecked_mut T;
+  core_slice_index_SliceIndex_index := core_slice_index_usize_index T;
+  core_slice_index_SliceIndex_index_mut := core_slice_index_usize_index_mut T;
+|}.
+
+(* [alloc::vec::Vec::index]: forward function *)
+Axiom alloc_vec_Vec_index : forall (T Idx : Type) (inst : core_slice_index_SliceIndex Idx (slice T))
+  (Self : alloc_vec_Vec T) (i : Idx), result inst.(core_slice_index_SliceIndex_Output).
+
+(* [alloc::vec::Vec::index_mut]: forward function *)
+Axiom alloc_vec_Vec_index_mut : forall (T Idx : Type) (inst : core_slice_index_SliceIndex Idx (slice T))
+  (Self : alloc_vec_Vec T) (i : Idx),
+  result (inst.(core_slice_index_SliceIndex_Output) *
+          (inst.(core_slice_index_SliceIndex_Output) -> result (alloc_vec_Vec T))).
+
+(* Trait implementation: [alloc::vec::Vec] *)
+Definition alloc_vec_Vec_coreopsindexIndexInst (T Idx : Type)
+  (inst : core_slice_index_SliceIndex Idx (slice T)) :
+  core_ops_index_Index (alloc_vec_Vec T) Idx := {|
+  core_ops_index_Index_Output := inst.(core_slice_index_SliceIndex_Output);
+  core_ops_index_Index_index := alloc_vec_Vec_index T Idx inst;
+|}.
+
+(* Trait implementation: [alloc::vec::Vec] *)
+Definition alloc_vec_Vec_coreopsindexIndexMutInst (T Idx : Type)
+  (inst : core_slice_index_SliceIndex Idx (slice T)) :
+  core_ops_index_IndexMut (alloc_vec_Vec T) Idx := {|
+  core_ops_index_IndexMut_indexInst := alloc_vec_Vec_coreopsindexIndexInst T Idx inst;
+  core_ops_index_IndexMut_index_mut := alloc_vec_Vec_index_mut T Idx inst;
+|}.
+
+(*** Theorems *)
+
+Axiom alloc_vec_Vec_index_eq : forall {a : Type} (v : alloc_vec_Vec a) (i : usize) (x : a),
+  alloc_vec_Vec_index a usize (core_slice_index_SliceIndexUsizeSliceTInst a) v i =
+    alloc_vec_Vec_index_usize v i.
+
+Axiom alloc_vec_Vec_index_mut_eq : forall {a : Type} (v : alloc_vec_Vec a) (i : usize) (x : a),
+  alloc_vec_Vec_index_mut a usize (core_slice_index_SliceIndexUsizeSliceTInst a) v i =
+    alloc_vec_Vec_index_mut_usize v i.
+
+End Primitives.
diff --git a/tests/coq/hashmap_main/_CoqProject b/tests/coq/hashmap_main/_CoqProject
new file mode 100644
index 00000000..d73541d9
--- /dev/null
+++ b/tests/coq/hashmap_main/_CoqProject
@@ -0,0 +1,12 @@
+# This file was automatically generated - see ../Makefile
+-R . Lib
+-arg -w
+-arg all
+
+HashmapMain_Types.v
+HashmapMain_FunsExternal_Template.v
+Primitives.v
+HashmapMain_Funs.v
+HashmapMain_TypesExternal.v
+HashmapMain_FunsExternal.v
+HashmapMain_TypesExternal_Template.v
diff --git a/tests/coq/hashmap_on_disk/HashmapMain_Funs.v b/tests/coq/hashmap_on_disk/HashmapMain_Funs.v
deleted file mode 100644
index f6467d5a..00000000
--- a/tests/coq/hashmap_on_disk/HashmapMain_Funs.v
+++ /dev/null
@@ -1,589 +0,0 @@
-(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
-(** [hashmap_main]: function definitions *)
-Require Import Primitives.
-Import Primitives.
-Require Import Coq.ZArith.ZArith.
-Require Import List.
-Import ListNotations.
-Local Open Scope Primitives_scope.
-Require Import HashmapMain_Types.
-Include HashmapMain_Types.
-Require Import HashmapMain_FunsExternal.
-Include HashmapMain_FunsExternal.
-Module HashmapMain_Funs.
-
-(** [hashmap_main::hashmap::hash_key]:
-    Source: 'tests/src/hashmap.rs', lines 35:0-35:32 *)
-Definition hashmap_hash_key (k : usize) : result usize :=
-  Ok k.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::allocate_slots]: loop 0:
-    Source: 'tests/src/hashmap.rs', lines 58:4-64:5 *)
-Fixpoint hashmap_HashMap_allocate_slots_loop
-  (T : Type) (n : nat) (slots : alloc_vec_Vec (hashmap_List_t T)) (n1 : usize)
-  :
-  result (alloc_vec_Vec (hashmap_List_t T))
-  :=
-  match n with
-  | O => Fail_ OutOfFuel
-  | S n2 =>
-    if n1 s> 0%usize
-    then (
-      slots1 <- alloc_vec_Vec_push (hashmap_List_t T) slots Hashmap_List_Nil;
-      n3 <- usize_sub n1 1%usize;
-      hashmap_HashMap_allocate_slots_loop T n2 slots1 n3)
-    else Ok slots
-  end
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::allocate_slots]:
-    Source: 'tests/src/hashmap.rs', lines 58:4-58:76 *)
-Definition hashmap_HashMap_allocate_slots
-  (T : Type) (n : nat) (slots : alloc_vec_Vec (hashmap_List_t T)) (n1 : usize)
-  :
-  result (alloc_vec_Vec (hashmap_List_t T))
-  :=
-  hashmap_HashMap_allocate_slots_loop T n slots n1
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::new_with_capacity]:
-    Source: 'tests/src/hashmap.rs', lines 67:4-71:13 *)
-Definition hashmap_HashMap_new_with_capacity
-  (T : Type) (n : nat) (capacity : usize) (max_load_dividend : usize)
-  (max_load_divisor : usize) :
-  result (hashmap_HashMap_t T)
-  :=
-  slots <-
-    hashmap_HashMap_allocate_slots T n (alloc_vec_Vec_new (hashmap_List_t T))
-      capacity;
-  i <- usize_mul capacity max_load_dividend;
-  i1 <- usize_div i max_load_divisor;
-  Ok
-    {|
-      hashmap_HashMap_num_entries := 0%usize;
-      hashmap_HashMap_max_load_factor := (max_load_dividend, max_load_divisor);
-      hashmap_HashMap_max_load := i1;
-      hashmap_HashMap_slots := slots
-    |}
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::new]:
-    Source: 'tests/src/hashmap.rs', lines 83:4-83:24 *)
-Definition hashmap_HashMap_new
-  (T : Type) (n : nat) : result (hashmap_HashMap_t T) :=
-  hashmap_HashMap_new_with_capacity T n 32%usize 4%usize 5%usize
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::clear]: loop 0:
-    Source: 'tests/src/hashmap.rs', lines 88:4-96:5 *)
-Fixpoint hashmap_HashMap_clear_loop
-  (T : Type) (n : nat) (slots : alloc_vec_Vec (hashmap_List_t T)) (i : usize) :
-  result (alloc_vec_Vec (hashmap_List_t T))
-  :=
-  match n with
-  | O => Fail_ OutOfFuel
-  | S n1 =>
-    let i1 := alloc_vec_Vec_len (hashmap_List_t T) slots in
-    if i s< i1
-    then (
-      p <-
-        alloc_vec_Vec_index_mut (hashmap_List_t T) usize
-          (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t T)) slots
-          i;
-      let (_, index_mut_back) := p in
-      i2 <- usize_add i 1%usize;
-      slots1 <- index_mut_back Hashmap_List_Nil;
-      hashmap_HashMap_clear_loop T n1 slots1 i2)
-    else Ok slots
-  end
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::clear]:
-    Source: 'tests/src/hashmap.rs', lines 88:4-88:27 *)
-Definition hashmap_HashMap_clear
-  (T : Type) (n : nat) (self : hashmap_HashMap_t T) :
-  result (hashmap_HashMap_t T)
-  :=
-  hm <- hashmap_HashMap_clear_loop T n self.(hashmap_HashMap_slots) 0%usize;
-  Ok
-    {|
-      hashmap_HashMap_num_entries := 0%usize;
-      hashmap_HashMap_max_load_factor := self.(hashmap_HashMap_max_load_factor);
-      hashmap_HashMap_max_load := self.(hashmap_HashMap_max_load);
-      hashmap_HashMap_slots := hm
-    |}
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::len]:
-    Source: 'tests/src/hashmap.rs', lines 98:4-98:30 *)
-Definition hashmap_HashMap_len
-  (T : Type) (self : hashmap_HashMap_t T) : result usize :=
-  Ok self.(hashmap_HashMap_num_entries)
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::insert_in_list]: loop 0:
-    Source: 'tests/src/hashmap.rs', lines 105:4-122:5 *)
-Fixpoint hashmap_HashMap_insert_in_list_loop
-  (T : Type) (n : nat) (key : usize) (value : T) (ls : hashmap_List_t T) :
-  result (bool * (hashmap_List_t T))
-  :=
-  match n with
-  | O => Fail_ OutOfFuel
-  | S n1 =>
-    match ls with
-    | Hashmap_List_Cons ckey cvalue tl =>
-      if ckey s= key
-      then Ok (false, Hashmap_List_Cons ckey value tl)
-      else (
-        p <- hashmap_HashMap_insert_in_list_loop T n1 key value tl;
-        let (b, tl1) := p in
-        Ok (b, Hashmap_List_Cons ckey cvalue tl1))
-    | Hashmap_List_Nil =>
-      Ok (true, Hashmap_List_Cons key value Hashmap_List_Nil)
-    end
-  end
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::insert_in_list]:
-    Source: 'tests/src/hashmap.rs', lines 105:4-105:71 *)
-Definition hashmap_HashMap_insert_in_list
-  (T : Type) (n : nat) (key : usize) (value : T) (ls : hashmap_List_t T) :
-  result (bool * (hashmap_List_t T))
-  :=
-  hashmap_HashMap_insert_in_list_loop T n key value ls
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::insert_no_resize]:
-    Source: 'tests/src/hashmap.rs', lines 125:4-125:54 *)
-Definition hashmap_HashMap_insert_no_resize
-  (T : Type) (n : nat) (self : hashmap_HashMap_t T) (key : usize) (value : T) :
-  result (hashmap_HashMap_t T)
-  :=
-  hash <- hashmap_hash_key key;
-  let i := alloc_vec_Vec_len (hashmap_List_t T) self.(hashmap_HashMap_slots) in
-  hash_mod <- usize_rem hash i;
-  p <-
-    alloc_vec_Vec_index_mut (hashmap_List_t T) usize
-      (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t T))
-      self.(hashmap_HashMap_slots) hash_mod;
-  let (l, index_mut_back) := p in
-  p1 <- hashmap_HashMap_insert_in_list T n key value l;
-  let (inserted, l1) := p1 in
-  if inserted
-  then (
-    i1 <- usize_add self.(hashmap_HashMap_num_entries) 1%usize;
-    v <- index_mut_back l1;
-    Ok
-      {|
-        hashmap_HashMap_num_entries := i1;
-        hashmap_HashMap_max_load_factor :=
-          self.(hashmap_HashMap_max_load_factor);
-        hashmap_HashMap_max_load := self.(hashmap_HashMap_max_load);
-        hashmap_HashMap_slots := v
-      |})
-  else (
-    v <- index_mut_back l1;
-    Ok
-      {|
-        hashmap_HashMap_num_entries := self.(hashmap_HashMap_num_entries);
-        hashmap_HashMap_max_load_factor :=
-          self.(hashmap_HashMap_max_load_factor);
-        hashmap_HashMap_max_load := self.(hashmap_HashMap_max_load);
-        hashmap_HashMap_slots := v
-      |})
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::move_elements_from_list]: loop 0:
-    Source: 'tests/src/hashmap.rs', lines 191:4-204:5 *)
-Fixpoint hashmap_HashMap_move_elements_from_list_loop
-  (T : Type) (n : nat) (ntable : hashmap_HashMap_t T) (ls : hashmap_List_t T) :
-  result (hashmap_HashMap_t T)
-  :=
-  match n with
-  | O => Fail_ OutOfFuel
-  | S n1 =>
-    match ls with
-    | Hashmap_List_Cons k v tl =>
-      ntable1 <- hashmap_HashMap_insert_no_resize T n1 ntable k v;
-      hashmap_HashMap_move_elements_from_list_loop T n1 ntable1 tl
-    | Hashmap_List_Nil => Ok ntable
-    end
-  end
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::move_elements_from_list]:
-    Source: 'tests/src/hashmap.rs', lines 191:4-191:72 *)
-Definition hashmap_HashMap_move_elements_from_list
-  (T : Type) (n : nat) (ntable : hashmap_HashMap_t T) (ls : hashmap_List_t T) :
-  result (hashmap_HashMap_t T)
-  :=
-  hashmap_HashMap_move_elements_from_list_loop T n ntable ls
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::move_elements]: loop 0:
-    Source: 'tests/src/hashmap.rs', lines 179:4-188:5 *)
-Fixpoint hashmap_HashMap_move_elements_loop
-  (T : Type) (n : nat) (ntable : hashmap_HashMap_t T)
-  (slots : alloc_vec_Vec (hashmap_List_t T)) (i : usize) :
-  result ((hashmap_HashMap_t T) * (alloc_vec_Vec (hashmap_List_t T)))
-  :=
-  match n with
-  | O => Fail_ OutOfFuel
-  | S n1 =>
-    let i1 := alloc_vec_Vec_len (hashmap_List_t T) slots in
-    if i s< i1
-    then (
-      p <-
-        alloc_vec_Vec_index_mut (hashmap_List_t T) usize
-          (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t T)) slots
-          i;
-      let (l, index_mut_back) := p in
-      let (ls, l1) := core_mem_replace (hashmap_List_t T) l Hashmap_List_Nil in
-      ntable1 <- hashmap_HashMap_move_elements_from_list T n1 ntable ls;
-      i2 <- usize_add i 1%usize;
-      slots1 <- index_mut_back l1;
-      hashmap_HashMap_move_elements_loop T n1 ntable1 slots1 i2)
-    else Ok (ntable, slots)
-  end
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::move_elements]:
-    Source: 'tests/src/hashmap.rs', lines 179:4-179:95 *)
-Definition hashmap_HashMap_move_elements
-  (T : Type) (n : nat) (ntable : hashmap_HashMap_t T)
-  (slots : alloc_vec_Vec (hashmap_List_t T)) (i : usize) :
-  result ((hashmap_HashMap_t T) * (alloc_vec_Vec (hashmap_List_t T)))
-  :=
-  hashmap_HashMap_move_elements_loop T n ntable slots i
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::try_resize]:
-    Source: 'tests/src/hashmap.rs', lines 148:4-148:28 *)
-Definition hashmap_HashMap_try_resize
-  (T : Type) (n : nat) (self : hashmap_HashMap_t T) :
-  result (hashmap_HashMap_t T)
-  :=
-  max_usize <- scalar_cast U32 Usize core_u32_max;
-  let capacity :=
-    alloc_vec_Vec_len (hashmap_List_t T) self.(hashmap_HashMap_slots) in
-  n1 <- usize_div max_usize 2%usize;
-  let (i, i1) := self.(hashmap_HashMap_max_load_factor) in
-  i2 <- usize_div n1 i;
-  if capacity s<= i2
-  then (
-    i3 <- usize_mul capacity 2%usize;
-    ntable <- hashmap_HashMap_new_with_capacity T n i3 i i1;
-    p <-
-      hashmap_HashMap_move_elements T n ntable self.(hashmap_HashMap_slots)
-        0%usize;
-    let (ntable1, _) := p in
-    Ok
-      {|
-        hashmap_HashMap_num_entries := self.(hashmap_HashMap_num_entries);
-        hashmap_HashMap_max_load_factor := (i, i1);
-        hashmap_HashMap_max_load := ntable1.(hashmap_HashMap_max_load);
-        hashmap_HashMap_slots := ntable1.(hashmap_HashMap_slots)
-      |})
-  else
-    Ok
-      {|
-        hashmap_HashMap_num_entries := self.(hashmap_HashMap_num_entries);
-        hashmap_HashMap_max_load_factor := (i, i1);
-        hashmap_HashMap_max_load := self.(hashmap_HashMap_max_load);
-        hashmap_HashMap_slots := self.(hashmap_HashMap_slots)
-      |}
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::insert]:
-    Source: 'tests/src/hashmap.rs', lines 137:4-137:48 *)
-Definition hashmap_HashMap_insert
-  (T : Type) (n : nat) (self : hashmap_HashMap_t T) (key : usize) (value : T) :
-  result (hashmap_HashMap_t T)
-  :=
-  self1 <- hashmap_HashMap_insert_no_resize T n self key value;
-  i <- hashmap_HashMap_len T self1;
-  if i s> self1.(hashmap_HashMap_max_load)
-  then hashmap_HashMap_try_resize T n self1
-  else Ok self1
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::contains_key_in_list]: loop 0:
-    Source: 'tests/src/hashmap.rs', lines 214:4-227:5 *)
-Fixpoint hashmap_HashMap_contains_key_in_list_loop
-  (T : Type) (n : nat) (key : usize) (ls : hashmap_List_t T) : result bool :=
-  match n with
-  | O => Fail_ OutOfFuel
-  | S n1 =>
-    match ls with
-    | Hashmap_List_Cons ckey _ tl =>
-      if ckey s= key
-      then Ok true
-      else hashmap_HashMap_contains_key_in_list_loop T n1 key tl
-    | Hashmap_List_Nil => Ok false
-    end
-  end
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::contains_key_in_list]:
-    Source: 'tests/src/hashmap.rs', lines 214:4-214:68 *)
-Definition hashmap_HashMap_contains_key_in_list
-  (T : Type) (n : nat) (key : usize) (ls : hashmap_List_t T) : result bool :=
-  hashmap_HashMap_contains_key_in_list_loop T n key ls
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::contains_key]:
-    Source: 'tests/src/hashmap.rs', lines 207:4-207:49 *)
-Definition hashmap_HashMap_contains_key
-  (T : Type) (n : nat) (self : hashmap_HashMap_t T) (key : usize) :
-  result bool
-  :=
-  hash <- hashmap_hash_key key;
-  let i := alloc_vec_Vec_len (hashmap_List_t T) self.(hashmap_HashMap_slots) in
-  hash_mod <- usize_rem hash i;
-  l <-
-    alloc_vec_Vec_index (hashmap_List_t T) usize
-      (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t T))
-      self.(hashmap_HashMap_slots) hash_mod;
-  hashmap_HashMap_contains_key_in_list T n key l
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get_in_list]: loop 0:
-    Source: 'tests/src/hashmap.rs', lines 232:4-245:5 *)
-Fixpoint hashmap_HashMap_get_in_list_loop
-  (T : Type) (n : nat) (key : usize) (ls : hashmap_List_t T) : result T :=
-  match n with
-  | O => Fail_ OutOfFuel
-  | S n1 =>
-    match ls with
-    | Hashmap_List_Cons ckey cvalue tl =>
-      if ckey s= key
-      then Ok cvalue
-      else hashmap_HashMap_get_in_list_loop T n1 key tl
-    | Hashmap_List_Nil => Fail_ Failure
-    end
-  end
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get_in_list]:
-    Source: 'tests/src/hashmap.rs', lines 232:4-232:70 *)
-Definition hashmap_HashMap_get_in_list
-  (T : Type) (n : nat) (key : usize) (ls : hashmap_List_t T) : result T :=
-  hashmap_HashMap_get_in_list_loop T n key ls
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get]:
-    Source: 'tests/src/hashmap.rs', lines 247:4-247:55 *)
-Definition hashmap_HashMap_get
-  (T : Type) (n : nat) (self : hashmap_HashMap_t T) (key : usize) : result T :=
-  hash <- hashmap_hash_key key;
-  let i := alloc_vec_Vec_len (hashmap_List_t T) self.(hashmap_HashMap_slots) in
-  hash_mod <- usize_rem hash i;
-  l <-
-    alloc_vec_Vec_index (hashmap_List_t T) usize
-      (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t T))
-      self.(hashmap_HashMap_slots) hash_mod;
-  hashmap_HashMap_get_in_list T n key l
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get_mut_in_list]: loop 0:
-    Source: 'tests/src/hashmap.rs', lines 253:4-262:5 *)
-Fixpoint hashmap_HashMap_get_mut_in_list_loop
-  (T : Type) (n : nat) (ls : hashmap_List_t T) (key : usize) :
-  result (T * (T -> result (hashmap_List_t T)))
-  :=
-  match n with
-  | O => Fail_ OutOfFuel
-  | S n1 =>
-    match ls with
-    | Hashmap_List_Cons ckey cvalue tl =>
-      if ckey s= key
-      then
-        let back := fun (ret : T) => Ok (Hashmap_List_Cons ckey ret tl) in
-        Ok (cvalue, back)
-      else (
-        p <- hashmap_HashMap_get_mut_in_list_loop T n1 tl key;
-        let (t, back) := p in
-        let back1 :=
-          fun (ret : T) =>
-            tl1 <- back ret; Ok (Hashmap_List_Cons ckey cvalue tl1) in
-        Ok (t, back1))
-    | Hashmap_List_Nil => Fail_ Failure
-    end
-  end
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get_mut_in_list]:
-    Source: 'tests/src/hashmap.rs', lines 253:4-253:86 *)
-Definition hashmap_HashMap_get_mut_in_list
-  (T : Type) (n : nat) (ls : hashmap_List_t T) (key : usize) :
-  result (T * (T -> result (hashmap_List_t T)))
-  :=
-  hashmap_HashMap_get_mut_in_list_loop T n ls key
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get_mut]:
-    Source: 'tests/src/hashmap.rs', lines 265:4-265:67 *)
-Definition hashmap_HashMap_get_mut
-  (T : Type) (n : nat) (self : hashmap_HashMap_t T) (key : usize) :
-  result (T * (T -> result (hashmap_HashMap_t T)))
-  :=
-  hash <- hashmap_hash_key key;
-  let i := alloc_vec_Vec_len (hashmap_List_t T) self.(hashmap_HashMap_slots) in
-  hash_mod <- usize_rem hash i;
-  p <-
-    alloc_vec_Vec_index_mut (hashmap_List_t T) usize
-      (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t T))
-      self.(hashmap_HashMap_slots) hash_mod;
-  let (l, index_mut_back) := p in
-  p1 <- hashmap_HashMap_get_mut_in_list T n l key;
-  let (t, get_mut_in_list_back) := p1 in
-  let back :=
-    fun (ret : T) =>
-      l1 <- get_mut_in_list_back ret;
-      v <- index_mut_back l1;
-      Ok
-        {|
-          hashmap_HashMap_num_entries := self.(hashmap_HashMap_num_entries);
-          hashmap_HashMap_max_load_factor :=
-            self.(hashmap_HashMap_max_load_factor);
-          hashmap_HashMap_max_load := self.(hashmap_HashMap_max_load);
-          hashmap_HashMap_slots := v
-        |} in
-  Ok (t, back)
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::remove_from_list]: loop 0:
-    Source: 'tests/src/hashmap.rs', lines 273:4-299:5 *)
-Fixpoint hashmap_HashMap_remove_from_list_loop
-  (T : Type) (n : nat) (key : usize) (ls : hashmap_List_t T) :
-  result ((option T) * (hashmap_List_t T))
-  :=
-  match n with
-  | O => Fail_ OutOfFuel
-  | S n1 =>
-    match ls with
-    | Hashmap_List_Cons ckey t tl =>
-      if ckey s= key
-      then
-        let (mv_ls, _) :=
-          core_mem_replace (hashmap_List_t T) (Hashmap_List_Cons ckey t tl)
-            Hashmap_List_Nil in
-        match mv_ls with
-        | Hashmap_List_Cons _ cvalue tl1 => Ok (Some cvalue, tl1)
-        | Hashmap_List_Nil => Fail_ Failure
-        end
-      else (
-        p <- hashmap_HashMap_remove_from_list_loop T n1 key tl;
-        let (o, tl1) := p in
-        Ok (o, Hashmap_List_Cons ckey t tl1))
-    | Hashmap_List_Nil => Ok (None, Hashmap_List_Nil)
-    end
-  end
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::remove_from_list]:
-    Source: 'tests/src/hashmap.rs', lines 273:4-273:69 *)
-Definition hashmap_HashMap_remove_from_list
-  (T : Type) (n : nat) (key : usize) (ls : hashmap_List_t T) :
-  result ((option T) * (hashmap_List_t T))
-  :=
-  hashmap_HashMap_remove_from_list_loop T n key ls
-.
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::remove]:
-    Source: 'tests/src/hashmap.rs', lines 302:4-302:52 *)
-Definition hashmap_HashMap_remove
-  (T : Type) (n : nat) (self : hashmap_HashMap_t T) (key : usize) :
-  result ((option T) * (hashmap_HashMap_t T))
-  :=
-  hash <- hashmap_hash_key key;
-  let i := alloc_vec_Vec_len (hashmap_List_t T) self.(hashmap_HashMap_slots) in
-  hash_mod <- usize_rem hash i;
-  p <-
-    alloc_vec_Vec_index_mut (hashmap_List_t T) usize
-      (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t T))
-      self.(hashmap_HashMap_slots) hash_mod;
-  let (l, index_mut_back) := p in
-  p1 <- hashmap_HashMap_remove_from_list T n key l;
-  let (x, l1) := p1 in
-  match x with
-  | None =>
-    v <- index_mut_back l1;
-    Ok (None,
-      {|
-        hashmap_HashMap_num_entries := self.(hashmap_HashMap_num_entries);
-        hashmap_HashMap_max_load_factor :=
-          self.(hashmap_HashMap_max_load_factor);
-        hashmap_HashMap_max_load := self.(hashmap_HashMap_max_load);
-        hashmap_HashMap_slots := v
-      |})
-  | Some x1 =>
-    i1 <- usize_sub self.(hashmap_HashMap_num_entries) 1%usize;
-    v <- index_mut_back l1;
-    Ok (Some x1,
-      {|
-        hashmap_HashMap_num_entries := i1;
-        hashmap_HashMap_max_load_factor :=
-          self.(hashmap_HashMap_max_load_factor);
-        hashmap_HashMap_max_load := self.(hashmap_HashMap_max_load);
-        hashmap_HashMap_slots := v
-      |})
-  end
-.
-
-(** [hashmap_main::hashmap::test1]:
-    Source: 'tests/src/hashmap.rs', lines 323:0-323:10 *)
-Definition hashmap_test1 (n : nat) : result unit :=
-  hm <- hashmap_HashMap_new u64 n;
-  hm1 <- hashmap_HashMap_insert u64 n hm 0%usize 42%u64;
-  hm2 <- hashmap_HashMap_insert u64 n hm1 128%usize 18%u64;
-  hm3 <- hashmap_HashMap_insert u64 n hm2 1024%usize 138%u64;
-  hm4 <- hashmap_HashMap_insert u64 n hm3 1056%usize 256%u64;
-  i <- hashmap_HashMap_get u64 n hm4 128%usize;
-  if negb (i s= 18%u64)
-  then Fail_ Failure
-  else (
-    p <- hashmap_HashMap_get_mut u64 n hm4 1024%usize;
-    let (_, get_mut_back) := p in
-    hm5 <- get_mut_back 56%u64;
-    i1 <- hashmap_HashMap_get u64 n hm5 1024%usize;
-    if negb (i1 s= 56%u64)
-    then Fail_ Failure
-    else (
-      p1 <- hashmap_HashMap_remove u64 n hm5 1024%usize;
-      let (x, hm6) := p1 in
-      match x with
-      | None => Fail_ Failure
-      | Some x1 =>
-        if negb (x1 s= 56%u64)
-        then Fail_ Failure
-        else (
-          i2 <- hashmap_HashMap_get u64 n hm6 0%usize;
-          if negb (i2 s= 42%u64)
-          then Fail_ Failure
-          else (
-            i3 <- hashmap_HashMap_get u64 n hm6 128%usize;
-            if negb (i3 s= 18%u64)
-            then Fail_ Failure
-            else (
-              i4 <- hashmap_HashMap_get u64 n hm6 1056%usize;
-              if negb (i4 s= 256%u64) then Fail_ Failure else Ok tt)))
-      end))
-.
-
-(** [hashmap_main::insert_on_disk]:
-    Source: 'tests/src/hashmap_main.rs', lines 13:0-13:43 *)
-Definition insert_on_disk
-  (n : nat) (key : usize) (value : u64) (st : state) : result (state * unit) :=
-  p <- hashmap_utils_deserialize st;
-  let (st1, hm) := p in
-  hm1 <- hashmap_HashMap_insert u64 n hm key value;
-  hashmap_utils_serialize hm1 st1
-.
-
-(** [hashmap_main::main]:
-    Source: 'tests/src/hashmap_main.rs', lines 22:0-22:13 *)
-Definition main : result unit :=
-  Ok tt.
-
-End HashmapMain_Funs.
diff --git a/tests/coq/hashmap_on_disk/HashmapMain_FunsExternal.v b/tests/coq/hashmap_on_disk/HashmapMain_FunsExternal.v
deleted file mode 100644
index fb5f23cd..00000000
--- a/tests/coq/hashmap_on_disk/HashmapMain_FunsExternal.v
+++ /dev/null
@@ -1,24 +0,0 @@
-(** [hashmap_main]: external function declarations *)
-Require Import Primitives.
-Import Primitives.
-Require Import Coq.ZArith.ZArith.
-Require Import List.
-Import ListNotations.
-Local Open Scope Primitives_scope.
-Require Export HashmapMain_Types.
-Import HashmapMain_Types.
-Module HashmapMain_FunsExternal.
-
-(** [hashmap_main::hashmap_utils::deserialize]: forward function
-    Source: 'src/hashmap_utils.rs', lines 10:0-10:43 *)
-Axiom hashmap_utils_deserialize
-  : state -> result (state * (hashmap_HashMap_t u64))
-.
-
-(** [hashmap_main::hashmap_utils::serialize]: forward function
-    Source: 'src/hashmap_utils.rs', lines 5:0-5:42 *)
-Axiom hashmap_utils_serialize
-  : hashmap_HashMap_t u64 -> state -> result (state * unit)
-.
-
-End HashmapMain_FunsExternal.
diff --git a/tests/coq/hashmap_on_disk/HashmapMain_FunsExternal_Template.v b/tests/coq/hashmap_on_disk/HashmapMain_FunsExternal_Template.v
deleted file mode 100644
index 66835e8c..00000000
--- a/tests/coq/hashmap_on_disk/HashmapMain_FunsExternal_Template.v
+++ /dev/null
@@ -1,26 +0,0 @@
-(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
-(** [hashmap_main]: external functions.
--- This is a template file: rename it to "FunsExternal.lean" and fill the holes. *)
-Require Import Primitives.
-Import Primitives.
-Require Import Coq.ZArith.ZArith.
-Require Import List.
-Import ListNotations.
-Local Open Scope Primitives_scope.
-Require Import HashmapMain_Types.
-Include HashmapMain_Types.
-Module HashmapMain_FunsExternal_Template.
-
-(** [hashmap_main::hashmap_utils::deserialize]:
-    Source: 'tests/src/hashmap_utils.rs', lines 11:0-11:43 *)
-Axiom hashmap_utils_deserialize
-  : state -> result (state * (hashmap_HashMap_t u64))
-.
-
-(** [hashmap_main::hashmap_utils::serialize]:
-    Source: 'tests/src/hashmap_utils.rs', lines 6:0-6:42 *)
-Axiom hashmap_utils_serialize
-  : hashmap_HashMap_t u64 -> state -> result (state * unit)
-.
-
-End HashmapMain_FunsExternal_Template.
diff --git a/tests/coq/hashmap_on_disk/HashmapMain_Types.v b/tests/coq/hashmap_on_disk/HashmapMain_Types.v
deleted file mode 100644
index 5656bd9c..00000000
--- a/tests/coq/hashmap_on_disk/HashmapMain_Types.v
+++ /dev/null
@@ -1,40 +0,0 @@
-(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
-(** [hashmap_main]: type definitions *)
-Require Import Primitives.
-Import Primitives.
-Require Import Coq.ZArith.ZArith.
-Require Import List.
-Import ListNotations.
-Local Open Scope Primitives_scope.
-Require Import HashmapMain_TypesExternal.
-Include HashmapMain_TypesExternal.
-Module HashmapMain_Types.
-
-(** [hashmap_main::hashmap::List]
-    Source: 'tests/src/hashmap.rs', lines 27:0-27:16 *)
-Inductive hashmap_List_t (T : Type) :=
-| Hashmap_List_Cons : usize -> T -> hashmap_List_t T -> hashmap_List_t T
-| Hashmap_List_Nil : hashmap_List_t T
-.
-
-Arguments Hashmap_List_Cons { _ }.
-Arguments Hashmap_List_Nil { _ }.
-
-(** [hashmap_main::hashmap::HashMap]
-    Source: 'tests/src/hashmap.rs', lines 43:0-43:21 *)
-Record hashmap_HashMap_t (T : Type) :=
-mkhashmap_HashMap_t {
-  hashmap_HashMap_num_entries : usize;
-  hashmap_HashMap_max_load_factor : (usize * usize);
-  hashmap_HashMap_max_load : usize;
-  hashmap_HashMap_slots : alloc_vec_Vec (hashmap_List_t T);
-}
-.
-
-Arguments mkhashmap_HashMap_t { _ }.
-Arguments hashmap_HashMap_num_entries { _ }.
-Arguments hashmap_HashMap_max_load_factor { _ }.
-Arguments hashmap_HashMap_max_load { _ }.
-Arguments hashmap_HashMap_slots { _ }.
-
-End HashmapMain_Types.
diff --git a/tests/coq/hashmap_on_disk/HashmapMain_TypesExternal.v b/tests/coq/hashmap_on_disk/HashmapMain_TypesExternal.v
deleted file mode 100644
index 28651c14..00000000
--- a/tests/coq/hashmap_on_disk/HashmapMain_TypesExternal.v
+++ /dev/null
@@ -1,14 +0,0 @@
-(** [hashmap_main]: external types.
--- This is a template file: rename it to "TypesExternal.lean" and fill the holes. *)
-Require Import Primitives.
-Import Primitives.
-Require Import Coq.ZArith.ZArith.
-Require Import List.
-Import ListNotations.
-Local Open Scope Primitives_scope.
-Module HashmapMain_TypesExternal.
-
-(** The state type used in the state-error monad *)
-Axiom state : Type.
-
-End HashmapMain_TypesExternal.
diff --git a/tests/coq/hashmap_on_disk/HashmapMain_TypesExternal_Template.v b/tests/coq/hashmap_on_disk/HashmapMain_TypesExternal_Template.v
deleted file mode 100644
index 391b2775..00000000
--- a/tests/coq/hashmap_on_disk/HashmapMain_TypesExternal_Template.v
+++ /dev/null
@@ -1,15 +0,0 @@
-(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
-(** [hashmap_main]: external types.
--- This is a template file: rename it to "TypesExternal.lean" and fill the holes. *)
-Require Import Primitives.
-Import Primitives.
-Require Import Coq.ZArith.ZArith.
-Require Import List.
-Import ListNotations.
-Local Open Scope Primitives_scope.
-Module HashmapMain_TypesExternal_Template.
-
-(** The state type used in the state-error monad *)
-Axiom state : Type.
-
-End HashmapMain_TypesExternal_Template.
diff --git a/tests/coq/hashmap_on_disk/Makefile b/tests/coq/hashmap_on_disk/Makefile
deleted file mode 100644
index 1a5aee4a..00000000
--- a/tests/coq/hashmap_on_disk/Makefile
+++ /dev/null
@@ -1,23 +0,0 @@
-# This file was automatically generated - modify ../Makefile.template instead
-# Makefile originally taken from coq-club
-
-%: Makefile.coq phony
-	+make -f Makefile.coq $@
-
-all: Makefile.coq
-	+make -f Makefile.coq all
-
-clean: Makefile.coq
-	+make -f Makefile.coq clean
-	rm -f Makefile.coq
-
-Makefile.coq: _CoqProject Makefile
-	coq_makefile -f _CoqProject | sed 's/$$(COQCHK) $$(COQCHKFLAGS) $$(COQLIBS)/$$(COQCHK) $$(COQCHKFLAGS) $$(subst -Q,-R,$$(COQLIBS))/' > Makefile.coq
-
-_CoqProject: ;
-
-Makefile: ;
-
-phony: ;
-
-.PHONY: all clean phony
diff --git a/tests/coq/hashmap_on_disk/Primitives.v b/tests/coq/hashmap_on_disk/Primitives.v
deleted file mode 100644
index b29fce43..00000000
--- a/tests/coq/hashmap_on_disk/Primitives.v
+++ /dev/null
@@ -1,981 +0,0 @@
-Require Import Lia.
-Require Coq.Strings.Ascii.
-Require Coq.Strings.String.
-Require Import Coq.Program.Equality.
-Require Import Coq.ZArith.ZArith.
-Require Import Coq.ZArith.Znat.
-Require Import List.
-Import ListNotations.
-
-Module Primitives.
-
-  (* TODO: use more *)
-Declare Scope Primitives_scope.
-
-(*** Result *)
-
-Inductive error :=
-  | Failure
-  | OutOfFuel.
-
-Inductive result A :=
-  | Ok : A -> result A
-  | Fail_ : error -> result A.
-
-Arguments Ok {_} a.
-Arguments Fail_ {_}.
-
-Definition bind {A B} (m: result A) (f: A -> result B) : result B :=
-  match m with
-  | Fail_ e => Fail_ e
-  | Ok x => f x
-  end.
-
-Definition return_ {A: Type} (x: A) : result A := Ok x.
-Definition fail_ {A: Type} (e: error) : result A := Fail_ e.
-
-Notation "x <- c1 ; c2" := (bind c1 (fun x => c2))
-  (at level 61, c1 at next level, right associativity).
-
-(** Monadic assert *)
-Definition massert (b: bool) : result unit :=
-  if b then Ok tt else Fail_ Failure.
-
-(** Normalize and unwrap a successful result (used for globals) *)
-Definition eval_result_refl {A} {x} (a: result A) (p: a = Ok x) : A :=
-  match a as r return (r = Ok x -> A) with
-  | Ok a' => fun _  => a'
-  | Fail_ e   => fun p' =>
-      False_rect _ (eq_ind (Fail_ e)
-          (fun e : result A =>
-          match e with
-          | Ok _ => False
-          | Fail_ e => True
-          end)
-        I (Ok x) p')
-  end p.
-
-Notation "x %global" := (eval_result_refl x eq_refl) (at level 40).
-Notation "x %return" := (eval_result_refl x eq_refl) (at level 40).
-
-(* Sanity check *)
-Check (if true then Ok (1 + 2) else Fail_ Failure)%global = 3.
-
-(*** Misc *)
-
-Definition string := Coq.Strings.String.string.
-Definition char := Coq.Strings.Ascii.ascii.
-Definition char_of_byte := Coq.Strings.Ascii.ascii_of_byte.
-
-Definition core_mem_replace (a : Type) (x : a) (y : a) : a * a := (x, x) .
-
-Record mut_raw_ptr (T : Type) := { mut_raw_ptr_v : T }.
-Record const_raw_ptr (T : Type) := { const_raw_ptr_v : T }.
-
-(*** Scalars *)
-
-Definition i8_min   : Z := -128%Z.
-Definition i8_max   : Z := 127%Z.
-Definition i16_min  : Z := -32768%Z.
-Definition i16_max  : Z := 32767%Z.
-Definition i32_min  : Z := -2147483648%Z.
-Definition i32_max  : Z := 2147483647%Z.
-Definition i64_min  : Z := -9223372036854775808%Z.
-Definition i64_max  : Z := 9223372036854775807%Z.
-Definition i128_min : Z := -170141183460469231731687303715884105728%Z.
-Definition i128_max : Z := 170141183460469231731687303715884105727%Z.
-Definition u8_min   : Z := 0%Z.
-Definition u8_max   : Z := 255%Z.
-Definition u16_min  : Z := 0%Z.
-Definition u16_max  : Z := 65535%Z.
-Definition u32_min  : Z := 0%Z.
-Definition u32_max  : Z := 4294967295%Z.
-Definition u64_min  : Z := 0%Z.
-Definition u64_max  : Z := 18446744073709551615%Z.
-Definition u128_min : Z := 0%Z.
-Definition u128_max : Z := 340282366920938463463374607431768211455%Z.
-
-(** The bounds of [isize] and [usize] vary with the architecture. *)
-Axiom isize_min : Z.
-Axiom isize_max : Z.
-Definition usize_min : Z := 0%Z.
-Axiom usize_max : Z.
-
-Open Scope Z_scope.
-
-(** We provide those lemmas to reason about the bounds of [isize] and [usize] *)
-Axiom isize_min_bound : isize_min <= i32_min.
-Axiom isize_max_bound : i32_max <= isize_max.
-Axiom usize_max_bound : u32_max <= usize_max.
-
-Inductive scalar_ty :=
-  | Isize
-  | I8
-  | I16
-  | I32
-  | I64
-  | I128
-  | Usize
-  | U8
-  | U16
-  | U32
-  | U64
-  | U128
-.
-
-Definition scalar_min (ty: scalar_ty) : Z :=
-  match ty with
-  | Isize => isize_min
-  | I8 => i8_min
-  | I16 => i16_min
-  | I32 => i32_min
-  | I64 => i64_min
-  | I128 => i128_min
-  | Usize => usize_min
-  | U8 => u8_min
-  | U16 => u16_min
-  | U32 => u32_min
-  | U64 => u64_min
-  | U128 => u128_min
-end.
-
-Definition scalar_max (ty: scalar_ty) : Z :=
-  match ty with
-  | Isize => isize_max
-  | I8 => i8_max
-  | I16 => i16_max
-  | I32 => i32_max
-  | I64 => i64_max
-  | I128 => i128_max
-  | Usize => usize_max
-  | U8 => u8_max
-  | U16 => u16_max
-  | U32 => u32_max
-  | U64 => u64_max
-  | U128 => u128_max
-end.
-
-(** We use the following conservative bounds to make sure we can compute bound
-    checks in most situations *)
-Definition scalar_min_cons (ty: scalar_ty) : Z :=
-  match ty with
-  | Isize => i32_min
-  | Usize => u32_min
-  | _ => scalar_min ty
-end.
-
-Definition scalar_max_cons (ty: scalar_ty) : Z :=
-  match ty with
-  | Isize => i32_max
-  | Usize => u32_max
-  | _ => scalar_max ty
-end.
-
-Lemma scalar_min_cons_valid : forall ty, scalar_min ty <= scalar_min_cons ty .
-Proof.
-  destruct ty; unfold scalar_min_cons, scalar_min; try lia.
-  - pose isize_min_bound; lia.
-  - apply Z.le_refl.
-Qed.
-
-Lemma scalar_max_cons_valid : forall ty, scalar_max ty >= scalar_max_cons ty .
-Proof.
-  destruct ty; unfold scalar_max_cons, scalar_max; try lia.
-  - pose isize_max_bound; lia.
-  - pose usize_max_bound. lia.
-Qed.
-
-Definition scalar (ty: scalar_ty) : Type :=
- { x: Z | scalar_min ty <= x <= scalar_max ty }.
-
-Definition to_Z {ty} (x: scalar ty) : Z := proj1_sig x.
-
-(** Bounds checks: we start by using the conservative bounds, to make sure we
-    can compute in most situations, then we use the real bounds (for [isize]
-    and [usize]). *)
-Definition scalar_ge_min (ty: scalar_ty) (x: Z) : bool :=
-  Z.leb (scalar_min_cons ty) x || Z.leb (scalar_min ty) x.
-
-Definition scalar_le_max (ty: scalar_ty) (x: Z) : bool :=
-  Z.leb x (scalar_max_cons ty) || Z.leb x (scalar_max ty).
-
-Lemma scalar_ge_min_valid (ty: scalar_ty) (x: Z) :
-  scalar_ge_min ty x = true -> scalar_min ty <= x .
-Proof.
-  unfold scalar_ge_min.
-  pose (scalar_min_cons_valid ty).
-  lia.
-Qed.
-
-Lemma scalar_le_max_valid (ty: scalar_ty) (x: Z) :
-  scalar_le_max ty x = true -> x <= scalar_max ty .
-Proof.
-  unfold scalar_le_max.
-  pose (scalar_max_cons_valid ty).
-  lia.
-Qed.
-
-Definition scalar_in_bounds (ty: scalar_ty) (x: Z) : bool :=
-  scalar_ge_min ty x && scalar_le_max ty x .
-
-Lemma scalar_in_bounds_valid (ty: scalar_ty) (x: Z) :
-  scalar_in_bounds ty x = true -> scalar_min ty <= x <= scalar_max ty .
-Proof.
-  unfold scalar_in_bounds.
-  intros H.
-  destruct (scalar_ge_min ty x) eqn:Hmin.
-  - destruct (scalar_le_max ty x) eqn:Hmax.
-    + pose (scalar_ge_min_valid ty x Hmin).
-      pose (scalar_le_max_valid ty x Hmax).
-      lia.
-    + inversion H.
-  - inversion H.
-Qed.
-
-Import Sumbool.
-
-Definition mk_scalar (ty: scalar_ty) (x: Z) : result (scalar ty) :=
-  match sumbool_of_bool (scalar_in_bounds ty x) with
-  | left H => Ok (exist _ x (scalar_in_bounds_valid _ _ H))
-  | right _ => Fail_ Failure
-  end.
-
-Definition scalar_add {ty} (x y: scalar ty) : result (scalar ty) := mk_scalar ty (to_Z x + to_Z y).
-
-Definition scalar_sub {ty} (x y: scalar ty) : result (scalar ty) := mk_scalar ty (to_Z x - to_Z y).
-
-Definition scalar_mul {ty} (x y: scalar ty) : result (scalar ty) := mk_scalar ty (to_Z x * to_Z y).
-
-Definition scalar_div {ty} (x y: scalar ty) : result (scalar ty) :=
-  if to_Z y =? 0 then Fail_ Failure else
-  mk_scalar ty (to_Z x / to_Z y).
-
-Definition scalar_rem {ty} (x y: scalar ty) : result (scalar ty) := mk_scalar ty (Z.rem (to_Z x) (to_Z y)).
-  
-Definition scalar_neg {ty} (x: scalar ty) : result (scalar ty) := mk_scalar ty (-(to_Z x)).
-
-Axiom scalar_xor : forall ty, scalar ty -> scalar ty -> scalar ty. (* TODO *)
-Axiom scalar_or : forall ty, scalar ty -> scalar ty -> scalar ty. (* TODO *)
-Axiom scalar_and : forall ty, scalar ty -> scalar ty -> scalar ty. (* TODO *)
-Axiom scalar_shl : forall ty0 ty1, scalar ty0 -> scalar ty1 -> result (scalar ty0). (* TODO *)
-Axiom scalar_shr : forall ty0 ty1, scalar ty0 -> scalar ty1 -> result (scalar ty0). (* TODO *)
-
-(** Cast an integer from a [src_ty] to a [tgt_ty] *)
-(* TODO: check the semantics of casts in Rust *)
-Definition scalar_cast (src_ty tgt_ty : scalar_ty) (x : scalar src_ty) : result (scalar tgt_ty) :=
-  mk_scalar tgt_ty (to_Z x).
-
-(* This can't fail, but for now we make all casts faillible (easier for the translation) *)
-Definition scalar_cast_bool (tgt_ty : scalar_ty) (x : bool) : result (scalar tgt_ty) :=
-  mk_scalar tgt_ty (if x then 1 else 0).
-
-(** Comparisons *)
-Definition scalar_leb {ty : scalar_ty} (x : scalar ty) (y : scalar ty) : bool :=
-  Z.leb (to_Z x) (to_Z y) .
-
-Definition scalar_ltb {ty : scalar_ty} (x : scalar ty) (y : scalar ty) : bool :=
-  Z.ltb (to_Z x) (to_Z y) .
-
-Definition scalar_geb {ty : scalar_ty} (x : scalar ty) (y : scalar ty) : bool :=
-  Z.geb (to_Z x) (to_Z y) .
-
-Definition scalar_gtb {ty : scalar_ty} (x : scalar ty) (y : scalar ty) : bool :=
-  Z.gtb (to_Z x) (to_Z y) .
-
-Definition scalar_eqb {ty : scalar_ty} (x : scalar ty) (y : scalar ty) : bool :=
-  Z.eqb (to_Z x) (to_Z y) .
-
-Definition scalar_neqb {ty : scalar_ty} (x : scalar ty) (y : scalar ty) : bool :=
-  negb (Z.eqb (to_Z x) (to_Z y)) .
-
-
-(** The scalar types *)
-Definition isize := scalar Isize.
-Definition i8    := scalar I8.
-Definition i16   := scalar I16.
-Definition i32   := scalar I32.
-Definition i64   := scalar I64.
-Definition i128  := scalar I128.
-Definition usize := scalar Usize.
-Definition u8    := scalar U8.
-Definition u16   := scalar U16.
-Definition u32   := scalar U32.
-Definition u64   := scalar U64.
-Definition u128  := scalar U128.
-
-(** Negaion *)
-Definition isize_neg := @scalar_neg Isize.
-Definition i8_neg    := @scalar_neg I8.
-Definition i16_neg   := @scalar_neg I16.
-Definition i32_neg   := @scalar_neg I32.
-Definition i64_neg   := @scalar_neg I64.
-Definition i128_neg  := @scalar_neg I128.
-
-(** Division *)
-Definition isize_div := @scalar_div Isize.
-Definition i8_div    := @scalar_div I8.
-Definition i16_div   := @scalar_div I16.
-Definition i32_div   := @scalar_div I32.
-Definition i64_div   := @scalar_div I64.
-Definition i128_div  := @scalar_div I128.
-Definition usize_div := @scalar_div Usize.
-Definition u8_div    := @scalar_div U8.
-Definition u16_div   := @scalar_div U16.
-Definition u32_div   := @scalar_div U32.
-Definition u64_div   := @scalar_div U64.
-Definition u128_div  := @scalar_div U128.
-
-(** Remainder *)
-Definition isize_rem := @scalar_rem Isize.
-Definition i8_rem    := @scalar_rem I8.
-Definition i16_rem   := @scalar_rem I16.
-Definition i32_rem   := @scalar_rem I32.
-Definition i64_rem   := @scalar_rem I64.
-Definition i128_rem  := @scalar_rem I128.
-Definition usize_rem := @scalar_rem Usize.
-Definition u8_rem    := @scalar_rem U8.
-Definition u16_rem   := @scalar_rem U16.
-Definition u32_rem   := @scalar_rem U32.
-Definition u64_rem   := @scalar_rem U64.
-Definition u128_rem  := @scalar_rem U128.
-
-(** Addition *)
-Definition isize_add := @scalar_add Isize.
-Definition i8_add    := @scalar_add I8.
-Definition i16_add   := @scalar_add I16.
-Definition i32_add   := @scalar_add I32.
-Definition i64_add   := @scalar_add I64.
-Definition i128_add  := @scalar_add I128.
-Definition usize_add := @scalar_add Usize.
-Definition u8_add    := @scalar_add U8.
-Definition u16_add   := @scalar_add U16.
-Definition u32_add   := @scalar_add U32.
-Definition u64_add   := @scalar_add U64.
-Definition u128_add  := @scalar_add U128.
-
-(** Substraction *)
-Definition isize_sub := @scalar_sub Isize.
-Definition i8_sub    := @scalar_sub I8.
-Definition i16_sub   := @scalar_sub I16.
-Definition i32_sub   := @scalar_sub I32.
-Definition i64_sub   := @scalar_sub I64.
-Definition i128_sub  := @scalar_sub I128.
-Definition usize_sub := @scalar_sub Usize.
-Definition u8_sub    := @scalar_sub U8.
-Definition u16_sub   := @scalar_sub U16.
-Definition u32_sub   := @scalar_sub U32.
-Definition u64_sub   := @scalar_sub U64.
-Definition u128_sub  := @scalar_sub U128.
-
-(** Multiplication *)
-Definition isize_mul := @scalar_mul Isize.
-Definition i8_mul    := @scalar_mul I8.
-Definition i16_mul   := @scalar_mul I16.
-Definition i32_mul   := @scalar_mul I32.
-Definition i64_mul   := @scalar_mul I64.
-Definition i128_mul  := @scalar_mul I128.
-Definition usize_mul := @scalar_mul Usize.
-Definition u8_mul    := @scalar_mul U8.
-Definition u16_mul   := @scalar_mul U16.
-Definition u32_mul   := @scalar_mul U32.
-Definition u64_mul   := @scalar_mul U64.
-Definition u128_mul  := @scalar_mul U128.
-
-(** Xor *)
-Definition u8_xor := @scalar_xor U8.
-Definition u16_xor := @scalar_xor U16.
-Definition u32_xor := @scalar_xor U32.
-Definition u64_xor := @scalar_xor U64.
-Definition u128_xor := @scalar_xor U128.
-Definition usize_xor := @scalar_xor Usize.
-Definition i8_xor := @scalar_xor I8.
-Definition i16_xor := @scalar_xor I16.
-Definition i32_xor := @scalar_xor I32.
-Definition i64_xor := @scalar_xor I64.
-Definition i128_xor := @scalar_xor I128.
-Definition isize_xor := @scalar_xor Isize.
-
-(** Or *)
-Definition u8_or := @scalar_or U8.
-Definition u16_or := @scalar_or U16.
-Definition u32_or := @scalar_or U32.
-Definition u64_or := @scalar_or U64.
-Definition u128_or := @scalar_or U128.
-Definition usize_or := @scalar_or Usize.
-Definition i8_or := @scalar_or I8.
-Definition i16_or := @scalar_or I16.
-Definition i32_or := @scalar_or I32.
-Definition i64_or := @scalar_or I64.
-Definition i128_or := @scalar_or I128.
-Definition isize_or := @scalar_or Isize.
-
-(** And *)
-Definition u8_and := @scalar_and U8.
-Definition u16_and := @scalar_and U16.
-Definition u32_and := @scalar_and U32.
-Definition u64_and := @scalar_and U64.
-Definition u128_and := @scalar_and U128.
-Definition usize_and := @scalar_and Usize.
-Definition i8_and := @scalar_and I8.
-Definition i16_and := @scalar_and I16.
-Definition i32_and := @scalar_and I32.
-Definition i64_and := @scalar_and I64.
-Definition i128_and := @scalar_and I128.
-Definition isize_and := @scalar_and Isize.
-
-(** Shift left *)
-Definition u8_shl {ty} := @scalar_shl U8 ty.
-Definition u16_shl {ty} := @scalar_shl U16 ty.
-Definition u32_shl {ty} := @scalar_shl U32 ty.
-Definition u64_shl {ty} := @scalar_shl U64 ty.
-Definition u128_shl {ty} := @scalar_shl U128 ty.
-Definition usize_shl {ty} := @scalar_shl Usize ty.
-Definition i8_shl {ty} := @scalar_shl I8 ty.
-Definition i16_shl {ty} := @scalar_shl I16 ty.
-Definition i32_shl {ty} := @scalar_shl I32 ty.
-Definition i64_shl {ty} := @scalar_shl I64 ty.
-Definition i128_shl {ty} := @scalar_shl I128 ty.
-Definition isize_shl {ty} := @scalar_shl Isize ty.
-
-(** Shift right *)
-Definition u8_shr {ty} := @scalar_shr U8 ty.
-Definition u16_shr {ty} := @scalar_shr U16 ty.
-Definition u32_shr {ty} := @scalar_shr U32 ty.
-Definition u64_shr {ty} := @scalar_shr U64 ty.
-Definition u128_shr {ty} := @scalar_shr U128 ty.
-Definition usize_shr {ty} := @scalar_shr Usize ty.
-Definition i8_shr {ty} := @scalar_shr I8 ty.
-Definition i16_shr {ty} := @scalar_shr I16 ty.
-Definition i32_shr {ty} := @scalar_shr I32 ty.
-Definition i64_shr {ty} := @scalar_shr I64 ty.
-Definition i128_shr {ty} := @scalar_shr I128 ty.
-Definition isize_shr {ty} := @scalar_shr Isize ty.
-
-(** Small utility *)
-Definition usize_to_nat (x: usize) : nat := Z.to_nat (to_Z x).
-
-(** Notations *)
-Notation "x %isize" := ((mk_scalar Isize x)%return) (at level 9).
-Notation "x %i8"    := ((mk_scalar I8    x)%return) (at level 9).
-Notation "x %i16"   := ((mk_scalar I16   x)%return) (at level 9).
-Notation "x %i32"   := ((mk_scalar I32   x)%return) (at level 9).
-Notation "x %i64"   := ((mk_scalar I64   x)%return) (at level 9).
-Notation "x %i128"  := ((mk_scalar I128  x)%return) (at level 9).
-Notation "x %usize" := ((mk_scalar Usize x)%return) (at level 9).
-Notation "x %u8"    := ((mk_scalar U8    x)%return) (at level 9).
-Notation "x %u16"   := ((mk_scalar U16   x)%return) (at level 9).
-Notation "x %u32"   := ((mk_scalar U32   x)%return) (at level 9).
-Notation "x %u64"   := ((mk_scalar U64   x)%return) (at level 9).
-Notation "x %u128"  := ((mk_scalar U128  x)%return) (at level 9).
-
-Notation "x s= y" := (scalar_eqb x y)  (at level 80) : Primitives_scope.
-Notation "x s<> y" := (scalar_neqb x y) (at level 80) : Primitives_scope.
-Notation "x s<= y" := (scalar_leb x y)  (at level 80) : Primitives_scope.
-Notation "x s< y" := (scalar_ltb x y)  (at level 80) : Primitives_scope.
-Notation "x s>= y" := (scalar_geb x y)  (at level 80) : Primitives_scope.
-Notation "x s> y" := (scalar_gtb x y)  (at level 80) : Primitives_scope.
-
-(** Constants *)
-Definition core_u8_max    := u8_max %u32.
-Definition core_u16_max   := u16_max %u32.
-Definition core_u32_max   := u32_max %u32.
-Definition core_u64_max   := u64_max %u64.
-Definition core_u128_max  := u64_max %u128.
-Axiom core_usize_max : usize. (** TODO *)
-Definition core_i8_max    := i8_max %i32.
-Definition core_i16_max   := i16_max %i32.
-Definition core_i32_max   := i32_max %i32.
-Definition core_i64_max   := i64_max %i64.
-Definition core_i128_max  := i64_max %i128.
-Axiom core_isize_max : isize. (** TODO *)
-
-(*** core *)
-
-(** Trait declaration: [core::clone::Clone] *)
-Record core_clone_Clone (self : Type) := {
-  clone : self -> result self
-}.
-
-Definition core_clone_impls_CloneBool_clone (b : bool) : bool := b.
-
-Definition core_clone_CloneBool : core_clone_Clone bool := {|
-  clone := fun b => Ok (core_clone_impls_CloneBool_clone b)
-|}.
-
-Definition core_clone_impls_CloneUsize_clone (x : usize) : usize := x.
-Definition core_clone_impls_CloneU8_clone (x : u8) : u8 := x.
-Definition core_clone_impls_CloneU16_clone (x : u16) : u16 := x.
-Definition core_clone_impls_CloneU32_clone (x : u32) : u32 := x.
-Definition core_clone_impls_CloneU64_clone (x : u64) : u64 := x.
-Definition core_clone_impls_CloneU128_clone (x : u128) : u128 := x.
-
-Definition core_clone_impls_CloneIsize_clone (x : isize) : isize := x.
-Definition core_clone_impls_CloneI8_clone (x : i8) : i8 := x.
-Definition core_clone_impls_CloneI16_clone (x : i16) : i16 := x.
-Definition core_clone_impls_CloneI32_clone (x : i32) : i32 := x.
-Definition core_clone_impls_CloneI64_clone (x : i64) : i64 := x.
-Definition core_clone_impls_CloneI128_clone (x : i128) : i128 := x.
-
-Definition core_clone_CloneUsize : core_clone_Clone usize := {|
-  clone := fun x => Ok (core_clone_impls_CloneUsize_clone x)
-|}.
-
-Definition core_clone_CloneU8 : core_clone_Clone u8 := {|
-  clone := fun x => Ok (core_clone_impls_CloneU8_clone x)
-|}.
-
-Definition core_clone_CloneU16 : core_clone_Clone u16 := {|
-  clone := fun x => Ok (core_clone_impls_CloneU16_clone x)
-|}.
-
-Definition core_clone_CloneU32 : core_clone_Clone u32 := {|
-  clone := fun x => Ok (core_clone_impls_CloneU32_clone x)
-|}.
-
-Definition core_clone_CloneU64 : core_clone_Clone u64 := {|
-  clone := fun x => Ok (core_clone_impls_CloneU64_clone x)
-|}.
-
-Definition core_clone_CloneU128 : core_clone_Clone u128 := {|
-  clone := fun x => Ok (core_clone_impls_CloneU128_clone x)
-|}.
-
-Definition core_clone_CloneIsize : core_clone_Clone isize := {|
-  clone := fun x => Ok (core_clone_impls_CloneIsize_clone x)
-|}.
-
-Definition core_clone_CloneI8 : core_clone_Clone i8 := {|
-  clone := fun x => Ok (core_clone_impls_CloneI8_clone x)
-|}.
-
-Definition core_clone_CloneI16 : core_clone_Clone i16 := {|
-  clone := fun x => Ok (core_clone_impls_CloneI16_clone x)
-|}.
-
-Definition core_clone_CloneI32 : core_clone_Clone i32 := {|
-  clone := fun x => Ok (core_clone_impls_CloneI32_clone x)
-|}.
-
-Definition core_clone_CloneI64 : core_clone_Clone i64 := {|
-  clone := fun x => Ok (core_clone_impls_CloneI64_clone x)
-|}.
-
-Definition core_clone_CloneI128 : core_clone_Clone i128 := {|
-  clone := fun x => Ok (core_clone_impls_CloneI128_clone x)
-|}.
-
-(** [core::option::{core::option::Option<T>}::unwrap] *)
-Definition core_option_Option_unwrap (T : Type) (x : option T) : result T :=
-  match x with
-  | None => Fail_ Failure
-  | Some x => Ok x
-  end.
-
-(*** core::ops *)
-
-(* Trait declaration: [core::ops::index::Index] *)
-Record core_ops_index_Index (Self Idx : Type) := mk_core_ops_index_Index {
-  core_ops_index_Index_Output : Type;
-  core_ops_index_Index_index : Self -> Idx -> result core_ops_index_Index_Output;
-}.
-Arguments mk_core_ops_index_Index {_ _}.
-Arguments core_ops_index_Index_Output {_ _}.
-Arguments core_ops_index_Index_index {_ _}.
-
-(* Trait declaration: [core::ops::index::IndexMut] *)
-Record core_ops_index_IndexMut (Self Idx : Type) := mk_core_ops_index_IndexMut {
-  core_ops_index_IndexMut_indexInst : core_ops_index_Index Self Idx;
-  core_ops_index_IndexMut_index_mut :
-    Self ->
-    Idx ->
-    result (core_ops_index_IndexMut_indexInst.(core_ops_index_Index_Output) *
-            (core_ops_index_IndexMut_indexInst.(core_ops_index_Index_Output) -> result Self));
-}.
-Arguments mk_core_ops_index_IndexMut {_ _}.
-Arguments core_ops_index_IndexMut_indexInst {_ _}.
-Arguments core_ops_index_IndexMut_index_mut {_ _}.
-
-(* Trait declaration [core::ops::deref::Deref] *)
-Record core_ops_deref_Deref (Self : Type) := mk_core_ops_deref_Deref {
-  core_ops_deref_Deref_target : Type;
-  core_ops_deref_Deref_deref : Self -> result core_ops_deref_Deref_target;
-}.
-Arguments mk_core_ops_deref_Deref {_}.
-Arguments core_ops_deref_Deref_target {_}.
-Arguments core_ops_deref_Deref_deref {_}.
-
-(* Trait declaration [core::ops::deref::DerefMut] *)
-Record core_ops_deref_DerefMut (Self : Type) := mk_core_ops_deref_DerefMut {
-  core_ops_deref_DerefMut_derefInst : core_ops_deref_Deref Self;
-  core_ops_deref_DerefMut_deref_mut :
-    Self ->
-    result (core_ops_deref_DerefMut_derefInst.(core_ops_deref_Deref_target) *
-            (core_ops_deref_DerefMut_derefInst.(core_ops_deref_Deref_target) -> result Self));
-}.
-Arguments mk_core_ops_deref_DerefMut {_}.
-Arguments core_ops_deref_DerefMut_derefInst {_}.
-Arguments core_ops_deref_DerefMut_deref_mut {_}.
-
-Record core_ops_range_Range (T : Type) := mk_core_ops_range_Range {
-  core_ops_range_Range_start : T;
-  core_ops_range_Range_end_ : T;
-}.
-Arguments mk_core_ops_range_Range {_}.
-Arguments core_ops_range_Range_start {_}.
-Arguments core_ops_range_Range_end_ {_}.
-
-(*** [alloc] *)
-
-Definition alloc_boxed_Box_deref (T : Type) (x : T) : result T := Ok x.
-Definition alloc_boxed_Box_deref_mut (T : Type) (x : T) : result (T * (T -> result T)) :=
-  Ok (x, fun x => Ok x).
-
-(* Trait instance *)
-Definition alloc_boxed_Box_coreopsDerefInst (Self : Type) : core_ops_deref_Deref Self := {|
-  core_ops_deref_Deref_target := Self;
-  core_ops_deref_Deref_deref := alloc_boxed_Box_deref Self;
-|}.
-
-(* Trait instance *)
-Definition alloc_boxed_Box_coreopsDerefMutInst (Self : Type) : core_ops_deref_DerefMut Self := {|
-  core_ops_deref_DerefMut_derefInst := alloc_boxed_Box_coreopsDerefInst Self;
-  core_ops_deref_DerefMut_deref_mut := alloc_boxed_Box_deref_mut Self;
-|}.
-
-
-(*** Arrays *)
-Definition array T (n : usize) := { l: list T | Z.of_nat (length l) = to_Z n}.
-
-Lemma le_0_usize_max : 0 <= usize_max.
-Proof.
-  pose (H := usize_max_bound).
-  unfold u32_max in H.
-  lia.
-Qed.
-
-Lemma eqb_imp_eq (x y : Z) : Z.eqb x y = true -> x = y.
-Proof.
-  lia.
-Qed.
-
-(* TODO: finish the definitions *)
-Axiom mk_array : forall (T : Type) (n : usize) (l : list T), array T n.
-
-(* For initialization *)
-Axiom array_repeat : forall (T : Type) (n : usize) (x : T), array T n.
-
-Axiom array_index_usize : forall (T : Type) (n : usize) (x : array T n) (i : usize), result T.
-Axiom array_update_usize : forall (T : Type) (n : usize) (x : array T n) (i : usize) (nx : T), result (array T n).
-
-Definition array_index_mut_usize (T : Type) (n : usize) (a : array T n) (i : usize) :
-  result (T * (T -> result (array T n))) :=
-  match array_index_usize T n a i with
-  | Fail_ e => Fail_ e
-  | Ok x => Ok (x, array_update_usize T n a i)
-  end.
-
-(*** Slice *)
-Definition slice T := { l: list T | Z.of_nat (length l) <= usize_max}.
-
-Axiom slice_len : forall (T : Type) (s : slice T), usize.
-Axiom slice_index_usize : forall (T : Type) (x : slice T) (i : usize), result T.
-Axiom slice_update_usize : forall (T : Type) (x : slice T) (i : usize) (nx : T), result (slice T).
-
-Definition slice_index_mut_usize (T : Type) (s : slice T) (i : usize) :
-  result (T * (T -> result (slice T))) :=
-  match slice_index_usize T s i with
-  | Fail_ e => Fail_ e
-  | Ok x => Ok (x, slice_update_usize T s i)
-  end.
-
-(*** Subslices *)
-
-Axiom array_to_slice : forall (T : Type) (n : usize) (x : array T n), result (slice T).
-Axiom array_from_slice : forall (T : Type) (n : usize) (x : array T n) (s : slice T), result (array T n).
-
-Definition array_to_slice_mut (T : Type) (n : usize) (a : array T n) :
-  result (slice T * (slice T -> result (array T n))) :=
-  match array_to_slice T n a with
-  | Fail_ e => Fail_ e
-  | Ok x => Ok (x, array_from_slice T n a)
-  end.
-
-Axiom array_subslice: forall (T : Type) (n : usize) (x : array T n) (r : core_ops_range_Range usize), result (slice T).
-Axiom array_update_subslice: forall (T : Type) (n : usize) (x : array T n) (r : core_ops_range_Range usize) (ns : slice T), result (array T n).
-
-Axiom slice_subslice: forall (T : Type) (x : slice T) (r : core_ops_range_Range usize), result (slice T).
-Axiom slice_update_subslice: forall (T : Type) (x : slice T) (r : core_ops_range_Range usize) (ns : slice T), result (slice T).
-
-(*** Vectors *)
-
-Definition alloc_vec_Vec T := { l: list T | Z.of_nat (length l) <= usize_max }.
-
-Definition alloc_vec_Vec_to_list {T: Type} (v: alloc_vec_Vec T) : list T := proj1_sig v.
-
-Definition alloc_vec_Vec_length {T: Type} (v: alloc_vec_Vec T) : Z := Z.of_nat (length (alloc_vec_Vec_to_list v)).
-
-Definition alloc_vec_Vec_new (T: Type) : alloc_vec_Vec T := (exist _ [] le_0_usize_max).
-
-Lemma alloc_vec_Vec_len_in_usize {T} (v: alloc_vec_Vec T) : usize_min <= alloc_vec_Vec_length v <= usize_max.
-Proof.
-  unfold alloc_vec_Vec_length, usize_min.
-  split.
-  - lia.
-  - apply (proj2_sig v).
-Qed.
-
-Definition alloc_vec_Vec_len (T: Type) (v: alloc_vec_Vec T) : usize :=
-  exist _ (alloc_vec_Vec_length v) (alloc_vec_Vec_len_in_usize v).
-
-Fixpoint list_update {A} (l: list A) (n: nat) (a: A)
-  : list A :=
-  match l with
-  | []     => []
-  | x :: t => match n with
-    | 0%nat => a :: t
-    | S m => x :: (list_update t m a)
-end end.
-
-Definition alloc_vec_Vec_bind {A B} (v: alloc_vec_Vec A) (f: list A -> result (list B)) : result (alloc_vec_Vec B) :=
-  l <- f (alloc_vec_Vec_to_list v) ;
-  match sumbool_of_bool (scalar_le_max Usize (Z.of_nat (length l))) with
-  | left H => Ok (exist _ l (scalar_le_max_valid _ _ H))
-  | right _ => Fail_ Failure
-  end.
-
-Definition alloc_vec_Vec_push (T: Type) (v: alloc_vec_Vec T) (x: T) : result (alloc_vec_Vec T) :=
-  alloc_vec_Vec_bind v (fun l => Ok (l ++ [x])).
-
-Definition alloc_vec_Vec_insert (T: Type) (v: alloc_vec_Vec T) (i: usize) (x: T) : result (alloc_vec_Vec T) :=
-  alloc_vec_Vec_bind v (fun l =>
-    if to_Z i <? Z.of_nat (length l)
-    then Ok (list_update l (usize_to_nat i) x)
-    else Fail_ Failure).
-
-(* Helper *)
-Axiom alloc_vec_Vec_index_usize : forall {T : Type} (v : alloc_vec_Vec T) (i : usize), result T.
-
-(* Helper *)
-Axiom alloc_vec_Vec_update_usize : forall {T : Type} (v : alloc_vec_Vec T) (i : usize) (x : T), result (alloc_vec_Vec T).
-
-Definition alloc_vec_Vec_index_mut_usize {T : Type} (v: alloc_vec_Vec T) (i: usize) :
-  result (T * (T -> result (alloc_vec_Vec T))) :=
-  match alloc_vec_Vec_index_usize v i with
-  | Ok x =>
-    Ok (x, alloc_vec_Vec_update_usize v i)
-  | Fail_ e => Fail_ e
-  end.
-
-(* Trait declaration: [core::slice::index::private_slice_index::Sealed] *)
-Definition core_slice_index_private_slice_index_Sealed (self : Type) := unit.
-
-(* Trait declaration: [core::slice::index::SliceIndex] *)
-Record core_slice_index_SliceIndex (Self T : Type) := mk_core_slice_index_SliceIndex {
-  core_slice_index_SliceIndex_sealedInst : core_slice_index_private_slice_index_Sealed Self;
-  core_slice_index_SliceIndex_Output : Type;
-  core_slice_index_SliceIndex_get : Self -> T -> result (option core_slice_index_SliceIndex_Output);
-  core_slice_index_SliceIndex_get_mut :
-    Self -> T -> result (option core_slice_index_SliceIndex_Output * (option core_slice_index_SliceIndex_Output -> result T));
-  core_slice_index_SliceIndex_get_unchecked : Self -> const_raw_ptr T -> result (const_raw_ptr core_slice_index_SliceIndex_Output);
-  core_slice_index_SliceIndex_get_unchecked_mut : Self -> mut_raw_ptr T -> result (mut_raw_ptr core_slice_index_SliceIndex_Output);
-  core_slice_index_SliceIndex_index : Self -> T -> result core_slice_index_SliceIndex_Output;
-  core_slice_index_SliceIndex_index_mut :
-    Self -> T -> result (core_slice_index_SliceIndex_Output * (core_slice_index_SliceIndex_Output -> result T));
-}.
-Arguments mk_core_slice_index_SliceIndex {_ _}.
-Arguments core_slice_index_SliceIndex_sealedInst {_ _}.
-Arguments core_slice_index_SliceIndex_Output {_ _}.
-Arguments core_slice_index_SliceIndex_get {_ _}.
-Arguments core_slice_index_SliceIndex_get_mut {_ _}.
-Arguments core_slice_index_SliceIndex_get_unchecked {_ _}.
-Arguments core_slice_index_SliceIndex_get_unchecked_mut {_ _}.
-Arguments core_slice_index_SliceIndex_index {_ _}.
-Arguments core_slice_index_SliceIndex_index_mut {_ _}.
-
-(* [core::slice::index::[T]::index]: forward function *)
-Definition core_slice_index_Slice_index
-  (T Idx : Type) (inst : core_slice_index_SliceIndex Idx (slice T))
-  (s : slice T) (i : Idx) : result inst.(core_slice_index_SliceIndex_Output) :=
-  x <- inst.(core_slice_index_SliceIndex_get) i s;
-  match x with
-  | None => Fail_ Failure
-  | Some x => Ok x
-  end.
-
-(* [core::slice::index::Range:::get]: forward function *)
-Axiom core_slice_index_RangeUsize_get : forall (T : Type) (i : core_ops_range_Range usize) (s : slice T), result (option (slice T)).
-
-(* [core::slice::index::Range::get_mut]: forward function *)
-Axiom core_slice_index_RangeUsize_get_mut :
-  forall (T : Type),
-    core_ops_range_Range usize -> slice T ->
-    result (option (slice T) * (option (slice T) -> result (slice T))).
-
-(* [core::slice::index::Range::get_unchecked]: forward function *)
-Definition core_slice_index_RangeUsize_get_unchecked
-  (T : Type) :
-  core_ops_range_Range usize -> const_raw_ptr (slice T) -> result (const_raw_ptr (slice T)) :=
-  (* Don't know what the model should be - for now we always fail to make
-     sure code which uses it fails *)
-  fun _ _ => Fail_ Failure.
-
-(* [core::slice::index::Range::get_unchecked_mut]: forward function *)
-Definition core_slice_index_RangeUsize_get_unchecked_mut
-  (T : Type) :
-  core_ops_range_Range usize -> mut_raw_ptr (slice T) -> result (mut_raw_ptr (slice T)) :=
-  (* Don't know what the model should be - for now we always fail to make
-    sure code which uses it fails *)
-  fun _ _ => Fail_ Failure.
-
-(* [core::slice::index::Range::index]: forward function *)
-Axiom core_slice_index_RangeUsize_index :
-  forall (T : Type), core_ops_range_Range usize -> slice T -> result (slice T).
-
-(* [core::slice::index::Range::index_mut]: forward function *)
-Axiom core_slice_index_RangeUsize_index_mut :
-  forall (T : Type), core_ops_range_Range usize -> slice T -> result (slice T * (slice T -> result (slice T))).
-
-(* [core::slice::index::[T]::index_mut]: forward function *)
-Axiom core_slice_index_Slice_index_mut :
-  forall (T Idx : Type) (inst : core_slice_index_SliceIndex Idx (slice T)),
-  slice T -> Idx ->
-  result (inst.(core_slice_index_SliceIndex_Output) *
-          (inst.(core_slice_index_SliceIndex_Output) -> result (slice T))).
-
-(* [core::array::[T; N]::index]: forward function *)
-Axiom core_array_Array_index :
-  forall (T Idx : Type) (N : usize) (inst : core_ops_index_Index (slice T) Idx)
-  (a : array T N) (i : Idx), result inst.(core_ops_index_Index_Output).
-
-(* [core::array::[T; N]::index_mut]: forward function *)
-Axiom core_array_Array_index_mut :
-  forall (T Idx : Type) (N : usize) (inst : core_ops_index_IndexMut (slice T) Idx)
-  (a : array T N) (i : Idx),
-  result (inst.(core_ops_index_IndexMut_indexInst).(core_ops_index_Index_Output) *
-          (inst.(core_ops_index_IndexMut_indexInst).(core_ops_index_Index_Output) -> result (array T N))).
-
-(* Trait implementation: [core::slice::index::private_slice_index::Range] *)
-Definition core_slice_index_private_slice_index_SealedRangeUsizeInst
-  : core_slice_index_private_slice_index_Sealed (core_ops_range_Range usize) := tt.
-
-(* Trait implementation: [core::slice::index::Range] *)
-Definition core_slice_index_SliceIndexRangeUsizeSliceTInst (T : Type) :
-  core_slice_index_SliceIndex (core_ops_range_Range usize) (slice T) := {|
-  core_slice_index_SliceIndex_sealedInst := core_slice_index_private_slice_index_SealedRangeUsizeInst;
-  core_slice_index_SliceIndex_Output := slice T;
-  core_slice_index_SliceIndex_get := core_slice_index_RangeUsize_get T;
-  core_slice_index_SliceIndex_get_mut := core_slice_index_RangeUsize_get_mut T;
-  core_slice_index_SliceIndex_get_unchecked := core_slice_index_RangeUsize_get_unchecked T;
-  core_slice_index_SliceIndex_get_unchecked_mut := core_slice_index_RangeUsize_get_unchecked_mut T;
-  core_slice_index_SliceIndex_index := core_slice_index_RangeUsize_index T;
-  core_slice_index_SliceIndex_index_mut := core_slice_index_RangeUsize_index_mut T;
-|}.
-
-(* Trait implementation: [core::slice::index::[T]] *)
-Definition core_ops_index_IndexSliceTIInst (T Idx : Type)
-  (inst : core_slice_index_SliceIndex Idx (slice T)) :
-  core_ops_index_Index (slice T) Idx := {|
-  core_ops_index_Index_Output := inst.(core_slice_index_SliceIndex_Output);
-  core_ops_index_Index_index := core_slice_index_Slice_index T Idx inst;
-|}.
-
-(* Trait implementation: [core::slice::index::[T]] *)
-Definition core_ops_index_IndexMutSliceTIInst (T Idx : Type)
-  (inst : core_slice_index_SliceIndex Idx (slice T)) :
-  core_ops_index_IndexMut (slice T) Idx := {|
-  core_ops_index_IndexMut_indexInst := core_ops_index_IndexSliceTIInst T Idx inst;
-  core_ops_index_IndexMut_index_mut := core_slice_index_Slice_index_mut T Idx inst;
-|}.
-
-(* Trait implementation: [core::array::[T; N]] *)
-Definition core_ops_index_IndexArrayInst (T Idx : Type) (N : usize)
-  (inst : core_ops_index_Index (slice T) Idx) :
-  core_ops_index_Index (array T N) Idx := {|
-  core_ops_index_Index_Output := inst.(core_ops_index_Index_Output);
-  core_ops_index_Index_index := core_array_Array_index T Idx N inst;
-|}.
-
-(* Trait implementation: [core::array::[T; N]] *)
-Definition core_ops_index_IndexMutArrayInst (T Idx : Type) (N : usize)
-  (inst : core_ops_index_IndexMut (slice T) Idx) :
-  core_ops_index_IndexMut (array T N) Idx := {|
-  core_ops_index_IndexMut_indexInst := core_ops_index_IndexArrayInst T Idx N inst.(core_ops_index_IndexMut_indexInst);
-  core_ops_index_IndexMut_index_mut := core_array_Array_index_mut T Idx N inst;
-|}.
-
-(* [core::slice::index::usize::get]: forward function *)
-Axiom core_slice_index_usize_get : forall (T : Type), usize -> slice T -> result (option T).
-
-(* [core::slice::index::usize::get_mut]: forward function *)
-Axiom core_slice_index_usize_get_mut :
-  forall (T : Type), usize -> slice T -> result (option T * (option T -> result (slice T))).
-
-(* [core::slice::index::usize::get_unchecked]: forward function *)
-Axiom core_slice_index_usize_get_unchecked :
-  forall (T : Type), usize -> const_raw_ptr (slice T) -> result (const_raw_ptr T).
-
-(* [core::slice::index::usize::get_unchecked_mut]: forward function *)
-Axiom core_slice_index_usize_get_unchecked_mut :
-  forall (T : Type), usize -> mut_raw_ptr (slice T) -> result (mut_raw_ptr T).
-
-(* [core::slice::index::usize::index]: forward function *)
-Axiom core_slice_index_usize_index : forall (T : Type), usize -> slice T -> result T.
-
-(* [core::slice::index::usize::index_mut]: forward function *)
-Axiom core_slice_index_usize_index_mut :
-  forall (T : Type), usize -> slice T -> result (T * (T -> result (slice T))).
-
-(* Trait implementation: [core::slice::index::private_slice_index::usize] *)
-Definition core_slice_index_private_slice_index_SealedUsizeInst
-  : core_slice_index_private_slice_index_Sealed usize := tt.
-
-(* Trait implementation: [core::slice::index::usize] *)
-Definition core_slice_index_SliceIndexUsizeSliceTInst (T : Type) :
-  core_slice_index_SliceIndex usize (slice T) := {|
-  core_slice_index_SliceIndex_sealedInst := core_slice_index_private_slice_index_SealedUsizeInst;
-  core_slice_index_SliceIndex_Output := T;
-  core_slice_index_SliceIndex_get := core_slice_index_usize_get T;
-  core_slice_index_SliceIndex_get_mut := core_slice_index_usize_get_mut T;
-  core_slice_index_SliceIndex_get_unchecked := core_slice_index_usize_get_unchecked T;
-  core_slice_index_SliceIndex_get_unchecked_mut := core_slice_index_usize_get_unchecked_mut T;
-  core_slice_index_SliceIndex_index := core_slice_index_usize_index T;
-  core_slice_index_SliceIndex_index_mut := core_slice_index_usize_index_mut T;
-|}.
-
-(* [alloc::vec::Vec::index]: forward function *)
-Axiom alloc_vec_Vec_index : forall (T Idx : Type) (inst : core_slice_index_SliceIndex Idx (slice T))
-  (Self : alloc_vec_Vec T) (i : Idx), result inst.(core_slice_index_SliceIndex_Output).
-
-(* [alloc::vec::Vec::index_mut]: forward function *)
-Axiom alloc_vec_Vec_index_mut : forall (T Idx : Type) (inst : core_slice_index_SliceIndex Idx (slice T))
-  (Self : alloc_vec_Vec T) (i : Idx),
-  result (inst.(core_slice_index_SliceIndex_Output) *
-          (inst.(core_slice_index_SliceIndex_Output) -> result (alloc_vec_Vec T))).
-
-(* Trait implementation: [alloc::vec::Vec] *)
-Definition alloc_vec_Vec_coreopsindexIndexInst (T Idx : Type)
-  (inst : core_slice_index_SliceIndex Idx (slice T)) :
-  core_ops_index_Index (alloc_vec_Vec T) Idx := {|
-  core_ops_index_Index_Output := inst.(core_slice_index_SliceIndex_Output);
-  core_ops_index_Index_index := alloc_vec_Vec_index T Idx inst;
-|}.
-
-(* Trait implementation: [alloc::vec::Vec] *)
-Definition alloc_vec_Vec_coreopsindexIndexMutInst (T Idx : Type)
-  (inst : core_slice_index_SliceIndex Idx (slice T)) :
-  core_ops_index_IndexMut (alloc_vec_Vec T) Idx := {|
-  core_ops_index_IndexMut_indexInst := alloc_vec_Vec_coreopsindexIndexInst T Idx inst;
-  core_ops_index_IndexMut_index_mut := alloc_vec_Vec_index_mut T Idx inst;
-|}.
-
-(*** Theorems *)
-
-Axiom alloc_vec_Vec_index_eq : forall {a : Type} (v : alloc_vec_Vec a) (i : usize) (x : a),
-  alloc_vec_Vec_index a usize (core_slice_index_SliceIndexUsizeSliceTInst a) v i =
-    alloc_vec_Vec_index_usize v i.
-
-Axiom alloc_vec_Vec_index_mut_eq : forall {a : Type} (v : alloc_vec_Vec a) (i : usize) (x : a),
-  alloc_vec_Vec_index_mut a usize (core_slice_index_SliceIndexUsizeSliceTInst a) v i =
-    alloc_vec_Vec_index_mut_usize v i.
-
-End Primitives.
diff --git a/tests/coq/hashmap_on_disk/_CoqProject b/tests/coq/hashmap_on_disk/_CoqProject
deleted file mode 100644
index d73541d9..00000000
--- a/tests/coq/hashmap_on_disk/_CoqProject
+++ /dev/null
@@ -1,12 +0,0 @@
-# This file was automatically generated - see ../Makefile
--R . Lib
--arg -w
--arg all
-
-HashmapMain_Types.v
-HashmapMain_FunsExternal_Template.v
-Primitives.v
-HashmapMain_Funs.v
-HashmapMain_TypesExternal.v
-HashmapMain_FunsExternal.v
-HashmapMain_TypesExternal_Template.v
diff --git a/tests/fstar/hashmap_main/HashmapMain.Clauses.Template.fst b/tests/fstar/hashmap_main/HashmapMain.Clauses.Template.fst
new file mode 100644
index 00000000..cdd73210
--- /dev/null
+++ b/tests/fstar/hashmap_main/HashmapMain.Clauses.Template.fst
@@ -0,0 +1,72 @@
+(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
+(** [hashmap_main]: templates for the decreases clauses *)
+module HashmapMain.Clauses.Template
+open Primitives
+open HashmapMain.Types
+
+#set-options "--z3rlimit 50 --fuel 1 --ifuel 1"
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::allocate_slots]: decreases clause
+    Source: 'tests/src/hashmap.rs', lines 58:4-64:5 *)
+unfold
+let hashmap_HashMap_allocate_slots_loop_decreases (t : Type0)
+  (slots : alloc_vec_Vec (hashmap_List_t t)) (n : usize) : nat =
+  admit ()
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::clear]: decreases clause
+    Source: 'tests/src/hashmap.rs', lines 88:4-96:5 *)
+unfold
+let hashmap_HashMap_clear_loop_decreases (t : Type0)
+  (slots : alloc_vec_Vec (hashmap_List_t t)) (i : usize) : nat =
+  admit ()
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::insert_in_list]: decreases clause
+    Source: 'tests/src/hashmap.rs', lines 105:4-122:5 *)
+unfold
+let hashmap_HashMap_insert_in_list_loop_decreases (t : Type0) (key : usize)
+  (value : t) (ls : hashmap_List_t t) : nat =
+  admit ()
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::move_elements_from_list]: decreases clause
+    Source: 'tests/src/hashmap.rs', lines 191:4-204:5 *)
+unfold
+let hashmap_HashMap_move_elements_from_list_loop_decreases (t : Type0)
+  (ntable : hashmap_HashMap_t t) (ls : hashmap_List_t t) : nat =
+  admit ()
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::move_elements]: decreases clause
+    Source: 'tests/src/hashmap.rs', lines 179:4-188:5 *)
+unfold
+let hashmap_HashMap_move_elements_loop_decreases (t : Type0)
+  (ntable : hashmap_HashMap_t t) (slots : alloc_vec_Vec (hashmap_List_t t))
+  (i : usize) : nat =
+  admit ()
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::contains_key_in_list]: decreases clause
+    Source: 'tests/src/hashmap.rs', lines 214:4-227:5 *)
+unfold
+let hashmap_HashMap_contains_key_in_list_loop_decreases (t : Type0)
+  (key : usize) (ls : hashmap_List_t t) : nat =
+  admit ()
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get_in_list]: decreases clause
+    Source: 'tests/src/hashmap.rs', lines 232:4-245:5 *)
+unfold
+let hashmap_HashMap_get_in_list_loop_decreases (t : Type0) (key : usize)
+  (ls : hashmap_List_t t) : nat =
+  admit ()
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get_mut_in_list]: decreases clause
+    Source: 'tests/src/hashmap.rs', lines 253:4-262:5 *)
+unfold
+let hashmap_HashMap_get_mut_in_list_loop_decreases (t : Type0)
+  (ls : hashmap_List_t t) (key : usize) : nat =
+  admit ()
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::remove_from_list]: decreases clause
+    Source: 'tests/src/hashmap.rs', lines 273:4-299:5 *)
+unfold
+let hashmap_HashMap_remove_from_list_loop_decreases (t : Type0) (key : usize)
+  (ls : hashmap_List_t t) : nat =
+  admit ()
+
diff --git a/tests/fstar/hashmap_main/HashmapMain.Clauses.fst b/tests/fstar/hashmap_main/HashmapMain.Clauses.fst
new file mode 100644
index 00000000..be5a4ab1
--- /dev/null
+++ b/tests/fstar/hashmap_main/HashmapMain.Clauses.fst
@@ -0,0 +1,61 @@
+(** [hashmap]: the decreases clauses *)
+module HashmapMain.Clauses
+open Primitives
+open FStar.List.Tot
+open HashmapMain.Types
+
+#set-options "--z3rlimit 50 --fuel 0 --ifuel 1"
+
+(** [hashmap::HashMap::allocate_slots]: decreases clause *)
+unfold
+let hashmap_HashMap_allocate_slots_loop_decreases (t : Type0) (slots : alloc_vec_Vec (hashmap_List_t t))
+  (n : usize) : nat = n
+
+(** [hashmap::HashMap::clear]: decreases clause *)
+unfold
+let hashmap_HashMap_clear_loop_decreases (t : Type0) (slots : alloc_vec_Vec (hashmap_List_t t))
+  (i : usize) : nat =
+  if i < length slots then length slots - i else 0
+
+(** [hashmap::HashMap::insert_in_list]: decreases clause *)
+unfold
+let hashmap_HashMap_insert_in_list_loop_decreases (t : Type0) (key : usize) (value : t)
+  (ls : hashmap_List_t t) : hashmap_List_t t =
+  ls
+
+(** [hashmap::HashMap::move_elements_from_list]: decreases clause *)
+unfold
+let hashmap_HashMap_move_elements_from_list_loop_decreases (t : Type0)
+  (ntable : hashmap_HashMap_t t) (ls : hashmap_List_t t) : hashmap_List_t t =
+  ls
+
+(** [hashmap::HashMap::move_elements]: decreases clause *)
+unfold
+let hashmap_HashMap_move_elements_loop_decreases (t : Type0) (ntable : hashmap_HashMap_t t)
+  (slots : alloc_vec_Vec (hashmap_List_t t)) (i : usize) : nat =
+  if i < length slots then length slots - i else 0
+
+(** [hashmap::HashMap::contains_key_in_list]: decreases clause *)
+unfold
+let hashmap_HashMap_contains_key_in_list_loop_decreases (t : Type0) (key : usize)
+  (ls : hashmap_List_t t) : hashmap_List_t t =
+  ls
+
+(** [hashmap::HashMap::get_in_list]: decreases clause *)
+unfold
+let hashmap_HashMap_get_in_list_loop_decreases (t : Type0) (key : usize) (ls : hashmap_List_t t) :
+  hashmap_List_t t =
+  ls
+
+(** [hashmap::HashMap::get_mut_in_list]: decreases clause *)
+unfold
+let hashmap_HashMap_get_mut_in_list_loop_decreases (t : Type0)
+  (ls : hashmap_List_t t) (key : usize) : hashmap_List_t t =
+  ls
+
+(** [hashmap::HashMap::remove_from_list]: decreases clause *)
+unfold
+let hashmap_HashMap_remove_from_list_loop_decreases (t : Type0) (key : usize)
+  (ls : hashmap_List_t t) : hashmap_List_t t =
+  ls
+
diff --git a/tests/fstar/hashmap_main/HashmapMain.Funs.fst b/tests/fstar/hashmap_main/HashmapMain.Funs.fst
new file mode 100644
index 00000000..c88a746e
--- /dev/null
+++ b/tests/fstar/hashmap_main/HashmapMain.Funs.fst
@@ -0,0 +1,446 @@
+(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
+(** [hashmap_main]: function definitions *)
+module HashmapMain.Funs
+open Primitives
+include HashmapMain.Types
+include HashmapMain.FunsExternal
+include HashmapMain.Clauses
+
+#set-options "--z3rlimit 50 --fuel 1 --ifuel 1"
+
+(** [hashmap_main::hashmap::hash_key]:
+    Source: 'tests/src/hashmap.rs', lines 35:0-35:32 *)
+let hashmap_hash_key (k : usize) : result usize =
+  Ok k
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::allocate_slots]: loop 0:
+    Source: 'tests/src/hashmap.rs', lines 58:4-64:5 *)
+let rec hashmap_HashMap_allocate_slots_loop
+  (t : Type0) (slots : alloc_vec_Vec (hashmap_List_t t)) (n : usize) :
+  Tot (result (alloc_vec_Vec (hashmap_List_t t)))
+  (decreases (hashmap_HashMap_allocate_slots_loop_decreases t slots n))
+  =
+  if n > 0
+  then
+    let* slots1 = alloc_vec_Vec_push (hashmap_List_t t) slots Hashmap_List_Nil
+      in
+    let* n1 = usize_sub n 1 in
+    hashmap_HashMap_allocate_slots_loop t slots1 n1
+  else Ok slots
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::allocate_slots]:
+    Source: 'tests/src/hashmap.rs', lines 58:4-58:76 *)
+let hashmap_HashMap_allocate_slots
+  (t : Type0) (slots : alloc_vec_Vec (hashmap_List_t t)) (n : usize) :
+  result (alloc_vec_Vec (hashmap_List_t t))
+  =
+  hashmap_HashMap_allocate_slots_loop t slots n
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::new_with_capacity]:
+    Source: 'tests/src/hashmap.rs', lines 67:4-71:13 *)
+let hashmap_HashMap_new_with_capacity
+  (t : Type0) (capacity : usize) (max_load_dividend : usize)
+  (max_load_divisor : usize) :
+  result (hashmap_HashMap_t t)
+  =
+  let* slots =
+    hashmap_HashMap_allocate_slots t (alloc_vec_Vec_new (hashmap_List_t t))
+      capacity in
+  let* i = usize_mul capacity max_load_dividend in
+  let* i1 = usize_div i max_load_divisor in
+  Ok
+    {
+      num_entries = 0;
+      max_load_factor = (max_load_dividend, max_load_divisor);
+      max_load = i1;
+      slots = slots
+    }
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::new]:
+    Source: 'tests/src/hashmap.rs', lines 83:4-83:24 *)
+let hashmap_HashMap_new (t : Type0) : result (hashmap_HashMap_t t) =
+  hashmap_HashMap_new_with_capacity t 32 4 5
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::clear]: loop 0:
+    Source: 'tests/src/hashmap.rs', lines 88:4-96:5 *)
+let rec hashmap_HashMap_clear_loop
+  (t : Type0) (slots : alloc_vec_Vec (hashmap_List_t t)) (i : usize) :
+  Tot (result (alloc_vec_Vec (hashmap_List_t t)))
+  (decreases (hashmap_HashMap_clear_loop_decreases t slots i))
+  =
+  let i1 = alloc_vec_Vec_len (hashmap_List_t t) slots in
+  if i < i1
+  then
+    let* (_, index_mut_back) =
+      alloc_vec_Vec_index_mut (hashmap_List_t t) usize
+        (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t t)) slots i
+      in
+    let* i2 = usize_add i 1 in
+    let* slots1 = index_mut_back Hashmap_List_Nil in
+    hashmap_HashMap_clear_loop t slots1 i2
+  else Ok slots
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::clear]:
+    Source: 'tests/src/hashmap.rs', lines 88:4-88:27 *)
+let hashmap_HashMap_clear
+  (t : Type0) (self : hashmap_HashMap_t t) : result (hashmap_HashMap_t t) =
+  let* hm = hashmap_HashMap_clear_loop t self.slots 0 in
+  Ok { self with num_entries = 0; slots = hm }
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::len]:
+    Source: 'tests/src/hashmap.rs', lines 98:4-98:30 *)
+let hashmap_HashMap_len
+  (t : Type0) (self : hashmap_HashMap_t t) : result usize =
+  Ok self.num_entries
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::insert_in_list]: loop 0:
+    Source: 'tests/src/hashmap.rs', lines 105:4-122:5 *)
+let rec hashmap_HashMap_insert_in_list_loop
+  (t : Type0) (key : usize) (value : t) (ls : hashmap_List_t t) :
+  Tot (result (bool & (hashmap_List_t t)))
+  (decreases (hashmap_HashMap_insert_in_list_loop_decreases t key value ls))
+  =
+  begin match ls with
+  | Hashmap_List_Cons ckey cvalue tl ->
+    if ckey = key
+    then Ok (false, Hashmap_List_Cons ckey value tl)
+    else
+      let* (b, tl1) = hashmap_HashMap_insert_in_list_loop t key value tl in
+      Ok (b, Hashmap_List_Cons ckey cvalue tl1)
+  | Hashmap_List_Nil -> Ok (true, Hashmap_List_Cons key value Hashmap_List_Nil)
+  end
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::insert_in_list]:
+    Source: 'tests/src/hashmap.rs', lines 105:4-105:71 *)
+let hashmap_HashMap_insert_in_list
+  (t : Type0) (key : usize) (value : t) (ls : hashmap_List_t t) :
+  result (bool & (hashmap_List_t t))
+  =
+  hashmap_HashMap_insert_in_list_loop t key value ls
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::insert_no_resize]:
+    Source: 'tests/src/hashmap.rs', lines 125:4-125:54 *)
+let hashmap_HashMap_insert_no_resize
+  (t : Type0) (self : hashmap_HashMap_t t) (key : usize) (value : t) :
+  result (hashmap_HashMap_t t)
+  =
+  let* hash = hashmap_hash_key key in
+  let i = alloc_vec_Vec_len (hashmap_List_t t) self.slots in
+  let* hash_mod = usize_rem hash i in
+  let* (l, index_mut_back) =
+    alloc_vec_Vec_index_mut (hashmap_List_t t) usize
+      (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t t))
+      self.slots hash_mod in
+  let* (inserted, l1) = hashmap_HashMap_insert_in_list t key value l in
+  if inserted
+  then
+    let* i1 = usize_add self.num_entries 1 in
+    let* v = index_mut_back l1 in
+    Ok { self with num_entries = i1; slots = v }
+  else let* v = index_mut_back l1 in Ok { self with slots = v }
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::move_elements_from_list]: loop 0:
+    Source: 'tests/src/hashmap.rs', lines 191:4-204:5 *)
+let rec hashmap_HashMap_move_elements_from_list_loop
+  (t : Type0) (ntable : hashmap_HashMap_t t) (ls : hashmap_List_t t) :
+  Tot (result (hashmap_HashMap_t t))
+  (decreases (
+    hashmap_HashMap_move_elements_from_list_loop_decreases t ntable ls))
+  =
+  begin match ls with
+  | Hashmap_List_Cons k v tl ->
+    let* ntable1 = hashmap_HashMap_insert_no_resize t ntable k v in
+    hashmap_HashMap_move_elements_from_list_loop t ntable1 tl
+  | Hashmap_List_Nil -> Ok ntable
+  end
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::move_elements_from_list]:
+    Source: 'tests/src/hashmap.rs', lines 191:4-191:72 *)
+let hashmap_HashMap_move_elements_from_list
+  (t : Type0) (ntable : hashmap_HashMap_t t) (ls : hashmap_List_t t) :
+  result (hashmap_HashMap_t t)
+  =
+  hashmap_HashMap_move_elements_from_list_loop t ntable ls
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::move_elements]: loop 0:
+    Source: 'tests/src/hashmap.rs', lines 179:4-188:5 *)
+let rec hashmap_HashMap_move_elements_loop
+  (t : Type0) (ntable : hashmap_HashMap_t t)
+  (slots : alloc_vec_Vec (hashmap_List_t t)) (i : usize) :
+  Tot (result ((hashmap_HashMap_t t) & (alloc_vec_Vec (hashmap_List_t t))))
+  (decreases (hashmap_HashMap_move_elements_loop_decreases t ntable slots i))
+  =
+  let i1 = alloc_vec_Vec_len (hashmap_List_t t) slots in
+  if i < i1
+  then
+    let* (l, index_mut_back) =
+      alloc_vec_Vec_index_mut (hashmap_List_t t) usize
+        (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t t)) slots i
+      in
+    let (ls, l1) = core_mem_replace (hashmap_List_t t) l Hashmap_List_Nil in
+    let* ntable1 = hashmap_HashMap_move_elements_from_list t ntable ls in
+    let* i2 = usize_add i 1 in
+    let* slots1 = index_mut_back l1 in
+    hashmap_HashMap_move_elements_loop t ntable1 slots1 i2
+  else Ok (ntable, slots)
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::move_elements]:
+    Source: 'tests/src/hashmap.rs', lines 179:4-179:95 *)
+let hashmap_HashMap_move_elements
+  (t : Type0) (ntable : hashmap_HashMap_t t)
+  (slots : alloc_vec_Vec (hashmap_List_t t)) (i : usize) :
+  result ((hashmap_HashMap_t t) & (alloc_vec_Vec (hashmap_List_t t)))
+  =
+  hashmap_HashMap_move_elements_loop t ntable slots i
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::try_resize]:
+    Source: 'tests/src/hashmap.rs', lines 148:4-148:28 *)
+let hashmap_HashMap_try_resize
+  (t : Type0) (self : hashmap_HashMap_t t) : result (hashmap_HashMap_t t) =
+  let* max_usize = scalar_cast U32 Usize core_u32_max in
+  let capacity = alloc_vec_Vec_len (hashmap_List_t t) self.slots in
+  let* n1 = usize_div max_usize 2 in
+  let (i, i1) = self.max_load_factor in
+  let* i2 = usize_div n1 i in
+  if capacity <= i2
+  then
+    let* i3 = usize_mul capacity 2 in
+    let* ntable = hashmap_HashMap_new_with_capacity t i3 i i1 in
+    let* p = hashmap_HashMap_move_elements t ntable self.slots 0 in
+    let (ntable1, _) = p in
+    Ok
+      { ntable1 with num_entries = self.num_entries; max_load_factor = (i, i1)
+      }
+  else Ok { self with max_load_factor = (i, i1) }
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::insert]:
+    Source: 'tests/src/hashmap.rs', lines 137:4-137:48 *)
+let hashmap_HashMap_insert
+  (t : Type0) (self : hashmap_HashMap_t t) (key : usize) (value : t) :
+  result (hashmap_HashMap_t t)
+  =
+  let* self1 = hashmap_HashMap_insert_no_resize t self key value in
+  let* i = hashmap_HashMap_len t self1 in
+  if i > self1.max_load then hashmap_HashMap_try_resize t self1 else Ok self1
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::contains_key_in_list]: loop 0:
+    Source: 'tests/src/hashmap.rs', lines 214:4-227:5 *)
+let rec hashmap_HashMap_contains_key_in_list_loop
+  (t : Type0) (key : usize) (ls : hashmap_List_t t) :
+  Tot (result bool)
+  (decreases (hashmap_HashMap_contains_key_in_list_loop_decreases t key ls))
+  =
+  begin match ls with
+  | Hashmap_List_Cons ckey _ tl ->
+    if ckey = key
+    then Ok true
+    else hashmap_HashMap_contains_key_in_list_loop t key tl
+  | Hashmap_List_Nil -> Ok false
+  end
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::contains_key_in_list]:
+    Source: 'tests/src/hashmap.rs', lines 214:4-214:68 *)
+let hashmap_HashMap_contains_key_in_list
+  (t : Type0) (key : usize) (ls : hashmap_List_t t) : result bool =
+  hashmap_HashMap_contains_key_in_list_loop t key ls
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::contains_key]:
+    Source: 'tests/src/hashmap.rs', lines 207:4-207:49 *)
+let hashmap_HashMap_contains_key
+  (t : Type0) (self : hashmap_HashMap_t t) (key : usize) : result bool =
+  let* hash = hashmap_hash_key key in
+  let i = alloc_vec_Vec_len (hashmap_List_t t) self.slots in
+  let* hash_mod = usize_rem hash i in
+  let* l =
+    alloc_vec_Vec_index (hashmap_List_t t) usize
+      (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t t))
+      self.slots hash_mod in
+  hashmap_HashMap_contains_key_in_list t key l
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get_in_list]: loop 0:
+    Source: 'tests/src/hashmap.rs', lines 232:4-245:5 *)
+let rec hashmap_HashMap_get_in_list_loop
+  (t : Type0) (key : usize) (ls : hashmap_List_t t) :
+  Tot (result t)
+  (decreases (hashmap_HashMap_get_in_list_loop_decreases t key ls))
+  =
+  begin match ls with
+  | Hashmap_List_Cons ckey cvalue tl ->
+    if ckey = key then Ok cvalue else hashmap_HashMap_get_in_list_loop t key tl
+  | Hashmap_List_Nil -> Fail Failure
+  end
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get_in_list]:
+    Source: 'tests/src/hashmap.rs', lines 232:4-232:70 *)
+let hashmap_HashMap_get_in_list
+  (t : Type0) (key : usize) (ls : hashmap_List_t t) : result t =
+  hashmap_HashMap_get_in_list_loop t key ls
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get]:
+    Source: 'tests/src/hashmap.rs', lines 247:4-247:55 *)
+let hashmap_HashMap_get
+  (t : Type0) (self : hashmap_HashMap_t t) (key : usize) : result t =
+  let* hash = hashmap_hash_key key in
+  let i = alloc_vec_Vec_len (hashmap_List_t t) self.slots in
+  let* hash_mod = usize_rem hash i in
+  let* l =
+    alloc_vec_Vec_index (hashmap_List_t t) usize
+      (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t t))
+      self.slots hash_mod in
+  hashmap_HashMap_get_in_list t key l
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get_mut_in_list]: loop 0:
+    Source: 'tests/src/hashmap.rs', lines 253:4-262:5 *)
+let rec hashmap_HashMap_get_mut_in_list_loop
+  (t : Type0) (ls : hashmap_List_t t) (key : usize) :
+  Tot (result (t & (t -> result (hashmap_List_t t))))
+  (decreases (hashmap_HashMap_get_mut_in_list_loop_decreases t ls key))
+  =
+  begin match ls with
+  | Hashmap_List_Cons ckey cvalue tl ->
+    if ckey = key
+    then
+      let back = fun ret -> Ok (Hashmap_List_Cons ckey ret tl) in
+      Ok (cvalue, back)
+    else
+      let* (x, back) = hashmap_HashMap_get_mut_in_list_loop t tl key in
+      let back1 =
+        fun ret ->
+          let* tl1 = back ret in Ok (Hashmap_List_Cons ckey cvalue tl1) in
+      Ok (x, back1)
+  | Hashmap_List_Nil -> Fail Failure
+  end
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get_mut_in_list]:
+    Source: 'tests/src/hashmap.rs', lines 253:4-253:86 *)
+let hashmap_HashMap_get_mut_in_list
+  (t : Type0) (ls : hashmap_List_t t) (key : usize) :
+  result (t & (t -> result (hashmap_List_t t)))
+  =
+  hashmap_HashMap_get_mut_in_list_loop t ls key
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get_mut]:
+    Source: 'tests/src/hashmap.rs', lines 265:4-265:67 *)
+let hashmap_HashMap_get_mut
+  (t : Type0) (self : hashmap_HashMap_t t) (key : usize) :
+  result (t & (t -> result (hashmap_HashMap_t t)))
+  =
+  let* hash = hashmap_hash_key key in
+  let i = alloc_vec_Vec_len (hashmap_List_t t) self.slots in
+  let* hash_mod = usize_rem hash i in
+  let* (l, index_mut_back) =
+    alloc_vec_Vec_index_mut (hashmap_List_t t) usize
+      (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t t))
+      self.slots hash_mod in
+  let* (x, get_mut_in_list_back) = hashmap_HashMap_get_mut_in_list t l key in
+  let back =
+    fun ret ->
+      let* l1 = get_mut_in_list_back ret in
+      let* v = index_mut_back l1 in
+      Ok { self with slots = v } in
+  Ok (x, back)
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::remove_from_list]: loop 0:
+    Source: 'tests/src/hashmap.rs', lines 273:4-299:5 *)
+let rec hashmap_HashMap_remove_from_list_loop
+  (t : Type0) (key : usize) (ls : hashmap_List_t t) :
+  Tot (result ((option t) & (hashmap_List_t t)))
+  (decreases (hashmap_HashMap_remove_from_list_loop_decreases t key ls))
+  =
+  begin match ls with
+  | Hashmap_List_Cons ckey x tl ->
+    if ckey = key
+    then
+      let (mv_ls, _) =
+        core_mem_replace (hashmap_List_t t) (Hashmap_List_Cons ckey x tl)
+          Hashmap_List_Nil in
+      begin match mv_ls with
+      | Hashmap_List_Cons _ cvalue tl1 -> Ok (Some cvalue, tl1)
+      | Hashmap_List_Nil -> Fail Failure
+      end
+    else
+      let* (o, tl1) = hashmap_HashMap_remove_from_list_loop t key tl in
+      Ok (o, Hashmap_List_Cons ckey x tl1)
+  | Hashmap_List_Nil -> Ok (None, Hashmap_List_Nil)
+  end
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::remove_from_list]:
+    Source: 'tests/src/hashmap.rs', lines 273:4-273:69 *)
+let hashmap_HashMap_remove_from_list
+  (t : Type0) (key : usize) (ls : hashmap_List_t t) :
+  result ((option t) & (hashmap_List_t t))
+  =
+  hashmap_HashMap_remove_from_list_loop t key ls
+
+(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::remove]:
+    Source: 'tests/src/hashmap.rs', lines 302:4-302:52 *)
+let hashmap_HashMap_remove
+  (t : Type0) (self : hashmap_HashMap_t t) (key : usize) :
+  result ((option t) & (hashmap_HashMap_t t))
+  =
+  let* hash = hashmap_hash_key key in
+  let i = alloc_vec_Vec_len (hashmap_List_t t) self.slots in
+  let* hash_mod = usize_rem hash i in
+  let* (l, index_mut_back) =
+    alloc_vec_Vec_index_mut (hashmap_List_t t) usize
+      (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t t))
+      self.slots hash_mod in
+  let* (x, l1) = hashmap_HashMap_remove_from_list t key l in
+  begin match x with
+  | None -> let* v = index_mut_back l1 in Ok (None, { self with slots = v })
+  | Some x1 ->
+    let* i1 = usize_sub self.num_entries 1 in
+    let* v = index_mut_back l1 in
+    Ok (Some x1, { self with num_entries = i1; slots = v })
+  end
+
+(** [hashmap_main::hashmap::test1]:
+    Source: 'tests/src/hashmap.rs', lines 323:0-323:10 *)
+let hashmap_test1 : result unit =
+  let* hm = hashmap_HashMap_new u64 in
+  let* hm1 = hashmap_HashMap_insert u64 hm 0 42 in
+  let* hm2 = hashmap_HashMap_insert u64 hm1 128 18 in
+  let* hm3 = hashmap_HashMap_insert u64 hm2 1024 138 in
+  let* hm4 = hashmap_HashMap_insert u64 hm3 1056 256 in
+  let* i = hashmap_HashMap_get u64 hm4 128 in
+  if not (i = 18)
+  then Fail Failure
+  else
+    let* (_, get_mut_back) = hashmap_HashMap_get_mut u64 hm4 1024 in
+    let* hm5 = get_mut_back 56 in
+    let* i1 = hashmap_HashMap_get u64 hm5 1024 in
+    if not (i1 = 56)
+    then Fail Failure
+    else
+      let* (x, hm6) = hashmap_HashMap_remove u64 hm5 1024 in
+      begin match x with
+      | None -> Fail Failure
+      | Some x1 ->
+        if not (x1 = 56)
+        then Fail Failure
+        else
+          let* i2 = hashmap_HashMap_get u64 hm6 0 in
+          if not (i2 = 42)
+          then Fail Failure
+          else
+            let* i3 = hashmap_HashMap_get u64 hm6 128 in
+            if not (i3 = 18)
+            then Fail Failure
+            else
+              let* i4 = hashmap_HashMap_get u64 hm6 1056 in
+              if not (i4 = 256) then Fail Failure else Ok ()
+      end
+
+(** [hashmap_main::insert_on_disk]:
+    Source: 'tests/src/hashmap_main.rs', lines 13:0-13:43 *)
+let insert_on_disk
+  (key : usize) (value : u64) (st : state) : result (state & unit) =
+  let* (st1, hm) = hashmap_utils_deserialize st in
+  let* hm1 = hashmap_HashMap_insert u64 hm key value in
+  hashmap_utils_serialize hm1 st1
+
+(** [hashmap_main::main]:
+    Source: 'tests/src/hashmap_main.rs', lines 22:0-22:13 *)
+let main : result unit =
+  Ok ()
+
diff --git a/tests/fstar/hashmap_main/HashmapMain.FunsExternal.fsti b/tests/fstar/hashmap_main/HashmapMain.FunsExternal.fsti
new file mode 100644
index 00000000..cc20d988
--- /dev/null
+++ b/tests/fstar/hashmap_main/HashmapMain.FunsExternal.fsti
@@ -0,0 +1,18 @@
+(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
+(** [hashmap_main]: external function declarations *)
+module HashmapMain.FunsExternal
+open Primitives
+include HashmapMain.Types
+
+#set-options "--z3rlimit 50 --fuel 1 --ifuel 1"
+
+(** [hashmap_main::hashmap_utils::deserialize]:
+    Source: 'tests/src/hashmap_utils.rs', lines 11:0-11:43 *)
+val hashmap_utils_deserialize
+  : state -> result (state & (hashmap_HashMap_t u64))
+
+(** [hashmap_main::hashmap_utils::serialize]:
+    Source: 'tests/src/hashmap_utils.rs', lines 6:0-6:42 *)
+val hashmap_utils_serialize
+  : hashmap_HashMap_t u64 -> state -> result (state & unit)
+
diff --git a/tests/fstar/hashmap_main/HashmapMain.Properties.fst b/tests/fstar/hashmap_main/HashmapMain.Properties.fst
new file mode 100644
index 00000000..beb3dc2c
--- /dev/null
+++ b/tests/fstar/hashmap_main/HashmapMain.Properties.fst
@@ -0,0 +1,48 @@
+(** Properties about the hashmap written on disk *)
+module HashmapMain.Properties
+open Primitives
+open HashmapMain.Funs
+
+#set-options "--z3rlimit 50 --fuel 0 --ifuel 1"
+
+/// Below, we focus on the functions to read from disk/write to disk to showcase
+/// how such reasoning which mixes opaque functions together with a state-error
+/// monad can be performed.
+
+(*** Hypotheses *)
+
+/// [state_v] gives us the hash map currently stored on disk
+assume
+val state_v : state -> hashmap_HashMap_t u64
+
+/// [serialize] updates the hash map stored on disk
+assume
+val serialize_lem (hm : hashmap_HashMap_t u64) (st : state) : Lemma (
+  match hashmap_utils_serialize hm st with
+  | Fail _ -> True
+  | Ok (st', ()) -> state_v st' == hm)
+  [SMTPat (hashmap_utils_serialize hm st)]
+
+/// [deserialize] gives us the hash map stored on disk, without updating it
+assume
+val deserialize_lem (st : state) : Lemma (
+  match hashmap_utils_deserialize st with
+  | Fail _ -> True
+  | Ok (st', hm) -> hm == state_v st /\ st' == st)
+  [SMTPat (hashmap_utils_deserialize st)]
+
+(*** Lemmas *)
+
+/// The obvious lemma about [insert_on_disk]: the updated hash map stored on disk
+/// is exactly the hash map produced from inserting the binding ([key], [value])
+/// in the hash map previously stored on disk.
+val insert_on_disk_lem (key : usize) (value : u64) (st : state) : Lemma (
+  match insert_on_disk key value st with
+  | Fail _ -> True
+  | Ok (st', ()) ->
+    let hm = state_v st in
+    match hashmap_HashMap_insert u64 hm key value with
+    | Fail _ -> False
+    | Ok hm' -> hm' == state_v st')
+
+let insert_on_disk_lem key value st = ()
diff --git a/tests/fstar/hashmap_main/HashmapMain.Types.fst b/tests/fstar/hashmap_main/HashmapMain.Types.fst
new file mode 100644
index 00000000..85bcaeea
--- /dev/null
+++ b/tests/fstar/hashmap_main/HashmapMain.Types.fst
@@ -0,0 +1,24 @@
+(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
+(** [hashmap_main]: type definitions *)
+module HashmapMain.Types
+open Primitives
+include HashmapMain.TypesExternal
+
+#set-options "--z3rlimit 50 --fuel 1 --ifuel 1"
+
+(** [hashmap_main::hashmap::List]
+    Source: 'tests/src/hashmap.rs', lines 27:0-27:16 *)
+type hashmap_List_t (t : Type0) =
+| Hashmap_List_Cons : usize -> t -> hashmap_List_t t -> hashmap_List_t t
+| Hashmap_List_Nil : hashmap_List_t t
+
+(** [hashmap_main::hashmap::HashMap]
+    Source: 'tests/src/hashmap.rs', lines 43:0-43:21 *)
+type hashmap_HashMap_t (t : Type0) =
+{
+  num_entries : usize;
+  max_load_factor : (usize & usize);
+  max_load : usize;
+  slots : alloc_vec_Vec (hashmap_List_t t);
+}
+
diff --git a/tests/fstar/hashmap_main/HashmapMain.TypesExternal.fsti b/tests/fstar/hashmap_main/HashmapMain.TypesExternal.fsti
new file mode 100644
index 00000000..75747408
--- /dev/null
+++ b/tests/fstar/hashmap_main/HashmapMain.TypesExternal.fsti
@@ -0,0 +1,10 @@
+(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
+(** [hashmap_main]: external type declarations *)
+module HashmapMain.TypesExternal
+open Primitives
+
+#set-options "--z3rlimit 50 --fuel 1 --ifuel 1"
+
+(** The state type used in the state-error monad *)
+val state : Type0
+
diff --git a/tests/fstar/hashmap_main/Makefile b/tests/fstar/hashmap_main/Makefile
new file mode 100644
index 00000000..fa7d1f36
--- /dev/null
+++ b/tests/fstar/hashmap_main/Makefile
@@ -0,0 +1,49 @@
+# This file was automatically generated - modify ../Makefile.template instead
+INCLUDE_DIRS = .
+
+FSTAR_INCLUDES = $(addprefix --include ,$(INCLUDE_DIRS))
+
+FSTAR_HINTS ?= --use_hints --use_hint_hashes --record_hints
+
+FSTAR_OPTIONS = $(FSTAR_HINTS) \
+  --cache_checked_modules $(FSTAR_INCLUDES) --cmi \
+  --warn_error '+241@247+285-274' \
+
+FSTAR_EXE ?= fstar.exe
+FSTAR_NO_FLAGS = $(FSTAR_EXE) --already_cached 'Prims FStar LowStar Steel' --odir obj --cache_dir obj
+
+FSTAR = $(FSTAR_NO_FLAGS) $(FSTAR_OPTIONS)
+
+# The F* roots are used to compute the dependency graph, and generate the .depend file
+FSTAR_ROOTS ?= $(wildcard *.fst *.fsti)
+
+# Build all the files
+all: $(addprefix obj/,$(addsuffix .checked,$(FSTAR_ROOTS)))
+
+# This is the right way to ensure the .depend file always gets re-built.
+ifeq (,$(filter %-in,$(MAKECMDGOALS)))
+ifndef NODEPEND
+ifndef MAKE_RESTARTS
+.depend: .FORCE
+	$(FSTAR_NO_FLAGS) --dep full $(notdir $(FSTAR_ROOTS)) > $@
+
+.PHONY: .FORCE
+.FORCE:
+endif
+endif
+
+include .depend
+endif
+
+# For the interactive mode
+%.fst-in %.fsti-in:
+	@echo $(FSTAR_OPTIONS)
+
+# Generete the .checked files in batch mode
+%.checked:
+	$(FSTAR) $(FSTAR_OPTIONS) $< && \
+	touch -c $@
+
+.PHONY: clean
+clean:
+	rm -f obj/*
diff --git a/tests/fstar/hashmap_main/Primitives.fst b/tests/fstar/hashmap_main/Primitives.fst
new file mode 100644
index 00000000..9951ccc3
--- /dev/null
+++ b/tests/fstar/hashmap_main/Primitives.fst
@@ -0,0 +1,929 @@
+/// This file lists primitive and assumed functions and types
+module Primitives
+open FStar.Mul
+open FStar.List.Tot
+
+#set-options "--z3rlimit 15 --fuel 0 --ifuel 1"
+
+(*** Utilities *)
+val list_update (#a : Type0) (ls : list a) (i : nat{i < length ls}) (x : a) :
+  ls':list a{
+    length ls' = length ls /\
+    index ls' i == x
+  }
+#push-options "--fuel 1"
+let rec list_update #a ls i x =
+  match ls with
+  | x' :: ls -> if i = 0 then x :: ls else x' :: list_update ls (i-1) x
+#pop-options
+
+(*** Result *)
+type error : Type0 =
+| Failure
+| OutOfFuel
+
+type result (a : Type0) : Type0 =
+| Ok : v:a -> result a
+| Fail : e:error -> result a
+
+// Monadic return operator
+unfold let return (#a : Type0) (x : a) : result a = Ok x
+
+// Monadic bind operator.
+// Allows to use the notation:
+// ```
+// let* x = y in
+// ...
+// ```
+unfold let (let*) (#a #b : Type0) (m: result a)
+  (f: (x:a) -> Pure (result b) (requires (m == Ok x)) (ensures fun _ -> True)) :
+  result b =
+  match m with
+  | Ok x -> f x
+  | Fail e   -> Fail e
+
+// Monadic assert(...)
+let massert (b:bool) : result unit = if b then Ok () else Fail Failure
+
+// Normalize and unwrap a successful result (used for globals).
+let eval_global (#a : Type0) (x : result a{Ok? (normalize_term x)}) : a = Ok?.v x
+
+(*** Misc *)
+type char = FStar.Char.char
+type string = string
+
+let is_zero (n: nat) : bool = n = 0
+let decrease (n: nat{n > 0}) : nat = n - 1
+
+let core_mem_replace (a : Type0) (x : a) (y : a) : a & a = (x, x)
+
+// We don't really use raw pointers for now
+type mut_raw_ptr (t : Type0) = { v : t }
+type const_raw_ptr (t : Type0) = { v : t }
+
+(*** Scalars *)
+/// Rem.: most of the following code was partially generated
+
+assume val size_numbits : pos
+
+// TODO: we could use FStar.Int.int_t and FStar.UInt.int_t
+
+let isize_min : int = -9223372036854775808 // TODO: should be opaque
+let isize_max : int = 9223372036854775807 // TODO: should be opaque
+let i8_min : int = -128
+let i8_max : int = 127
+let i16_min : int = -32768
+let i16_max : int = 32767
+let i32_min : int = -2147483648
+let i32_max : int = 2147483647
+let i64_min : int = -9223372036854775808
+let i64_max : int = 9223372036854775807
+let i128_min : int = -170141183460469231731687303715884105728
+let i128_max : int = 170141183460469231731687303715884105727
+let usize_min : int = 0
+let usize_max : int = 4294967295 // TODO: should be opaque
+let u8_min : int = 0
+let u8_max : int = 255
+let u16_min : int = 0
+let u16_max : int = 65535
+let u32_min : int = 0
+let u32_max : int = 4294967295
+let u64_min : int = 0
+let u64_max : int = 18446744073709551615
+let u128_min : int = 0
+let u128_max : int = 340282366920938463463374607431768211455
+
+type scalar_ty =
+| Isize
+| I8
+| I16
+| I32
+| I64
+| I128
+| Usize
+| U8
+| U16
+| U32
+| U64
+| U128
+
+let is_unsigned = function
+  | Isize | I8 | I16 | I32 | I64 | I128 -> false
+  | Usize | U8 | U16 | U32 | U64 | U128 -> true
+
+let scalar_min (ty : scalar_ty) : int =
+  match ty with
+  | Isize -> isize_min
+  | I8 -> i8_min
+  | I16 -> i16_min
+  | I32 -> i32_min
+  | I64 -> i64_min
+  | I128 -> i128_min
+  | Usize -> usize_min
+  | U8 -> u8_min
+  | U16 -> u16_min
+  | U32 -> u32_min
+  | U64 -> u64_min
+  | U128 -> u128_min
+
+let scalar_max (ty : scalar_ty) : int =
+  match ty with
+  | Isize -> isize_max
+  | I8 -> i8_max
+  | I16 -> i16_max
+  | I32 -> i32_max
+  | I64 -> i64_max
+  | I128 -> i128_max
+  | Usize -> usize_max
+  | U8 -> u8_max
+  | U16 -> u16_max
+  | U32 -> u32_max
+  | U64 -> u64_max
+  | U128 -> u128_max
+
+type scalar (ty : scalar_ty) : eqtype = x:int{scalar_min ty <= x && x <= scalar_max ty}
+
+let mk_scalar (ty : scalar_ty) (x : int) : result (scalar ty) =
+  if scalar_min ty <= x && scalar_max ty >= x then Ok x else Fail Failure
+
+let scalar_neg (#ty : scalar_ty) (x : scalar ty) : result (scalar ty) = mk_scalar ty (-x)
+
+let scalar_div (#ty : scalar_ty) (x : scalar ty) (y : scalar ty) : result (scalar ty) =
+  if y <> 0 then mk_scalar ty (x / y) else Fail Failure
+
+/// The remainder operation
+let int_rem (x : int) (y : int{y <> 0}) : int =
+  if x >= 0 then (x % y) else -(x % y)
+
+(* Checking consistency with Rust *)
+let _ = assert_norm(int_rem 1 2 = 1)
+let _ = assert_norm(int_rem (-1) 2 = -1)
+let _ = assert_norm(int_rem 1 (-2) = 1)
+let _ = assert_norm(int_rem (-1) (-2) = -1)
+
+let scalar_rem (#ty : scalar_ty) (x : scalar ty) (y : scalar ty) : result (scalar ty) =
+  if y <> 0 then mk_scalar ty (int_rem x y) else Fail Failure
+
+let scalar_add (#ty : scalar_ty) (x : scalar ty) (y : scalar ty) : result (scalar ty) =
+  mk_scalar ty (x + y)
+
+let scalar_sub (#ty : scalar_ty) (x : scalar ty) (y : scalar ty) : result (scalar ty) =
+  mk_scalar ty (x - y)
+
+let scalar_mul (#ty : scalar_ty) (x : scalar ty) (y : scalar ty) : result (scalar ty) =
+  mk_scalar ty (x * y)
+
+let scalar_xor (#ty : scalar_ty)
+    (x : scalar ty) (y : scalar ty) : scalar ty =
+  match ty with
+  | U8 -> FStar.UInt.logxor #8 x y
+  | U16 -> FStar.UInt.logxor #16 x y
+  | U32 -> FStar.UInt.logxor #32 x y
+  | U64 -> FStar.UInt.logxor #64 x y
+  | U128 -> FStar.UInt.logxor #128 x y
+  | Usize -> admit() // TODO
+  | I8 ->
+    // Encoding issues...
+    normalize_spec (FStar.Int.int_t 8);
+    normalize_spec (scalar I8);
+    FStar.Int.logxor #8 x y
+  | I16 ->
+    // Encoding issues...
+    normalize_spec (FStar.Int.int_t 16);
+    normalize_spec (scalar I16);
+    FStar.Int.logxor #16 x y
+  | I32 -> FStar.Int.logxor #32 x y
+  | I64 -> FStar.Int.logxor #64 x y
+  | I128 ->
+    // Encoding issues...
+    normalize_spec (FStar.Int.int_t 128);
+    normalize_spec (scalar I128);
+    FStar.Int.logxor #128 x y
+  | Isize -> admit() // TODO
+
+let scalar_or (#ty : scalar_ty)
+    (x : scalar ty) (y : scalar ty) : scalar ty =
+  match ty with
+  | U8 -> FStar.UInt.logor #8 x y
+  | U16 -> FStar.UInt.logor #16 x y
+  | U32 -> FStar.UInt.logor #32 x y
+  | U64 -> FStar.UInt.logor #64 x y
+  | U128 -> FStar.UInt.logor #128 x y
+  | Usize -> admit() // TODO
+  | I8 ->
+    // Encoding issues...
+    normalize_spec (FStar.Int.int_t 8);
+    normalize_spec (scalar I8);
+    FStar.Int.logor #8 x y
+  | I16 ->
+    // Encoding issues...
+    normalize_spec (FStar.Int.int_t 16);
+    normalize_spec (scalar I16);
+    FStar.Int.logor #16 x y
+  | I32 -> FStar.Int.logor #32 x y
+  | I64 -> FStar.Int.logor #64 x y
+  | I128 ->
+    // Encoding issues...
+    normalize_spec (FStar.Int.int_t 128);
+    normalize_spec (scalar I128);
+    FStar.Int.logor #128 x y
+  | Isize -> admit() // TODO
+
+let scalar_and (#ty : scalar_ty)
+    (x : scalar ty) (y : scalar ty) : scalar ty =
+  match ty with
+  | U8 -> FStar.UInt.logand #8 x y
+  | U16 -> FStar.UInt.logand #16 x y
+  | U32 -> FStar.UInt.logand #32 x y
+  | U64 -> FStar.UInt.logand #64 x y
+  | U128 -> FStar.UInt.logand #128 x y
+  | Usize -> admit() // TODO
+  | I8 ->
+    // Encoding issues...
+    normalize_spec (FStar.Int.int_t 8);
+    normalize_spec (scalar I8);
+    FStar.Int.logand #8 x y
+  | I16 ->
+    // Encoding issues...
+    normalize_spec (FStar.Int.int_t 16);
+    normalize_spec (scalar I16);
+    FStar.Int.logand #16 x y
+  | I32 -> FStar.Int.logand #32 x y
+  | I64 -> FStar.Int.logand #64 x y
+  | I128 ->
+    // Encoding issues...
+    normalize_spec (FStar.Int.int_t 128);
+    normalize_spec (scalar I128);
+    FStar.Int.logand #128 x y
+  | Isize -> admit() // TODO
+
+// Shift left
+let scalar_shl (#ty0 #ty1 : scalar_ty)
+    (x : scalar ty0) (y : scalar ty1) : result (scalar ty0) =
+  admit()
+
+// Shift right
+let scalar_shr (#ty0 #ty1 : scalar_ty)
+    (x : scalar ty0) (y : scalar ty1) : result (scalar ty0) =
+  admit()
+
+(** Cast an integer from a [src_ty] to a [tgt_ty] *)
+// TODO: check the semantics of casts in Rust
+let scalar_cast (src_ty : scalar_ty) (tgt_ty : scalar_ty) (x : scalar src_ty) : result (scalar tgt_ty) =
+  mk_scalar tgt_ty x
+
+// This can't fail, but for now we make all casts faillible (easier for the translation)
+let scalar_cast_bool (tgt_ty : scalar_ty) (x : bool) : result (scalar tgt_ty) =
+  mk_scalar tgt_ty (if x then 1 else 0)
+
+/// The scalar types
+type isize : eqtype = scalar Isize
+type i8    : eqtype = scalar I8
+type i16   : eqtype = scalar I16
+type i32   : eqtype = scalar I32
+type i64   : eqtype = scalar I64
+type i128  : eqtype = scalar I128
+type usize : eqtype = scalar Usize
+type u8    : eqtype = scalar U8
+type u16   : eqtype = scalar U16
+type u32   : eqtype = scalar U32
+type u64   : eqtype = scalar U64
+type u128  : eqtype = scalar U128
+
+
+let core_isize_min : isize = isize_min
+let core_isize_max : isize = isize_max
+let core_i8_min    : i8 = i8_min
+let core_i8_max    : i8 = i8_max
+let core_i16_min   : i16 = i16_min
+let core_i16_max   : i16 = i16_max
+let core_i32_min   : i32 = i32_min
+let core_i32_max   : i32 = i32_max
+let core_i64_min   : i64 = i64_min
+let core_i64_max   : i64 = i64_max
+let core_i128_min  : i128 = i128_min
+let core_i128_max  : i128 = i128_max
+
+let core_usize_min : usize = usize_min
+let core_usize_max : usize = usize_max
+let core_u8_min    : u8 = u8_min
+let core_u8_max    : u8 = u8_max
+let core_u16_min   : u16 = u16_min
+let core_u16_max   : u16 = u16_max
+let core_u32_min   : u32 = u32_min
+let core_u32_max   : u32 = u32_max
+let core_u64_min   : u64 = u64_min
+let core_u64_max   : u64 = u64_max
+let core_u128_min  : u128 = u128_min
+let core_u128_max  : u128 = u128_max
+
+/// Negation
+let isize_neg = scalar_neg #Isize
+let i8_neg = scalar_neg #I8
+let i16_neg = scalar_neg #I16
+let i32_neg = scalar_neg #I32
+let i64_neg = scalar_neg #I64
+let i128_neg = scalar_neg #I128
+
+/// Division
+let isize_div = scalar_div #Isize
+let i8_div = scalar_div #I8
+let i16_div = scalar_div #I16
+let i32_div = scalar_div #I32
+let i64_div = scalar_div #I64
+let i128_div = scalar_div #I128
+let usize_div = scalar_div #Usize
+let u8_div = scalar_div #U8
+let u16_div = scalar_div #U16
+let u32_div = scalar_div #U32
+let u64_div = scalar_div #U64
+let u128_div = scalar_div #U128
+
+/// Remainder
+let isize_rem = scalar_rem #Isize
+let i8_rem = scalar_rem #I8
+let i16_rem = scalar_rem #I16
+let i32_rem = scalar_rem #I32
+let i64_rem = scalar_rem #I64
+let i128_rem = scalar_rem #I128
+let usize_rem = scalar_rem #Usize
+let u8_rem = scalar_rem #U8
+let u16_rem = scalar_rem #U16
+let u32_rem = scalar_rem #U32
+let u64_rem = scalar_rem #U64
+let u128_rem = scalar_rem #U128
+
+/// Addition
+let isize_add = scalar_add #Isize
+let i8_add = scalar_add #I8
+let i16_add = scalar_add #I16
+let i32_add = scalar_add #I32
+let i64_add = scalar_add #I64
+let i128_add = scalar_add #I128
+let usize_add = scalar_add #Usize
+let u8_add = scalar_add #U8
+let u16_add = scalar_add #U16
+let u32_add = scalar_add #U32
+let u64_add = scalar_add #U64
+let u128_add = scalar_add #U128
+
+/// Subtraction
+let isize_sub = scalar_sub #Isize
+let i8_sub = scalar_sub #I8
+let i16_sub = scalar_sub #I16
+let i32_sub = scalar_sub #I32
+let i64_sub = scalar_sub #I64
+let i128_sub = scalar_sub #I128
+let usize_sub = scalar_sub #Usize
+let u8_sub = scalar_sub #U8
+let u16_sub = scalar_sub #U16
+let u32_sub = scalar_sub #U32
+let u64_sub = scalar_sub #U64
+let u128_sub = scalar_sub #U128
+
+/// Multiplication
+let isize_mul = scalar_mul #Isize
+let i8_mul = scalar_mul #I8
+let i16_mul = scalar_mul #I16
+let i32_mul = scalar_mul #I32
+let i64_mul = scalar_mul #I64
+let i128_mul = scalar_mul #I128
+let usize_mul = scalar_mul #Usize
+let u8_mul = scalar_mul #U8
+let u16_mul = scalar_mul #U16
+let u32_mul = scalar_mul #U32
+let u64_mul = scalar_mul #U64
+let u128_mul = scalar_mul #U128
+
+/// Xor
+let u8_xor = scalar_xor #U8
+let u16_xor = scalar_xor #U16
+let u32_xor = scalar_xor #U32
+let u64_xor = scalar_xor #U64
+let u128_xor = scalar_xor #U128
+let usize_xor = scalar_xor #Usize
+let i8_xor = scalar_xor #I8
+let i16_xor = scalar_xor #I16
+let i32_xor = scalar_xor #I32
+let i64_xor = scalar_xor #I64
+let i128_xor = scalar_xor #I128
+let isize_xor = scalar_xor #Isize
+
+/// Or
+let u8_or = scalar_or #U8
+let u16_or = scalar_or #U16
+let u32_or = scalar_or #U32
+let u64_or = scalar_or #U64
+let u128_or = scalar_or #U128
+let usize_or = scalar_or #Usize
+let i8_or = scalar_or #I8
+let i16_or = scalar_or #I16
+let i32_or = scalar_or #I32
+let i64_or = scalar_or #I64
+let i128_or = scalar_or #I128
+let isize_or = scalar_or #Isize
+
+/// And
+let u8_and = scalar_and #U8
+let u16_and = scalar_and #U16
+let u32_and = scalar_and #U32
+let u64_and = scalar_and #U64
+let u128_and = scalar_and #U128
+let usize_and = scalar_and #Usize
+let i8_and = scalar_and #I8
+let i16_and = scalar_and #I16
+let i32_and = scalar_and #I32
+let i64_and = scalar_and #I64
+let i128_and = scalar_and #I128
+let isize_and = scalar_and #Isize
+
+/// Shift left
+let u8_shl #ty = scalar_shl #U8 #ty
+let u16_shl #ty = scalar_shl #U16 #ty
+let u32_shl #ty = scalar_shl #U32 #ty
+let u64_shl #ty = scalar_shl #U64 #ty
+let u128_shl #ty = scalar_shl #U128 #ty
+let usize_shl #ty = scalar_shl #Usize #ty
+let i8_shl #ty = scalar_shl #I8 #ty
+let i16_shl #ty = scalar_shl #I16 #ty
+let i32_shl #ty = scalar_shl #I32 #ty
+let i64_shl #ty = scalar_shl #I64 #ty
+let i128_shl #ty = scalar_shl #I128 #ty
+let isize_shl #ty = scalar_shl #Isize #ty
+
+/// Shift right
+let u8_shr #ty = scalar_shr #U8 #ty
+let u16_shr #ty = scalar_shr #U16 #ty
+let u32_shr #ty = scalar_shr #U32 #ty
+let u64_shr #ty = scalar_shr #U64 #ty
+let u128_shr #ty = scalar_shr #U128 #ty
+let usize_shr #ty = scalar_shr #Usize #ty
+let i8_shr #ty = scalar_shr #I8 #ty
+let i16_shr #ty = scalar_shr #I16 #ty
+let i32_shr #ty = scalar_shr #I32 #ty
+let i64_shr #ty = scalar_shr #I64 #ty
+let i128_shr #ty = scalar_shr #I128 #ty
+let isize_shr #ty = scalar_shr #Isize #ty
+
+(*** core *)
+
+/// Trait declaration: [core::clone::Clone]
+noeq type core_clone_Clone (self : Type0) = {
+  clone : self → result self
+}
+
+let core_clone_impls_CloneBool_clone (b : bool) : bool = b
+
+let core_clone_CloneBool : core_clone_Clone bool = {
+  clone = fun b -> Ok (core_clone_impls_CloneBool_clone b)
+}
+
+let core_clone_impls_CloneUsize_clone (x : usize) : usize = x
+let core_clone_impls_CloneU8_clone (x : u8) : u8 = x
+let core_clone_impls_CloneU16_clone (x : u16) : u16 = x
+let core_clone_impls_CloneU32_clone (x : u32) : u32 = x
+let core_clone_impls_CloneU64_clone (x : u64) : u64 = x
+let core_clone_impls_CloneU128_clone (x : u128) : u128 = x
+
+let core_clone_impls_CloneIsize_clone (x : isize) : isize = x
+let core_clone_impls_CloneI8_clone (x : i8) : i8 = x
+let core_clone_impls_CloneI16_clone (x : i16) : i16 = x
+let core_clone_impls_CloneI32_clone (x : i32) : i32 = x
+let core_clone_impls_CloneI64_clone (x : i64) : i64 = x
+let core_clone_impls_CloneI128_clone (x : i128) : i128 = x
+
+let core_clone_CloneUsize : core_clone_Clone usize = {
+  clone = fun x -> Ok (core_clone_impls_CloneUsize_clone x)
+}
+
+let core_clone_CloneU8 : core_clone_Clone u8 = {
+  clone = fun x -> Ok (core_clone_impls_CloneU8_clone x)
+}
+
+let core_clone_CloneU16 : core_clone_Clone u16 = {
+  clone = fun x -> Ok (core_clone_impls_CloneU16_clone x)
+}
+
+let core_clone_CloneU32 : core_clone_Clone u32 = {
+  clone = fun x -> Ok (core_clone_impls_CloneU32_clone x)
+}
+
+let core_clone_CloneU64 : core_clone_Clone u64 = {
+  clone = fun x -> Ok (core_clone_impls_CloneU64_clone x)
+}
+
+let core_clone_CloneU128 : core_clone_Clone u128 = {
+  clone = fun x -> Ok (core_clone_impls_CloneU128_clone x)
+}
+
+let core_clone_CloneIsize : core_clone_Clone isize = {
+  clone = fun x -> Ok (core_clone_impls_CloneIsize_clone x)
+}
+
+let core_clone_CloneI8 : core_clone_Clone i8 = {
+  clone = fun x -> Ok (core_clone_impls_CloneI8_clone x)
+}
+
+let core_clone_CloneI16 : core_clone_Clone i16 = {
+  clone = fun x -> Ok (core_clone_impls_CloneI16_clone x)
+}
+
+let core_clone_CloneI32 : core_clone_Clone i32 = {
+  clone = fun x -> Ok (core_clone_impls_CloneI32_clone x)
+}
+
+let core_clone_CloneI64 : core_clone_Clone i64 = {
+  clone = fun x -> Ok (core_clone_impls_CloneI64_clone x)
+}
+
+let core_clone_CloneI128 : core_clone_Clone i128 = {
+  clone = fun x -> Ok (core_clone_impls_CloneI128_clone x)
+}
+
+(** [core::option::{core::option::Option<T>}::unwrap] *)
+let core_option_Option_unwrap (t : Type0) (x : option t) : result t =
+  match x with
+  | None -> Fail Failure
+  | Some x -> Ok x
+
+(*** core::ops *)
+
+// Trait declaration: [core::ops::index::Index]
+noeq type core_ops_index_Index (self idx : Type0) = {
+  output : Type0;
+  index : self → idx → result output
+}
+
+// Trait declaration: [core::ops::index::IndexMut]
+noeq type core_ops_index_IndexMut (self idx : Type0) = {
+  indexInst : core_ops_index_Index self idx;
+  index_mut : self → idx → result (indexInst.output & (indexInst.output → result self));
+}
+
+// Trait declaration [core::ops::deref::Deref]
+noeq type core_ops_deref_Deref (self : Type0) = {
+  target : Type0;
+  deref : self → result target;
+}
+
+// Trait declaration [core::ops::deref::DerefMut]
+noeq type core_ops_deref_DerefMut (self : Type0) = {
+  derefInst : core_ops_deref_Deref self;
+  deref_mut : self → result (derefInst.target & (derefInst.target → result self));
+}
+
+type core_ops_range_Range (a : Type0) = {
+  start : a;
+  end_ : a;
+}
+
+(*** [alloc] *)
+
+let alloc_boxed_Box_deref (t : Type0) (x : t) : result t = Ok x
+let alloc_boxed_Box_deref_mut (t : Type0) (x : t) : result (t & (t -> result t)) =
+  Ok (x, (fun x -> Ok x))
+
+// Trait instance
+let alloc_boxed_Box_coreopsDerefInst (self : Type0) : core_ops_deref_Deref self = {
+  target = self;
+  deref = alloc_boxed_Box_deref self;
+}
+
+// Trait instance
+let alloc_boxed_Box_coreopsDerefMutInst (self : Type0) : core_ops_deref_DerefMut self = {
+  derefInst = alloc_boxed_Box_coreopsDerefInst self;
+  deref_mut = alloc_boxed_Box_deref_mut self;
+}
+
+(*** Array *)
+type array (a : Type0) (n : usize) = s:list a{length s = n}
+
+// We tried putting the normalize_term condition as a refinement on the list
+// but it didn't work. It works with the requires clause.
+let mk_array (a : Type0) (n : usize)
+  (l : list a) :
+  Pure (array a n)
+  (requires (normalize_term(FStar.List.Tot.length l) = n))
+  (ensures (fun _ -> True)) =
+  normalize_term_spec (FStar.List.Tot.length l);
+  l
+
+let array_index_usize (a : Type0) (n : usize) (x : array a n) (i : usize) : result a =
+  if i < length x then Ok (index x i)
+  else Fail Failure
+
+let array_update_usize (a : Type0) (n : usize) (x : array a n) (i : usize) (nx : a) :
+  result (array a n) =
+  if i < length x then Ok (list_update x i nx)
+  else Fail Failure
+
+let array_index_mut_usize (a : Type0) (n : usize) (x : array a n) (i : usize) :
+  result (a & (a -> result (array a n))) =
+  match array_index_usize a n x i with
+  | Fail e -> Fail e
+  | Ok v ->
+    Ok (v, array_update_usize a n x i)
+
+(*** Slice *)
+type slice (a : Type0) = s:list a{length s <= usize_max}
+
+let slice_len (a : Type0) (s : slice a) : usize = length s
+
+let slice_index_usize (a : Type0) (x : slice a) (i : usize) : result a =
+  if i < length x then Ok (index x i)
+  else Fail Failure
+
+let slice_update_usize (a : Type0) (x : slice a) (i : usize) (nx : a) : result (slice a) =
+  if i < length x then Ok (list_update x i nx)
+  else Fail Failure
+
+let slice_index_mut_usize (a : Type0) (s : slice a) (i : usize) :
+  result (a & (a -> result (slice a))) =
+  match slice_index_usize a s i with
+  | Fail e -> Fail e
+  | Ok x ->
+    Ok (x, slice_update_usize a s i)
+
+(*** Subslices *)
+
+let array_to_slice (a : Type0) (n : usize) (x : array a n) : result (slice a) = Ok x
+let array_from_slice (a : Type0) (n : usize) (x : array a n) (s : slice a) : result (array a n) =
+  if length s = n then Ok s
+  else Fail Failure
+
+let array_to_slice_mut (a : Type0) (n : usize) (x : array a n) :
+  result (slice a & (slice a -> result (array a n))) =
+  Ok (x, array_from_slice a n x)
+
+// TODO: finish the definitions below (there lacks [List.drop] and [List.take] in the standard library *)
+let array_subslice (a : Type0) (n : usize) (x : array a n) (r : core_ops_range_Range usize) : result (slice a) =
+  admit()
+
+let array_update_subslice (a : Type0) (n : usize) (x : array a n) (r : core_ops_range_Range usize) (ns : slice a) : result (array a n) =
+  admit()
+
+let array_repeat (a : Type0) (n : usize) (x : a) : array a n =
+  admit()
+
+let slice_subslice (a : Type0) (x : slice a) (r : core_ops_range_Range usize) : result (slice a) =
+  admit()
+
+let slice_update_subslice (a : Type0) (x : slice a) (r : core_ops_range_Range usize) (ns : slice a) : result (slice a) =
+  admit()
+
+(*** Vector *)
+type alloc_vec_Vec (a : Type0) = v:list a{length v <= usize_max}
+
+let alloc_vec_Vec_new (a  : Type0) : alloc_vec_Vec a = assert_norm(length #a [] == 0); []
+let alloc_vec_Vec_len (a : Type0) (v : alloc_vec_Vec a) : usize = length v
+
+// Helper
+let alloc_vec_Vec_index_usize (#a : Type0) (v : alloc_vec_Vec a) (i : usize) : result a =
+  if i < length v then Ok (index v i) else Fail Failure
+// Helper
+let alloc_vec_Vec_update_usize (#a : Type0) (v : alloc_vec_Vec a) (i : usize) (x : a) : result (alloc_vec_Vec a) =
+  if i < length v then Ok (list_update v i x) else Fail Failure
+
+let alloc_vec_Vec_index_mut_usize (#a : Type0) (v: alloc_vec_Vec a) (i: usize) :
+  result (a & (a → result (alloc_vec_Vec a))) =
+  match alloc_vec_Vec_index_usize v i with
+  | Ok x ->
+    Ok (x, alloc_vec_Vec_update_usize v i)
+  | Fail e -> Fail e
+
+let alloc_vec_Vec_push (a  : Type0) (v : alloc_vec_Vec a) (x : a) :
+  Pure (result (alloc_vec_Vec a))
+  (requires True)
+  (ensures (fun res ->
+    match res with
+    | Fail e -> e == Failure
+    | Ok v' -> length v' = length v + 1)) =
+  if length v < usize_max then begin
+    (**) assert_norm(length [x] == 1);
+    (**) append_length v [x];
+    (**) assert(length (append v [x]) = length v + 1);
+    Ok (append v [x])
+    end
+  else Fail Failure
+
+let alloc_vec_Vec_insert (a : Type0) (v : alloc_vec_Vec a) (i : usize) (x : a) : result (alloc_vec_Vec a) =
+  if i < length v then Ok (list_update v i x) else Fail Failure
+
+// Trait declaration: [core::slice::index::private_slice_index::Sealed]
+type core_slice_index_private_slice_index_Sealed (self : Type0) = unit
+
+// Trait declaration: [core::slice::index::SliceIndex]
+noeq type core_slice_index_SliceIndex (self t : Type0) = {
+  sealedInst : core_slice_index_private_slice_index_Sealed self;
+  output : Type0;
+  get : self → t → result (option output);
+  get_mut : self → t → result (option output & (option output -> result t));
+  get_unchecked : self → const_raw_ptr t → result (const_raw_ptr output);
+  get_unchecked_mut : self → mut_raw_ptr t → result (mut_raw_ptr output);
+  index : self → t → result output;
+  index_mut : self → t → result (output & (output -> result t));
+}
+
+// [core::slice::index::[T]::index]: forward function
+let core_slice_index_Slice_index
+  (t idx : Type0) (inst : core_slice_index_SliceIndex idx (slice t))
+  (s : slice t) (i : idx) : result inst.output =
+  let* x = inst.get i s in
+  match x with
+  | None -> Fail Failure
+  | Some x -> Ok x
+
+// [core::slice::index::Range:::get]: forward function
+let core_slice_index_RangeUsize_get (t : Type0) (i : core_ops_range_Range usize) (s : slice t) :
+  result (option (slice t)) =
+  admit () // TODO
+
+// [core::slice::index::Range::get_mut]: forward function
+let core_slice_index_RangeUsize_get_mut (t : Type0) :
+  core_ops_range_Range usize → slice t → result (option (slice t) & (option (slice t) -> result (slice t))) =
+  admit () // TODO
+
+// [core::slice::index::Range::get_unchecked]: forward function
+let core_slice_index_RangeUsize_get_unchecked
+  (t : Type0) :
+  core_ops_range_Range usize → const_raw_ptr (slice t) → result (const_raw_ptr (slice t)) =
+  // Don't know what the model should be - for now we always fail to make
+  // sure code which uses it fails
+  fun _ _ -> Fail Failure
+
+// [core::slice::index::Range::get_unchecked_mut]: forward function
+let core_slice_index_RangeUsize_get_unchecked_mut
+  (t : Type0) :
+  core_ops_range_Range usize → mut_raw_ptr (slice t) → result (mut_raw_ptr (slice t)) =
+  // Don't know what the model should be - for now we always fail to make
+  // sure code which uses it fails
+  fun _ _ -> Fail Failure
+
+// [core::slice::index::Range::index]: forward function
+let core_slice_index_RangeUsize_index
+  (t : Type0) : core_ops_range_Range usize → slice t → result (slice t) =
+  admit () // TODO
+
+// [core::slice::index::Range::index_mut]: forward function
+let core_slice_index_RangeUsize_index_mut (t : Type0) :
+  core_ops_range_Range usize → slice t → result (slice t & (slice t -> result (slice t))) =
+  admit () // TODO
+
+// [core::slice::index::[T]::index_mut]: forward function
+let core_slice_index_Slice_index_mut
+  (t idx : Type0) (inst : core_slice_index_SliceIndex idx (slice t)) :
+  slice t → idx → result (inst.output & (inst.output -> result (slice t))) =
+  admit () // 
+
+// [core::array::[T; N]::index]: forward function
+let core_array_Array_index
+  (t idx : Type0) (n : usize) (inst : core_ops_index_Index (slice t) idx)
+  (a : array t n) (i : idx) : result inst.output =
+  admit () // TODO
+
+// [core::array::[T; N]::index_mut]: forward function
+let core_array_Array_index_mut
+  (t idx : Type0) (n : usize) (inst : core_ops_index_IndexMut (slice t) idx)
+  (a : array t n) (i : idx) :
+  result (inst.indexInst.output & (inst.indexInst.output -> result (array t n))) =
+  admit () // TODO
+
+// Trait implementation: [core::slice::index::private_slice_index::Range]
+let core_slice_index_private_slice_index_SealedRangeUsizeInst
+  : core_slice_index_private_slice_index_Sealed (core_ops_range_Range usize) = ()
+
+// Trait implementation: [core::slice::index::Range]
+let core_slice_index_SliceIndexRangeUsizeSliceTInst (t : Type0) :
+  core_slice_index_SliceIndex (core_ops_range_Range usize) (slice t) = {
+  sealedInst = core_slice_index_private_slice_index_SealedRangeUsizeInst;
+  output = slice t;
+  get = core_slice_index_RangeUsize_get t;
+  get_mut = core_slice_index_RangeUsize_get_mut t;
+  get_unchecked = core_slice_index_RangeUsize_get_unchecked t;
+  get_unchecked_mut = core_slice_index_RangeUsize_get_unchecked_mut t;
+  index = core_slice_index_RangeUsize_index t;
+  index_mut = core_slice_index_RangeUsize_index_mut t;
+}
+
+// Trait implementation: [core::slice::index::[T]]
+let core_ops_index_IndexSliceTIInst (t idx : Type0)
+  (inst : core_slice_index_SliceIndex idx (slice t)) :
+  core_ops_index_Index (slice t) idx = {
+  output = inst.output;
+  index = core_slice_index_Slice_index t idx inst;
+}
+
+// Trait implementation: [core::slice::index::[T]]
+let core_ops_index_IndexMutSliceTIInst (t idx : Type0)
+  (inst : core_slice_index_SliceIndex idx (slice t)) :
+  core_ops_index_IndexMut (slice t) idx = {
+  indexInst = core_ops_index_IndexSliceTIInst t idx inst;
+  index_mut = core_slice_index_Slice_index_mut t idx inst;
+}
+
+// Trait implementation: [core::array::[T; N]]
+let core_ops_index_IndexArrayInst (t idx : Type0) (n : usize)
+  (inst : core_ops_index_Index (slice t) idx) :
+  core_ops_index_Index (array t n) idx = {
+  output = inst.output;
+  index = core_array_Array_index t idx n inst;
+}
+
+// Trait implementation: [core::array::[T; N]]
+let core_ops_index_IndexMutArrayIInst (t idx : Type0) (n : usize)
+  (inst : core_ops_index_IndexMut (slice t) idx) :
+  core_ops_index_IndexMut (array t n) idx = {
+  indexInst = core_ops_index_IndexArrayInst t idx n inst.indexInst;
+  index_mut = core_array_Array_index_mut t idx n inst;
+}
+
+// [core::slice::index::usize::get]: forward function
+let core_slice_index_usize_get
+  (t : Type0) : usize → slice t → result (option t) =
+  admit () // TODO
+
+// [core::slice::index::usize::get_mut]: forward function
+let core_slice_index_usize_get_mut (t : Type0) :
+  usize → slice t → result (option t & (option t -> result (slice t))) =
+  admit () // TODO
+
+// [core::slice::index::usize::get_unchecked]: forward function
+let core_slice_index_usize_get_unchecked
+  (t : Type0) : usize → const_raw_ptr (slice t) → result (const_raw_ptr t) =
+  admit () // TODO
+
+// [core::slice::index::usize::get_unchecked_mut]: forward function
+let core_slice_index_usize_get_unchecked_mut
+  (t : Type0) : usize → mut_raw_ptr (slice t) → result (mut_raw_ptr t) =
+  admit () // TODO
+
+// [core::slice::index::usize::index]: forward function
+let core_slice_index_usize_index (t : Type0) : usize → slice t → result t =
+  admit () // TODO
+
+// [core::slice::index::usize::index_mut]: forward function
+let core_slice_index_usize_index_mut (t : Type0) :
+  usize → slice t → result (t & (t -> result (slice t))) =
+  admit () // TODO
+
+// Trait implementation: [core::slice::index::private_slice_index::usize]
+let core_slice_index_private_slice_index_SealedUsizeInst
+  : core_slice_index_private_slice_index_Sealed usize = ()
+
+// Trait implementation: [core::slice::index::usize]
+let core_slice_index_SliceIndexUsizeSliceTInst (t : Type0) :
+  core_slice_index_SliceIndex usize (slice t) = {
+  sealedInst = core_slice_index_private_slice_index_SealedUsizeInst;
+  output = t;
+  get = core_slice_index_usize_get t;
+  get_mut = core_slice_index_usize_get_mut t;
+  get_unchecked = core_slice_index_usize_get_unchecked t;
+  get_unchecked_mut = core_slice_index_usize_get_unchecked_mut t;
+  index = core_slice_index_usize_index t;
+  index_mut = core_slice_index_usize_index_mut t;
+}
+
+// [alloc::vec::Vec::index]: forward function
+let alloc_vec_Vec_index (t idx : Type0) (inst : core_slice_index_SliceIndex idx (slice t))
+  (self : alloc_vec_Vec t) (i : idx) : result inst.output =
+  admit () // TODO
+
+// [alloc::vec::Vec::index_mut]: forward function
+let alloc_vec_Vec_index_mut (t idx : Type0) (inst : core_slice_index_SliceIndex idx (slice t))
+  (self : alloc_vec_Vec t) (i : idx) :
+  result (inst.output & (inst.output -> result (alloc_vec_Vec t))) =
+  admit () // TODO
+
+// Trait implementation: [alloc::vec::Vec]
+let alloc_vec_Vec_coreopsindexIndexInst (t idx : Type0)
+  (inst : core_slice_index_SliceIndex idx (slice t)) :
+  core_ops_index_Index (alloc_vec_Vec t) idx = {
+  output = inst.output;
+  index = alloc_vec_Vec_index t idx inst;
+}
+
+// Trait implementation: [alloc::vec::Vec]
+let alloc_vec_Vec_coreopsindexIndexMutInst (t idx : Type0)
+  (inst : core_slice_index_SliceIndex idx (slice t)) :
+  core_ops_index_IndexMut (alloc_vec_Vec t) idx = {
+  indexInst = alloc_vec_Vec_coreopsindexIndexInst t idx inst;
+  index_mut = alloc_vec_Vec_index_mut t idx inst;
+}
+
+(*** Theorems *)
+
+let alloc_vec_Vec_index_eq (#a : Type0) (v : alloc_vec_Vec a) (i : usize) :
+  Lemma (
+    alloc_vec_Vec_index a usize (core_slice_index_SliceIndexUsizeSliceTInst a) v i ==
+      alloc_vec_Vec_index_usize v i)
+  [SMTPat (alloc_vec_Vec_index a usize (core_slice_index_SliceIndexUsizeSliceTInst a) v i)]
+  =
+  admit()
+
+let alloc_vec_Vec_index_mut_eq (#a : Type0) (v : alloc_vec_Vec a) (i : usize) :
+  Lemma (
+    alloc_vec_Vec_index_mut a usize (core_slice_index_SliceIndexUsizeSliceTInst a) v i ==
+      alloc_vec_Vec_index_mut_usize v i)
+  [SMTPat (alloc_vec_Vec_index_mut a usize (core_slice_index_SliceIndexUsizeSliceTInst a) v i)]
+  =
+  admit()
diff --git a/tests/fstar/hashmap_on_disk/HashmapMain.Clauses.Template.fst b/tests/fstar/hashmap_on_disk/HashmapMain.Clauses.Template.fst
deleted file mode 100644
index cdd73210..00000000
--- a/tests/fstar/hashmap_on_disk/HashmapMain.Clauses.Template.fst
+++ /dev/null
@@ -1,72 +0,0 @@
-(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
-(** [hashmap_main]: templates for the decreases clauses *)
-module HashmapMain.Clauses.Template
-open Primitives
-open HashmapMain.Types
-
-#set-options "--z3rlimit 50 --fuel 1 --ifuel 1"
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::allocate_slots]: decreases clause
-    Source: 'tests/src/hashmap.rs', lines 58:4-64:5 *)
-unfold
-let hashmap_HashMap_allocate_slots_loop_decreases (t : Type0)
-  (slots : alloc_vec_Vec (hashmap_List_t t)) (n : usize) : nat =
-  admit ()
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::clear]: decreases clause
-    Source: 'tests/src/hashmap.rs', lines 88:4-96:5 *)
-unfold
-let hashmap_HashMap_clear_loop_decreases (t : Type0)
-  (slots : alloc_vec_Vec (hashmap_List_t t)) (i : usize) : nat =
-  admit ()
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::insert_in_list]: decreases clause
-    Source: 'tests/src/hashmap.rs', lines 105:4-122:5 *)
-unfold
-let hashmap_HashMap_insert_in_list_loop_decreases (t : Type0) (key : usize)
-  (value : t) (ls : hashmap_List_t t) : nat =
-  admit ()
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::move_elements_from_list]: decreases clause
-    Source: 'tests/src/hashmap.rs', lines 191:4-204:5 *)
-unfold
-let hashmap_HashMap_move_elements_from_list_loop_decreases (t : Type0)
-  (ntable : hashmap_HashMap_t t) (ls : hashmap_List_t t) : nat =
-  admit ()
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::move_elements]: decreases clause
-    Source: 'tests/src/hashmap.rs', lines 179:4-188:5 *)
-unfold
-let hashmap_HashMap_move_elements_loop_decreases (t : Type0)
-  (ntable : hashmap_HashMap_t t) (slots : alloc_vec_Vec (hashmap_List_t t))
-  (i : usize) : nat =
-  admit ()
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::contains_key_in_list]: decreases clause
-    Source: 'tests/src/hashmap.rs', lines 214:4-227:5 *)
-unfold
-let hashmap_HashMap_contains_key_in_list_loop_decreases (t : Type0)
-  (key : usize) (ls : hashmap_List_t t) : nat =
-  admit ()
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get_in_list]: decreases clause
-    Source: 'tests/src/hashmap.rs', lines 232:4-245:5 *)
-unfold
-let hashmap_HashMap_get_in_list_loop_decreases (t : Type0) (key : usize)
-  (ls : hashmap_List_t t) : nat =
-  admit ()
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get_mut_in_list]: decreases clause
-    Source: 'tests/src/hashmap.rs', lines 253:4-262:5 *)
-unfold
-let hashmap_HashMap_get_mut_in_list_loop_decreases (t : Type0)
-  (ls : hashmap_List_t t) (key : usize) : nat =
-  admit ()
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::remove_from_list]: decreases clause
-    Source: 'tests/src/hashmap.rs', lines 273:4-299:5 *)
-unfold
-let hashmap_HashMap_remove_from_list_loop_decreases (t : Type0) (key : usize)
-  (ls : hashmap_List_t t) : nat =
-  admit ()
-
diff --git a/tests/fstar/hashmap_on_disk/HashmapMain.Clauses.fst b/tests/fstar/hashmap_on_disk/HashmapMain.Clauses.fst
deleted file mode 100644
index be5a4ab1..00000000
--- a/tests/fstar/hashmap_on_disk/HashmapMain.Clauses.fst
+++ /dev/null
@@ -1,61 +0,0 @@
-(** [hashmap]: the decreases clauses *)
-module HashmapMain.Clauses
-open Primitives
-open FStar.List.Tot
-open HashmapMain.Types
-
-#set-options "--z3rlimit 50 --fuel 0 --ifuel 1"
-
-(** [hashmap::HashMap::allocate_slots]: decreases clause *)
-unfold
-let hashmap_HashMap_allocate_slots_loop_decreases (t : Type0) (slots : alloc_vec_Vec (hashmap_List_t t))
-  (n : usize) : nat = n
-
-(** [hashmap::HashMap::clear]: decreases clause *)
-unfold
-let hashmap_HashMap_clear_loop_decreases (t : Type0) (slots : alloc_vec_Vec (hashmap_List_t t))
-  (i : usize) : nat =
-  if i < length slots then length slots - i else 0
-
-(** [hashmap::HashMap::insert_in_list]: decreases clause *)
-unfold
-let hashmap_HashMap_insert_in_list_loop_decreases (t : Type0) (key : usize) (value : t)
-  (ls : hashmap_List_t t) : hashmap_List_t t =
-  ls
-
-(** [hashmap::HashMap::move_elements_from_list]: decreases clause *)
-unfold
-let hashmap_HashMap_move_elements_from_list_loop_decreases (t : Type0)
-  (ntable : hashmap_HashMap_t t) (ls : hashmap_List_t t) : hashmap_List_t t =
-  ls
-
-(** [hashmap::HashMap::move_elements]: decreases clause *)
-unfold
-let hashmap_HashMap_move_elements_loop_decreases (t : Type0) (ntable : hashmap_HashMap_t t)
-  (slots : alloc_vec_Vec (hashmap_List_t t)) (i : usize) : nat =
-  if i < length slots then length slots - i else 0
-
-(** [hashmap::HashMap::contains_key_in_list]: decreases clause *)
-unfold
-let hashmap_HashMap_contains_key_in_list_loop_decreases (t : Type0) (key : usize)
-  (ls : hashmap_List_t t) : hashmap_List_t t =
-  ls
-
-(** [hashmap::HashMap::get_in_list]: decreases clause *)
-unfold
-let hashmap_HashMap_get_in_list_loop_decreases (t : Type0) (key : usize) (ls : hashmap_List_t t) :
-  hashmap_List_t t =
-  ls
-
-(** [hashmap::HashMap::get_mut_in_list]: decreases clause *)
-unfold
-let hashmap_HashMap_get_mut_in_list_loop_decreases (t : Type0)
-  (ls : hashmap_List_t t) (key : usize) : hashmap_List_t t =
-  ls
-
-(** [hashmap::HashMap::remove_from_list]: decreases clause *)
-unfold
-let hashmap_HashMap_remove_from_list_loop_decreases (t : Type0) (key : usize)
-  (ls : hashmap_List_t t) : hashmap_List_t t =
-  ls
-
diff --git a/tests/fstar/hashmap_on_disk/HashmapMain.Funs.fst b/tests/fstar/hashmap_on_disk/HashmapMain.Funs.fst
deleted file mode 100644
index c88a746e..00000000
--- a/tests/fstar/hashmap_on_disk/HashmapMain.Funs.fst
+++ /dev/null
@@ -1,446 +0,0 @@
-(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
-(** [hashmap_main]: function definitions *)
-module HashmapMain.Funs
-open Primitives
-include HashmapMain.Types
-include HashmapMain.FunsExternal
-include HashmapMain.Clauses
-
-#set-options "--z3rlimit 50 --fuel 1 --ifuel 1"
-
-(** [hashmap_main::hashmap::hash_key]:
-    Source: 'tests/src/hashmap.rs', lines 35:0-35:32 *)
-let hashmap_hash_key (k : usize) : result usize =
-  Ok k
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::allocate_slots]: loop 0:
-    Source: 'tests/src/hashmap.rs', lines 58:4-64:5 *)
-let rec hashmap_HashMap_allocate_slots_loop
-  (t : Type0) (slots : alloc_vec_Vec (hashmap_List_t t)) (n : usize) :
-  Tot (result (alloc_vec_Vec (hashmap_List_t t)))
-  (decreases (hashmap_HashMap_allocate_slots_loop_decreases t slots n))
-  =
-  if n > 0
-  then
-    let* slots1 = alloc_vec_Vec_push (hashmap_List_t t) slots Hashmap_List_Nil
-      in
-    let* n1 = usize_sub n 1 in
-    hashmap_HashMap_allocate_slots_loop t slots1 n1
-  else Ok slots
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::allocate_slots]:
-    Source: 'tests/src/hashmap.rs', lines 58:4-58:76 *)
-let hashmap_HashMap_allocate_slots
-  (t : Type0) (slots : alloc_vec_Vec (hashmap_List_t t)) (n : usize) :
-  result (alloc_vec_Vec (hashmap_List_t t))
-  =
-  hashmap_HashMap_allocate_slots_loop t slots n
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::new_with_capacity]:
-    Source: 'tests/src/hashmap.rs', lines 67:4-71:13 *)
-let hashmap_HashMap_new_with_capacity
-  (t : Type0) (capacity : usize) (max_load_dividend : usize)
-  (max_load_divisor : usize) :
-  result (hashmap_HashMap_t t)
-  =
-  let* slots =
-    hashmap_HashMap_allocate_slots t (alloc_vec_Vec_new (hashmap_List_t t))
-      capacity in
-  let* i = usize_mul capacity max_load_dividend in
-  let* i1 = usize_div i max_load_divisor in
-  Ok
-    {
-      num_entries = 0;
-      max_load_factor = (max_load_dividend, max_load_divisor);
-      max_load = i1;
-      slots = slots
-    }
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::new]:
-    Source: 'tests/src/hashmap.rs', lines 83:4-83:24 *)
-let hashmap_HashMap_new (t : Type0) : result (hashmap_HashMap_t t) =
-  hashmap_HashMap_new_with_capacity t 32 4 5
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::clear]: loop 0:
-    Source: 'tests/src/hashmap.rs', lines 88:4-96:5 *)
-let rec hashmap_HashMap_clear_loop
-  (t : Type0) (slots : alloc_vec_Vec (hashmap_List_t t)) (i : usize) :
-  Tot (result (alloc_vec_Vec (hashmap_List_t t)))
-  (decreases (hashmap_HashMap_clear_loop_decreases t slots i))
-  =
-  let i1 = alloc_vec_Vec_len (hashmap_List_t t) slots in
-  if i < i1
-  then
-    let* (_, index_mut_back) =
-      alloc_vec_Vec_index_mut (hashmap_List_t t) usize
-        (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t t)) slots i
-      in
-    let* i2 = usize_add i 1 in
-    let* slots1 = index_mut_back Hashmap_List_Nil in
-    hashmap_HashMap_clear_loop t slots1 i2
-  else Ok slots
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::clear]:
-    Source: 'tests/src/hashmap.rs', lines 88:4-88:27 *)
-let hashmap_HashMap_clear
-  (t : Type0) (self : hashmap_HashMap_t t) : result (hashmap_HashMap_t t) =
-  let* hm = hashmap_HashMap_clear_loop t self.slots 0 in
-  Ok { self with num_entries = 0; slots = hm }
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::len]:
-    Source: 'tests/src/hashmap.rs', lines 98:4-98:30 *)
-let hashmap_HashMap_len
-  (t : Type0) (self : hashmap_HashMap_t t) : result usize =
-  Ok self.num_entries
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::insert_in_list]: loop 0:
-    Source: 'tests/src/hashmap.rs', lines 105:4-122:5 *)
-let rec hashmap_HashMap_insert_in_list_loop
-  (t : Type0) (key : usize) (value : t) (ls : hashmap_List_t t) :
-  Tot (result (bool & (hashmap_List_t t)))
-  (decreases (hashmap_HashMap_insert_in_list_loop_decreases t key value ls))
-  =
-  begin match ls with
-  | Hashmap_List_Cons ckey cvalue tl ->
-    if ckey = key
-    then Ok (false, Hashmap_List_Cons ckey value tl)
-    else
-      let* (b, tl1) = hashmap_HashMap_insert_in_list_loop t key value tl in
-      Ok (b, Hashmap_List_Cons ckey cvalue tl1)
-  | Hashmap_List_Nil -> Ok (true, Hashmap_List_Cons key value Hashmap_List_Nil)
-  end
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::insert_in_list]:
-    Source: 'tests/src/hashmap.rs', lines 105:4-105:71 *)
-let hashmap_HashMap_insert_in_list
-  (t : Type0) (key : usize) (value : t) (ls : hashmap_List_t t) :
-  result (bool & (hashmap_List_t t))
-  =
-  hashmap_HashMap_insert_in_list_loop t key value ls
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::insert_no_resize]:
-    Source: 'tests/src/hashmap.rs', lines 125:4-125:54 *)
-let hashmap_HashMap_insert_no_resize
-  (t : Type0) (self : hashmap_HashMap_t t) (key : usize) (value : t) :
-  result (hashmap_HashMap_t t)
-  =
-  let* hash = hashmap_hash_key key in
-  let i = alloc_vec_Vec_len (hashmap_List_t t) self.slots in
-  let* hash_mod = usize_rem hash i in
-  let* (l, index_mut_back) =
-    alloc_vec_Vec_index_mut (hashmap_List_t t) usize
-      (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t t))
-      self.slots hash_mod in
-  let* (inserted, l1) = hashmap_HashMap_insert_in_list t key value l in
-  if inserted
-  then
-    let* i1 = usize_add self.num_entries 1 in
-    let* v = index_mut_back l1 in
-    Ok { self with num_entries = i1; slots = v }
-  else let* v = index_mut_back l1 in Ok { self with slots = v }
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::move_elements_from_list]: loop 0:
-    Source: 'tests/src/hashmap.rs', lines 191:4-204:5 *)
-let rec hashmap_HashMap_move_elements_from_list_loop
-  (t : Type0) (ntable : hashmap_HashMap_t t) (ls : hashmap_List_t t) :
-  Tot (result (hashmap_HashMap_t t))
-  (decreases (
-    hashmap_HashMap_move_elements_from_list_loop_decreases t ntable ls))
-  =
-  begin match ls with
-  | Hashmap_List_Cons k v tl ->
-    let* ntable1 = hashmap_HashMap_insert_no_resize t ntable k v in
-    hashmap_HashMap_move_elements_from_list_loop t ntable1 tl
-  | Hashmap_List_Nil -> Ok ntable
-  end
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::move_elements_from_list]:
-    Source: 'tests/src/hashmap.rs', lines 191:4-191:72 *)
-let hashmap_HashMap_move_elements_from_list
-  (t : Type0) (ntable : hashmap_HashMap_t t) (ls : hashmap_List_t t) :
-  result (hashmap_HashMap_t t)
-  =
-  hashmap_HashMap_move_elements_from_list_loop t ntable ls
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::move_elements]: loop 0:
-    Source: 'tests/src/hashmap.rs', lines 179:4-188:5 *)
-let rec hashmap_HashMap_move_elements_loop
-  (t : Type0) (ntable : hashmap_HashMap_t t)
-  (slots : alloc_vec_Vec (hashmap_List_t t)) (i : usize) :
-  Tot (result ((hashmap_HashMap_t t) & (alloc_vec_Vec (hashmap_List_t t))))
-  (decreases (hashmap_HashMap_move_elements_loop_decreases t ntable slots i))
-  =
-  let i1 = alloc_vec_Vec_len (hashmap_List_t t) slots in
-  if i < i1
-  then
-    let* (l, index_mut_back) =
-      alloc_vec_Vec_index_mut (hashmap_List_t t) usize
-        (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t t)) slots i
-      in
-    let (ls, l1) = core_mem_replace (hashmap_List_t t) l Hashmap_List_Nil in
-    let* ntable1 = hashmap_HashMap_move_elements_from_list t ntable ls in
-    let* i2 = usize_add i 1 in
-    let* slots1 = index_mut_back l1 in
-    hashmap_HashMap_move_elements_loop t ntable1 slots1 i2
-  else Ok (ntable, slots)
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::move_elements]:
-    Source: 'tests/src/hashmap.rs', lines 179:4-179:95 *)
-let hashmap_HashMap_move_elements
-  (t : Type0) (ntable : hashmap_HashMap_t t)
-  (slots : alloc_vec_Vec (hashmap_List_t t)) (i : usize) :
-  result ((hashmap_HashMap_t t) & (alloc_vec_Vec (hashmap_List_t t)))
-  =
-  hashmap_HashMap_move_elements_loop t ntable slots i
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::try_resize]:
-    Source: 'tests/src/hashmap.rs', lines 148:4-148:28 *)
-let hashmap_HashMap_try_resize
-  (t : Type0) (self : hashmap_HashMap_t t) : result (hashmap_HashMap_t t) =
-  let* max_usize = scalar_cast U32 Usize core_u32_max in
-  let capacity = alloc_vec_Vec_len (hashmap_List_t t) self.slots in
-  let* n1 = usize_div max_usize 2 in
-  let (i, i1) = self.max_load_factor in
-  let* i2 = usize_div n1 i in
-  if capacity <= i2
-  then
-    let* i3 = usize_mul capacity 2 in
-    let* ntable = hashmap_HashMap_new_with_capacity t i3 i i1 in
-    let* p = hashmap_HashMap_move_elements t ntable self.slots 0 in
-    let (ntable1, _) = p in
-    Ok
-      { ntable1 with num_entries = self.num_entries; max_load_factor = (i, i1)
-      }
-  else Ok { self with max_load_factor = (i, i1) }
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::insert]:
-    Source: 'tests/src/hashmap.rs', lines 137:4-137:48 *)
-let hashmap_HashMap_insert
-  (t : Type0) (self : hashmap_HashMap_t t) (key : usize) (value : t) :
-  result (hashmap_HashMap_t t)
-  =
-  let* self1 = hashmap_HashMap_insert_no_resize t self key value in
-  let* i = hashmap_HashMap_len t self1 in
-  if i > self1.max_load then hashmap_HashMap_try_resize t self1 else Ok self1
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::contains_key_in_list]: loop 0:
-    Source: 'tests/src/hashmap.rs', lines 214:4-227:5 *)
-let rec hashmap_HashMap_contains_key_in_list_loop
-  (t : Type0) (key : usize) (ls : hashmap_List_t t) :
-  Tot (result bool)
-  (decreases (hashmap_HashMap_contains_key_in_list_loop_decreases t key ls))
-  =
-  begin match ls with
-  | Hashmap_List_Cons ckey _ tl ->
-    if ckey = key
-    then Ok true
-    else hashmap_HashMap_contains_key_in_list_loop t key tl
-  | Hashmap_List_Nil -> Ok false
-  end
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::contains_key_in_list]:
-    Source: 'tests/src/hashmap.rs', lines 214:4-214:68 *)
-let hashmap_HashMap_contains_key_in_list
-  (t : Type0) (key : usize) (ls : hashmap_List_t t) : result bool =
-  hashmap_HashMap_contains_key_in_list_loop t key ls
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::contains_key]:
-    Source: 'tests/src/hashmap.rs', lines 207:4-207:49 *)
-let hashmap_HashMap_contains_key
-  (t : Type0) (self : hashmap_HashMap_t t) (key : usize) : result bool =
-  let* hash = hashmap_hash_key key in
-  let i = alloc_vec_Vec_len (hashmap_List_t t) self.slots in
-  let* hash_mod = usize_rem hash i in
-  let* l =
-    alloc_vec_Vec_index (hashmap_List_t t) usize
-      (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t t))
-      self.slots hash_mod in
-  hashmap_HashMap_contains_key_in_list t key l
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get_in_list]: loop 0:
-    Source: 'tests/src/hashmap.rs', lines 232:4-245:5 *)
-let rec hashmap_HashMap_get_in_list_loop
-  (t : Type0) (key : usize) (ls : hashmap_List_t t) :
-  Tot (result t)
-  (decreases (hashmap_HashMap_get_in_list_loop_decreases t key ls))
-  =
-  begin match ls with
-  | Hashmap_List_Cons ckey cvalue tl ->
-    if ckey = key then Ok cvalue else hashmap_HashMap_get_in_list_loop t key tl
-  | Hashmap_List_Nil -> Fail Failure
-  end
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get_in_list]:
-    Source: 'tests/src/hashmap.rs', lines 232:4-232:70 *)
-let hashmap_HashMap_get_in_list
-  (t : Type0) (key : usize) (ls : hashmap_List_t t) : result t =
-  hashmap_HashMap_get_in_list_loop t key ls
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get]:
-    Source: 'tests/src/hashmap.rs', lines 247:4-247:55 *)
-let hashmap_HashMap_get
-  (t : Type0) (self : hashmap_HashMap_t t) (key : usize) : result t =
-  let* hash = hashmap_hash_key key in
-  let i = alloc_vec_Vec_len (hashmap_List_t t) self.slots in
-  let* hash_mod = usize_rem hash i in
-  let* l =
-    alloc_vec_Vec_index (hashmap_List_t t) usize
-      (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t t))
-      self.slots hash_mod in
-  hashmap_HashMap_get_in_list t key l
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get_mut_in_list]: loop 0:
-    Source: 'tests/src/hashmap.rs', lines 253:4-262:5 *)
-let rec hashmap_HashMap_get_mut_in_list_loop
-  (t : Type0) (ls : hashmap_List_t t) (key : usize) :
-  Tot (result (t & (t -> result (hashmap_List_t t))))
-  (decreases (hashmap_HashMap_get_mut_in_list_loop_decreases t ls key))
-  =
-  begin match ls with
-  | Hashmap_List_Cons ckey cvalue tl ->
-    if ckey = key
-    then
-      let back = fun ret -> Ok (Hashmap_List_Cons ckey ret tl) in
-      Ok (cvalue, back)
-    else
-      let* (x, back) = hashmap_HashMap_get_mut_in_list_loop t tl key in
-      let back1 =
-        fun ret ->
-          let* tl1 = back ret in Ok (Hashmap_List_Cons ckey cvalue tl1) in
-      Ok (x, back1)
-  | Hashmap_List_Nil -> Fail Failure
-  end
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get_mut_in_list]:
-    Source: 'tests/src/hashmap.rs', lines 253:4-253:86 *)
-let hashmap_HashMap_get_mut_in_list
-  (t : Type0) (ls : hashmap_List_t t) (key : usize) :
-  result (t & (t -> result (hashmap_List_t t)))
-  =
-  hashmap_HashMap_get_mut_in_list_loop t ls key
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::get_mut]:
-    Source: 'tests/src/hashmap.rs', lines 265:4-265:67 *)
-let hashmap_HashMap_get_mut
-  (t : Type0) (self : hashmap_HashMap_t t) (key : usize) :
-  result (t & (t -> result (hashmap_HashMap_t t)))
-  =
-  let* hash = hashmap_hash_key key in
-  let i = alloc_vec_Vec_len (hashmap_List_t t) self.slots in
-  let* hash_mod = usize_rem hash i in
-  let* (l, index_mut_back) =
-    alloc_vec_Vec_index_mut (hashmap_List_t t) usize
-      (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t t))
-      self.slots hash_mod in
-  let* (x, get_mut_in_list_back) = hashmap_HashMap_get_mut_in_list t l key in
-  let back =
-    fun ret ->
-      let* l1 = get_mut_in_list_back ret in
-      let* v = index_mut_back l1 in
-      Ok { self with slots = v } in
-  Ok (x, back)
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::remove_from_list]: loop 0:
-    Source: 'tests/src/hashmap.rs', lines 273:4-299:5 *)
-let rec hashmap_HashMap_remove_from_list_loop
-  (t : Type0) (key : usize) (ls : hashmap_List_t t) :
-  Tot (result ((option t) & (hashmap_List_t t)))
-  (decreases (hashmap_HashMap_remove_from_list_loop_decreases t key ls))
-  =
-  begin match ls with
-  | Hashmap_List_Cons ckey x tl ->
-    if ckey = key
-    then
-      let (mv_ls, _) =
-        core_mem_replace (hashmap_List_t t) (Hashmap_List_Cons ckey x tl)
-          Hashmap_List_Nil in
-      begin match mv_ls with
-      | Hashmap_List_Cons _ cvalue tl1 -> Ok (Some cvalue, tl1)
-      | Hashmap_List_Nil -> Fail Failure
-      end
-    else
-      let* (o, tl1) = hashmap_HashMap_remove_from_list_loop t key tl in
-      Ok (o, Hashmap_List_Cons ckey x tl1)
-  | Hashmap_List_Nil -> Ok (None, Hashmap_List_Nil)
-  end
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::remove_from_list]:
-    Source: 'tests/src/hashmap.rs', lines 273:4-273:69 *)
-let hashmap_HashMap_remove_from_list
-  (t : Type0) (key : usize) (ls : hashmap_List_t t) :
-  result ((option t) & (hashmap_List_t t))
-  =
-  hashmap_HashMap_remove_from_list_loop t key ls
-
-(** [hashmap_main::hashmap::{hashmap_main::hashmap::HashMap<T>}::remove]:
-    Source: 'tests/src/hashmap.rs', lines 302:4-302:52 *)
-let hashmap_HashMap_remove
-  (t : Type0) (self : hashmap_HashMap_t t) (key : usize) :
-  result ((option t) & (hashmap_HashMap_t t))
-  =
-  let* hash = hashmap_hash_key key in
-  let i = alloc_vec_Vec_len (hashmap_List_t t) self.slots in
-  let* hash_mod = usize_rem hash i in
-  let* (l, index_mut_back) =
-    alloc_vec_Vec_index_mut (hashmap_List_t t) usize
-      (core_slice_index_SliceIndexUsizeSliceTInst (hashmap_List_t t))
-      self.slots hash_mod in
-  let* (x, l1) = hashmap_HashMap_remove_from_list t key l in
-  begin match x with
-  | None -> let* v = index_mut_back l1 in Ok (None, { self with slots = v })
-  | Some x1 ->
-    let* i1 = usize_sub self.num_entries 1 in
-    let* v = index_mut_back l1 in
-    Ok (Some x1, { self with num_entries = i1; slots = v })
-  end
-
-(** [hashmap_main::hashmap::test1]:
-    Source: 'tests/src/hashmap.rs', lines 323:0-323:10 *)
-let hashmap_test1 : result unit =
-  let* hm = hashmap_HashMap_new u64 in
-  let* hm1 = hashmap_HashMap_insert u64 hm 0 42 in
-  let* hm2 = hashmap_HashMap_insert u64 hm1 128 18 in
-  let* hm3 = hashmap_HashMap_insert u64 hm2 1024 138 in
-  let* hm4 = hashmap_HashMap_insert u64 hm3 1056 256 in
-  let* i = hashmap_HashMap_get u64 hm4 128 in
-  if not (i = 18)
-  then Fail Failure
-  else
-    let* (_, get_mut_back) = hashmap_HashMap_get_mut u64 hm4 1024 in
-    let* hm5 = get_mut_back 56 in
-    let* i1 = hashmap_HashMap_get u64 hm5 1024 in
-    if not (i1 = 56)
-    then Fail Failure
-    else
-      let* (x, hm6) = hashmap_HashMap_remove u64 hm5 1024 in
-      begin match x with
-      | None -> Fail Failure
-      | Some x1 ->
-        if not (x1 = 56)
-        then Fail Failure
-        else
-          let* i2 = hashmap_HashMap_get u64 hm6 0 in
-          if not (i2 = 42)
-          then Fail Failure
-          else
-            let* i3 = hashmap_HashMap_get u64 hm6 128 in
-            if not (i3 = 18)
-            then Fail Failure
-            else
-              let* i4 = hashmap_HashMap_get u64 hm6 1056 in
-              if not (i4 = 256) then Fail Failure else Ok ()
-      end
-
-(** [hashmap_main::insert_on_disk]:
-    Source: 'tests/src/hashmap_main.rs', lines 13:0-13:43 *)
-let insert_on_disk
-  (key : usize) (value : u64) (st : state) : result (state & unit) =
-  let* (st1, hm) = hashmap_utils_deserialize st in
-  let* hm1 = hashmap_HashMap_insert u64 hm key value in
-  hashmap_utils_serialize hm1 st1
-
-(** [hashmap_main::main]:
-    Source: 'tests/src/hashmap_main.rs', lines 22:0-22:13 *)
-let main : result unit =
-  Ok ()
-
diff --git a/tests/fstar/hashmap_on_disk/HashmapMain.FunsExternal.fsti b/tests/fstar/hashmap_on_disk/HashmapMain.FunsExternal.fsti
deleted file mode 100644
index cc20d988..00000000
--- a/tests/fstar/hashmap_on_disk/HashmapMain.FunsExternal.fsti
+++ /dev/null
@@ -1,18 +0,0 @@
-(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
-(** [hashmap_main]: external function declarations *)
-module HashmapMain.FunsExternal
-open Primitives
-include HashmapMain.Types
-
-#set-options "--z3rlimit 50 --fuel 1 --ifuel 1"
-
-(** [hashmap_main::hashmap_utils::deserialize]:
-    Source: 'tests/src/hashmap_utils.rs', lines 11:0-11:43 *)
-val hashmap_utils_deserialize
-  : state -> result (state & (hashmap_HashMap_t u64))
-
-(** [hashmap_main::hashmap_utils::serialize]:
-    Source: 'tests/src/hashmap_utils.rs', lines 6:0-6:42 *)
-val hashmap_utils_serialize
-  : hashmap_HashMap_t u64 -> state -> result (state & unit)
-
diff --git a/tests/fstar/hashmap_on_disk/HashmapMain.Properties.fst b/tests/fstar/hashmap_on_disk/HashmapMain.Properties.fst
deleted file mode 100644
index beb3dc2c..00000000
--- a/tests/fstar/hashmap_on_disk/HashmapMain.Properties.fst
+++ /dev/null
@@ -1,48 +0,0 @@
-(** Properties about the hashmap written on disk *)
-module HashmapMain.Properties
-open Primitives
-open HashmapMain.Funs
-
-#set-options "--z3rlimit 50 --fuel 0 --ifuel 1"
-
-/// Below, we focus on the functions to read from disk/write to disk to showcase
-/// how such reasoning which mixes opaque functions together with a state-error
-/// monad can be performed.
-
-(*** Hypotheses *)
-
-/// [state_v] gives us the hash map currently stored on disk
-assume
-val state_v : state -> hashmap_HashMap_t u64
-
-/// [serialize] updates the hash map stored on disk
-assume
-val serialize_lem (hm : hashmap_HashMap_t u64) (st : state) : Lemma (
-  match hashmap_utils_serialize hm st with
-  | Fail _ -> True
-  | Ok (st', ()) -> state_v st' == hm)
-  [SMTPat (hashmap_utils_serialize hm st)]
-
-/// [deserialize] gives us the hash map stored on disk, without updating it
-assume
-val deserialize_lem (st : state) : Lemma (
-  match hashmap_utils_deserialize st with
-  | Fail _ -> True
-  | Ok (st', hm) -> hm == state_v st /\ st' == st)
-  [SMTPat (hashmap_utils_deserialize st)]
-
-(*** Lemmas *)
-
-/// The obvious lemma about [insert_on_disk]: the updated hash map stored on disk
-/// is exactly the hash map produced from inserting the binding ([key], [value])
-/// in the hash map previously stored on disk.
-val insert_on_disk_lem (key : usize) (value : u64) (st : state) : Lemma (
-  match insert_on_disk key value st with
-  | Fail _ -> True
-  | Ok (st', ()) ->
-    let hm = state_v st in
-    match hashmap_HashMap_insert u64 hm key value with
-    | Fail _ -> False
-    | Ok hm' -> hm' == state_v st')
-
-let insert_on_disk_lem key value st = ()
diff --git a/tests/fstar/hashmap_on_disk/HashmapMain.Types.fst b/tests/fstar/hashmap_on_disk/HashmapMain.Types.fst
deleted file mode 100644
index 85bcaeea..00000000
--- a/tests/fstar/hashmap_on_disk/HashmapMain.Types.fst
+++ /dev/null
@@ -1,24 +0,0 @@
-(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
-(** [hashmap_main]: type definitions *)
-module HashmapMain.Types
-open Primitives
-include HashmapMain.TypesExternal
-
-#set-options "--z3rlimit 50 --fuel 1 --ifuel 1"
-
-(** [hashmap_main::hashmap::List]
-    Source: 'tests/src/hashmap.rs', lines 27:0-27:16 *)
-type hashmap_List_t (t : Type0) =
-| Hashmap_List_Cons : usize -> t -> hashmap_List_t t -> hashmap_List_t t
-| Hashmap_List_Nil : hashmap_List_t t
-
-(** [hashmap_main::hashmap::HashMap]
-    Source: 'tests/src/hashmap.rs', lines 43:0-43:21 *)
-type hashmap_HashMap_t (t : Type0) =
-{
-  num_entries : usize;
-  max_load_factor : (usize & usize);
-  max_load : usize;
-  slots : alloc_vec_Vec (hashmap_List_t t);
-}
-
diff --git a/tests/fstar/hashmap_on_disk/HashmapMain.TypesExternal.fsti b/tests/fstar/hashmap_on_disk/HashmapMain.TypesExternal.fsti
deleted file mode 100644
index 75747408..00000000
--- a/tests/fstar/hashmap_on_disk/HashmapMain.TypesExternal.fsti
+++ /dev/null
@@ -1,10 +0,0 @@
-(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
-(** [hashmap_main]: external type declarations *)
-module HashmapMain.TypesExternal
-open Primitives
-
-#set-options "--z3rlimit 50 --fuel 1 --ifuel 1"
-
-(** The state type used in the state-error monad *)
-val state : Type0
-
diff --git a/tests/fstar/hashmap_on_disk/Makefile b/tests/fstar/hashmap_on_disk/Makefile
deleted file mode 100644
index fa7d1f36..00000000
--- a/tests/fstar/hashmap_on_disk/Makefile
+++ /dev/null
@@ -1,49 +0,0 @@
-# This file was automatically generated - modify ../Makefile.template instead
-INCLUDE_DIRS = .
-
-FSTAR_INCLUDES = $(addprefix --include ,$(INCLUDE_DIRS))
-
-FSTAR_HINTS ?= --use_hints --use_hint_hashes --record_hints
-
-FSTAR_OPTIONS = $(FSTAR_HINTS) \
-  --cache_checked_modules $(FSTAR_INCLUDES) --cmi \
-  --warn_error '+241@247+285-274' \
-
-FSTAR_EXE ?= fstar.exe
-FSTAR_NO_FLAGS = $(FSTAR_EXE) --already_cached 'Prims FStar LowStar Steel' --odir obj --cache_dir obj
-
-FSTAR = $(FSTAR_NO_FLAGS) $(FSTAR_OPTIONS)
-
-# The F* roots are used to compute the dependency graph, and generate the .depend file
-FSTAR_ROOTS ?= $(wildcard *.fst *.fsti)
-
-# Build all the files
-all: $(addprefix obj/,$(addsuffix .checked,$(FSTAR_ROOTS)))
-
-# This is the right way to ensure the .depend file always gets re-built.
-ifeq (,$(filter %-in,$(MAKECMDGOALS)))
-ifndef NODEPEND
-ifndef MAKE_RESTARTS
-.depend: .FORCE
-	$(FSTAR_NO_FLAGS) --dep full $(notdir $(FSTAR_ROOTS)) > $@
-
-.PHONY: .FORCE
-.FORCE:
-endif
-endif
-
-include .depend
-endif
-
-# For the interactive mode
-%.fst-in %.fsti-in:
-	@echo $(FSTAR_OPTIONS)
-
-# Generete the .checked files in batch mode
-%.checked:
-	$(FSTAR) $(FSTAR_OPTIONS) $< && \
-	touch -c $@
-
-.PHONY: clean
-clean:
-	rm -f obj/*
diff --git a/tests/fstar/hashmap_on_disk/Primitives.fst b/tests/fstar/hashmap_on_disk/Primitives.fst
deleted file mode 100644
index 9951ccc3..00000000
--- a/tests/fstar/hashmap_on_disk/Primitives.fst
+++ /dev/null
@@ -1,929 +0,0 @@
-/// This file lists primitive and assumed functions and types
-module Primitives
-open FStar.Mul
-open FStar.List.Tot
-
-#set-options "--z3rlimit 15 --fuel 0 --ifuel 1"
-
-(*** Utilities *)
-val list_update (#a : Type0) (ls : list a) (i : nat{i < length ls}) (x : a) :
-  ls':list a{
-    length ls' = length ls /\
-    index ls' i == x
-  }
-#push-options "--fuel 1"
-let rec list_update #a ls i x =
-  match ls with
-  | x' :: ls -> if i = 0 then x :: ls else x' :: list_update ls (i-1) x
-#pop-options
-
-(*** Result *)
-type error : Type0 =
-| Failure
-| OutOfFuel
-
-type result (a : Type0) : Type0 =
-| Ok : v:a -> result a
-| Fail : e:error -> result a
-
-// Monadic return operator
-unfold let return (#a : Type0) (x : a) : result a = Ok x
-
-// Monadic bind operator.
-// Allows to use the notation:
-// ```
-// let* x = y in
-// ...
-// ```
-unfold let (let*) (#a #b : Type0) (m: result a)
-  (f: (x:a) -> Pure (result b) (requires (m == Ok x)) (ensures fun _ -> True)) :
-  result b =
-  match m with
-  | Ok x -> f x
-  | Fail e   -> Fail e
-
-// Monadic assert(...)
-let massert (b:bool) : result unit = if b then Ok () else Fail Failure
-
-// Normalize and unwrap a successful result (used for globals).
-let eval_global (#a : Type0) (x : result a{Ok? (normalize_term x)}) : a = Ok?.v x
-
-(*** Misc *)
-type char = FStar.Char.char
-type string = string
-
-let is_zero (n: nat) : bool = n = 0
-let decrease (n: nat{n > 0}) : nat = n - 1
-
-let core_mem_replace (a : Type0) (x : a) (y : a) : a & a = (x, x)
-
-// We don't really use raw pointers for now
-type mut_raw_ptr (t : Type0) = { v : t }
-type const_raw_ptr (t : Type0) = { v : t }
-
-(*** Scalars *)
-/// Rem.: most of the following code was partially generated
-
-assume val size_numbits : pos
-
-// TODO: we could use FStar.Int.int_t and FStar.UInt.int_t
-
-let isize_min : int = -9223372036854775808 // TODO: should be opaque
-let isize_max : int = 9223372036854775807 // TODO: should be opaque
-let i8_min : int = -128
-let i8_max : int = 127
-let i16_min : int = -32768
-let i16_max : int = 32767
-let i32_min : int = -2147483648
-let i32_max : int = 2147483647
-let i64_min : int = -9223372036854775808
-let i64_max : int = 9223372036854775807
-let i128_min : int = -170141183460469231731687303715884105728
-let i128_max : int = 170141183460469231731687303715884105727
-let usize_min : int = 0
-let usize_max : int = 4294967295 // TODO: should be opaque
-let u8_min : int = 0
-let u8_max : int = 255
-let u16_min : int = 0
-let u16_max : int = 65535
-let u32_min : int = 0
-let u32_max : int = 4294967295
-let u64_min : int = 0
-let u64_max : int = 18446744073709551615
-let u128_min : int = 0
-let u128_max : int = 340282366920938463463374607431768211455
-
-type scalar_ty =
-| Isize
-| I8
-| I16
-| I32
-| I64
-| I128
-| Usize
-| U8
-| U16
-| U32
-| U64
-| U128
-
-let is_unsigned = function
-  | Isize | I8 | I16 | I32 | I64 | I128 -> false
-  | Usize | U8 | U16 | U32 | U64 | U128 -> true
-
-let scalar_min (ty : scalar_ty) : int =
-  match ty with
-  | Isize -> isize_min
-  | I8 -> i8_min
-  | I16 -> i16_min
-  | I32 -> i32_min
-  | I64 -> i64_min
-  | I128 -> i128_min
-  | Usize -> usize_min
-  | U8 -> u8_min
-  | U16 -> u16_min
-  | U32 -> u32_min
-  | U64 -> u64_min
-  | U128 -> u128_min
-
-let scalar_max (ty : scalar_ty) : int =
-  match ty with
-  | Isize -> isize_max
-  | I8 -> i8_max
-  | I16 -> i16_max
-  | I32 -> i32_max
-  | I64 -> i64_max
-  | I128 -> i128_max
-  | Usize -> usize_max
-  | U8 -> u8_max
-  | U16 -> u16_max
-  | U32 -> u32_max
-  | U64 -> u64_max
-  | U128 -> u128_max
-
-type scalar (ty : scalar_ty) : eqtype = x:int{scalar_min ty <= x && x <= scalar_max ty}
-
-let mk_scalar (ty : scalar_ty) (x : int) : result (scalar ty) =
-  if scalar_min ty <= x && scalar_max ty >= x then Ok x else Fail Failure
-
-let scalar_neg (#ty : scalar_ty) (x : scalar ty) : result (scalar ty) = mk_scalar ty (-x)
-
-let scalar_div (#ty : scalar_ty) (x : scalar ty) (y : scalar ty) : result (scalar ty) =
-  if y <> 0 then mk_scalar ty (x / y) else Fail Failure
-
-/// The remainder operation
-let int_rem (x : int) (y : int{y <> 0}) : int =
-  if x >= 0 then (x % y) else -(x % y)
-
-(* Checking consistency with Rust *)
-let _ = assert_norm(int_rem 1 2 = 1)
-let _ = assert_norm(int_rem (-1) 2 = -1)
-let _ = assert_norm(int_rem 1 (-2) = 1)
-let _ = assert_norm(int_rem (-1) (-2) = -1)
-
-let scalar_rem (#ty : scalar_ty) (x : scalar ty) (y : scalar ty) : result (scalar ty) =
-  if y <> 0 then mk_scalar ty (int_rem x y) else Fail Failure
-
-let scalar_add (#ty : scalar_ty) (x : scalar ty) (y : scalar ty) : result (scalar ty) =
-  mk_scalar ty (x + y)
-
-let scalar_sub (#ty : scalar_ty) (x : scalar ty) (y : scalar ty) : result (scalar ty) =
-  mk_scalar ty (x - y)
-
-let scalar_mul (#ty : scalar_ty) (x : scalar ty) (y : scalar ty) : result (scalar ty) =
-  mk_scalar ty (x * y)
-
-let scalar_xor (#ty : scalar_ty)
-    (x : scalar ty) (y : scalar ty) : scalar ty =
-  match ty with
-  | U8 -> FStar.UInt.logxor #8 x y
-  | U16 -> FStar.UInt.logxor #16 x y
-  | U32 -> FStar.UInt.logxor #32 x y
-  | U64 -> FStar.UInt.logxor #64 x y
-  | U128 -> FStar.UInt.logxor #128 x y
-  | Usize -> admit() // TODO
-  | I8 ->
-    // Encoding issues...
-    normalize_spec (FStar.Int.int_t 8);
-    normalize_spec (scalar I8);
-    FStar.Int.logxor #8 x y
-  | I16 ->
-    // Encoding issues...
-    normalize_spec (FStar.Int.int_t 16);
-    normalize_spec (scalar I16);
-    FStar.Int.logxor #16 x y
-  | I32 -> FStar.Int.logxor #32 x y
-  | I64 -> FStar.Int.logxor #64 x y
-  | I128 ->
-    // Encoding issues...
-    normalize_spec (FStar.Int.int_t 128);
-    normalize_spec (scalar I128);
-    FStar.Int.logxor #128 x y
-  | Isize -> admit() // TODO
-
-let scalar_or (#ty : scalar_ty)
-    (x : scalar ty) (y : scalar ty) : scalar ty =
-  match ty with
-  | U8 -> FStar.UInt.logor #8 x y
-  | U16 -> FStar.UInt.logor #16 x y
-  | U32 -> FStar.UInt.logor #32 x y
-  | U64 -> FStar.UInt.logor #64 x y
-  | U128 -> FStar.UInt.logor #128 x y
-  | Usize -> admit() // TODO
-  | I8 ->
-    // Encoding issues...
-    normalize_spec (FStar.Int.int_t 8);
-    normalize_spec (scalar I8);
-    FStar.Int.logor #8 x y
-  | I16 ->
-    // Encoding issues...
-    normalize_spec (FStar.Int.int_t 16);
-    normalize_spec (scalar I16);
-    FStar.Int.logor #16 x y
-  | I32 -> FStar.Int.logor #32 x y
-  | I64 -> FStar.Int.logor #64 x y
-  | I128 ->
-    // Encoding issues...
-    normalize_spec (FStar.Int.int_t 128);
-    normalize_spec (scalar I128);
-    FStar.Int.logor #128 x y
-  | Isize -> admit() // TODO
-
-let scalar_and (#ty : scalar_ty)
-    (x : scalar ty) (y : scalar ty) : scalar ty =
-  match ty with
-  | U8 -> FStar.UInt.logand #8 x y
-  | U16 -> FStar.UInt.logand #16 x y
-  | U32 -> FStar.UInt.logand #32 x y
-  | U64 -> FStar.UInt.logand #64 x y
-  | U128 -> FStar.UInt.logand #128 x y
-  | Usize -> admit() // TODO
-  | I8 ->
-    // Encoding issues...
-    normalize_spec (FStar.Int.int_t 8);
-    normalize_spec (scalar I8);
-    FStar.Int.logand #8 x y
-  | I16 ->
-    // Encoding issues...
-    normalize_spec (FStar.Int.int_t 16);
-    normalize_spec (scalar I16);
-    FStar.Int.logand #16 x y
-  | I32 -> FStar.Int.logand #32 x y
-  | I64 -> FStar.Int.logand #64 x y
-  | I128 ->
-    // Encoding issues...
-    normalize_spec (FStar.Int.int_t 128);
-    normalize_spec (scalar I128);
-    FStar.Int.logand #128 x y
-  | Isize -> admit() // TODO
-
-// Shift left
-let scalar_shl (#ty0 #ty1 : scalar_ty)
-    (x : scalar ty0) (y : scalar ty1) : result (scalar ty0) =
-  admit()
-
-// Shift right
-let scalar_shr (#ty0 #ty1 : scalar_ty)
-    (x : scalar ty0) (y : scalar ty1) : result (scalar ty0) =
-  admit()
-
-(** Cast an integer from a [src_ty] to a [tgt_ty] *)
-// TODO: check the semantics of casts in Rust
-let scalar_cast (src_ty : scalar_ty) (tgt_ty : scalar_ty) (x : scalar src_ty) : result (scalar tgt_ty) =
-  mk_scalar tgt_ty x
-
-// This can't fail, but for now we make all casts faillible (easier for the translation)
-let scalar_cast_bool (tgt_ty : scalar_ty) (x : bool) : result (scalar tgt_ty) =
-  mk_scalar tgt_ty (if x then 1 else 0)
-
-/// The scalar types
-type isize : eqtype = scalar Isize
-type i8    : eqtype = scalar I8
-type i16   : eqtype = scalar I16
-type i32   : eqtype = scalar I32
-type i64   : eqtype = scalar I64
-type i128  : eqtype = scalar I128
-type usize : eqtype = scalar Usize
-type u8    : eqtype = scalar U8
-type u16   : eqtype = scalar U16
-type u32   : eqtype = scalar U32
-type u64   : eqtype = scalar U64
-type u128  : eqtype = scalar U128
-
-
-let core_isize_min : isize = isize_min
-let core_isize_max : isize = isize_max
-let core_i8_min    : i8 = i8_min
-let core_i8_max    : i8 = i8_max
-let core_i16_min   : i16 = i16_min
-let core_i16_max   : i16 = i16_max
-let core_i32_min   : i32 = i32_min
-let core_i32_max   : i32 = i32_max
-let core_i64_min   : i64 = i64_min
-let core_i64_max   : i64 = i64_max
-let core_i128_min  : i128 = i128_min
-let core_i128_max  : i128 = i128_max
-
-let core_usize_min : usize = usize_min
-let core_usize_max : usize = usize_max
-let core_u8_min    : u8 = u8_min
-let core_u8_max    : u8 = u8_max
-let core_u16_min   : u16 = u16_min
-let core_u16_max   : u16 = u16_max
-let core_u32_min   : u32 = u32_min
-let core_u32_max   : u32 = u32_max
-let core_u64_min   : u64 = u64_min
-let core_u64_max   : u64 = u64_max
-let core_u128_min  : u128 = u128_min
-let core_u128_max  : u128 = u128_max
-
-/// Negation
-let isize_neg = scalar_neg #Isize
-let i8_neg = scalar_neg #I8
-let i16_neg = scalar_neg #I16
-let i32_neg = scalar_neg #I32
-let i64_neg = scalar_neg #I64
-let i128_neg = scalar_neg #I128
-
-/// Division
-let isize_div = scalar_div #Isize
-let i8_div = scalar_div #I8
-let i16_div = scalar_div #I16
-let i32_div = scalar_div #I32
-let i64_div = scalar_div #I64
-let i128_div = scalar_div #I128
-let usize_div = scalar_div #Usize
-let u8_div = scalar_div #U8
-let u16_div = scalar_div #U16
-let u32_div = scalar_div #U32
-let u64_div = scalar_div #U64
-let u128_div = scalar_div #U128
-
-/// Remainder
-let isize_rem = scalar_rem #Isize
-let i8_rem = scalar_rem #I8
-let i16_rem = scalar_rem #I16
-let i32_rem = scalar_rem #I32
-let i64_rem = scalar_rem #I64
-let i128_rem = scalar_rem #I128
-let usize_rem = scalar_rem #Usize
-let u8_rem = scalar_rem #U8
-let u16_rem = scalar_rem #U16
-let u32_rem = scalar_rem #U32
-let u64_rem = scalar_rem #U64
-let u128_rem = scalar_rem #U128
-
-/// Addition
-let isize_add = scalar_add #Isize
-let i8_add = scalar_add #I8
-let i16_add = scalar_add #I16
-let i32_add = scalar_add #I32
-let i64_add = scalar_add #I64
-let i128_add = scalar_add #I128
-let usize_add = scalar_add #Usize
-let u8_add = scalar_add #U8
-let u16_add = scalar_add #U16
-let u32_add = scalar_add #U32
-let u64_add = scalar_add #U64
-let u128_add = scalar_add #U128
-
-/// Subtraction
-let isize_sub = scalar_sub #Isize
-let i8_sub = scalar_sub #I8
-let i16_sub = scalar_sub #I16
-let i32_sub = scalar_sub #I32
-let i64_sub = scalar_sub #I64
-let i128_sub = scalar_sub #I128
-let usize_sub = scalar_sub #Usize
-let u8_sub = scalar_sub #U8
-let u16_sub = scalar_sub #U16
-let u32_sub = scalar_sub #U32
-let u64_sub = scalar_sub #U64
-let u128_sub = scalar_sub #U128
-
-/// Multiplication
-let isize_mul = scalar_mul #Isize
-let i8_mul = scalar_mul #I8
-let i16_mul = scalar_mul #I16
-let i32_mul = scalar_mul #I32
-let i64_mul = scalar_mul #I64
-let i128_mul = scalar_mul #I128
-let usize_mul = scalar_mul #Usize
-let u8_mul = scalar_mul #U8
-let u16_mul = scalar_mul #U16
-let u32_mul = scalar_mul #U32
-let u64_mul = scalar_mul #U64
-let u128_mul = scalar_mul #U128
-
-/// Xor
-let u8_xor = scalar_xor #U8
-let u16_xor = scalar_xor #U16
-let u32_xor = scalar_xor #U32
-let u64_xor = scalar_xor #U64
-let u128_xor = scalar_xor #U128
-let usize_xor = scalar_xor #Usize
-let i8_xor = scalar_xor #I8
-let i16_xor = scalar_xor #I16
-let i32_xor = scalar_xor #I32
-let i64_xor = scalar_xor #I64
-let i128_xor = scalar_xor #I128
-let isize_xor = scalar_xor #Isize
-
-/// Or
-let u8_or = scalar_or #U8
-let u16_or = scalar_or #U16
-let u32_or = scalar_or #U32
-let u64_or = scalar_or #U64
-let u128_or = scalar_or #U128
-let usize_or = scalar_or #Usize
-let i8_or = scalar_or #I8
-let i16_or = scalar_or #I16
-let i32_or = scalar_or #I32
-let i64_or = scalar_or #I64
-let i128_or = scalar_or #I128
-let isize_or = scalar_or #Isize
-
-/// And
-let u8_and = scalar_and #U8
-let u16_and = scalar_and #U16
-let u32_and = scalar_and #U32
-let u64_and = scalar_and #U64
-let u128_and = scalar_and #U128
-let usize_and = scalar_and #Usize
-let i8_and = scalar_and #I8
-let i16_and = scalar_and #I16
-let i32_and = scalar_and #I32
-let i64_and = scalar_and #I64
-let i128_and = scalar_and #I128
-let isize_and = scalar_and #Isize
-
-/// Shift left
-let u8_shl #ty = scalar_shl #U8 #ty
-let u16_shl #ty = scalar_shl #U16 #ty
-let u32_shl #ty = scalar_shl #U32 #ty
-let u64_shl #ty = scalar_shl #U64 #ty
-let u128_shl #ty = scalar_shl #U128 #ty
-let usize_shl #ty = scalar_shl #Usize #ty
-let i8_shl #ty = scalar_shl #I8 #ty
-let i16_shl #ty = scalar_shl #I16 #ty
-let i32_shl #ty = scalar_shl #I32 #ty
-let i64_shl #ty = scalar_shl #I64 #ty
-let i128_shl #ty = scalar_shl #I128 #ty
-let isize_shl #ty = scalar_shl #Isize #ty
-
-/// Shift right
-let u8_shr #ty = scalar_shr #U8 #ty
-let u16_shr #ty = scalar_shr #U16 #ty
-let u32_shr #ty = scalar_shr #U32 #ty
-let u64_shr #ty = scalar_shr #U64 #ty
-let u128_shr #ty = scalar_shr #U128 #ty
-let usize_shr #ty = scalar_shr #Usize #ty
-let i8_shr #ty = scalar_shr #I8 #ty
-let i16_shr #ty = scalar_shr #I16 #ty
-let i32_shr #ty = scalar_shr #I32 #ty
-let i64_shr #ty = scalar_shr #I64 #ty
-let i128_shr #ty = scalar_shr #I128 #ty
-let isize_shr #ty = scalar_shr #Isize #ty
-
-(*** core *)
-
-/// Trait declaration: [core::clone::Clone]
-noeq type core_clone_Clone (self : Type0) = {
-  clone : self → result self
-}
-
-let core_clone_impls_CloneBool_clone (b : bool) : bool = b
-
-let core_clone_CloneBool : core_clone_Clone bool = {
-  clone = fun b -> Ok (core_clone_impls_CloneBool_clone b)
-}
-
-let core_clone_impls_CloneUsize_clone (x : usize) : usize = x
-let core_clone_impls_CloneU8_clone (x : u8) : u8 = x
-let core_clone_impls_CloneU16_clone (x : u16) : u16 = x
-let core_clone_impls_CloneU32_clone (x : u32) : u32 = x
-let core_clone_impls_CloneU64_clone (x : u64) : u64 = x
-let core_clone_impls_CloneU128_clone (x : u128) : u128 = x
-
-let core_clone_impls_CloneIsize_clone (x : isize) : isize = x
-let core_clone_impls_CloneI8_clone (x : i8) : i8 = x
-let core_clone_impls_CloneI16_clone (x : i16) : i16 = x
-let core_clone_impls_CloneI32_clone (x : i32) : i32 = x
-let core_clone_impls_CloneI64_clone (x : i64) : i64 = x
-let core_clone_impls_CloneI128_clone (x : i128) : i128 = x
-
-let core_clone_CloneUsize : core_clone_Clone usize = {
-  clone = fun x -> Ok (core_clone_impls_CloneUsize_clone x)
-}
-
-let core_clone_CloneU8 : core_clone_Clone u8 = {
-  clone = fun x -> Ok (core_clone_impls_CloneU8_clone x)
-}
-
-let core_clone_CloneU16 : core_clone_Clone u16 = {
-  clone = fun x -> Ok (core_clone_impls_CloneU16_clone x)
-}
-
-let core_clone_CloneU32 : core_clone_Clone u32 = {
-  clone = fun x -> Ok (core_clone_impls_CloneU32_clone x)
-}
-
-let core_clone_CloneU64 : core_clone_Clone u64 = {
-  clone = fun x -> Ok (core_clone_impls_CloneU64_clone x)
-}
-
-let core_clone_CloneU128 : core_clone_Clone u128 = {
-  clone = fun x -> Ok (core_clone_impls_CloneU128_clone x)
-}
-
-let core_clone_CloneIsize : core_clone_Clone isize = {
-  clone = fun x -> Ok (core_clone_impls_CloneIsize_clone x)
-}
-
-let core_clone_CloneI8 : core_clone_Clone i8 = {
-  clone = fun x -> Ok (core_clone_impls_CloneI8_clone x)
-}
-
-let core_clone_CloneI16 : core_clone_Clone i16 = {
-  clone = fun x -> Ok (core_clone_impls_CloneI16_clone x)
-}
-
-let core_clone_CloneI32 : core_clone_Clone i32 = {
-  clone = fun x -> Ok (core_clone_impls_CloneI32_clone x)
-}
-
-let core_clone_CloneI64 : core_clone_Clone i64 = {
-  clone = fun x -> Ok (core_clone_impls_CloneI64_clone x)
-}
-
-let core_clone_CloneI128 : core_clone_Clone i128 = {
-  clone = fun x -> Ok (core_clone_impls_CloneI128_clone x)
-}
-
-(** [core::option::{core::option::Option<T>}::unwrap] *)
-let core_option_Option_unwrap (t : Type0) (x : option t) : result t =
-  match x with
-  | None -> Fail Failure
-  | Some x -> Ok x
-
-(*** core::ops *)
-
-// Trait declaration: [core::ops::index::Index]
-noeq type core_ops_index_Index (self idx : Type0) = {
-  output : Type0;
-  index : self → idx → result output
-}
-
-// Trait declaration: [core::ops::index::IndexMut]
-noeq type core_ops_index_IndexMut (self idx : Type0) = {
-  indexInst : core_ops_index_Index self idx;
-  index_mut : self → idx → result (indexInst.output & (indexInst.output → result self));
-}
-
-// Trait declaration [core::ops::deref::Deref]
-noeq type core_ops_deref_Deref (self : Type0) = {
-  target : Type0;
-  deref : self → result target;
-}
-
-// Trait declaration [core::ops::deref::DerefMut]
-noeq type core_ops_deref_DerefMut (self : Type0) = {
-  derefInst : core_ops_deref_Deref self;
-  deref_mut : self → result (derefInst.target & (derefInst.target → result self));
-}
-
-type core_ops_range_Range (a : Type0) = {
-  start : a;
-  end_ : a;
-}
-
-(*** [alloc] *)
-
-let alloc_boxed_Box_deref (t : Type0) (x : t) : result t = Ok x
-let alloc_boxed_Box_deref_mut (t : Type0) (x : t) : result (t & (t -> result t)) =
-  Ok (x, (fun x -> Ok x))
-
-// Trait instance
-let alloc_boxed_Box_coreopsDerefInst (self : Type0) : core_ops_deref_Deref self = {
-  target = self;
-  deref = alloc_boxed_Box_deref self;
-}
-
-// Trait instance
-let alloc_boxed_Box_coreopsDerefMutInst (self : Type0) : core_ops_deref_DerefMut self = {
-  derefInst = alloc_boxed_Box_coreopsDerefInst self;
-  deref_mut = alloc_boxed_Box_deref_mut self;
-}
-
-(*** Array *)
-type array (a : Type0) (n : usize) = s:list a{length s = n}
-
-// We tried putting the normalize_term condition as a refinement on the list
-// but it didn't work. It works with the requires clause.
-let mk_array (a : Type0) (n : usize)
-  (l : list a) :
-  Pure (array a n)
-  (requires (normalize_term(FStar.List.Tot.length l) = n))
-  (ensures (fun _ -> True)) =
-  normalize_term_spec (FStar.List.Tot.length l);
-  l
-
-let array_index_usize (a : Type0) (n : usize) (x : array a n) (i : usize) : result a =
-  if i < length x then Ok (index x i)
-  else Fail Failure
-
-let array_update_usize (a : Type0) (n : usize) (x : array a n) (i : usize) (nx : a) :
-  result (array a n) =
-  if i < length x then Ok (list_update x i nx)
-  else Fail Failure
-
-let array_index_mut_usize (a : Type0) (n : usize) (x : array a n) (i : usize) :
-  result (a & (a -> result (array a n))) =
-  match array_index_usize a n x i with
-  | Fail e -> Fail e
-  | Ok v ->
-    Ok (v, array_update_usize a n x i)
-
-(*** Slice *)
-type slice (a : Type0) = s:list a{length s <= usize_max}
-
-let slice_len (a : Type0) (s : slice a) : usize = length s
-
-let slice_index_usize (a : Type0) (x : slice a) (i : usize) : result a =
-  if i < length x then Ok (index x i)
-  else Fail Failure
-
-let slice_update_usize (a : Type0) (x : slice a) (i : usize) (nx : a) : result (slice a) =
-  if i < length x then Ok (list_update x i nx)
-  else Fail Failure
-
-let slice_index_mut_usize (a : Type0) (s : slice a) (i : usize) :
-  result (a & (a -> result (slice a))) =
-  match slice_index_usize a s i with
-  | Fail e -> Fail e
-  | Ok x ->
-    Ok (x, slice_update_usize a s i)
-
-(*** Subslices *)
-
-let array_to_slice (a : Type0) (n : usize) (x : array a n) : result (slice a) = Ok x
-let array_from_slice (a : Type0) (n : usize) (x : array a n) (s : slice a) : result (array a n) =
-  if length s = n then Ok s
-  else Fail Failure
-
-let array_to_slice_mut (a : Type0) (n : usize) (x : array a n) :
-  result (slice a & (slice a -> result (array a n))) =
-  Ok (x, array_from_slice a n x)
-
-// TODO: finish the definitions below (there lacks [List.drop] and [List.take] in the standard library *)
-let array_subslice (a : Type0) (n : usize) (x : array a n) (r : core_ops_range_Range usize) : result (slice a) =
-  admit()
-
-let array_update_subslice (a : Type0) (n : usize) (x : array a n) (r : core_ops_range_Range usize) (ns : slice a) : result (array a n) =
-  admit()
-
-let array_repeat (a : Type0) (n : usize) (x : a) : array a n =
-  admit()
-
-let slice_subslice (a : Type0) (x : slice a) (r : core_ops_range_Range usize) : result (slice a) =
-  admit()
-
-let slice_update_subslice (a : Type0) (x : slice a) (r : core_ops_range_Range usize) (ns : slice a) : result (slice a) =
-  admit()
-
-(*** Vector *)
-type alloc_vec_Vec (a : Type0) = v:list a{length v <= usize_max}
-
-let alloc_vec_Vec_new (a  : Type0) : alloc_vec_Vec a = assert_norm(length #a [] == 0); []
-let alloc_vec_Vec_len (a : Type0) (v : alloc_vec_Vec a) : usize = length v
-
-// Helper
-let alloc_vec_Vec_index_usize (#a : Type0) (v : alloc_vec_Vec a) (i : usize) : result a =
-  if i < length v then Ok (index v i) else Fail Failure
-// Helper
-let alloc_vec_Vec_update_usize (#a : Type0) (v : alloc_vec_Vec a) (i : usize) (x : a) : result (alloc_vec_Vec a) =
-  if i < length v then Ok (list_update v i x) else Fail Failure
-
-let alloc_vec_Vec_index_mut_usize (#a : Type0) (v: alloc_vec_Vec a) (i: usize) :
-  result (a & (a → result (alloc_vec_Vec a))) =
-  match alloc_vec_Vec_index_usize v i with
-  | Ok x ->
-    Ok (x, alloc_vec_Vec_update_usize v i)
-  | Fail e -> Fail e
-
-let alloc_vec_Vec_push (a  : Type0) (v : alloc_vec_Vec a) (x : a) :
-  Pure (result (alloc_vec_Vec a))
-  (requires True)
-  (ensures (fun res ->
-    match res with
-    | Fail e -> e == Failure
-    | Ok v' -> length v' = length v + 1)) =
-  if length v < usize_max then begin
-    (**) assert_norm(length [x] == 1);
-    (**) append_length v [x];
-    (**) assert(length (append v [x]) = length v + 1);
-    Ok (append v [x])
-    end
-  else Fail Failure
-
-let alloc_vec_Vec_insert (a : Type0) (v : alloc_vec_Vec a) (i : usize) (x : a) : result (alloc_vec_Vec a) =
-  if i < length v then Ok (list_update v i x) else Fail Failure
-
-// Trait declaration: [core::slice::index::private_slice_index::Sealed]
-type core_slice_index_private_slice_index_Sealed (self : Type0) = unit
-
-// Trait declaration: [core::slice::index::SliceIndex]
-noeq type core_slice_index_SliceIndex (self t : Type0) = {
-  sealedInst : core_slice_index_private_slice_index_Sealed self;
-  output : Type0;
-  get : self → t → result (option output);
-  get_mut : self → t → result (option output & (option output -> result t));
-  get_unchecked : self → const_raw_ptr t → result (const_raw_ptr output);
-  get_unchecked_mut : self → mut_raw_ptr t → result (mut_raw_ptr output);
-  index : self → t → result output;
-  index_mut : self → t → result (output & (output -> result t));
-}
-
-// [core::slice::index::[T]::index]: forward function
-let core_slice_index_Slice_index
-  (t idx : Type0) (inst : core_slice_index_SliceIndex idx (slice t))
-  (s : slice t) (i : idx) : result inst.output =
-  let* x = inst.get i s in
-  match x with
-  | None -> Fail Failure
-  | Some x -> Ok x
-
-// [core::slice::index::Range:::get]: forward function
-let core_slice_index_RangeUsize_get (t : Type0) (i : core_ops_range_Range usize) (s : slice t) :
-  result (option (slice t)) =
-  admit () // TODO
-
-// [core::slice::index::Range::get_mut]: forward function
-let core_slice_index_RangeUsize_get_mut (t : Type0) :
-  core_ops_range_Range usize → slice t → result (option (slice t) & (option (slice t) -> result (slice t))) =
-  admit () // TODO
-
-// [core::slice::index::Range::get_unchecked]: forward function
-let core_slice_index_RangeUsize_get_unchecked
-  (t : Type0) :
-  core_ops_range_Range usize → const_raw_ptr (slice t) → result (const_raw_ptr (slice t)) =
-  // Don't know what the model should be - for now we always fail to make
-  // sure code which uses it fails
-  fun _ _ -> Fail Failure
-
-// [core::slice::index::Range::get_unchecked_mut]: forward function
-let core_slice_index_RangeUsize_get_unchecked_mut
-  (t : Type0) :
-  core_ops_range_Range usize → mut_raw_ptr (slice t) → result (mut_raw_ptr (slice t)) =
-  // Don't know what the model should be - for now we always fail to make
-  // sure code which uses it fails
-  fun _ _ -> Fail Failure
-
-// [core::slice::index::Range::index]: forward function
-let core_slice_index_RangeUsize_index
-  (t : Type0) : core_ops_range_Range usize → slice t → result (slice t) =
-  admit () // TODO
-
-// [core::slice::index::Range::index_mut]: forward function
-let core_slice_index_RangeUsize_index_mut (t : Type0) :
-  core_ops_range_Range usize → slice t → result (slice t & (slice t -> result (slice t))) =
-  admit () // TODO
-
-// [core::slice::index::[T]::index_mut]: forward function
-let core_slice_index_Slice_index_mut
-  (t idx : Type0) (inst : core_slice_index_SliceIndex idx (slice t)) :
-  slice t → idx → result (inst.output & (inst.output -> result (slice t))) =
-  admit () // 
-
-// [core::array::[T; N]::index]: forward function
-let core_array_Array_index
-  (t idx : Type0) (n : usize) (inst : core_ops_index_Index (slice t) idx)
-  (a : array t n) (i : idx) : result inst.output =
-  admit () // TODO
-
-// [core::array::[T; N]::index_mut]: forward function
-let core_array_Array_index_mut
-  (t idx : Type0) (n : usize) (inst : core_ops_index_IndexMut (slice t) idx)
-  (a : array t n) (i : idx) :
-  result (inst.indexInst.output & (inst.indexInst.output -> result (array t n))) =
-  admit () // TODO
-
-// Trait implementation: [core::slice::index::private_slice_index::Range]
-let core_slice_index_private_slice_index_SealedRangeUsizeInst
-  : core_slice_index_private_slice_index_Sealed (core_ops_range_Range usize) = ()
-
-// Trait implementation: [core::slice::index::Range]
-let core_slice_index_SliceIndexRangeUsizeSliceTInst (t : Type0) :
-  core_slice_index_SliceIndex (core_ops_range_Range usize) (slice t) = {
-  sealedInst = core_slice_index_private_slice_index_SealedRangeUsizeInst;
-  output = slice t;
-  get = core_slice_index_RangeUsize_get t;
-  get_mut = core_slice_index_RangeUsize_get_mut t;
-  get_unchecked = core_slice_index_RangeUsize_get_unchecked t;
-  get_unchecked_mut = core_slice_index_RangeUsize_get_unchecked_mut t;
-  index = core_slice_index_RangeUsize_index t;
-  index_mut = core_slice_index_RangeUsize_index_mut t;
-}
-
-// Trait implementation: [core::slice::index::[T]]
-let core_ops_index_IndexSliceTIInst (t idx : Type0)
-  (inst : core_slice_index_SliceIndex idx (slice t)) :
-  core_ops_index_Index (slice t) idx = {
-  output = inst.output;
-  index = core_slice_index_Slice_index t idx inst;
-}
-
-// Trait implementation: [core::slice::index::[T]]
-let core_ops_index_IndexMutSliceTIInst (t idx : Type0)
-  (inst : core_slice_index_SliceIndex idx (slice t)) :
-  core_ops_index_IndexMut (slice t) idx = {
-  indexInst = core_ops_index_IndexSliceTIInst t idx inst;
-  index_mut = core_slice_index_Slice_index_mut t idx inst;
-}
-
-// Trait implementation: [core::array::[T; N]]
-let core_ops_index_IndexArrayInst (t idx : Type0) (n : usize)
-  (inst : core_ops_index_Index (slice t) idx) :
-  core_ops_index_Index (array t n) idx = {
-  output = inst.output;
-  index = core_array_Array_index t idx n inst;
-}
-
-// Trait implementation: [core::array::[T; N]]
-let core_ops_index_IndexMutArrayIInst (t idx : Type0) (n : usize)
-  (inst : core_ops_index_IndexMut (slice t) idx) :
-  core_ops_index_IndexMut (array t n) idx = {
-  indexInst = core_ops_index_IndexArrayInst t idx n inst.indexInst;
-  index_mut = core_array_Array_index_mut t idx n inst;
-}
-
-// [core::slice::index::usize::get]: forward function
-let core_slice_index_usize_get
-  (t : Type0) : usize → slice t → result (option t) =
-  admit () // TODO
-
-// [core::slice::index::usize::get_mut]: forward function
-let core_slice_index_usize_get_mut (t : Type0) :
-  usize → slice t → result (option t & (option t -> result (slice t))) =
-  admit () // TODO
-
-// [core::slice::index::usize::get_unchecked]: forward function
-let core_slice_index_usize_get_unchecked
-  (t : Type0) : usize → const_raw_ptr (slice t) → result (const_raw_ptr t) =
-  admit () // TODO
-
-// [core::slice::index::usize::get_unchecked_mut]: forward function
-let core_slice_index_usize_get_unchecked_mut
-  (t : Type0) : usize → mut_raw_ptr (slice t) → result (mut_raw_ptr t) =
-  admit () // TODO
-
-// [core::slice::index::usize::index]: forward function
-let core_slice_index_usize_index (t : Type0) : usize → slice t → result t =
-  admit () // TODO
-
-// [core::slice::index::usize::index_mut]: forward function
-let core_slice_index_usize_index_mut (t : Type0) :
-  usize → slice t → result (t & (t -> result (slice t))) =
-  admit () // TODO
-
-// Trait implementation: [core::slice::index::private_slice_index::usize]
-let core_slice_index_private_slice_index_SealedUsizeInst
-  : core_slice_index_private_slice_index_Sealed usize = ()
-
-// Trait implementation: [core::slice::index::usize]
-let core_slice_index_SliceIndexUsizeSliceTInst (t : Type0) :
-  core_slice_index_SliceIndex usize (slice t) = {
-  sealedInst = core_slice_index_private_slice_index_SealedUsizeInst;
-  output = t;
-  get = core_slice_index_usize_get t;
-  get_mut = core_slice_index_usize_get_mut t;
-  get_unchecked = core_slice_index_usize_get_unchecked t;
-  get_unchecked_mut = core_slice_index_usize_get_unchecked_mut t;
-  index = core_slice_index_usize_index t;
-  index_mut = core_slice_index_usize_index_mut t;
-}
-
-// [alloc::vec::Vec::index]: forward function
-let alloc_vec_Vec_index (t idx : Type0) (inst : core_slice_index_SliceIndex idx (slice t))
-  (self : alloc_vec_Vec t) (i : idx) : result inst.output =
-  admit () // TODO
-
-// [alloc::vec::Vec::index_mut]: forward function
-let alloc_vec_Vec_index_mut (t idx : Type0) (inst : core_slice_index_SliceIndex idx (slice t))
-  (self : alloc_vec_Vec t) (i : idx) :
-  result (inst.output & (inst.output -> result (alloc_vec_Vec t))) =
-  admit () // TODO
-
-// Trait implementation: [alloc::vec::Vec]
-let alloc_vec_Vec_coreopsindexIndexInst (t idx : Type0)
-  (inst : core_slice_index_SliceIndex idx (slice t)) :
-  core_ops_index_Index (alloc_vec_Vec t) idx = {
-  output = inst.output;
-  index = alloc_vec_Vec_index t idx inst;
-}
-
-// Trait implementation: [alloc::vec::Vec]
-let alloc_vec_Vec_coreopsindexIndexMutInst (t idx : Type0)
-  (inst : core_slice_index_SliceIndex idx (slice t)) :
-  core_ops_index_IndexMut (alloc_vec_Vec t) idx = {
-  indexInst = alloc_vec_Vec_coreopsindexIndexInst t idx inst;
-  index_mut = alloc_vec_Vec_index_mut t idx inst;
-}
-
-(*** Theorems *)
-
-let alloc_vec_Vec_index_eq (#a : Type0) (v : alloc_vec_Vec a) (i : usize) :
-  Lemma (
-    alloc_vec_Vec_index a usize (core_slice_index_SliceIndexUsizeSliceTInst a) v i ==
-      alloc_vec_Vec_index_usize v i)
-  [SMTPat (alloc_vec_Vec_index a usize (core_slice_index_SliceIndexUsizeSliceTInst a) v i)]
-  =
-  admit()
-
-let alloc_vec_Vec_index_mut_eq (#a : Type0) (v : alloc_vec_Vec a) (i : usize) :
-  Lemma (
-    alloc_vec_Vec_index_mut a usize (core_slice_index_SliceIndexUsizeSliceTInst a) v i ==
-      alloc_vec_Vec_index_mut_usize v i)
-  [SMTPat (alloc_vec_Vec_index_mut a usize (core_slice_index_SliceIndexUsizeSliceTInst a) v i)]
-  =
-  admit()
diff --git a/tests/hol4/constants/Holmakefile b/tests/hol4/constants/Holmakefile
new file mode 100644
index 00000000..3c4b8973
--- /dev/null
+++ b/tests/hol4/constants/Holmakefile
@@ -0,0 +1,5 @@
+# This file was automatically generated - modify ../Holmakefile.template instead
+INCLUDES =  ../../../backends/hol4
+
+all: $(DEFAULT_TARGETS)
+.PHONY: all
diff --git a/tests/hol4/constants/constantsScript.sml b/tests/hol4/constants/constantsScript.sml
new file mode 100644
index 00000000..40a319c6
--- /dev/null
+++ b/tests/hol4/constants/constantsScript.sml
@@ -0,0 +1,217 @@
+(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
+(** [constants] *)
+open primitivesLib divDefLib
+
+val _ = new_theory "constants"
+
+
+(** [constants::X0] *)
+Definition x0_body_def:
+  x0_body : u32 result = Return (int_to_u32 0)
+End
+Definition x0_c_def:
+  x0_c : u32 = get_return_value x0_body
+End
+
+(** [constants::X1] *)
+Definition x1_body_def:
+  x1_body : u32 result = Return core_u32_max
+End
+Definition x1_c_def:
+  x1_c : u32 = get_return_value x1_body
+End
+
+(** [constants::X2] *)
+Definition x2_body_def:
+  x2_body : u32 result = Return (int_to_u32 3)
+End
+Definition x2_c_def:
+  x2_c : u32 = get_return_value x2_body
+End
+
+val incr_fwd_def = Define ‘
+  (** [constants::incr]: forward function *)
+  incr_fwd (n : u32) : u32 result =
+    u32_add n (int_to_u32 1)
+’
+
+(** [constants::X3] *)
+Definition x3_body_def:
+  x3_body : u32 result = incr_fwd (int_to_u32 32)
+End
+Definition x3_c_def:
+  x3_c : u32 = get_return_value x3_body
+End
+
+val mk_pair0_fwd_def = Define ‘
+  (** [constants::mk_pair0]: forward function *)
+  mk_pair0_fwd (x : u32) (y : u32) : (u32 # u32) result =
+    Return (x, y)
+’
+
+Datatype:
+  (** [constants::Pair] *)
+  pair_t = <| pair_x : 't1; pair_y : 't2; |>
+End
+
+val mk_pair1_fwd_def = Define ‘
+  (** [constants::mk_pair1]: forward function *)
+  mk_pair1_fwd (x : u32) (y : u32) : (u32, u32) pair_t result =
+    Return (<| pair_x := x; pair_y := y |>)
+’
+
+(** [constants::P0] *)
+Definition p0_body_def:
+  p0_body : (u32 # u32) result = mk_pair0_fwd (int_to_u32 0) (int_to_u32 1)
+End
+Definition p0_c_def:
+  p0_c : (u32 # u32) = get_return_value p0_body
+End
+
+(** [constants::P1] *)
+Definition p1_body_def:
+  p1_body : (u32, u32) pair_t result =
+    mk_pair1_fwd (int_to_u32 0) (int_to_u32 1)
+End
+Definition p1_c_def:
+  p1_c : (u32, u32) pair_t = get_return_value p1_body
+End
+
+(** [constants::P2] *)
+Definition p2_body_def:
+  p2_body : (u32 # u32) result = Return (int_to_u32 0, int_to_u32 1)
+End
+Definition p2_c_def:
+  p2_c : (u32 # u32) = get_return_value p2_body
+End
+
+(** [constants::P3] *)
+Definition p3_body_def:
+  p3_body : (u32, u32) pair_t result =
+    Return (<| pair_x := (int_to_u32 0); pair_y := (int_to_u32 1) |>)
+End
+Definition p3_c_def:
+  p3_c : (u32, u32) pair_t = get_return_value p3_body
+End
+
+Datatype:
+  (** [constants::Wrap] *)
+  wrap_t = <| wrap_val : 't; |>
+End
+
+val wrap_new_fwd_def = Define ‘
+  (** [constants::Wrap::{0}::new]: forward function *)
+  wrap_new_fwd (val : 't) : 't wrap_t result =
+    Return (<| wrap_val := val |>)
+’
+
+(** [constants::Y] *)
+Definition y_body_def:
+  y_body : i32 wrap_t result = wrap_new_fwd (int_to_i32 2)
+End
+Definition y_c_def:
+  y_c : i32 wrap_t = get_return_value y_body
+End
+
+val unwrap_y_fwd_def = Define ‘
+  (** [constants::unwrap_y]: forward function *)
+  unwrap_y_fwd : i32 result =
+    Return y_c.wrap_val
+’
+
+(** [constants::YVAL] *)
+Definition yval_body_def:
+  yval_body : i32 result = unwrap_y_fwd
+End
+Definition yval_c_def:
+  yval_c : i32 = get_return_value yval_body
+End
+
+(** [constants::get_z1::Z1] *)
+Definition get_z1_z1_body_def:
+  get_z1_z1_body : i32 result = Return (int_to_i32 3)
+End
+Definition get_z1_z1_c_def:
+  get_z1_z1_c : i32 = get_return_value get_z1_z1_body
+End
+
+val get_z1_fwd_def = Define ‘
+  (** [constants::get_z1]: forward function *)
+  get_z1_fwd : i32 result =
+    Return get_z1_z1_c
+’
+
+val add_fwd_def = Define ‘
+  (** [constants::add]: forward function *)
+  add_fwd (a : i32) (b : i32) : i32 result =
+    i32_add a b
+’
+
+(** [constants::Q1] *)
+Definition q1_body_def:
+  q1_body : i32 result = Return (int_to_i32 5)
+End
+Definition q1_c_def:
+  q1_c : i32 = get_return_value q1_body
+End
+
+(** [constants::Q2] *)
+Definition q2_body_def:
+  q2_body : i32 result = Return q1_c
+End
+Definition q2_c_def:
+  q2_c : i32 = get_return_value q2_body
+End
+
+(** [constants::Q3] *)
+Definition q3_body_def:
+  q3_body : i32 result = add_fwd q2_c (int_to_i32 3)
+End
+Definition q3_c_def:
+  q3_c : i32 = get_return_value q3_body
+End
+
+val get_z2_fwd_def = Define ‘
+  (** [constants::get_z2]: forward function *)
+  get_z2_fwd : i32 result =
+    do
+    i <- get_z1_fwd;
+    i0 <- add_fwd i q3_c;
+    add_fwd q1_c i0
+    od
+’
+
+(** [constants::S1] *)
+Definition s1_body_def:
+  s1_body : u32 result = Return (int_to_u32 6)
+End
+Definition s1_c_def:
+  s1_c : u32 = get_return_value s1_body
+End
+
+(** [constants::S2] *)
+Definition s2_body_def:
+  s2_body : u32 result = incr_fwd s1_c
+End
+Definition s2_c_def:
+  s2_c : u32 = get_return_value s2_body
+End
+
+(** [constants::S3] *)
+Definition s3_body_def:
+  s3_body : (u32, u32) pair_t result = Return p3_c
+End
+Definition s3_c_def:
+  s3_c : (u32, u32) pair_t = get_return_value s3_body
+End
+
+(** [constants::S4] *)
+Definition s4_body_def:
+  s4_body : (u32, u32) pair_t result =
+    mk_pair1_fwd (int_to_u32 7) (int_to_u32 8)
+End
+Definition s4_c_def:
+  s4_c : (u32, u32) pair_t = get_return_value s4_body
+End
+
+val _ = export_theory ()
diff --git a/tests/hol4/constants/constantsTheory.sig b/tests/hol4/constants/constantsTheory.sig
new file mode 100644
index 00000000..287ad5f5
--- /dev/null
+++ b/tests/hol4/constants/constantsTheory.sig
@@ -0,0 +1,538 @@
+signature constantsTheory =
+sig
+  type thm = Thm.thm
+  
+  (*  Definitions  *)
+    val add_fwd_def : thm
+    val get_z1_fwd_def : thm
+    val get_z1_z1_body_def : thm
+    val get_z1_z1_c_def : thm
+    val get_z2_fwd_def : thm
+    val incr_fwd_def : thm
+    val mk_pair0_fwd_def : thm
+    val mk_pair1_fwd_def : thm
+    val p0_body_def : thm
+    val p0_c_def : thm
+    val p1_body_def : thm
+    val p1_c_def : thm
+    val p2_body_def : thm
+    val p2_c_def : thm
+    val p3_body_def : thm
+    val p3_c_def : thm
+    val pair_t_TY_DEF : thm
+    val pair_t_case_def : thm
+    val pair_t_pair_x : thm
+    val pair_t_pair_x_fupd : thm
+    val pair_t_pair_y : thm
+    val pair_t_pair_y_fupd : thm
+    val pair_t_size_def : thm
+    val q1_body_def : thm
+    val q1_c_def : thm
+    val q2_body_def : thm
+    val q2_c_def : thm
+    val q3_body_def : thm
+    val q3_c_def : thm
+    val s1_body_def : thm
+    val s1_c_def : thm
+    val s2_body_def : thm
+    val s2_c_def : thm
+    val s3_body_def : thm
+    val s3_c_def : thm
+    val s4_body_def : thm
+    val s4_c_def : thm
+    val unwrap_y_fwd_def : thm
+    val wrap_new_fwd_def : thm
+    val wrap_t_TY_DEF : thm
+    val wrap_t_case_def : thm
+    val wrap_t_size_def : thm
+    val wrap_t_wrap_val : thm
+    val wrap_t_wrap_val_fupd : thm
+    val x0_body_def : thm
+    val x0_c_def : thm
+    val x1_body_def : thm
+    val x1_c_def : thm
+    val x2_body_def : thm
+    val x2_c_def : thm
+    val x3_body_def : thm
+    val x3_c_def : thm
+    val y_body_def : thm
+    val y_c_def : thm
+    val yval_body_def : thm
+    val yval_c_def : thm
+  
+  (*  Theorems  *)
+    val EXISTS_pair_t : thm
+    val EXISTS_wrap_t : thm
+    val FORALL_pair_t : thm
+    val FORALL_wrap_t : thm
+    val datatype_pair_t : thm
+    val datatype_wrap_t : thm
+    val pair_t_11 : thm
+    val pair_t_Axiom : thm
+    val pair_t_accessors : thm
+    val pair_t_accfupds : thm
+    val pair_t_case_cong : thm
+    val pair_t_case_eq : thm
+    val pair_t_component_equality : thm
+    val pair_t_fn_updates : thm
+    val pair_t_fupdcanon : thm
+    val pair_t_fupdcanon_comp : thm
+    val pair_t_fupdfupds : thm
+    val pair_t_fupdfupds_comp : thm
+    val pair_t_induction : thm
+    val pair_t_literal_11 : thm
+    val pair_t_literal_nchotomy : thm
+    val pair_t_nchotomy : thm
+    val pair_t_updates_eq_literal : thm
+    val wrap_t_11 : thm
+    val wrap_t_Axiom : thm
+    val wrap_t_accessors : thm
+    val wrap_t_accfupds : thm
+    val wrap_t_case_cong : thm
+    val wrap_t_case_eq : thm
+    val wrap_t_component_equality : thm
+    val wrap_t_fn_updates : thm
+    val wrap_t_fupdfupds : thm
+    val wrap_t_fupdfupds_comp : thm
+    val wrap_t_induction : thm
+    val wrap_t_literal_11 : thm
+    val wrap_t_literal_nchotomy : thm
+    val wrap_t_nchotomy : thm
+    val wrap_t_updates_eq_literal : thm
+  
+  val constants_grammars : type_grammar.grammar * term_grammar.grammar
+(*
+   [divDef] Parent theory of "constants"
+   
+   [add_fwd_def]  Definition
+      
+      ⊢ ∀a b. add_fwd a b = i32_add a b
+   
+   [get_z1_fwd_def]  Definition
+      
+      ⊢ get_z1_fwd = Return get_z1_z1_c
+   
+   [get_z1_z1_body_def]  Definition
+      
+      ⊢ get_z1_z1_body = Return (int_to_i32 3)
+   
+   [get_z1_z1_c_def]  Definition
+      
+      ⊢ get_z1_z1_c = get_return_value get_z1_z1_body
+   
+   [get_z2_fwd_def]  Definition
+      
+      ⊢ get_z2_fwd =
+        do i <- get_z1_fwd; i0 <- add_fwd i q3_c; add_fwd q1_c i0 od
+   
+   [incr_fwd_def]  Definition
+      
+      ⊢ ∀n. incr_fwd n = u32_add n (int_to_u32 1)
+   
+   [mk_pair0_fwd_def]  Definition
+      
+      ⊢ ∀x y. mk_pair0_fwd x y = Return (x,y)
+   
+   [mk_pair1_fwd_def]  Definition
+      
+      ⊢ ∀x y. mk_pair1_fwd x y = Return <|pair_x := x; pair_y := y|>
+   
+   [p0_body_def]  Definition
+      
+      ⊢ p0_body = mk_pair0_fwd (int_to_u32 0) (int_to_u32 1)
+   
+   [p0_c_def]  Definition
+      
+      ⊢ p0_c = get_return_value p0_body
+   
+   [p1_body_def]  Definition
+      
+      ⊢ p1_body = mk_pair1_fwd (int_to_u32 0) (int_to_u32 1)
+   
+   [p1_c_def]  Definition
+      
+      ⊢ p1_c = get_return_value p1_body
+   
+   [p2_body_def]  Definition
+      
+      ⊢ p2_body = Return (int_to_u32 0,int_to_u32 1)
+   
+   [p2_c_def]  Definition
+      
+      ⊢ p2_c = get_return_value p2_body
+   
+   [p3_body_def]  Definition
+      
+      ⊢ p3_body = Return <|pair_x := int_to_u32 0; pair_y := int_to_u32 1|>
+   
+   [p3_c_def]  Definition
+      
+      ⊢ p3_c = get_return_value p3_body
+   
+   [pair_t_TY_DEF]  Definition
+      
+      ⊢ ∃rep.
+          TYPE_DEFINITION
+            (λa0'.
+                 ∀ $var$('pair_t').
+                   (∀a0'.
+                      (∃a0 a1.
+                         a0' =
+                         (λa0 a1.
+                              ind_type$CONSTR 0 (a0,a1)
+                                (λn. ind_type$BOTTOM)) a0 a1) ⇒
+                      $var$('pair_t') a0') ⇒
+                   $var$('pair_t') a0') rep
+   
+   [pair_t_case_def]  Definition
+      
+      ⊢ ∀a0 a1 f. pair_t_CASE (pair_t a0 a1) f = f a0 a1
+   
+   [pair_t_pair_x]  Definition
+      
+      ⊢ ∀t t0. (pair_t t t0).pair_x = t
+   
+   [pair_t_pair_x_fupd]  Definition
+      
+      ⊢ ∀f t t0. pair_t t t0 with pair_x updated_by f = pair_t (f t) t0
+   
+   [pair_t_pair_y]  Definition
+      
+      ⊢ ∀t t0. (pair_t t t0).pair_y = t0
+   
+   [pair_t_pair_y_fupd]  Definition
+      
+      ⊢ ∀f t t0. pair_t t t0 with pair_y updated_by f = pair_t t (f t0)
+   
+   [pair_t_size_def]  Definition
+      
+      ⊢ ∀f f1 a0 a1. pair_t_size f f1 (pair_t a0 a1) = 1 + (f a0 + f1 a1)
+   
+   [q1_body_def]  Definition
+      
+      ⊢ q1_body = Return (int_to_i32 5)
+   
+   [q1_c_def]  Definition
+      
+      ⊢ q1_c = get_return_value q1_body
+   
+   [q2_body_def]  Definition
+      
+      ⊢ q2_body = Return q1_c
+   
+   [q2_c_def]  Definition
+      
+      ⊢ q2_c = get_return_value q2_body
+   
+   [q3_body_def]  Definition
+      
+      ⊢ q3_body = add_fwd q2_c (int_to_i32 3)
+   
+   [q3_c_def]  Definition
+      
+      ⊢ q3_c = get_return_value q3_body
+   
+   [s1_body_def]  Definition
+      
+      ⊢ s1_body = Return (int_to_u32 6)
+   
+   [s1_c_def]  Definition
+      
+      ⊢ s1_c = get_return_value s1_body
+   
+   [s2_body_def]  Definition
+      
+      ⊢ s2_body = incr_fwd s1_c
+   
+   [s2_c_def]  Definition
+      
+      ⊢ s2_c = get_return_value s2_body
+   
+   [s3_body_def]  Definition
+      
+      ⊢ s3_body = Return p3_c
+   
+   [s3_c_def]  Definition
+      
+      ⊢ s3_c = get_return_value s3_body
+   
+   [s4_body_def]  Definition
+      
+      ⊢ s4_body = mk_pair1_fwd (int_to_u32 7) (int_to_u32 8)
+   
+   [s4_c_def]  Definition
+      
+      ⊢ s4_c = get_return_value s4_body
+   
+   [unwrap_y_fwd_def]  Definition
+      
+      ⊢ unwrap_y_fwd = Return y_c.wrap_val
+   
+   [wrap_new_fwd_def]  Definition
+      
+      ⊢ ∀val. wrap_new_fwd val = Return <|wrap_val := val|>
+   
+   [wrap_t_TY_DEF]  Definition
+      
+      ⊢ ∃rep.
+          TYPE_DEFINITION
+            (λa0.
+                 ∀ $var$('wrap_t').
+                   (∀a0.
+                      (∃a. a0 =
+                           (λa. ind_type$CONSTR 0 a (λn. ind_type$BOTTOM))
+                             a) ⇒
+                      $var$('wrap_t') a0) ⇒
+                   $var$('wrap_t') a0) rep
+   
+   [wrap_t_case_def]  Definition
+      
+      ⊢ ∀a f. wrap_t_CASE (wrap_t a) f = f a
+   
+   [wrap_t_size_def]  Definition
+      
+      ⊢ ∀f a. wrap_t_size f (wrap_t a) = 1 + f a
+   
+   [wrap_t_wrap_val]  Definition
+      
+      ⊢ ∀t. (wrap_t t).wrap_val = t
+   
+   [wrap_t_wrap_val_fupd]  Definition
+      
+      ⊢ ∀f t. wrap_t t with wrap_val updated_by f = wrap_t (f t)
+   
+   [x0_body_def]  Definition
+      
+      ⊢ x0_body = Return (int_to_u32 0)
+   
+   [x0_c_def]  Definition
+      
+      ⊢ x0_c = get_return_value x0_body
+   
+   [x1_body_def]  Definition
+      
+      ⊢ x1_body = Return core_u32_max
+   
+   [x1_c_def]  Definition
+      
+      ⊢ x1_c = get_return_value x1_body
+   
+   [x2_body_def]  Definition
+      
+      ⊢ x2_body = Return (int_to_u32 3)
+   
+   [x2_c_def]  Definition
+      
+      ⊢ x2_c = get_return_value x2_body
+   
+   [x3_body_def]  Definition
+      
+      ⊢ x3_body = incr_fwd (int_to_u32 32)
+   
+   [x3_c_def]  Definition
+      
+      ⊢ x3_c = get_return_value x3_body
+   
+   [y_body_def]  Definition
+      
+      ⊢ y_body = wrap_new_fwd (int_to_i32 2)
+   
+   [y_c_def]  Definition
+      
+      ⊢ y_c = get_return_value y_body
+   
+   [yval_body_def]  Definition
+      
+      ⊢ yval_body = unwrap_y_fwd
+   
+   [yval_c_def]  Definition
+      
+      ⊢ yval_c = get_return_value yval_body
+   
+   [EXISTS_pair_t]  Theorem
+      
+      ⊢ ∀P. (∃p. P p) ⇔ ∃t0 t. P <|pair_x := t0; pair_y := t|>
+   
+   [EXISTS_wrap_t]  Theorem
+      
+      ⊢ ∀P. (∃w. P w) ⇔ ∃u. P <|wrap_val := u|>
+   
+   [FORALL_pair_t]  Theorem
+      
+      ⊢ ∀P. (∀p. P p) ⇔ ∀t0 t. P <|pair_x := t0; pair_y := t|>
+   
+   [FORALL_wrap_t]  Theorem
+      
+      ⊢ ∀P. (∀w. P w) ⇔ ∀u. P <|wrap_val := u|>
+   
+   [datatype_pair_t]  Theorem
+      
+      ⊢ DATATYPE (record pair_t pair_x pair_y)
+   
+   [datatype_wrap_t]  Theorem
+      
+      ⊢ DATATYPE (record wrap_t wrap_val)
+   
+   [pair_t_11]  Theorem
+      
+      ⊢ ∀a0 a1 a0' a1'. pair_t a0 a1 = pair_t a0' a1' ⇔ a0 = a0' ∧ a1 = a1'
+   
+   [pair_t_Axiom]  Theorem
+      
+      ⊢ ∀f. ∃fn. ∀a0 a1. fn (pair_t a0 a1) = f a0 a1
+   
+   [pair_t_accessors]  Theorem
+      
+      ⊢ (∀t t0. (pair_t t t0).pair_x = t) ∧
+        ∀t t0. (pair_t t t0).pair_y = t0
+   
+   [pair_t_accfupds]  Theorem
+      
+      ⊢ (∀p f. (p with pair_y updated_by f).pair_x = p.pair_x) ∧
+        (∀p f. (p with pair_x updated_by f).pair_y = p.pair_y) ∧
+        (∀p f. (p with pair_x updated_by f).pair_x = f p.pair_x) ∧
+        ∀p f. (p with pair_y updated_by f).pair_y = f p.pair_y
+   
+   [pair_t_case_cong]  Theorem
+      
+      ⊢ ∀M M' f.
+          M = M' ∧ (∀a0 a1. M' = pair_t a0 a1 ⇒ f a0 a1 = f' a0 a1) ⇒
+          pair_t_CASE M f = pair_t_CASE M' f'
+   
+   [pair_t_case_eq]  Theorem
+      
+      ⊢ pair_t_CASE x f = v ⇔ ∃t t0. x = pair_t t t0 ∧ f t t0 = v
+   
+   [pair_t_component_equality]  Theorem
+      
+      ⊢ ∀p1 p2. p1 = p2 ⇔ p1.pair_x = p2.pair_x ∧ p1.pair_y = p2.pair_y
+   
+   [pair_t_fn_updates]  Theorem
+      
+      ⊢ (∀f t t0. pair_t t t0 with pair_x updated_by f = pair_t (f t) t0) ∧
+        ∀f t t0. pair_t t t0 with pair_y updated_by f = pair_t t (f t0)
+   
+   [pair_t_fupdcanon]  Theorem
+      
+      ⊢ ∀p g f.
+          p with <|pair_y updated_by f; pair_x updated_by g|> =
+          p with <|pair_x updated_by g; pair_y updated_by f|>
+   
+   [pair_t_fupdcanon_comp]  Theorem
+      
+      ⊢ (∀g f.
+           pair_y_fupd f ∘ pair_x_fupd g = pair_x_fupd g ∘ pair_y_fupd f) ∧
+        ∀h g f.
+          pair_y_fupd f ∘ pair_x_fupd g ∘ h =
+          pair_x_fupd g ∘ pair_y_fupd f ∘ h
+   
+   [pair_t_fupdfupds]  Theorem
+      
+      ⊢ (∀p g f.
+           p with <|pair_x updated_by f; pair_x updated_by g|> =
+           p with pair_x updated_by f ∘ g) ∧
+        ∀p g f.
+          p with <|pair_y updated_by f; pair_y updated_by g|> =
+          p with pair_y updated_by f ∘ g
+   
+   [pair_t_fupdfupds_comp]  Theorem
+      
+      ⊢ ((∀g f. pair_x_fupd f ∘ pair_x_fupd g = pair_x_fupd (f ∘ g)) ∧
+         ∀h g f.
+           pair_x_fupd f ∘ pair_x_fupd g ∘ h = pair_x_fupd (f ∘ g) ∘ h) ∧
+        (∀g f. pair_y_fupd f ∘ pair_y_fupd g = pair_y_fupd (f ∘ g)) ∧
+        ∀h g f. pair_y_fupd f ∘ pair_y_fupd g ∘ h = pair_y_fupd (f ∘ g) ∘ h
+   
+   [pair_t_induction]  Theorem
+      
+      ⊢ ∀P. (∀t t0. P (pair_t t t0)) ⇒ ∀p. P p
+   
+   [pair_t_literal_11]  Theorem
+      
+      ⊢ ∀t01 t1 t02 t2.
+          <|pair_x := t01; pair_y := t1|> = <|pair_x := t02; pair_y := t2|> ⇔
+          t01 = t02 ∧ t1 = t2
+   
+   [pair_t_literal_nchotomy]  Theorem
+      
+      ⊢ ∀p. ∃t0 t. p = <|pair_x := t0; pair_y := t|>
+   
+   [pair_t_nchotomy]  Theorem
+      
+      ⊢ ∀pp. ∃t t0. pp = pair_t t t0
+   
+   [pair_t_updates_eq_literal]  Theorem
+      
+      ⊢ ∀p t0 t.
+          p with <|pair_x := t0; pair_y := t|> =
+          <|pair_x := t0; pair_y := t|>
+   
+   [wrap_t_11]  Theorem
+      
+      ⊢ ∀a a'. wrap_t a = wrap_t a' ⇔ a = a'
+   
+   [wrap_t_Axiom]  Theorem
+      
+      ⊢ ∀f. ∃fn. ∀a. fn (wrap_t a) = f a
+   
+   [wrap_t_accessors]  Theorem
+      
+      ⊢ ∀t. (wrap_t t).wrap_val = t
+   
+   [wrap_t_accfupds]  Theorem
+      
+      ⊢ ∀w f. (w with wrap_val updated_by f).wrap_val = f w.wrap_val
+   
+   [wrap_t_case_cong]  Theorem
+      
+      ⊢ ∀M M' f.
+          M = M' ∧ (∀a. M' = wrap_t a ⇒ f a = f' a) ⇒
+          wrap_t_CASE M f = wrap_t_CASE M' f'
+   
+   [wrap_t_case_eq]  Theorem
+      
+      ⊢ wrap_t_CASE x f = v ⇔ ∃t. x = wrap_t t ∧ f t = v
+   
+   [wrap_t_component_equality]  Theorem
+      
+      ⊢ ∀w1 w2. w1 = w2 ⇔ w1.wrap_val = w2.wrap_val
+   
+   [wrap_t_fn_updates]  Theorem
+      
+      ⊢ ∀f t. wrap_t t with wrap_val updated_by f = wrap_t (f t)
+   
+   [wrap_t_fupdfupds]  Theorem
+      
+      ⊢ ∀w g f.
+          w with <|wrap_val updated_by f; wrap_val updated_by g|> =
+          w with wrap_val updated_by f ∘ g
+   
+   [wrap_t_fupdfupds_comp]  Theorem
+      
+      ⊢ (∀g f. wrap_val_fupd f ∘ wrap_val_fupd g = wrap_val_fupd (f ∘ g)) ∧
+        ∀h g f.
+          wrap_val_fupd f ∘ wrap_val_fupd g ∘ h = wrap_val_fupd (f ∘ g) ∘ h
+   
+   [wrap_t_induction]  Theorem
+      
+      ⊢ ∀P. (∀t. P (wrap_t t)) ⇒ ∀w. P w
+   
+   [wrap_t_literal_11]  Theorem
+      
+      ⊢ ∀u1 u2. <|wrap_val := u1|> = <|wrap_val := u2|> ⇔ u1 = u2
+   
+   [wrap_t_literal_nchotomy]  Theorem
+      
+      ⊢ ∀w. ∃u. w = <|wrap_val := u|>
+   
+   [wrap_t_nchotomy]  Theorem
+      
+      ⊢ ∀ww. ∃t. ww = wrap_t t
+   
+   [wrap_t_updates_eq_literal]  Theorem
+      
+      ⊢ ∀w u. w with wrap_val := u = <|wrap_val := u|>
+   
+   
+*)
+end
diff --git a/tests/hol4/external/Holmakefile b/tests/hol4/external/Holmakefile
new file mode 100644
index 00000000..3c4b8973
--- /dev/null
+++ b/tests/hol4/external/Holmakefile
@@ -0,0 +1,5 @@
+# This file was automatically generated - modify ../Holmakefile.template instead
+INCLUDES =  ../../../backends/hol4
+
+all: $(DEFAULT_TARGETS)
+.PHONY: all
diff --git a/tests/hol4/external/external_FunsScript.sml b/tests/hol4/external/external_FunsScript.sml
new file mode 100644
index 00000000..f3692ee2
--- /dev/null
+++ b/tests/hol4/external/external_FunsScript.sml
@@ -0,0 +1,108 @@
+(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
+(** [external]: function definitions *)
+open primitivesLib divDefLib
+open external_TypesTheory external_OpaqueTheory
+
+val _ = new_theory "external_Funs"
+
+
+val swap_fwd_def = Define ‘
+  (** [external::swap]: forward function *)
+  swap_fwd (x : 't) (y : 't) (st : state) : (state # unit) result =
+    do
+    (st0, _) <- core_mem_swap_fwd x y st;
+    (st1, _) <- core_mem_swap_back0 x y st st0;
+    (st2, _) <- core_mem_swap_back1 x y st st1;
+    Return (st2, ())
+    od
+’
+
+val swap_back_def = Define ‘
+  (** [external::swap]: backward function 0 *)
+  swap_back
+    (x : 't) (y : 't) (st : state) (st0 : state) : (state # ('t # 't)) result =
+    do
+    (st1, _) <- core_mem_swap_fwd x y st;
+    (st2, x0) <- core_mem_swap_back0 x y st st1;
+    (_, y0) <- core_mem_swap_back1 x y st st2;
+    Return (st0, (x0, y0))
+    od
+’
+
+val test_new_non_zero_u32_fwd_def = Define ‘
+  (** [external::test_new_non_zero_u32]: forward function *)
+  test_new_non_zero_u32_fwd
+    (x : u32) (st : state) : (state # core_num_nonzero_non_zero_u32_t) result =
+    do
+    (st0, opt) <- core_num_nonzero_non_zero_u32_new_fwd x st;
+    core_option_option_unwrap_fwd opt st0
+    od
+’
+
+val test_vec_fwd_def = Define ‘
+  (** [external::test_vec]: forward function *)
+  test_vec_fwd : unit result =
+    let v = vec_new in do
+                       _ <- vec_push_back v (int_to_u32 0);
+                       Return ()
+                       od
+’
+
+(** Unit test for [external::test_vec] *)
+val _ = assert_return (“test_vec_fwd”)
+
+val custom_swap_fwd_def = Define ‘
+  (** [external::custom_swap]: forward function *)
+  custom_swap_fwd (x : 't) (y : 't) (st : state) : (state # 't) result =
+    do
+    (st0, _) <- core_mem_swap_fwd x y st;
+    (st1, x0) <- core_mem_swap_back0 x y st st0;
+    (st2, _) <- core_mem_swap_back1 x y st st1;
+    Return (st2, x0)
+    od
+’
+
+val custom_swap_back_def = Define ‘
+  (** [external::custom_swap]: backward function 0 *)
+  custom_swap_back
+    (x : 't) (y : 't) (st : state) (ret : 't) (st0 : state) :
+    (state # ('t # 't)) result
+    =
+    do
+    (st1, _) <- core_mem_swap_fwd x y st;
+    (st2, _) <- core_mem_swap_back0 x y st st1;
+    (_, y0) <- core_mem_swap_back1 x y st st2;
+    Return (st0, (ret, y0))
+    od
+’
+
+val test_custom_swap_fwd_def = Define ‘
+  (** [external::test_custom_swap]: forward function *)
+  test_custom_swap_fwd
+    (x : u32) (y : u32) (st : state) : (state # unit) result =
+    do
+    (st0, _) <- custom_swap_fwd x y st;
+    Return (st0, ())
+    od
+’
+
+val test_custom_swap_back_def = Define ‘
+  (** [external::test_custom_swap]: backward function 0 *)
+  test_custom_swap_back
+    (x : u32) (y : u32) (st : state) (st0 : state) :
+    (state # (u32 # u32)) result
+    =
+    custom_swap_back x y st (int_to_u32 1) st0
+’
+
+val test_swap_non_zero_fwd_def = Define ‘
+  (** [external::test_swap_non_zero]: forward function *)
+  test_swap_non_zero_fwd (x : u32) (st : state) : (state # u32) result =
+    do
+    (st0, _) <- swap_fwd x (int_to_u32 0) st;
+    (st1, (x0, _)) <- swap_back x (int_to_u32 0) st st0;
+    if x0 = int_to_u32 0 then Fail Failure else Return (st1, x0)
+    od
+’
+
+val _ = export_theory ()
diff --git a/tests/hol4/external/external_FunsTheory.sig b/tests/hol4/external/external_FunsTheory.sig
new file mode 100644
index 00000000..490f9d06
--- /dev/null
+++ b/tests/hol4/external/external_FunsTheory.sig
@@ -0,0 +1,105 @@
+signature external_FunsTheory =
+sig
+  type thm = Thm.thm
+  
+  (*  Definitions  *)
+    val custom_swap_back_def : thm
+    val custom_swap_fwd_def : thm
+    val swap_back_def : thm
+    val swap_fwd_def : thm
+    val test_custom_swap_back_def : thm
+    val test_custom_swap_fwd_def : thm
+    val test_new_non_zero_u32_fwd_def : thm
+    val test_swap_non_zero_fwd_def : thm
+    val test_vec_fwd_def : thm
+  
+  val external_Funs_grammars : type_grammar.grammar * term_grammar.grammar
+(*
+   [external_Opaque] Parent theory of "external_Funs"
+   
+   [custom_swap_back_def]  Definition
+      
+      ⊢ ∀x y st ret st0.
+          custom_swap_back x y st ret st0 =
+          do
+            (st1,_) <- core_mem_swap_fwd x y st;
+            (st2,_) <- core_mem_swap_back0 x y st st1;
+            (_,y0) <- core_mem_swap_back1 x y st st2;
+            Return (st0,ret,y0)
+          od
+   
+   [custom_swap_fwd_def]  Definition
+      
+      ⊢ ∀x y st.
+          custom_swap_fwd x y st =
+          do
+            (st0,_) <- core_mem_swap_fwd x y st;
+            (st1,x0) <- core_mem_swap_back0 x y st st0;
+            (st2,_) <- core_mem_swap_back1 x y st st1;
+            Return (st2,x0)
+          od
+   
+   [swap_back_def]  Definition
+      
+      ⊢ ∀x y st st0.
+          swap_back x y st st0 =
+          do
+            (st1,_) <- core_mem_swap_fwd x y st;
+            (st2,x0) <- core_mem_swap_back0 x y st st1;
+            (_,y0) <- core_mem_swap_back1 x y st st2;
+            Return (st0,x0,y0)
+          od
+   
+   [swap_fwd_def]  Definition
+      
+      ⊢ ∀x y st.
+          swap_fwd x y st =
+          do
+            (st0,_) <- core_mem_swap_fwd x y st;
+            (st1,_) <- core_mem_swap_back0 x y st st0;
+            (st2,_) <- core_mem_swap_back1 x y st st1;
+            Return (st2,())
+          od
+   
+   [test_custom_swap_back_def]  Definition
+      
+      ⊢ ∀x y st st0.
+          test_custom_swap_back x y st st0 =
+          custom_swap_back x y st (int_to_u32 1) st0
+   
+   [test_custom_swap_fwd_def]  Definition
+      
+      ⊢ ∀x y st.
+          test_custom_swap_fwd x y st =
+          do (st0,_) <- custom_swap_fwd x y st; Return (st0,()) od
+   
+   [test_new_non_zero_u32_fwd_def]  Definition
+      
+      ⊢ ∀x st.
+          test_new_non_zero_u32_fwd x st =
+          do
+            (st0,opt) <- core_num_nonzero_non_zero_u32_new_fwd x st;
+            core_option_option_unwrap_fwd opt st0
+          od
+   
+   [test_swap_non_zero_fwd_def]  Definition
+      
+      ⊢ ∀x st.
+          test_swap_non_zero_fwd x st =
+          do
+            (st0,_) <- swap_fwd x (int_to_u32 0) st;
+            (st1,x0,_) <- swap_back x (int_to_u32 0) st st0;
+            if x0 = int_to_u32 0 then Fail Failure else Return (st1,x0)
+          od
+   
+   [test_vec_fwd_def]  Definition
+      
+      ⊢ test_vec_fwd =
+        (let
+           v = vec_new
+         in
+           monad_ignore_bind (vec_push_back v (int_to_u32 0)) (Return ()))
+   
+   
+*)
+end
diff --git a/tests/hol4/external/external_OpaqueScript.sml b/tests/hol4/external/external_OpaqueScript.sml
new file mode 100644
index 00000000..b5a6d91d
--- /dev/null
+++ b/tests/hol4/external/external_OpaqueScript.sml
@@ -0,0 +1,25 @@
+(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
+(** [external]: external function declarations *)
+open primitivesLib divDefLib
+open external_TypesTheory
+
+val _ = new_theory "external_Opaque"
+
+
+(** [core::mem::swap]: forward function *)val _ = new_constant ("core_mem_swap_fwd",
+  “:'t -> 't -> state -> (state # unit) result”)
+
+(** [core::mem::swap]: backward function 0 *)val _ = new_constant ("core_mem_swap_back0",
+  “:'t -> 't -> state -> state -> (state # 't) result”)
+
+(** [core::mem::swap]: backward function 1 *)val _ = new_constant ("core_mem_swap_back1",
+  “:'t -> 't -> state -> state -> (state # 't) result”)
+
+(** [core::num::nonzero::NonZeroU32::{14}::new]: forward function *)val _ = new_constant ("core_num_nonzero_non_zero_u32_new_fwd",
+  “:u32 -> state -> (state # core_num_nonzero_non_zero_u32_t option)
+  result”)
+
+(** [core::option::Option::{0}::unwrap]: forward function *)val _ = new_constant ("core_option_option_unwrap_fwd",
+  “:'t option -> state -> (state # 't) result”)
+
+val _ = export_theory ()
diff --git a/tests/hol4/external/external_OpaqueTheory.sig b/tests/hol4/external/external_OpaqueTheory.sig
new file mode 100644
index 00000000..7cd7a08c
--- /dev/null
+++ b/tests/hol4/external/external_OpaqueTheory.sig
@@ -0,0 +1,11 @@
+signature external_OpaqueTheory =
+sig
+  type thm = Thm.thm
+  
+  val external_Opaque_grammars : type_grammar.grammar * term_grammar.grammar
+(*
+   [external_Types] Parent theory of "external_Opaque"
+   
+   
+*)
+end
diff --git a/tests/hol4/external/external_TypesScript.sml b/tests/hol4/external/external_TypesScript.sml
new file mode 100644
index 00000000..d290c3f6
--- /dev/null
+++ b/tests/hol4/external/external_TypesScript.sml
@@ -0,0 +1,13 @@
+(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
+(** [external]: type definitions *)
+open primitivesLib divDefLib
+
+val _ = new_theory "external_Types"
+
+
+val _ = new_type ("core_num_nonzero_non_zero_u32_t", 0)
+
+(** The state type used in the state-error monad *)
+val _ = new_type ("state", 0)
+
+val _ = export_theory ()
diff --git a/tests/hol4/external/external_TypesTheory.sig b/tests/hol4/external/external_TypesTheory.sig
new file mode 100644
index 00000000..17e2e8e3
--- /dev/null
+++ b/tests/hol4/external/external_TypesTheory.sig
@@ -0,0 +1,11 @@
+signature external_TypesTheory =
+sig
+  type thm = Thm.thm
+  
+  val external_Types_grammars : type_grammar.grammar * term_grammar.grammar
+(*
+   [divDef] Parent theory of "external_Types"
+   
+   
+*)
+end
diff --git a/tests/hol4/hashmap_main/Holmakefile b/tests/hol4/hashmap_main/Holmakefile
new file mode 100644
index 00000000..3c4b8973
--- /dev/null
+++ b/tests/hol4/hashmap_main/Holmakefile
@@ -0,0 +1,5 @@
+# This file was automatically generated - modify ../Holmakefile.template instead
+INCLUDES =  ../../../backends/hol4
+
+all: $(DEFAULT_TARGETS)
+.PHONY: all
diff --git a/tests/hol4/hashmap_main/hashmapMain_FunsScript.sml b/tests/hol4/hashmap_main/hashmapMain_FunsScript.sml
new file mode 100644
index 00000000..c1e30aa6
--- /dev/null
+++ b/tests/hol4/hashmap_main/hashmapMain_FunsScript.sml
@@ -0,0 +1,647 @@
+(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
+(** [hashmap_main]: function definitions *)
+open primitivesLib divDefLib
+open hashmapMain_TypesTheory hashmapMain_OpaqueTheory
+
+val _ = new_theory "hashmapMain_Funs"
+
+
+val hashmap_hash_key_fwd_def = Define ‘
+  (** [hashmap_main::hashmap::hash_key]: forward function *)
+  hashmap_hash_key_fwd (k : usize) : usize result =
+    Return k
+’
+
+val [hashmap_hash_map_allocate_slots_loop_fwd_def] = DefineDiv ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::allocate_slots]: loop 0: forward function *)
+  hashmap_hash_map_allocate_slots_loop_fwd
+    (slots : 't hashmap_list_t vec) (n : usize) :
+    't hashmap_list_t vec result
+    =
+    if usize_gt n (int_to_usize 0)
+    then (
+      do
+      slots0 <- vec_push_back slots HashmapListNil;
+      n0 <- usize_sub n (int_to_usize 1);
+      hashmap_hash_map_allocate_slots_loop_fwd slots0 n0
+      od)
+    else Return slots
+’
+
+val hashmap_hash_map_allocate_slots_fwd_def = Define ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::allocate_slots]: forward function *)
+  hashmap_hash_map_allocate_slots_fwd
+    (slots : 't hashmap_list_t vec) (n : usize) :
+    't hashmap_list_t vec result
+    =
+    hashmap_hash_map_allocate_slots_loop_fwd slots n
+’
+
+val hashmap_hash_map_new_with_capacity_fwd_def = Define ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::new_with_capacity]: forward function *)
+  hashmap_hash_map_new_with_capacity_fwd
+    (capacity : usize) (max_load_dividend : usize) (max_load_divisor : usize) :
+    't hashmap_hash_map_t result
+    =
+    let v = vec_new in
+    do
+    slots <- hashmap_hash_map_allocate_slots_fwd v capacity;
+    i <- usize_mul capacity max_load_dividend;
+    i0 <- usize_div i max_load_divisor;
+    Return
+      (<|
+         hashmap_hash_map_num_entries := (int_to_usize 0);
+         hashmap_hash_map_max_load_factor :=
+           (max_load_dividend, max_load_divisor);
+         hashmap_hash_map_max_load := i0;
+         hashmap_hash_map_slots := slots
+         |>)
+    od
+’
+
+val hashmap_hash_map_new_fwd_def = Define ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::new]: forward function *)
+  hashmap_hash_map_new_fwd : 't hashmap_hash_map_t result =
+    hashmap_hash_map_new_with_capacity_fwd (int_to_usize 32) (int_to_usize 4)
+      (int_to_usize 5)
+’
+
+val [hashmap_hash_map_clear_loop_fwd_back_def] = DefineDiv ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::clear]: loop 0: merged forward/backward function
+      (there is a single backward function, and the forward function returns ()) *)
+  hashmap_hash_map_clear_loop_fwd_back
+    (slots : 't hashmap_list_t vec) (i : usize) :
+    't hashmap_list_t vec result
+    =
+    let i0 = vec_len slots in
+    if usize_lt i i0
+    then (
+      do
+      i1 <- usize_add i (int_to_usize 1);
+      slots0 <- vec_index_mut_back slots i HashmapListNil;
+      hashmap_hash_map_clear_loop_fwd_back slots0 i1
+      od)
+    else Return slots
+’
+
+val hashmap_hash_map_clear_fwd_back_def = Define ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::clear]: merged forward/backward function
+      (there is a single backward function, and the forward function returns ()) *)
+  hashmap_hash_map_clear_fwd_back
+    (self : 't hashmap_hash_map_t) : 't hashmap_hash_map_t result =
+    do
+    v <-
+      hashmap_hash_map_clear_loop_fwd_back self.hashmap_hash_map_slots
+        (int_to_usize 0);
+    Return
+      (self
+         with
+         <|
+         hashmap_hash_map_num_entries := (int_to_usize 0);
+         hashmap_hash_map_slots := v
+         |>)
+    od
+’
+
+val hashmap_hash_map_len_fwd_def = Define ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::len]: forward function *)
+  hashmap_hash_map_len_fwd (self : 't hashmap_hash_map_t) : usize result =
+    Return self.hashmap_hash_map_num_entries
+’
+
+val [hashmap_hash_map_insert_in_list_loop_fwd_def] = DefineDiv ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::insert_in_list]: loop 0: forward function *)
+  hashmap_hash_map_insert_in_list_loop_fwd
+    (key : usize) (value : 't) (ls : 't hashmap_list_t) : bool result =
+    (case ls of
+    | HashmapListCons ckey cvalue tl =>
+      if ckey = key
+      then Return F
+      else hashmap_hash_map_insert_in_list_loop_fwd key value tl
+    | HashmapListNil => Return T)
+’
+
+val hashmap_hash_map_insert_in_list_fwd_def = Define ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::insert_in_list]: forward function *)
+  hashmap_hash_map_insert_in_list_fwd
+    (key : usize) (value : 't) (ls : 't hashmap_list_t) : bool result =
+    hashmap_hash_map_insert_in_list_loop_fwd key value ls
+’
+
+val [hashmap_hash_map_insert_in_list_loop_back_def] = DefineDiv ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::insert_in_list]: loop 0: backward function 0 *)
+  hashmap_hash_map_insert_in_list_loop_back
+    (key : usize) (value : 't) (ls : 't hashmap_list_t) :
+    't hashmap_list_t result
+    =
+    (case ls of
+    | HashmapListCons ckey cvalue tl =>
+      if ckey = key
+      then Return (HashmapListCons ckey value tl)
+      else (
+        do
+        tl0 <- hashmap_hash_map_insert_in_list_loop_back key value tl;
+        Return (HashmapListCons ckey cvalue tl0)
+        od)
+    | HashmapListNil =>
+      let l = HashmapListNil in Return (HashmapListCons key value l))
+’
+
+val hashmap_hash_map_insert_in_list_back_def = Define ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::insert_in_list]: backward function 0 *)
+  hashmap_hash_map_insert_in_list_back
+    (key : usize) (value : 't) (ls : 't hashmap_list_t) :
+    't hashmap_list_t result
+    =
+    hashmap_hash_map_insert_in_list_loop_back key value ls
+’
+
+val hashmap_hash_map_insert_no_resize_fwd_back_def = Define ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::insert_no_resize]: merged forward/backward function
+      (there is a single backward function, and the forward function returns ()) *)
+  hashmap_hash_map_insert_no_resize_fwd_back
+    (self : 't hashmap_hash_map_t) (key : usize) (value : 't) :
+    't hashmap_hash_map_t result
+    =
+    do
+    hash <- hashmap_hash_key_fwd key;
+    let i = vec_len self.hashmap_hash_map_slots in
+    do
+    hash_mod <- usize_rem hash i;
+    l <- vec_index_mut_fwd self.hashmap_hash_map_slots hash_mod;
+    inserted <- hashmap_hash_map_insert_in_list_fwd key value l;
+    if inserted
+    then (
+      do
+      i0 <- usize_add self.hashmap_hash_map_num_entries (int_to_usize 1);
+      l0 <- hashmap_hash_map_insert_in_list_back key value l;
+      v <- vec_index_mut_back self.hashmap_hash_map_slots hash_mod l0;
+      Return
+        (self
+           with
+           <|
+           hashmap_hash_map_num_entries := i0; hashmap_hash_map_slots := v
+           |>)
+      od)
+    else (
+      do
+      l0 <- hashmap_hash_map_insert_in_list_back key value l;
+      v <- vec_index_mut_back self.hashmap_hash_map_slots hash_mod l0;
+      Return (self with <| hashmap_hash_map_slots := v |>)
+      od)
+    od
+    od
+’
+
+val [hashmap_hash_map_move_elements_from_list_loop_fwd_back_def] = DefineDiv ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::move_elements_from_list]: loop 0: merged forward/backward function
+      (there is a single backward function, and the forward function returns ()) *)
+  hashmap_hash_map_move_elements_from_list_loop_fwd_back
+    (ntable : 't hashmap_hash_map_t) (ls : 't hashmap_list_t) :
+    't hashmap_hash_map_t result
+    =
+    (case ls of
+    | HashmapListCons k v tl =>
+      do
+      ntable0 <- hashmap_hash_map_insert_no_resize_fwd_back ntable k v;
+      hashmap_hash_map_move_elements_from_list_loop_fwd_back ntable0 tl
+      od
+    | HashmapListNil => Return ntable)
+’
+
+val hashmap_hash_map_move_elements_from_list_fwd_back_def = Define ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::move_elements_from_list]: merged forward/backward function
+      (there is a single backward function, and the forward function returns ()) *)
+  hashmap_hash_map_move_elements_from_list_fwd_back
+    (ntable : 't hashmap_hash_map_t) (ls : 't hashmap_list_t) :
+    't hashmap_hash_map_t result
+    =
+    hashmap_hash_map_move_elements_from_list_loop_fwd_back ntable ls
+’
+
+val [hashmap_hash_map_move_elements_loop_fwd_back_def] = DefineDiv ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::move_elements]: loop 0: merged forward/backward function
+      (there is a single backward function, and the forward function returns ()) *)
+  hashmap_hash_map_move_elements_loop_fwd_back
+    (ntable : 't hashmap_hash_map_t) (slots : 't hashmap_list_t vec)
+    (i : usize) :
+    ('t hashmap_hash_map_t # 't hashmap_list_t vec) result
+    =
+    let i0 = vec_len slots in
+    if usize_lt i i0
+    then (
+      do
+      l <- vec_index_mut_fwd slots i;
+      let ls = mem_replace_fwd l HashmapListNil in
+      do
+      ntable0 <- hashmap_hash_map_move_elements_from_list_fwd_back ntable ls;
+      i1 <- usize_add i (int_to_usize 1);
+      let l0 = mem_replace_back l HashmapListNil in
+      do
+      slots0 <- vec_index_mut_back slots i l0;
+      hashmap_hash_map_move_elements_loop_fwd_back ntable0 slots0 i1
+      od
+      od
+      od)
+    else Return (ntable, slots)
+’
+
+val hashmap_hash_map_move_elements_fwd_back_def = Define ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::move_elements]: merged forward/backward function
+      (there is a single backward function, and the forward function returns ()) *)
+  hashmap_hash_map_move_elements_fwd_back
+    (ntable : 't hashmap_hash_map_t) (slots : 't hashmap_list_t vec)
+    (i : usize) :
+    ('t hashmap_hash_map_t # 't hashmap_list_t vec) result
+    =
+    hashmap_hash_map_move_elements_loop_fwd_back ntable slots i
+’
+
+val hashmap_hash_map_try_resize_fwd_back_def = Define ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::try_resize]: merged forward/backward function
+      (there is a single backward function, and the forward function returns ()) *)
+  hashmap_hash_map_try_resize_fwd_back
+    (self : 't hashmap_hash_map_t) : 't hashmap_hash_map_t result =
+    do
+    max_usize <- mk_usize (u32_to_int core_u32_max);
+    let capacity = vec_len self.hashmap_hash_map_slots in
+    do
+    n1 <- usize_div max_usize (int_to_usize 2);
+    let (i, i0) = self.hashmap_hash_map_max_load_factor in
+    do
+    i1 <- usize_div n1 i;
+    if usize_le capacity i1
+    then (
+      do
+      i2 <- usize_mul capacity (int_to_usize 2);
+      ntable <- hashmap_hash_map_new_with_capacity_fwd i2 i i0;
+      (ntable0, _) <-
+        hashmap_hash_map_move_elements_fwd_back ntable
+          self.hashmap_hash_map_slots (int_to_usize 0);
+      Return
+        (ntable0
+           with
+           <|
+           hashmap_hash_map_num_entries := self.hashmap_hash_map_num_entries;
+           hashmap_hash_map_max_load_factor := (i, i0)
+           |>)
+      od)
+    else Return (self with <| hashmap_hash_map_max_load_factor := (i, i0) |>)
+    od
+    od
+    od
+’
+
+val hashmap_hash_map_insert_fwd_back_def = Define ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::insert]: merged forward/backward function
+      (there is a single backward function, and the forward function returns ()) *)
+  hashmap_hash_map_insert_fwd_back
+    (self : 't hashmap_hash_map_t) (key : usize) (value : 't) :
+    't hashmap_hash_map_t result
+    =
+    do
+    self0 <- hashmap_hash_map_insert_no_resize_fwd_back self key value;
+    i <- hashmap_hash_map_len_fwd self0;
+    if usize_gt i self0.hashmap_hash_map_max_load
+    then hashmap_hash_map_try_resize_fwd_back self0
+    else Return self0
+    od
+’
+
+val [hashmap_hash_map_contains_key_in_list_loop_fwd_def] = DefineDiv ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::contains_key_in_list]: loop 0: forward function *)
+  hashmap_hash_map_contains_key_in_list_loop_fwd
+    (key : usize) (ls : 't hashmap_list_t) : bool result =
+    (case ls of
+    | HashmapListCons ckey t tl =>
+      if ckey = key
+      then Return T
+      else hashmap_hash_map_contains_key_in_list_loop_fwd key tl
+    | HashmapListNil => Return F)
+’
+
+val hashmap_hash_map_contains_key_in_list_fwd_def = Define ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::contains_key_in_list]: forward function *)
+  hashmap_hash_map_contains_key_in_list_fwd
+    (key : usize) (ls : 't hashmap_list_t) : bool result =
+    hashmap_hash_map_contains_key_in_list_loop_fwd key ls
+’
+
+val hashmap_hash_map_contains_key_fwd_def = Define ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::contains_key]: forward function *)
+  hashmap_hash_map_contains_key_fwd
+    (self : 't hashmap_hash_map_t) (key : usize) : bool result =
+    do
+    hash <- hashmap_hash_key_fwd key;
+    let i = vec_len self.hashmap_hash_map_slots in
+    do
+    hash_mod <- usize_rem hash i;
+    l <- vec_index_fwd self.hashmap_hash_map_slots hash_mod;
+    hashmap_hash_map_contains_key_in_list_fwd key l
+    od
+    od
+’
+
+val [hashmap_hash_map_get_in_list_loop_fwd_def] = DefineDiv ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::get_in_list]: loop 0: forward function *)
+  hashmap_hash_map_get_in_list_loop_fwd
+    (key : usize) (ls : 't hashmap_list_t) : 't result =
+    (case ls of
+    | HashmapListCons ckey cvalue tl =>
+      if ckey = key
+      then Return cvalue
+      else hashmap_hash_map_get_in_list_loop_fwd key tl
+    | HashmapListNil => Fail Failure)
+’
+
+val hashmap_hash_map_get_in_list_fwd_def = Define ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::get_in_list]: forward function *)
+  hashmap_hash_map_get_in_list_fwd
+    (key : usize) (ls : 't hashmap_list_t) : 't result =
+    hashmap_hash_map_get_in_list_loop_fwd key ls
+’
+
+val hashmap_hash_map_get_fwd_def = Define ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::get]: forward function *)
+  hashmap_hash_map_get_fwd
+    (self : 't hashmap_hash_map_t) (key : usize) : 't result =
+    do
+    hash <- hashmap_hash_key_fwd key;
+    let i = vec_len self.hashmap_hash_map_slots in
+    do
+    hash_mod <- usize_rem hash i;
+    l <- vec_index_fwd self.hashmap_hash_map_slots hash_mod;
+    hashmap_hash_map_get_in_list_fwd key l
+    od
+    od
+’
+
+val [hashmap_hash_map_get_mut_in_list_loop_fwd_def] = DefineDiv ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::get_mut_in_list]: loop 0: forward function *)
+  hashmap_hash_map_get_mut_in_list_loop_fwd
+    (ls : 't hashmap_list_t) (key : usize) : 't result =
+    (case ls of
+    | HashmapListCons ckey cvalue tl =>
+      if ckey = key
+      then Return cvalue
+      else hashmap_hash_map_get_mut_in_list_loop_fwd tl key
+    | HashmapListNil => Fail Failure)
+’
+
+val hashmap_hash_map_get_mut_in_list_fwd_def = Define ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::get_mut_in_list]: forward function *)
+  hashmap_hash_map_get_mut_in_list_fwd
+    (ls : 't hashmap_list_t) (key : usize) : 't result =
+    hashmap_hash_map_get_mut_in_list_loop_fwd ls key
+’
+
+val [hashmap_hash_map_get_mut_in_list_loop_back_def] = DefineDiv ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::get_mut_in_list]: loop 0: backward function 0 *)
+  hashmap_hash_map_get_mut_in_list_loop_back
+    (ls : 't hashmap_list_t) (key : usize) (ret : 't) :
+    't hashmap_list_t result
+    =
+    (case ls of
+    | HashmapListCons ckey cvalue tl =>
+      if ckey = key
+      then Return (HashmapListCons ckey ret tl)
+      else (
+        do
+        tl0 <- hashmap_hash_map_get_mut_in_list_loop_back tl key ret;
+        Return (HashmapListCons ckey cvalue tl0)
+        od)
+    | HashmapListNil => Fail Failure)
+’
+
+val hashmap_hash_map_get_mut_in_list_back_def = Define ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::get_mut_in_list]: backward function 0 *)
+  hashmap_hash_map_get_mut_in_list_back
+    (ls : 't hashmap_list_t) (key : usize) (ret : 't) :
+    't hashmap_list_t result
+    =
+    hashmap_hash_map_get_mut_in_list_loop_back ls key ret
+’
+
+val hashmap_hash_map_get_mut_fwd_def = Define ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::get_mut]: forward function *)
+  hashmap_hash_map_get_mut_fwd
+    (self : 't hashmap_hash_map_t) (key : usize) : 't result =
+    do
+    hash <- hashmap_hash_key_fwd key;
+    let i = vec_len self.hashmap_hash_map_slots in
+    do
+    hash_mod <- usize_rem hash i;
+    l <- vec_index_mut_fwd self.hashmap_hash_map_slots hash_mod;
+    hashmap_hash_map_get_mut_in_list_fwd l key
+    od
+    od
+’
+
+val hashmap_hash_map_get_mut_back_def = Define ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::get_mut]: backward function 0 *)
+  hashmap_hash_map_get_mut_back
+    (self : 't hashmap_hash_map_t) (key : usize) (ret : 't) :
+    't hashmap_hash_map_t result
+    =
+    do
+    hash <- hashmap_hash_key_fwd key;
+    let i = vec_len self.hashmap_hash_map_slots in
+    do
+    hash_mod <- usize_rem hash i;
+    l <- vec_index_mut_fwd self.hashmap_hash_map_slots hash_mod;
+    l0 <- hashmap_hash_map_get_mut_in_list_back l key ret;
+    v <- vec_index_mut_back self.hashmap_hash_map_slots hash_mod l0;
+    Return (self with <| hashmap_hash_map_slots := v |>)
+    od
+    od
+’
+
+val [hashmap_hash_map_remove_from_list_loop_fwd_def] = DefineDiv ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::remove_from_list]: loop 0: forward function *)
+  hashmap_hash_map_remove_from_list_loop_fwd
+    (key : usize) (ls : 't hashmap_list_t) : 't option result =
+    (case ls of
+    | HashmapListCons ckey t tl =>
+      if ckey = key
+      then
+        let mv_ls = mem_replace_fwd (HashmapListCons ckey t tl) HashmapListNil
+          in
+        (case mv_ls of
+        | HashmapListCons i cvalue tl0 => Return (SOME cvalue)
+        | HashmapListNil => Fail Failure)
+      else hashmap_hash_map_remove_from_list_loop_fwd key tl
+    | HashmapListNil => Return NONE)
+’
+
+val hashmap_hash_map_remove_from_list_fwd_def = Define ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::remove_from_list]: forward function *)
+  hashmap_hash_map_remove_from_list_fwd
+    (key : usize) (ls : 't hashmap_list_t) : 't option result =
+    hashmap_hash_map_remove_from_list_loop_fwd key ls
+’
+
+val [hashmap_hash_map_remove_from_list_loop_back_def] = DefineDiv ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::remove_from_list]: loop 0: backward function 1 *)
+  hashmap_hash_map_remove_from_list_loop_back
+    (key : usize) (ls : 't hashmap_list_t) : 't hashmap_list_t result =
+    (case ls of
+    | HashmapListCons ckey t tl =>
+      if ckey = key
+      then
+        let mv_ls = mem_replace_fwd (HashmapListCons ckey t tl) HashmapListNil
+          in
+        (case mv_ls of
+        | HashmapListCons i cvalue tl0 => Return tl0
+        | HashmapListNil => Fail Failure)
+      else (
+        do
+        tl0 <- hashmap_hash_map_remove_from_list_loop_back key tl;
+        Return (HashmapListCons ckey t tl0)
+        od)
+    | HashmapListNil => Return HashmapListNil)
+’
+
+val hashmap_hash_map_remove_from_list_back_def = Define ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::remove_from_list]: backward function 1 *)
+  hashmap_hash_map_remove_from_list_back
+    (key : usize) (ls : 't hashmap_list_t) : 't hashmap_list_t result =
+    hashmap_hash_map_remove_from_list_loop_back key ls
+’
+
+val hashmap_hash_map_remove_fwd_def = Define ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::remove]: forward function *)
+  hashmap_hash_map_remove_fwd
+    (self : 't hashmap_hash_map_t) (key : usize) : 't option result =
+    do
+    hash <- hashmap_hash_key_fwd key;
+    let i = vec_len self.hashmap_hash_map_slots in
+    do
+    hash_mod <- usize_rem hash i;
+    l <- vec_index_mut_fwd self.hashmap_hash_map_slots hash_mod;
+    x <- hashmap_hash_map_remove_from_list_fwd key l;
+    (case x of
+    | NONE => Return NONE
+    | SOME x0 =>
+      do
+      _ <- usize_sub self.hashmap_hash_map_num_entries (int_to_usize 1);
+      Return (SOME x0)
+      od)
+    od
+    od
+’
+
+val hashmap_hash_map_remove_back_def = Define ‘
+  (** [hashmap_main::hashmap::HashMap::{0}::remove]: backward function 0 *)
+  hashmap_hash_map_remove_back
+    (self : 't hashmap_hash_map_t) (key : usize) :
+    't hashmap_hash_map_t result
+    =
+    do
+    hash <- hashmap_hash_key_fwd key;
+    let i = vec_len self.hashmap_hash_map_slots in
+    do
+    hash_mod <- usize_rem hash i;
+    l <- vec_index_mut_fwd self.hashmap_hash_map_slots hash_mod;
+    x <- hashmap_hash_map_remove_from_list_fwd key l;
+    (case x of
+    | NONE =>
+      do
+      l0 <- hashmap_hash_map_remove_from_list_back key l;
+      v <- vec_index_mut_back self.hashmap_hash_map_slots hash_mod l0;
+      Return (self with <| hashmap_hash_map_slots := v |>)
+      od
+    | SOME x0 =>
+      do
+      i0 <- usize_sub self.hashmap_hash_map_num_entries (int_to_usize 1);
+      l0 <- hashmap_hash_map_remove_from_list_back key l;
+      v <- vec_index_mut_back self.hashmap_hash_map_slots hash_mod l0;
+      Return
+        (self
+           with
+           <|
+           hashmap_hash_map_num_entries := i0; hashmap_hash_map_slots := v
+           |>)
+      od)
+    od
+    od
+’
+
+val hashmap_test1_fwd_def = Define ‘
+  (** [hashmap_main::hashmap::test1]: forward function *)
+  hashmap_test1_fwd : unit result =
+    do
+    hm <- hashmap_hash_map_new_fwd;
+    hm0 <-
+      hashmap_hash_map_insert_fwd_back hm (int_to_usize 0) (int_to_u64 42);
+    hm1 <-
+      hashmap_hash_map_insert_fwd_back hm0 (int_to_usize 128) (int_to_u64 18);
+    hm2 <-
+      hashmap_hash_map_insert_fwd_back hm1 (int_to_usize 1024) (int_to_u64 138);
+    hm3 <-
+      hashmap_hash_map_insert_fwd_back hm2 (int_to_usize 1056) (int_to_u64 256);
+    i <- hashmap_hash_map_get_fwd hm3 (int_to_usize 128);
+    if ~ (i = int_to_u64 18)
+    then Fail Failure
+    else (
+      do
+      hm4 <-
+        hashmap_hash_map_get_mut_back hm3 (int_to_usize 1024) (int_to_u64 56);
+      i0 <- hashmap_hash_map_get_fwd hm4 (int_to_usize 1024);
+      if ~ (i0 = int_to_u64 56)
+      then Fail Failure
+      else (
+        do
+        x <- hashmap_hash_map_remove_fwd hm4 (int_to_usize 1024);
+        (case x of
+        | NONE => Fail Failure
+        | SOME x0 =>
+          if ~ (x0 = int_to_u64 56)
+          then Fail Failure
+          else (
+            do
+            hm5 <- hashmap_hash_map_remove_back hm4 (int_to_usize 1024);
+            i1 <- hashmap_hash_map_get_fwd hm5 (int_to_usize 0);
+            if ~ (i1 = int_to_u64 42)
+            then Fail Failure
+            else (
+              do
+              i2 <- hashmap_hash_map_get_fwd hm5 (int_to_usize 128);
+              if ~ (i2 = int_to_u64 18)
+              then Fail Failure
+              else (
+                do
+                i3 <- hashmap_hash_map_get_fwd hm5 (int_to_usize 1056);
+                if ~ (i3 = int_to_u64 256) then Fail Failure else Return ()
+                od)
+              od)
+            od))
+        od)
+      od)
+    od
+’
+
+(** Unit test for [hashmap_main::hashmap::test1] *)
+val _ = assert_return (“hashmap_test1_fwd”)
+
+val insert_on_disk_fwd_def = Define ‘
+  (** [hashmap_main::insert_on_disk]: forward function *)
+  insert_on_disk_fwd
+    (key : usize) (value : u64) (st : state) : (state # unit) result =
+    do
+    (st0, hm) <- hashmap_utils_deserialize_fwd st;
+    hm0 <- hashmap_hash_map_insert_fwd_back hm key value;
+    (st1, _) <- hashmap_utils_serialize_fwd hm0 st0;
+    Return (st1, ())
+    od
+’
+
+val main_fwd_def = Define ‘
+  (** [hashmap_main::main]: forward function *)
+  main_fwd : unit result =
+    Return ()
+’
+
+(** Unit test for [hashmap_main::main] *)
+val _ = assert_return (“main_fwd”)
+
+val _ = export_theory ()
diff --git a/tests/hol4/hashmap_main/hashmapMain_FunsTheory.sig b/tests/hol4/hashmap_main/hashmapMain_FunsTheory.sig
new file mode 100644
index 00000000..d4e43d9a
--- /dev/null
+++ b/tests/hol4/hashmap_main/hashmapMain_FunsTheory.sig
@@ -0,0 +1,598 @@
+signature hashmapMain_FunsTheory =
+sig
+  type thm = Thm.thm
+  
+  (*  Definitions  *)
+    val hashmap_hash_key_fwd_def : thm
+    val hashmap_hash_map_allocate_slots_fwd_def : thm
+    val hashmap_hash_map_allocate_slots_loop_fwd_def : thm
+    val hashmap_hash_map_clear_fwd_back_def : thm
+    val hashmap_hash_map_clear_loop_fwd_back_def : thm
+    val hashmap_hash_map_contains_key_fwd_def : thm
+    val hashmap_hash_map_contains_key_in_list_fwd_def : thm
+    val hashmap_hash_map_contains_key_in_list_loop_fwd_def : thm
+    val hashmap_hash_map_get_fwd_def : thm
+    val hashmap_hash_map_get_in_list_fwd_def : thm
+    val hashmap_hash_map_get_in_list_loop_fwd_def : thm
+    val hashmap_hash_map_get_mut_back_def : thm
+    val hashmap_hash_map_get_mut_fwd_def : thm
+    val hashmap_hash_map_get_mut_in_list_back_def : thm
+    val hashmap_hash_map_get_mut_in_list_fwd_def : thm
+    val hashmap_hash_map_get_mut_in_list_loop_back_def : thm
+    val hashmap_hash_map_get_mut_in_list_loop_fwd_def : thm
+    val hashmap_hash_map_insert_fwd_back_def : thm
+    val hashmap_hash_map_insert_in_list_back_def : thm
+    val hashmap_hash_map_insert_in_list_fwd_def : thm
+    val hashmap_hash_map_insert_in_list_loop_back_def : thm
+    val hashmap_hash_map_insert_in_list_loop_fwd_def : thm
+    val hashmap_hash_map_insert_no_resize_fwd_back_def : thm
+    val hashmap_hash_map_len_fwd_def : thm
+    val hashmap_hash_map_move_elements_from_list_fwd_back_def : thm
+    val hashmap_hash_map_move_elements_from_list_loop_fwd_back_def : thm
+    val hashmap_hash_map_move_elements_fwd_back_def : thm
+    val hashmap_hash_map_move_elements_loop_fwd_back_def : thm
+    val hashmap_hash_map_new_fwd_def : thm
+    val hashmap_hash_map_new_with_capacity_fwd_def : thm
+    val hashmap_hash_map_remove_back_def : thm
+    val hashmap_hash_map_remove_from_list_back_def : thm
+    val hashmap_hash_map_remove_from_list_fwd_def : thm
+    val hashmap_hash_map_remove_from_list_loop_back_def : thm
+    val hashmap_hash_map_remove_from_list_loop_fwd_def : thm
+    val hashmap_hash_map_remove_fwd_def : thm
+    val hashmap_hash_map_try_resize_fwd_back_def : thm
+    val hashmap_test1_fwd_def : thm
+    val insert_on_disk_fwd_def : thm
+    val main_fwd_def : thm
+  
+  val hashmapMain_Funs_grammars : type_grammar.grammar * term_grammar.grammar
+(*
+   [hashmapMain_Opaque] Parent theory of "hashmapMain_Funs"
+   
+   [hashmap_hash_key_fwd_def]  Definition
+      
+      ⊢ ∀k. hashmap_hash_key_fwd k = Return k
+   
+   [hashmap_hash_map_allocate_slots_fwd_def]  Definition
+      
+      ⊢ ∀slots n.
+          hashmap_hash_map_allocate_slots_fwd slots n =
+          hashmap_hash_map_allocate_slots_loop_fwd slots n
+   
+   [hashmap_hash_map_allocate_slots_loop_fwd_def]  Definition
+      
+      ⊢ ∀slots n.
+          hashmap_hash_map_allocate_slots_loop_fwd slots n =
+          if usize_gt n (int_to_usize 0) then
+            do
+              slots0 <- vec_push_back slots HashmapListNil;
+              n0 <- usize_sub n (int_to_usize 1);
+              hashmap_hash_map_allocate_slots_loop_fwd slots0 n0
+            od
+          else Return slots
+   
+   [hashmap_hash_map_clear_fwd_back_def]  Definition
+      
+      ⊢ ∀self.
+          hashmap_hash_map_clear_fwd_back self =
+          do
+            v <-
+              hashmap_hash_map_clear_loop_fwd_back
+                self.hashmap_hash_map_slots (int_to_usize 0);
+            Return
+              (self with
+               <|hashmap_hash_map_num_entries := int_to_usize 0;
+                 hashmap_hash_map_slots := v|>)
+          od
+   
+   [hashmap_hash_map_clear_loop_fwd_back_def]  Definition
+      
+      ⊢ ∀slots i.
+          hashmap_hash_map_clear_loop_fwd_back slots i =
+          (let
+             i0 = vec_len slots
+           in
+             if usize_lt i i0 then
+               do
+                 i1 <- usize_add i (int_to_usize 1);
+                 slots0 <- vec_index_mut_back slots i HashmapListNil;
+                 hashmap_hash_map_clear_loop_fwd_back slots0 i1
+               od
+             else Return slots)
+   
+   [hashmap_hash_map_contains_key_fwd_def]  Definition
+      
+      ⊢ ∀self key.
+          hashmap_hash_map_contains_key_fwd self key =
+          do
+            hash <- hashmap_hash_key_fwd key;
+            i <<- vec_len self.hashmap_hash_map_slots;
+            hash_mod <- usize_rem hash i;
+            l <- vec_index_fwd self.hashmap_hash_map_slots hash_mod;
+            hashmap_hash_map_contains_key_in_list_fwd key l
+          od
+   
+   [hashmap_hash_map_contains_key_in_list_fwd_def]  Definition
+      
+      ⊢ ∀key ls.
+          hashmap_hash_map_contains_key_in_list_fwd key ls =
+          hashmap_hash_map_contains_key_in_list_loop_fwd key ls
+   
+   [hashmap_hash_map_contains_key_in_list_loop_fwd_def]  Definition
+      
+      ⊢ ∀key ls.
+          hashmap_hash_map_contains_key_in_list_loop_fwd key ls =
+          case ls of
+            HashmapListCons ckey t tl =>
+              if ckey = key then Return T
+              else hashmap_hash_map_contains_key_in_list_loop_fwd key tl
+          | HashmapListNil => Return F
+   
+   [hashmap_hash_map_get_fwd_def]  Definition
+      
+      ⊢ ∀self key.
+          hashmap_hash_map_get_fwd self key =
+          do
+            hash <- hashmap_hash_key_fwd key;
+            i <<- vec_len self.hashmap_hash_map_slots;
+            hash_mod <- usize_rem hash i;
+            l <- vec_index_fwd self.hashmap_hash_map_slots hash_mod;
+            hashmap_hash_map_get_in_list_fwd key l
+          od
+   
+   [hashmap_hash_map_get_in_list_fwd_def]  Definition
+      
+      ⊢ ∀key ls.
+          hashmap_hash_map_get_in_list_fwd key ls =
+          hashmap_hash_map_get_in_list_loop_fwd key ls
+   
+   [hashmap_hash_map_get_in_list_loop_fwd_def]  Definition
+      
+      ⊢ ∀key ls.
+          hashmap_hash_map_get_in_list_loop_fwd key ls =
+          case ls of
+            HashmapListCons ckey cvalue tl =>
+              if ckey = key then Return cvalue
+              else hashmap_hash_map_get_in_list_loop_fwd key tl
+          | HashmapListNil => Fail Failure
+   
+   [hashmap_hash_map_get_mut_back_def]  Definition
+      
+      ⊢ ∀self key ret.
+          hashmap_hash_map_get_mut_back self key ret =
+          do
+            hash <- hashmap_hash_key_fwd key;
+            i <<- vec_len self.hashmap_hash_map_slots;
+            hash_mod <- usize_rem hash i;
+            l <- vec_index_mut_fwd self.hashmap_hash_map_slots hash_mod;
+            l0 <- hashmap_hash_map_get_mut_in_list_back l key ret;
+            v <- vec_index_mut_back self.hashmap_hash_map_slots hash_mod l0;
+            Return (self with hashmap_hash_map_slots := v)
+          od
+   
+   [hashmap_hash_map_get_mut_fwd_def]  Definition
+      
+      ⊢ ∀self key.
+          hashmap_hash_map_get_mut_fwd self key =
+          do
+            hash <- hashmap_hash_key_fwd key;
+            i <<- vec_len self.hashmap_hash_map_slots;
+            hash_mod <- usize_rem hash i;
+            l <- vec_index_mut_fwd self.hashmap_hash_map_slots hash_mod;
+            hashmap_hash_map_get_mut_in_list_fwd l key
+          od
+   
+   [hashmap_hash_map_get_mut_in_list_back_def]  Definition
+      
+      ⊢ ∀ls key ret.
+          hashmap_hash_map_get_mut_in_list_back ls key ret =
+          hashmap_hash_map_get_mut_in_list_loop_back ls key ret
+   
+   [hashmap_hash_map_get_mut_in_list_fwd_def]  Definition
+      
+      ⊢ ∀ls key.
+          hashmap_hash_map_get_mut_in_list_fwd ls key =
+          hashmap_hash_map_get_mut_in_list_loop_fwd ls key
+   
+   [hashmap_hash_map_get_mut_in_list_loop_back_def]  Definition
+      
+      ⊢ ∀ls key ret.
+          hashmap_hash_map_get_mut_in_list_loop_back ls key ret =
+          case ls of
+            HashmapListCons ckey cvalue tl =>
+              if ckey = key then Return (HashmapListCons ckey ret tl)
+              else
+                do
+                  tl0 <-
+                    hashmap_hash_map_get_mut_in_list_loop_back tl key ret;
+                  Return (HashmapListCons ckey cvalue tl0)
+                od
+          | HashmapListNil => Fail Failure
+   
+   [hashmap_hash_map_get_mut_in_list_loop_fwd_def]  Definition
+      
+      ⊢ ∀ls key.
+          hashmap_hash_map_get_mut_in_list_loop_fwd ls key =
+          case ls of
+            HashmapListCons ckey cvalue tl =>
+              if ckey = key then Return cvalue
+              else hashmap_hash_map_get_mut_in_list_loop_fwd tl key
+          | HashmapListNil => Fail Failure
+   
+   [hashmap_hash_map_insert_fwd_back_def]  Definition
+      
+      ⊢ ∀self key value.
+          hashmap_hash_map_insert_fwd_back self key value =
+          do
+            self0 <-
+              hashmap_hash_map_insert_no_resize_fwd_back self key value;
+            i <- hashmap_hash_map_len_fwd self0;
+            if usize_gt i self0.hashmap_hash_map_max_load then
+              hashmap_hash_map_try_resize_fwd_back self0
+            else Return self0
+          od
+   
+   [hashmap_hash_map_insert_in_list_back_def]  Definition
+      
+      ⊢ ∀key value ls.
+          hashmap_hash_map_insert_in_list_back key value ls =
+          hashmap_hash_map_insert_in_list_loop_back key value ls
+   
+   [hashmap_hash_map_insert_in_list_fwd_def]  Definition
+      
+      ⊢ ∀key value ls.
+          hashmap_hash_map_insert_in_list_fwd key value ls =
+          hashmap_hash_map_insert_in_list_loop_fwd key value ls
+   
+   [hashmap_hash_map_insert_in_list_loop_back_def]  Definition
+      
+      ⊢ ∀key value ls.
+          hashmap_hash_map_insert_in_list_loop_back key value ls =
+          case ls of
+            HashmapListCons ckey cvalue tl =>
+              if ckey = key then Return (HashmapListCons ckey value tl)
+              else
+                do
+                  tl0 <-
+                    hashmap_hash_map_insert_in_list_loop_back key value tl;
+                  Return (HashmapListCons ckey cvalue tl0)
+                od
+          | HashmapListNil =>
+            (let
+               l = HashmapListNil
+             in
+               Return (HashmapListCons key value l))
+   
+   [hashmap_hash_map_insert_in_list_loop_fwd_def]  Definition
+      
+      ⊢ ∀key value ls.
+          hashmap_hash_map_insert_in_list_loop_fwd key value ls =
+          case ls of
+            HashmapListCons ckey cvalue tl =>
+              if ckey = key then Return F
+              else hashmap_hash_map_insert_in_list_loop_fwd key value tl
+          | HashmapListNil => Return T
+   
+   [hashmap_hash_map_insert_no_resize_fwd_back_def]  Definition
+      
+      ⊢ ∀self key value.
+          hashmap_hash_map_insert_no_resize_fwd_back self key value =
+          do
+            hash <- hashmap_hash_key_fwd key;
+            i <<- vec_len self.hashmap_hash_map_slots;
+            hash_mod <- usize_rem hash i;
+            l <- vec_index_mut_fwd self.hashmap_hash_map_slots hash_mod;
+            inserted <- hashmap_hash_map_insert_in_list_fwd key value l;
+            if inserted then
+              do
+                i0 <-
+                  usize_add self.hashmap_hash_map_num_entries
+                    (int_to_usize 1);
+                l0 <- hashmap_hash_map_insert_in_list_back key value l;
+                v <-
+                  vec_index_mut_back self.hashmap_hash_map_slots hash_mod
+                    l0;
+                Return
+                  (self with
+                   <|hashmap_hash_map_num_entries := i0;
+                     hashmap_hash_map_slots := v|>)
+              od
+            else
+              do
+                l0 <- hashmap_hash_map_insert_in_list_back key value l;
+                v <-
+                  vec_index_mut_back self.hashmap_hash_map_slots hash_mod
+                    l0;
+                Return (self with hashmap_hash_map_slots := v)
+              od
+          od
+   
+   [hashmap_hash_map_len_fwd_def]  Definition
+      
+      ⊢ ∀self.
+          hashmap_hash_map_len_fwd self =
+          Return self.hashmap_hash_map_num_entries
+   
+   [hashmap_hash_map_move_elements_from_list_fwd_back_def]  Definition
+      
+      ⊢ ∀ntable ls.
+          hashmap_hash_map_move_elements_from_list_fwd_back ntable ls =
+          hashmap_hash_map_move_elements_from_list_loop_fwd_back ntable ls
+   
+   [hashmap_hash_map_move_elements_from_list_loop_fwd_back_def]  Definition
+      
+      ⊢ ∀ntable ls.
+          hashmap_hash_map_move_elements_from_list_loop_fwd_back ntable ls =
+          case ls of
+            HashmapListCons k v tl =>
+              do
+                ntable0 <-
+                  hashmap_hash_map_insert_no_resize_fwd_back ntable k v;
+                hashmap_hash_map_move_elements_from_list_loop_fwd_back
+                  ntable0 tl
+              od
+          | HashmapListNil => Return ntable
+   
+   [hashmap_hash_map_move_elements_fwd_back_def]  Definition
+      
+      ⊢ ∀ntable slots i.
+          hashmap_hash_map_move_elements_fwd_back ntable slots i =
+          hashmap_hash_map_move_elements_loop_fwd_back ntable slots i
+   
+   [hashmap_hash_map_move_elements_loop_fwd_back_def]  Definition
+      
+      ⊢ ∀ntable slots i.
+          hashmap_hash_map_move_elements_loop_fwd_back ntable slots i =
+          (let
+             i0 = vec_len slots
+           in
+             if usize_lt i i0 then
+               do
+                 l <- vec_index_mut_fwd slots i;
+                 ls <<- mem_replace_fwd l HashmapListNil;
+                 ntable0 <-
+                   hashmap_hash_map_move_elements_from_list_fwd_back ntable
+                     ls;
+                 i1 <- usize_add i (int_to_usize 1);
+                 l0 <<- mem_replace_back l HashmapListNil;
+                 slots0 <- vec_index_mut_back slots i l0;
+                 hashmap_hash_map_move_elements_loop_fwd_back ntable0
+                   slots0 i1
+               od
+             else Return (ntable,slots))
+   
+   [hashmap_hash_map_new_fwd_def]  Definition
+      
+      ⊢ hashmap_hash_map_new_fwd =
+        hashmap_hash_map_new_with_capacity_fwd (int_to_usize 32)
+          (int_to_usize 4) (int_to_usize 5)
+   
+   [hashmap_hash_map_new_with_capacity_fwd_def]  Definition
+      
+      ⊢ ∀capacity max_load_dividend max_load_divisor.
+          hashmap_hash_map_new_with_capacity_fwd capacity max_load_dividend
+            max_load_divisor =
+          (let
+             v = vec_new
+           in
+             do
+               slots <- hashmap_hash_map_allocate_slots_fwd v capacity;
+               i <- usize_mul capacity max_load_dividend;
+               i0 <- usize_div i max_load_divisor;
+               Return
+                 <|hashmap_hash_map_num_entries := int_to_usize 0;
+                   hashmap_hash_map_max_load_factor :=
+                     (max_load_dividend,max_load_divisor);
+                   hashmap_hash_map_max_load := i0;
+                   hashmap_hash_map_slots := slots|>
+             od)
+   
+   [hashmap_hash_map_remove_back_def]  Definition
+      
+      ⊢ ∀self key.
+          hashmap_hash_map_remove_back self key =
+          do
+            hash <- hashmap_hash_key_fwd key;
+            i <<- vec_len self.hashmap_hash_map_slots;
+            hash_mod <- usize_rem hash i;
+            l <- vec_index_mut_fwd self.hashmap_hash_map_slots hash_mod;
+            x <- hashmap_hash_map_remove_from_list_fwd key l;
+            case x of
+              NONE =>
+                do
+                  l0 <- hashmap_hash_map_remove_from_list_back key l;
+                  v <-
+                    vec_index_mut_back self.hashmap_hash_map_slots hash_mod
+                      l0;
+                  Return (self with hashmap_hash_map_slots := v)
+                od
+            | SOME x0 =>
+              do
+                i0 <-
+                  usize_sub self.hashmap_hash_map_num_entries
+                    (int_to_usize 1);
+                l0 <- hashmap_hash_map_remove_from_list_back key l;
+                v <-
+                  vec_index_mut_back self.hashmap_hash_map_slots hash_mod
+                    l0;
+                Return
+                  (self with
+                   <|hashmap_hash_map_num_entries := i0;
+                     hashmap_hash_map_slots := v|>)
+              od
+          od
+   
+   [hashmap_hash_map_remove_from_list_back_def]  Definition
+      
+      ⊢ ∀key ls.
+          hashmap_hash_map_remove_from_list_back key ls =
+          hashmap_hash_map_remove_from_list_loop_back key ls
+   
+   [hashmap_hash_map_remove_from_list_fwd_def]  Definition
+      
+      ⊢ ∀key ls.
+          hashmap_hash_map_remove_from_list_fwd key ls =
+          hashmap_hash_map_remove_from_list_loop_fwd key ls
+   
+   [hashmap_hash_map_remove_from_list_loop_back_def]  Definition
+      
+      ⊢ ∀key ls.
+          hashmap_hash_map_remove_from_list_loop_back key ls =
+          case ls of
+            HashmapListCons ckey t tl =>
+              if ckey = key then
+                (let
+                   mv_ls =
+                     mem_replace_fwd (HashmapListCons ckey t tl)
+                       HashmapListNil
+                 in
+                   case mv_ls of
+                     HashmapListCons i cvalue tl0 => Return tl0
+                   | HashmapListNil => Fail Failure)
+              else
+                do
+                  tl0 <- hashmap_hash_map_remove_from_list_loop_back key tl;
+                  Return (HashmapListCons ckey t tl0)
+                od
+          | HashmapListNil => Return HashmapListNil
+   
+   [hashmap_hash_map_remove_from_list_loop_fwd_def]  Definition
+      
+      ⊢ ∀key ls.
+          hashmap_hash_map_remove_from_list_loop_fwd key ls =
+          case ls of
+            HashmapListCons ckey t tl =>
+              if ckey = key then
+                (let
+                   mv_ls =
+                     mem_replace_fwd (HashmapListCons ckey t tl)
+                       HashmapListNil
+                 in
+                   case mv_ls of
+                     HashmapListCons i cvalue tl0 => Return (SOME cvalue)
+                   | HashmapListNil => Fail Failure)
+              else hashmap_hash_map_remove_from_list_loop_fwd key tl
+          | HashmapListNil => Return NONE
+   
+   [hashmap_hash_map_remove_fwd_def]  Definition
+      
+      ⊢ ∀self key.
+          hashmap_hash_map_remove_fwd self key =
+          do
+            hash <- hashmap_hash_key_fwd key;
+            i <<- vec_len self.hashmap_hash_map_slots;
+            hash_mod <- usize_rem hash i;
+            l <- vec_index_mut_fwd self.hashmap_hash_map_slots hash_mod;
+            x <- hashmap_hash_map_remove_from_list_fwd key l;
+            case x of
+              NONE => Return NONE
+            | SOME x0 =>
+              monad_ignore_bind
+                (usize_sub self.hashmap_hash_map_num_entries
+                   (int_to_usize 1)) (Return (SOME x0))
+          od
+   
+   [hashmap_hash_map_try_resize_fwd_back_def]  Definition
+      
+      ⊢ ∀self.
+          hashmap_hash_map_try_resize_fwd_back self =
+          do
+            max_usize <- mk_usize (u32_to_int core_u32_max);
+            capacity <<- vec_len self.hashmap_hash_map_slots;
+            n1 <- usize_div max_usize (int_to_usize 2);
+            (i,i0) <<- self.hashmap_hash_map_max_load_factor;
+            i1 <- usize_div n1 i;
+            if usize_le capacity i1 then
+              do
+                i2 <- usize_mul capacity (int_to_usize 2);
+                ntable <- hashmap_hash_map_new_with_capacity_fwd i2 i i0;
+                (ntable0,_) <-
+                  hashmap_hash_map_move_elements_fwd_back ntable
+                    self.hashmap_hash_map_slots (int_to_usize 0);
+                Return
+                  (ntable0 with
+                   <|hashmap_hash_map_num_entries :=
+                       self.hashmap_hash_map_num_entries;
+                     hashmap_hash_map_max_load_factor := (i,i0)|>)
+              od
+            else
+              Return (self with hashmap_hash_map_max_load_factor := (i,i0))
+          od
+   
+   [hashmap_test1_fwd_def]  Definition
+      
+      ⊢ hashmap_test1_fwd =
+        do
+          hm <- hashmap_hash_map_new_fwd;
+          hm0 <-
+            hashmap_hash_map_insert_fwd_back hm (int_to_usize 0)
+              (int_to_u64 42);
+          hm1 <-
+            hashmap_hash_map_insert_fwd_back hm0 (int_to_usize 128)
+              (int_to_u64 18);
+          hm2 <-
+            hashmap_hash_map_insert_fwd_back hm1 (int_to_usize 1024)
+              (int_to_u64 138);
+          hm3 <-
+            hashmap_hash_map_insert_fwd_back hm2 (int_to_usize 1056)
+              (int_to_u64 256);
+          i <- hashmap_hash_map_get_fwd hm3 (int_to_usize 128);
+          if i ≠ int_to_u64 18 then Fail Failure
+          else
+            do
+              hm4 <-
+                hashmap_hash_map_get_mut_back hm3 (int_to_usize 1024)
+                  (int_to_u64 56);
+              i0 <- hashmap_hash_map_get_fwd hm4 (int_to_usize 1024);
+              if i0 ≠ int_to_u64 56 then Fail Failure
+              else
+                do
+                  x <- hashmap_hash_map_remove_fwd hm4 (int_to_usize 1024);
+                  case x of
+                    NONE => Fail Failure
+                  | SOME x0 =>
+                    if x0 ≠ int_to_u64 56 then Fail Failure
+                    else
+                      do
+                        hm5 <-
+                          hashmap_hash_map_remove_back hm4
+                            (int_to_usize 1024);
+                        i1 <- hashmap_hash_map_get_fwd hm5 (int_to_usize 0);
+                        if i1 ≠ int_to_u64 42 then Fail Failure
+                        else
+                          do
+                            i2 <-
+                              hashmap_hash_map_get_fwd hm5
+                                (int_to_usize 128);
+                            if i2 ≠ int_to_u64 18 then Fail Failure
+                            else
+                              do
+                                i3 <-
+                                  hashmap_hash_map_get_fwd hm5
+                                    (int_to_usize 1056);
+                                if i3 ≠ int_to_u64 256 then Fail Failure
+                                else Return ()
+                              od
+                          od
+                      od
+                od
+            od
+        od
+   
+   [insert_on_disk_fwd_def]  Definition
+      
+      ⊢ ∀key value st.
+          insert_on_disk_fwd key value st =
+          do
+            (st0,hm) <- hashmap_utils_deserialize_fwd st;
+            hm0 <- hashmap_hash_map_insert_fwd_back hm key value;
+            (st1,_) <- hashmap_utils_serialize_fwd hm0 st0;
+            Return (st1,())
+          od
+   
+   [main_fwd_def]  Definition
+      
+      ⊢ main_fwd = Return ()
+   
+   
+*)
+end
diff --git a/tests/hol4/hashmap_main/hashmapMain_OpaqueScript.sml b/tests/hol4/hashmap_main/hashmapMain_OpaqueScript.sml
new file mode 100644
index 00000000..f7221d92
--- /dev/null
+++ b/tests/hol4/hashmap_main/hashmapMain_OpaqueScript.sml
@@ -0,0 +1,15 @@
+(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
+(** [hashmap_main]: external function declarations *)
+open primitivesLib divDefLib
+open hashmapMain_TypesTheory
+
+val _ = new_theory "hashmapMain_Opaque"
+
+
+(** [hashmap_main::hashmap_utils::deserialize]: forward function *)val _ = new_constant ("hashmap_utils_deserialize_fwd",
+  “:state -> (state # u64 hashmap_hash_map_t) result”)
+
+(** [hashmap_main::hashmap_utils::serialize]: forward function *)val _ = new_constant ("hashmap_utils_serialize_fwd",
+  “:u64 hashmap_hash_map_t -> state -> (state # unit) result”)
+
+val _ = export_theory ()
diff --git a/tests/hol4/hashmap_main/hashmapMain_OpaqueTheory.sig b/tests/hol4/hashmap_main/hashmapMain_OpaqueTheory.sig
new file mode 100644
index 00000000..f7373609
--- /dev/null
+++ b/tests/hol4/hashmap_main/hashmapMain_OpaqueTheory.sig
@@ -0,0 +1,11 @@
+signature hashmapMain_OpaqueTheory =
+sig
+  type thm = Thm.thm
+  
+  val hashmapMain_Opaque_grammars : type_grammar.grammar * term_grammar.grammar
+(*
+   [hashmapMain_Types] Parent theory of "hashmapMain_Opaque"
+   
+   
+*)
+end
diff --git a/tests/hol4/hashmap_main/hashmapMain_TypesScript.sml b/tests/hol4/hashmap_main/hashmapMain_TypesScript.sml
new file mode 100644
index 00000000..3f8ca9b9
--- /dev/null
+++ b/tests/hol4/hashmap_main/hashmapMain_TypesScript.sml
@@ -0,0 +1,27 @@
+(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
+(** [hashmap_main]: type definitions *)
+open primitivesLib divDefLib
+
+val _ = new_theory "hashmapMain_Types"
+
+
+Datatype:
+  (** [hashmap_main::hashmap::List] *)
+  hashmap_list_t = | HashmapListCons usize 't hashmap_list_t | HashmapListNil
+End
+
+Datatype:
+  (** [hashmap_main::hashmap::HashMap] *)
+  hashmap_hash_map_t =
+  <|
+    hashmap_hash_map_num_entries : usize;
+    hashmap_hash_map_max_load_factor : (usize # usize);
+    hashmap_hash_map_max_load : usize;
+    hashmap_hash_map_slots : 't hashmap_list_t vec;
+  |>
+End
+
+(** The state type used in the state-error monad *)
+val _ = new_type ("state", 0)
+
+val _ = export_theory ()
diff --git a/tests/hol4/hashmap_main/hashmapMain_TypesTheory.sig b/tests/hol4/hashmap_main/hashmapMain_TypesTheory.sig
new file mode 100644
index 00000000..a3e770ea
--- /dev/null
+++ b/tests/hol4/hashmap_main/hashmapMain_TypesTheory.sig
@@ -0,0 +1,568 @@
+signature hashmapMain_TypesTheory =
+sig
+  type thm = Thm.thm
+  
+  (*  Definitions  *)
+    val hashmap_hash_map_t_TY_DEF : thm
+    val hashmap_hash_map_t_case_def : thm
+    val hashmap_hash_map_t_hashmap_hash_map_max_load : thm
+    val hashmap_hash_map_t_hashmap_hash_map_max_load_factor : thm
+    val hashmap_hash_map_t_hashmap_hash_map_max_load_factor_fupd : thm
+    val hashmap_hash_map_t_hashmap_hash_map_max_load_fupd : thm
+    val hashmap_hash_map_t_hashmap_hash_map_num_entries : thm
+    val hashmap_hash_map_t_hashmap_hash_map_num_entries_fupd : thm
+    val hashmap_hash_map_t_hashmap_hash_map_slots : thm
+    val hashmap_hash_map_t_hashmap_hash_map_slots_fupd : thm
+    val hashmap_hash_map_t_size_def : thm
+    val hashmap_list_t_TY_DEF : thm
+    val hashmap_list_t_case_def : thm
+    val hashmap_list_t_size_def : thm
+  
+  (*  Theorems  *)
+    val EXISTS_hashmap_hash_map_t : thm
+    val FORALL_hashmap_hash_map_t : thm
+    val datatype_hashmap_hash_map_t : thm
+    val datatype_hashmap_list_t : thm
+    val hashmap_hash_map_t_11 : thm
+    val hashmap_hash_map_t_Axiom : thm
+    val hashmap_hash_map_t_accessors : thm
+    val hashmap_hash_map_t_accfupds : thm
+    val hashmap_hash_map_t_case_cong : thm
+    val hashmap_hash_map_t_case_eq : thm
+    val hashmap_hash_map_t_component_equality : thm
+    val hashmap_hash_map_t_fn_updates : thm
+    val hashmap_hash_map_t_fupdcanon : thm
+    val hashmap_hash_map_t_fupdcanon_comp : thm
+    val hashmap_hash_map_t_fupdfupds : thm
+    val hashmap_hash_map_t_fupdfupds_comp : thm
+    val hashmap_hash_map_t_induction : thm
+    val hashmap_hash_map_t_literal_11 : thm
+    val hashmap_hash_map_t_literal_nchotomy : thm
+    val hashmap_hash_map_t_nchotomy : thm
+    val hashmap_hash_map_t_updates_eq_literal : thm
+    val hashmap_list_t_11 : thm
+    val hashmap_list_t_Axiom : thm
+    val hashmap_list_t_case_cong : thm
+    val hashmap_list_t_case_eq : thm
+    val hashmap_list_t_distinct : thm
+    val hashmap_list_t_induction : thm
+    val hashmap_list_t_nchotomy : thm
+  
+  val hashmapMain_Types_grammars : type_grammar.grammar * term_grammar.grammar
+(*
+   [divDef] Parent theory of "hashmapMain_Types"
+   
+   [hashmap_hash_map_t_TY_DEF]  Definition
+      
+      ⊢ ∃rep.
+          TYPE_DEFINITION
+            (λa0'.
+                 ∀ $var$('hashmap_hash_map_t').
+                   (∀a0'.
+                      (∃a0 a1 a2 a3.
+                         a0' =
+                         (λa0 a1 a2 a3.
+                              ind_type$CONSTR 0 (a0,a1,a2,a3)
+                                (λn. ind_type$BOTTOM)) a0 a1 a2 a3) ⇒
+                      $var$('hashmap_hash_map_t') a0') ⇒
+                   $var$('hashmap_hash_map_t') a0') rep
+   
+   [hashmap_hash_map_t_case_def]  Definition
+      
+      ⊢ ∀a0 a1 a2 a3 f.
+          hashmap_hash_map_t_CASE (hashmap_hash_map_t a0 a1 a2 a3) f =
+          f a0 a1 a2 a3
+   
+   [hashmap_hash_map_t_hashmap_hash_map_max_load]  Definition
+      
+      ⊢ ∀u p u0 v.
+          (hashmap_hash_map_t u p u0 v).hashmap_hash_map_max_load = u0
+   
+   [hashmap_hash_map_t_hashmap_hash_map_max_load_factor]  Definition
+      
+      ⊢ ∀u p u0 v.
+          (hashmap_hash_map_t u p u0 v).hashmap_hash_map_max_load_factor =
+          p
+   
+   [hashmap_hash_map_t_hashmap_hash_map_max_load_factor_fupd]  Definition
+      
+      ⊢ ∀f u p u0 v.
+          hashmap_hash_map_t u p u0 v with
+          hashmap_hash_map_max_load_factor updated_by f =
+          hashmap_hash_map_t u (f p) u0 v
+   
+   [hashmap_hash_map_t_hashmap_hash_map_max_load_fupd]  Definition
+      
+      ⊢ ∀f u p u0 v.
+          hashmap_hash_map_t u p u0 v with
+          hashmap_hash_map_max_load updated_by f =
+          hashmap_hash_map_t u p (f u0) v
+   
+   [hashmap_hash_map_t_hashmap_hash_map_num_entries]  Definition
+      
+      ⊢ ∀u p u0 v.
+          (hashmap_hash_map_t u p u0 v).hashmap_hash_map_num_entries = u
+   
+   [hashmap_hash_map_t_hashmap_hash_map_num_entries_fupd]  Definition
+      
+      ⊢ ∀f u p u0 v.
+          hashmap_hash_map_t u p u0 v with
+          hashmap_hash_map_num_entries updated_by f =
+          hashmap_hash_map_t (f u) p u0 v
+   
+   [hashmap_hash_map_t_hashmap_hash_map_slots]  Definition
+      
+      ⊢ ∀u p u0 v. (hashmap_hash_map_t u p u0 v).hashmap_hash_map_slots = v
+   
+   [hashmap_hash_map_t_hashmap_hash_map_slots_fupd]  Definition
+      
+      ⊢ ∀f u p u0 v.
+          hashmap_hash_map_t u p u0 v with
+          hashmap_hash_map_slots updated_by f =
+          hashmap_hash_map_t u p u0 (f v)
+   
+   [hashmap_hash_map_t_size_def]  Definition
+      
+      ⊢ ∀f a0 a1 a2 a3.
+          hashmap_hash_map_t_size f (hashmap_hash_map_t a0 a1 a2 a3) =
+          1 + pair_size (λv. 0) (λv. 0) a1
+   
+   [hashmap_list_t_TY_DEF]  Definition
+      
+      ⊢ ∃rep.
+          TYPE_DEFINITION
+            (λa0'.
+                 ∀ $var$('hashmap_list_t').
+                   (∀a0'.
+                      (∃a0 a1 a2.
+                         a0' =
+                         (λa0 a1 a2.
+                              ind_type$CONSTR 0 (a0,a1)
+                                (ind_type$FCONS a2 (λn. ind_type$BOTTOM)))
+                           a0 a1 a2 ∧ $var$('hashmap_list_t') a2) ∨
+                      a0' =
+                      ind_type$CONSTR (SUC 0) (ARB,ARB)
+                        (λn. ind_type$BOTTOM) ⇒
+                      $var$('hashmap_list_t') a0') ⇒
+                   $var$('hashmap_list_t') a0') rep
+   
+   [hashmap_list_t_case_def]  Definition
+      
+      ⊢ (∀a0 a1 a2 f v.
+           hashmap_list_t_CASE (HashmapListCons a0 a1 a2) f v = f a0 a1 a2) ∧
+        ∀f v. hashmap_list_t_CASE HashmapListNil f v = v
+   
+   [hashmap_list_t_size_def]  Definition
+      
+      ⊢ (∀f a0 a1 a2.
+           hashmap_list_t_size f (HashmapListCons a0 a1 a2) =
+           1 + (f a1 + hashmap_list_t_size f a2)) ∧
+        ∀f. hashmap_list_t_size f HashmapListNil = 0
+   
+   [EXISTS_hashmap_hash_map_t]  Theorem
+      
+      ⊢ ∀P. (∃h. P h) ⇔
+            ∃u0 p u v.
+              P
+                <|hashmap_hash_map_num_entries := u0;
+                  hashmap_hash_map_max_load_factor := p;
+                  hashmap_hash_map_max_load := u;
+                  hashmap_hash_map_slots := v|>
+   
+   [FORALL_hashmap_hash_map_t]  Theorem
+      
+      ⊢ ∀P. (∀h. P h) ⇔
+            ∀u0 p u v.
+              P
+                <|hashmap_hash_map_num_entries := u0;
+                  hashmap_hash_map_max_load_factor := p;
+                  hashmap_hash_map_max_load := u;
+                  hashmap_hash_map_slots := v|>
+   
+   [datatype_hashmap_hash_map_t]  Theorem
+      
+      ⊢ DATATYPE
+          (record hashmap_hash_map_t hashmap_hash_map_num_entries
+             hashmap_hash_map_max_load_factor hashmap_hash_map_max_load
+             hashmap_hash_map_slots)
+   
+   [datatype_hashmap_list_t]  Theorem
+      
+      ⊢ DATATYPE (hashmap_list_t HashmapListCons HashmapListNil)
+   
+   [hashmap_hash_map_t_11]  Theorem
+      
+      ⊢ ∀a0 a1 a2 a3 a0' a1' a2' a3'.
+          hashmap_hash_map_t a0 a1 a2 a3 =
+          hashmap_hash_map_t a0' a1' a2' a3' ⇔
+          a0 = a0' ∧ a1 = a1' ∧ a2 = a2' ∧ a3 = a3'
+   
+   [hashmap_hash_map_t_Axiom]  Theorem
+      
+      ⊢ ∀f. ∃fn. ∀a0 a1 a2 a3.
+          fn (hashmap_hash_map_t a0 a1 a2 a3) = f a0 a1 a2 a3
+   
+   [hashmap_hash_map_t_accessors]  Theorem
+      
+      ⊢ (∀u p u0 v.
+           (hashmap_hash_map_t u p u0 v).hashmap_hash_map_num_entries = u) ∧
+        (∀u p u0 v.
+           (hashmap_hash_map_t u p u0 v).hashmap_hash_map_max_load_factor =
+           p) ∧
+        (∀u p u0 v.
+           (hashmap_hash_map_t u p u0 v).hashmap_hash_map_max_load = u0) ∧
+        ∀u p u0 v. (hashmap_hash_map_t u p u0 v).hashmap_hash_map_slots = v
+   
+   [hashmap_hash_map_t_accfupds]  Theorem
+      
+      ⊢ (∀h f.
+           (h with hashmap_hash_map_max_load_factor updated_by f).
+           hashmap_hash_map_num_entries =
+           h.hashmap_hash_map_num_entries) ∧
+        (∀h f.
+           (h with hashmap_hash_map_max_load updated_by f).
+           hashmap_hash_map_num_entries =
+           h.hashmap_hash_map_num_entries) ∧
+        (∀h f.
+           (h with hashmap_hash_map_slots updated_by f).
+           hashmap_hash_map_num_entries =
+           h.hashmap_hash_map_num_entries) ∧
+        (∀h f.
+           (h with hashmap_hash_map_num_entries updated_by f).
+           hashmap_hash_map_max_load_factor =
+           h.hashmap_hash_map_max_load_factor) ∧
+        (∀h f.
+           (h with hashmap_hash_map_max_load updated_by f).
+           hashmap_hash_map_max_load_factor =
+           h.hashmap_hash_map_max_load_factor) ∧
+        (∀h f.
+           (h with hashmap_hash_map_slots updated_by f).
+           hashmap_hash_map_max_load_factor =
+           h.hashmap_hash_map_max_load_factor) ∧
+        (∀h f.
+           (h with hashmap_hash_map_num_entries updated_by f).
+           hashmap_hash_map_max_load =
+           h.hashmap_hash_map_max_load) ∧
+        (∀h f.
+           (h with hashmap_hash_map_max_load_factor updated_by f).
+           hashmap_hash_map_max_load =
+           h.hashmap_hash_map_max_load) ∧
+        (∀h f.
+           (h with hashmap_hash_map_slots updated_by f).
+           hashmap_hash_map_max_load =
+           h.hashmap_hash_map_max_load) ∧
+        (∀h f.
+           (h with hashmap_hash_map_num_entries updated_by f).
+           hashmap_hash_map_slots =
+           h.hashmap_hash_map_slots) ∧
+        (∀h f.
+           (h with hashmap_hash_map_max_load_factor updated_by f).
+           hashmap_hash_map_slots =
+           h.hashmap_hash_map_slots) ∧
+        (∀h f.
+           (h with hashmap_hash_map_max_load updated_by f).
+           hashmap_hash_map_slots =
+           h.hashmap_hash_map_slots) ∧
+        (∀h f.
+           (h with hashmap_hash_map_num_entries updated_by f).
+           hashmap_hash_map_num_entries =
+           f h.hashmap_hash_map_num_entries) ∧
+        (∀h f.
+           (h with hashmap_hash_map_max_load_factor updated_by f).
+           hashmap_hash_map_max_load_factor =
+           f h.hashmap_hash_map_max_load_factor) ∧
+        (∀h f.
+           (h with hashmap_hash_map_max_load updated_by f).
+           hashmap_hash_map_max_load =
+           f h.hashmap_hash_map_max_load) ∧
+        ∀h f.
+          (h with hashmap_hash_map_slots updated_by f).
+          hashmap_hash_map_slots =
+          f h.hashmap_hash_map_slots
+   
+   [hashmap_hash_map_t_case_cong]  Theorem
+      
+      ⊢ ∀M M' f.
+          M = M' ∧
+          (∀a0 a1 a2 a3.
+             M' = hashmap_hash_map_t a0 a1 a2 a3 ⇒
+             f a0 a1 a2 a3 = f' a0 a1 a2 a3) ⇒
+          hashmap_hash_map_t_CASE M f = hashmap_hash_map_t_CASE M' f'
+   
+   [hashmap_hash_map_t_case_eq]  Theorem
+      
+      ⊢ hashmap_hash_map_t_CASE x f = v ⇔
+        ∃u p u0 v'. x = hashmap_hash_map_t u p u0 v' ∧ f u p u0 v' = v
+   
+   [hashmap_hash_map_t_component_equality]  Theorem
+      
+      ⊢ ∀h1 h2.
+          h1 = h2 ⇔
+          h1.hashmap_hash_map_num_entries = h2.hashmap_hash_map_num_entries ∧
+          h1.hashmap_hash_map_max_load_factor =
+          h2.hashmap_hash_map_max_load_factor ∧
+          h1.hashmap_hash_map_max_load = h2.hashmap_hash_map_max_load ∧
+          h1.hashmap_hash_map_slots = h2.hashmap_hash_map_slots
+   
+   [hashmap_hash_map_t_fn_updates]  Theorem
+      
+      ⊢ (∀f u p u0 v.
+           hashmap_hash_map_t u p u0 v with
+           hashmap_hash_map_num_entries updated_by f =
+           hashmap_hash_map_t (f u) p u0 v) ∧
+        (∀f u p u0 v.
+           hashmap_hash_map_t u p u0 v with
+           hashmap_hash_map_max_load_factor updated_by f =
+           hashmap_hash_map_t u (f p) u0 v) ∧
+        (∀f u p u0 v.
+           hashmap_hash_map_t u p u0 v with
+           hashmap_hash_map_max_load updated_by f =
+           hashmap_hash_map_t u p (f u0) v) ∧
+        ∀f u p u0 v.
+          hashmap_hash_map_t u p u0 v with
+          hashmap_hash_map_slots updated_by f =
+          hashmap_hash_map_t u p u0 (f v)
+   
+   [hashmap_hash_map_t_fupdcanon]  Theorem
+      
+      ⊢ (∀h g f.
+           h with
+           <|hashmap_hash_map_max_load_factor updated_by f;
+             hashmap_hash_map_num_entries updated_by g|> =
+           h with
+           <|hashmap_hash_map_num_entries updated_by g;
+             hashmap_hash_map_max_load_factor updated_by f|>) ∧
+        (∀h g f.
+           h with
+           <|hashmap_hash_map_max_load updated_by f;
+             hashmap_hash_map_num_entries updated_by g|> =
+           h with
+           <|hashmap_hash_map_num_entries updated_by g;
+             hashmap_hash_map_max_load updated_by f|>) ∧
+        (∀h g f.
+           h with
+           <|hashmap_hash_map_max_load updated_by f;
+             hashmap_hash_map_max_load_factor updated_by g|> =
+           h with
+           <|hashmap_hash_map_max_load_factor updated_by g;
+             hashmap_hash_map_max_load updated_by f|>) ∧
+        (∀h g f.
+           h with
+           <|hashmap_hash_map_slots updated_by f;
+             hashmap_hash_map_num_entries updated_by g|> =
+           h with
+           <|hashmap_hash_map_num_entries updated_by g;
+             hashmap_hash_map_slots updated_by f|>) ∧
+        (∀h g f.
+           h with
+           <|hashmap_hash_map_slots updated_by f;
+             hashmap_hash_map_max_load_factor updated_by g|> =
+           h with
+           <|hashmap_hash_map_max_load_factor updated_by g;
+             hashmap_hash_map_slots updated_by f|>) ∧
+        ∀h g f.
+          h with
+          <|hashmap_hash_map_slots updated_by f;
+            hashmap_hash_map_max_load updated_by g|> =
+          h with
+          <|hashmap_hash_map_max_load updated_by g;
+            hashmap_hash_map_slots updated_by f|>
+   
+   [hashmap_hash_map_t_fupdcanon_comp]  Theorem
+      
+      ⊢ ((∀g f.
+            hashmap_hash_map_max_load_factor_fupd f ∘
+            hashmap_hash_map_num_entries_fupd g =
+            hashmap_hash_map_num_entries_fupd g ∘
+            hashmap_hash_map_max_load_factor_fupd f) ∧
+         ∀h g f.
+           hashmap_hash_map_max_load_factor_fupd f ∘
+           hashmap_hash_map_num_entries_fupd g ∘ h =
+           hashmap_hash_map_num_entries_fupd g ∘
+           hashmap_hash_map_max_load_factor_fupd f ∘ h) ∧
+        ((∀g f.
+            hashmap_hash_map_max_load_fupd f ∘
+            hashmap_hash_map_num_entries_fupd g =
+            hashmap_hash_map_num_entries_fupd g ∘
+            hashmap_hash_map_max_load_fupd f) ∧
+         ∀h g f.
+           hashmap_hash_map_max_load_fupd f ∘
+           hashmap_hash_map_num_entries_fupd g ∘ h =
+           hashmap_hash_map_num_entries_fupd g ∘
+           hashmap_hash_map_max_load_fupd f ∘ h) ∧
+        ((∀g f.
+            hashmap_hash_map_max_load_fupd f ∘
+            hashmap_hash_map_max_load_factor_fupd g =
+            hashmap_hash_map_max_load_factor_fupd g ∘
+            hashmap_hash_map_max_load_fupd f) ∧
+         ∀h g f.
+           hashmap_hash_map_max_load_fupd f ∘
+           hashmap_hash_map_max_load_factor_fupd g ∘ h =
+           hashmap_hash_map_max_load_factor_fupd g ∘
+           hashmap_hash_map_max_load_fupd f ∘ h) ∧
+        ((∀g f.
+            hashmap_hash_map_slots_fupd f ∘
+            hashmap_hash_map_num_entries_fupd g =
+            hashmap_hash_map_num_entries_fupd g ∘
+            hashmap_hash_map_slots_fupd f) ∧
+         ∀h g f.
+           hashmap_hash_map_slots_fupd f ∘
+           hashmap_hash_map_num_entries_fupd g ∘ h =
+           hashmap_hash_map_num_entries_fupd g ∘
+           hashmap_hash_map_slots_fupd f ∘ h) ∧
+        ((∀g f.
+            hashmap_hash_map_slots_fupd f ∘
+            hashmap_hash_map_max_load_factor_fupd g =
+            hashmap_hash_map_max_load_factor_fupd g ∘
+            hashmap_hash_map_slots_fupd f) ∧
+         ∀h g f.
+           hashmap_hash_map_slots_fupd f ∘
+           hashmap_hash_map_max_load_factor_fupd g ∘ h =
+           hashmap_hash_map_max_load_factor_fupd g ∘
+           hashmap_hash_map_slots_fupd f ∘ h) ∧
+        (∀g f.
+           hashmap_hash_map_slots_fupd f ∘ hashmap_hash_map_max_load_fupd g =
+           hashmap_hash_map_max_load_fupd g ∘ hashmap_hash_map_slots_fupd f) ∧
+        ∀h g f.
+          hashmap_hash_map_slots_fupd f ∘
+          hashmap_hash_map_max_load_fupd g ∘ h =
+          hashmap_hash_map_max_load_fupd g ∘
+          hashmap_hash_map_slots_fupd f ∘ h
+   
+   [hashmap_hash_map_t_fupdfupds]  Theorem
+      
+      ⊢ (∀h g f.
+           h with
+           <|hashmap_hash_map_num_entries updated_by f;
+             hashmap_hash_map_num_entries updated_by g|> =
+           h with hashmap_hash_map_num_entries updated_by f ∘ g) ∧
+        (∀h g f.
+           h with
+           <|hashmap_hash_map_max_load_factor updated_by f;
+             hashmap_hash_map_max_load_factor updated_by g|> =
+           h with hashmap_hash_map_max_load_factor updated_by f ∘ g) ∧
+        (∀h g f.
+           h with
+           <|hashmap_hash_map_max_load updated_by f;
+             hashmap_hash_map_max_load updated_by g|> =
+           h with hashmap_hash_map_max_load updated_by f ∘ g) ∧
+        ∀h g f.
+          h with
+          <|hashmap_hash_map_slots updated_by f;
+            hashmap_hash_map_slots updated_by g|> =
+          h with hashmap_hash_map_slots updated_by f ∘ g
+   
+   [hashmap_hash_map_t_fupdfupds_comp]  Theorem
+      
+      ⊢ ((∀g f.
+            hashmap_hash_map_num_entries_fupd f ∘
+            hashmap_hash_map_num_entries_fupd g =
+            hashmap_hash_map_num_entries_fupd (f ∘ g)) ∧
+         ∀h g f.
+           hashmap_hash_map_num_entries_fupd f ∘
+           hashmap_hash_map_num_entries_fupd g ∘ h =
+           hashmap_hash_map_num_entries_fupd (f ∘ g) ∘ h) ∧
+        ((∀g f.
+            hashmap_hash_map_max_load_factor_fupd f ∘
+            hashmap_hash_map_max_load_factor_fupd g =
+            hashmap_hash_map_max_load_factor_fupd (f ∘ g)) ∧
+         ∀h g f.
+           hashmap_hash_map_max_load_factor_fupd f ∘
+           hashmap_hash_map_max_load_factor_fupd g ∘ h =
+           hashmap_hash_map_max_load_factor_fupd (f ∘ g) ∘ h) ∧
+        ((∀g f.
+            hashmap_hash_map_max_load_fupd f ∘
+            hashmap_hash_map_max_load_fupd g =
+            hashmap_hash_map_max_load_fupd (f ∘ g)) ∧
+         ∀h g f.
+           hashmap_hash_map_max_load_fupd f ∘
+           hashmap_hash_map_max_load_fupd g ∘ h =
+           hashmap_hash_map_max_load_fupd (f ∘ g) ∘ h) ∧
+        (∀g f.
+           hashmap_hash_map_slots_fupd f ∘ hashmap_hash_map_slots_fupd g =
+           hashmap_hash_map_slots_fupd (f ∘ g)) ∧
+        ∀h g f.
+          hashmap_hash_map_slots_fupd f ∘ hashmap_hash_map_slots_fupd g ∘ h =
+          hashmap_hash_map_slots_fupd (f ∘ g) ∘ h
+   
+   [hashmap_hash_map_t_induction]  Theorem
+      
+      ⊢ ∀P. (∀u p u0 v. P (hashmap_hash_map_t u p u0 v)) ⇒ ∀h. P h
+   
+   [hashmap_hash_map_t_literal_11]  Theorem
+      
+      ⊢ ∀u01 p1 u1 v1 u02 p2 u2 v2.
+          <|hashmap_hash_map_num_entries := u01;
+            hashmap_hash_map_max_load_factor := p1;
+            hashmap_hash_map_max_load := u1; hashmap_hash_map_slots := v1|> =
+          <|hashmap_hash_map_num_entries := u02;
+            hashmap_hash_map_max_load_factor := p2;
+            hashmap_hash_map_max_load := u2; hashmap_hash_map_slots := v2|> ⇔
+          u01 = u02 ∧ p1 = p2 ∧ u1 = u2 ∧ v1 = v2
+   
+   [hashmap_hash_map_t_literal_nchotomy]  Theorem
+      
+      ⊢ ∀h. ∃u0 p u v.
+          h =
+          <|hashmap_hash_map_num_entries := u0;
+            hashmap_hash_map_max_load_factor := p;
+            hashmap_hash_map_max_load := u; hashmap_hash_map_slots := v|>
+   
+   [hashmap_hash_map_t_nchotomy]  Theorem
+      
+      ⊢ ∀hh. ∃u p u0 v. hh = hashmap_hash_map_t u p u0 v
+   
+   [hashmap_hash_map_t_updates_eq_literal]  Theorem
+      
+      ⊢ ∀h u0 p u v.
+          h with
+          <|hashmap_hash_map_num_entries := u0;
+            hashmap_hash_map_max_load_factor := p;
+            hashmap_hash_map_max_load := u; hashmap_hash_map_slots := v|> =
+          <|hashmap_hash_map_num_entries := u0;
+            hashmap_hash_map_max_load_factor := p;
+            hashmap_hash_map_max_load := u; hashmap_hash_map_slots := v|>
+   
+   [hashmap_list_t_11]  Theorem
+      
+      ⊢ ∀a0 a1 a2 a0' a1' a2'.
+          HashmapListCons a0 a1 a2 = HashmapListCons a0' a1' a2' ⇔
+          a0 = a0' ∧ a1 = a1' ∧ a2 = a2'
+   
+   [hashmap_list_t_Axiom]  Theorem
+      
+      ⊢ ∀f0 f1. ∃fn.
+          (∀a0 a1 a2. fn (HashmapListCons a0 a1 a2) = f0 a0 a1 a2 (fn a2)) ∧
+          fn HashmapListNil = f1
+   
+   [hashmap_list_t_case_cong]  Theorem
+      
+      ⊢ ∀M M' f v.
+          M = M' ∧
+          (∀a0 a1 a2.
+             M' = HashmapListCons a0 a1 a2 ⇒ f a0 a1 a2 = f' a0 a1 a2) ∧
+          (M' = HashmapListNil ⇒ v = v') ⇒
+          hashmap_list_t_CASE M f v = hashmap_list_t_CASE M' f' v'
+   
+   [hashmap_list_t_case_eq]  Theorem
+      
+      ⊢ hashmap_list_t_CASE x f v = v' ⇔
+        (∃u t h. x = HashmapListCons u t h ∧ f u t h = v') ∨
+        x = HashmapListNil ∧ v = v'
+   
+   [hashmap_list_t_distinct]  Theorem
+      
+      ⊢ ∀a2 a1 a0. HashmapListCons a0 a1 a2 ≠ HashmapListNil
+   
+   [hashmap_list_t_induction]  Theorem
+      
+      ⊢ ∀P. (∀h. P h ⇒ ∀t u. P (HashmapListCons u t h)) ∧ P HashmapListNil ⇒
+            ∀h. P h
+   
+   [hashmap_list_t_nchotomy]  Theorem
+      
+      ⊢ ∀hh. (∃u t h. hh = HashmapListCons u t h) ∨ hh = HashmapListNil
+   
+   
+*)
+end
diff --git a/tests/hol4/hashmap_on_disk/Holmakefile b/tests/hol4/hashmap_on_disk/Holmakefile
deleted file mode 100644
index 3c4b8973..00000000
--- a/tests/hol4/hashmap_on_disk/Holmakefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# This file was automatically generated - modify ../Holmakefile.template instead
-INCLUDES =  ../../../backends/hol4
-
-all: $(DEFAULT_TARGETS)
-.PHONY: all
diff --git a/tests/hol4/hashmap_on_disk/hashmapMain_FunsScript.sml b/tests/hol4/hashmap_on_disk/hashmapMain_FunsScript.sml
deleted file mode 100644
index c1e30aa6..00000000
--- a/tests/hol4/hashmap_on_disk/hashmapMain_FunsScript.sml
+++ /dev/null
@@ -1,647 +0,0 @@
-(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
-(** [hashmap_main]: function definitions *)
-open primitivesLib divDefLib
-open hashmapMain_TypesTheory hashmapMain_OpaqueTheory
-
-val _ = new_theory "hashmapMain_Funs"
-
-
-val hashmap_hash_key_fwd_def = Define ‘
-  (** [hashmap_main::hashmap::hash_key]: forward function *)
-  hashmap_hash_key_fwd (k : usize) : usize result =
-    Return k
-’
-
-val [hashmap_hash_map_allocate_slots_loop_fwd_def] = DefineDiv ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::allocate_slots]: loop 0: forward function *)
-  hashmap_hash_map_allocate_slots_loop_fwd
-    (slots : 't hashmap_list_t vec) (n : usize) :
-    't hashmap_list_t vec result
-    =
-    if usize_gt n (int_to_usize 0)
-    then (
-      do
-      slots0 <- vec_push_back slots HashmapListNil;
-      n0 <- usize_sub n (int_to_usize 1);
-      hashmap_hash_map_allocate_slots_loop_fwd slots0 n0
-      od)
-    else Return slots
-’
-
-val hashmap_hash_map_allocate_slots_fwd_def = Define ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::allocate_slots]: forward function *)
-  hashmap_hash_map_allocate_slots_fwd
-    (slots : 't hashmap_list_t vec) (n : usize) :
-    't hashmap_list_t vec result
-    =
-    hashmap_hash_map_allocate_slots_loop_fwd slots n
-’
-
-val hashmap_hash_map_new_with_capacity_fwd_def = Define ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::new_with_capacity]: forward function *)
-  hashmap_hash_map_new_with_capacity_fwd
-    (capacity : usize) (max_load_dividend : usize) (max_load_divisor : usize) :
-    't hashmap_hash_map_t result
-    =
-    let v = vec_new in
-    do
-    slots <- hashmap_hash_map_allocate_slots_fwd v capacity;
-    i <- usize_mul capacity max_load_dividend;
-    i0 <- usize_div i max_load_divisor;
-    Return
-      (<|
-         hashmap_hash_map_num_entries := (int_to_usize 0);
-         hashmap_hash_map_max_load_factor :=
-           (max_load_dividend, max_load_divisor);
-         hashmap_hash_map_max_load := i0;
-         hashmap_hash_map_slots := slots
-         |>)
-    od
-’
-
-val hashmap_hash_map_new_fwd_def = Define ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::new]: forward function *)
-  hashmap_hash_map_new_fwd : 't hashmap_hash_map_t result =
-    hashmap_hash_map_new_with_capacity_fwd (int_to_usize 32) (int_to_usize 4)
-      (int_to_usize 5)
-’
-
-val [hashmap_hash_map_clear_loop_fwd_back_def] = DefineDiv ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::clear]: loop 0: merged forward/backward function
-      (there is a single backward function, and the forward function returns ()) *)
-  hashmap_hash_map_clear_loop_fwd_back
-    (slots : 't hashmap_list_t vec) (i : usize) :
-    't hashmap_list_t vec result
-    =
-    let i0 = vec_len slots in
-    if usize_lt i i0
-    then (
-      do
-      i1 <- usize_add i (int_to_usize 1);
-      slots0 <- vec_index_mut_back slots i HashmapListNil;
-      hashmap_hash_map_clear_loop_fwd_back slots0 i1
-      od)
-    else Return slots
-’
-
-val hashmap_hash_map_clear_fwd_back_def = Define ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::clear]: merged forward/backward function
-      (there is a single backward function, and the forward function returns ()) *)
-  hashmap_hash_map_clear_fwd_back
-    (self : 't hashmap_hash_map_t) : 't hashmap_hash_map_t result =
-    do
-    v <-
-      hashmap_hash_map_clear_loop_fwd_back self.hashmap_hash_map_slots
-        (int_to_usize 0);
-    Return
-      (self
-         with
-         <|
-         hashmap_hash_map_num_entries := (int_to_usize 0);
-         hashmap_hash_map_slots := v
-         |>)
-    od
-’
-
-val hashmap_hash_map_len_fwd_def = Define ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::len]: forward function *)
-  hashmap_hash_map_len_fwd (self : 't hashmap_hash_map_t) : usize result =
-    Return self.hashmap_hash_map_num_entries
-’
-
-val [hashmap_hash_map_insert_in_list_loop_fwd_def] = DefineDiv ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::insert_in_list]: loop 0: forward function *)
-  hashmap_hash_map_insert_in_list_loop_fwd
-    (key : usize) (value : 't) (ls : 't hashmap_list_t) : bool result =
-    (case ls of
-    | HashmapListCons ckey cvalue tl =>
-      if ckey = key
-      then Return F
-      else hashmap_hash_map_insert_in_list_loop_fwd key value tl
-    | HashmapListNil => Return T)
-’
-
-val hashmap_hash_map_insert_in_list_fwd_def = Define ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::insert_in_list]: forward function *)
-  hashmap_hash_map_insert_in_list_fwd
-    (key : usize) (value : 't) (ls : 't hashmap_list_t) : bool result =
-    hashmap_hash_map_insert_in_list_loop_fwd key value ls
-’
-
-val [hashmap_hash_map_insert_in_list_loop_back_def] = DefineDiv ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::insert_in_list]: loop 0: backward function 0 *)
-  hashmap_hash_map_insert_in_list_loop_back
-    (key : usize) (value : 't) (ls : 't hashmap_list_t) :
-    't hashmap_list_t result
-    =
-    (case ls of
-    | HashmapListCons ckey cvalue tl =>
-      if ckey = key
-      then Return (HashmapListCons ckey value tl)
-      else (
-        do
-        tl0 <- hashmap_hash_map_insert_in_list_loop_back key value tl;
-        Return (HashmapListCons ckey cvalue tl0)
-        od)
-    | HashmapListNil =>
-      let l = HashmapListNil in Return (HashmapListCons key value l))
-’
-
-val hashmap_hash_map_insert_in_list_back_def = Define ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::insert_in_list]: backward function 0 *)
-  hashmap_hash_map_insert_in_list_back
-    (key : usize) (value : 't) (ls : 't hashmap_list_t) :
-    't hashmap_list_t result
-    =
-    hashmap_hash_map_insert_in_list_loop_back key value ls
-’
-
-val hashmap_hash_map_insert_no_resize_fwd_back_def = Define ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::insert_no_resize]: merged forward/backward function
-      (there is a single backward function, and the forward function returns ()) *)
-  hashmap_hash_map_insert_no_resize_fwd_back
-    (self : 't hashmap_hash_map_t) (key : usize) (value : 't) :
-    't hashmap_hash_map_t result
-    =
-    do
-    hash <- hashmap_hash_key_fwd key;
-    let i = vec_len self.hashmap_hash_map_slots in
-    do
-    hash_mod <- usize_rem hash i;
-    l <- vec_index_mut_fwd self.hashmap_hash_map_slots hash_mod;
-    inserted <- hashmap_hash_map_insert_in_list_fwd key value l;
-    if inserted
-    then (
-      do
-      i0 <- usize_add self.hashmap_hash_map_num_entries (int_to_usize 1);
-      l0 <- hashmap_hash_map_insert_in_list_back key value l;
-      v <- vec_index_mut_back self.hashmap_hash_map_slots hash_mod l0;
-      Return
-        (self
-           with
-           <|
-           hashmap_hash_map_num_entries := i0; hashmap_hash_map_slots := v
-           |>)
-      od)
-    else (
-      do
-      l0 <- hashmap_hash_map_insert_in_list_back key value l;
-      v <- vec_index_mut_back self.hashmap_hash_map_slots hash_mod l0;
-      Return (self with <| hashmap_hash_map_slots := v |>)
-      od)
-    od
-    od
-’
-
-val [hashmap_hash_map_move_elements_from_list_loop_fwd_back_def] = DefineDiv ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::move_elements_from_list]: loop 0: merged forward/backward function
-      (there is a single backward function, and the forward function returns ()) *)
-  hashmap_hash_map_move_elements_from_list_loop_fwd_back
-    (ntable : 't hashmap_hash_map_t) (ls : 't hashmap_list_t) :
-    't hashmap_hash_map_t result
-    =
-    (case ls of
-    | HashmapListCons k v tl =>
-      do
-      ntable0 <- hashmap_hash_map_insert_no_resize_fwd_back ntable k v;
-      hashmap_hash_map_move_elements_from_list_loop_fwd_back ntable0 tl
-      od
-    | HashmapListNil => Return ntable)
-’
-
-val hashmap_hash_map_move_elements_from_list_fwd_back_def = Define ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::move_elements_from_list]: merged forward/backward function
-      (there is a single backward function, and the forward function returns ()) *)
-  hashmap_hash_map_move_elements_from_list_fwd_back
-    (ntable : 't hashmap_hash_map_t) (ls : 't hashmap_list_t) :
-    't hashmap_hash_map_t result
-    =
-    hashmap_hash_map_move_elements_from_list_loop_fwd_back ntable ls
-’
-
-val [hashmap_hash_map_move_elements_loop_fwd_back_def] = DefineDiv ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::move_elements]: loop 0: merged forward/backward function
-      (there is a single backward function, and the forward function returns ()) *)
-  hashmap_hash_map_move_elements_loop_fwd_back
-    (ntable : 't hashmap_hash_map_t) (slots : 't hashmap_list_t vec)
-    (i : usize) :
-    ('t hashmap_hash_map_t # 't hashmap_list_t vec) result
-    =
-    let i0 = vec_len slots in
-    if usize_lt i i0
-    then (
-      do
-      l <- vec_index_mut_fwd slots i;
-      let ls = mem_replace_fwd l HashmapListNil in
-      do
-      ntable0 <- hashmap_hash_map_move_elements_from_list_fwd_back ntable ls;
-      i1 <- usize_add i (int_to_usize 1);
-      let l0 = mem_replace_back l HashmapListNil in
-      do
-      slots0 <- vec_index_mut_back slots i l0;
-      hashmap_hash_map_move_elements_loop_fwd_back ntable0 slots0 i1
-      od
-      od
-      od)
-    else Return (ntable, slots)
-’
-
-val hashmap_hash_map_move_elements_fwd_back_def = Define ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::move_elements]: merged forward/backward function
-      (there is a single backward function, and the forward function returns ()) *)
-  hashmap_hash_map_move_elements_fwd_back
-    (ntable : 't hashmap_hash_map_t) (slots : 't hashmap_list_t vec)
-    (i : usize) :
-    ('t hashmap_hash_map_t # 't hashmap_list_t vec) result
-    =
-    hashmap_hash_map_move_elements_loop_fwd_back ntable slots i
-’
-
-val hashmap_hash_map_try_resize_fwd_back_def = Define ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::try_resize]: merged forward/backward function
-      (there is a single backward function, and the forward function returns ()) *)
-  hashmap_hash_map_try_resize_fwd_back
-    (self : 't hashmap_hash_map_t) : 't hashmap_hash_map_t result =
-    do
-    max_usize <- mk_usize (u32_to_int core_u32_max);
-    let capacity = vec_len self.hashmap_hash_map_slots in
-    do
-    n1 <- usize_div max_usize (int_to_usize 2);
-    let (i, i0) = self.hashmap_hash_map_max_load_factor in
-    do
-    i1 <- usize_div n1 i;
-    if usize_le capacity i1
-    then (
-      do
-      i2 <- usize_mul capacity (int_to_usize 2);
-      ntable <- hashmap_hash_map_new_with_capacity_fwd i2 i i0;
-      (ntable0, _) <-
-        hashmap_hash_map_move_elements_fwd_back ntable
-          self.hashmap_hash_map_slots (int_to_usize 0);
-      Return
-        (ntable0
-           with
-           <|
-           hashmap_hash_map_num_entries := self.hashmap_hash_map_num_entries;
-           hashmap_hash_map_max_load_factor := (i, i0)
-           |>)
-      od)
-    else Return (self with <| hashmap_hash_map_max_load_factor := (i, i0) |>)
-    od
-    od
-    od
-’
-
-val hashmap_hash_map_insert_fwd_back_def = Define ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::insert]: merged forward/backward function
-      (there is a single backward function, and the forward function returns ()) *)
-  hashmap_hash_map_insert_fwd_back
-    (self : 't hashmap_hash_map_t) (key : usize) (value : 't) :
-    't hashmap_hash_map_t result
-    =
-    do
-    self0 <- hashmap_hash_map_insert_no_resize_fwd_back self key value;
-    i <- hashmap_hash_map_len_fwd self0;
-    if usize_gt i self0.hashmap_hash_map_max_load
-    then hashmap_hash_map_try_resize_fwd_back self0
-    else Return self0
-    od
-’
-
-val [hashmap_hash_map_contains_key_in_list_loop_fwd_def] = DefineDiv ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::contains_key_in_list]: loop 0: forward function *)
-  hashmap_hash_map_contains_key_in_list_loop_fwd
-    (key : usize) (ls : 't hashmap_list_t) : bool result =
-    (case ls of
-    | HashmapListCons ckey t tl =>
-      if ckey = key
-      then Return T
-      else hashmap_hash_map_contains_key_in_list_loop_fwd key tl
-    | HashmapListNil => Return F)
-’
-
-val hashmap_hash_map_contains_key_in_list_fwd_def = Define ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::contains_key_in_list]: forward function *)
-  hashmap_hash_map_contains_key_in_list_fwd
-    (key : usize) (ls : 't hashmap_list_t) : bool result =
-    hashmap_hash_map_contains_key_in_list_loop_fwd key ls
-’
-
-val hashmap_hash_map_contains_key_fwd_def = Define ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::contains_key]: forward function *)
-  hashmap_hash_map_contains_key_fwd
-    (self : 't hashmap_hash_map_t) (key : usize) : bool result =
-    do
-    hash <- hashmap_hash_key_fwd key;
-    let i = vec_len self.hashmap_hash_map_slots in
-    do
-    hash_mod <- usize_rem hash i;
-    l <- vec_index_fwd self.hashmap_hash_map_slots hash_mod;
-    hashmap_hash_map_contains_key_in_list_fwd key l
-    od
-    od
-’
-
-val [hashmap_hash_map_get_in_list_loop_fwd_def] = DefineDiv ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::get_in_list]: loop 0: forward function *)
-  hashmap_hash_map_get_in_list_loop_fwd
-    (key : usize) (ls : 't hashmap_list_t) : 't result =
-    (case ls of
-    | HashmapListCons ckey cvalue tl =>
-      if ckey = key
-      then Return cvalue
-      else hashmap_hash_map_get_in_list_loop_fwd key tl
-    | HashmapListNil => Fail Failure)
-’
-
-val hashmap_hash_map_get_in_list_fwd_def = Define ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::get_in_list]: forward function *)
-  hashmap_hash_map_get_in_list_fwd
-    (key : usize) (ls : 't hashmap_list_t) : 't result =
-    hashmap_hash_map_get_in_list_loop_fwd key ls
-’
-
-val hashmap_hash_map_get_fwd_def = Define ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::get]: forward function *)
-  hashmap_hash_map_get_fwd
-    (self : 't hashmap_hash_map_t) (key : usize) : 't result =
-    do
-    hash <- hashmap_hash_key_fwd key;
-    let i = vec_len self.hashmap_hash_map_slots in
-    do
-    hash_mod <- usize_rem hash i;
-    l <- vec_index_fwd self.hashmap_hash_map_slots hash_mod;
-    hashmap_hash_map_get_in_list_fwd key l
-    od
-    od
-’
-
-val [hashmap_hash_map_get_mut_in_list_loop_fwd_def] = DefineDiv ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::get_mut_in_list]: loop 0: forward function *)
-  hashmap_hash_map_get_mut_in_list_loop_fwd
-    (ls : 't hashmap_list_t) (key : usize) : 't result =
-    (case ls of
-    | HashmapListCons ckey cvalue tl =>
-      if ckey = key
-      then Return cvalue
-      else hashmap_hash_map_get_mut_in_list_loop_fwd tl key
-    | HashmapListNil => Fail Failure)
-’
-
-val hashmap_hash_map_get_mut_in_list_fwd_def = Define ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::get_mut_in_list]: forward function *)
-  hashmap_hash_map_get_mut_in_list_fwd
-    (ls : 't hashmap_list_t) (key : usize) : 't result =
-    hashmap_hash_map_get_mut_in_list_loop_fwd ls key
-’
-
-val [hashmap_hash_map_get_mut_in_list_loop_back_def] = DefineDiv ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::get_mut_in_list]: loop 0: backward function 0 *)
-  hashmap_hash_map_get_mut_in_list_loop_back
-    (ls : 't hashmap_list_t) (key : usize) (ret : 't) :
-    't hashmap_list_t result
-    =
-    (case ls of
-    | HashmapListCons ckey cvalue tl =>
-      if ckey = key
-      then Return (HashmapListCons ckey ret tl)
-      else (
-        do
-        tl0 <- hashmap_hash_map_get_mut_in_list_loop_back tl key ret;
-        Return (HashmapListCons ckey cvalue tl0)
-        od)
-    | HashmapListNil => Fail Failure)
-’
-
-val hashmap_hash_map_get_mut_in_list_back_def = Define ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::get_mut_in_list]: backward function 0 *)
-  hashmap_hash_map_get_mut_in_list_back
-    (ls : 't hashmap_list_t) (key : usize) (ret : 't) :
-    't hashmap_list_t result
-    =
-    hashmap_hash_map_get_mut_in_list_loop_back ls key ret
-’
-
-val hashmap_hash_map_get_mut_fwd_def = Define ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::get_mut]: forward function *)
-  hashmap_hash_map_get_mut_fwd
-    (self : 't hashmap_hash_map_t) (key : usize) : 't result =
-    do
-    hash <- hashmap_hash_key_fwd key;
-    let i = vec_len self.hashmap_hash_map_slots in
-    do
-    hash_mod <- usize_rem hash i;
-    l <- vec_index_mut_fwd self.hashmap_hash_map_slots hash_mod;
-    hashmap_hash_map_get_mut_in_list_fwd l key
-    od
-    od
-’
-
-val hashmap_hash_map_get_mut_back_def = Define ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::get_mut]: backward function 0 *)
-  hashmap_hash_map_get_mut_back
-    (self : 't hashmap_hash_map_t) (key : usize) (ret : 't) :
-    't hashmap_hash_map_t result
-    =
-    do
-    hash <- hashmap_hash_key_fwd key;
-    let i = vec_len self.hashmap_hash_map_slots in
-    do
-    hash_mod <- usize_rem hash i;
-    l <- vec_index_mut_fwd self.hashmap_hash_map_slots hash_mod;
-    l0 <- hashmap_hash_map_get_mut_in_list_back l key ret;
-    v <- vec_index_mut_back self.hashmap_hash_map_slots hash_mod l0;
-    Return (self with <| hashmap_hash_map_slots := v |>)
-    od
-    od
-’
-
-val [hashmap_hash_map_remove_from_list_loop_fwd_def] = DefineDiv ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::remove_from_list]: loop 0: forward function *)
-  hashmap_hash_map_remove_from_list_loop_fwd
-    (key : usize) (ls : 't hashmap_list_t) : 't option result =
-    (case ls of
-    | HashmapListCons ckey t tl =>
-      if ckey = key
-      then
-        let mv_ls = mem_replace_fwd (HashmapListCons ckey t tl) HashmapListNil
-          in
-        (case mv_ls of
-        | HashmapListCons i cvalue tl0 => Return (SOME cvalue)
-        | HashmapListNil => Fail Failure)
-      else hashmap_hash_map_remove_from_list_loop_fwd key tl
-    | HashmapListNil => Return NONE)
-’
-
-val hashmap_hash_map_remove_from_list_fwd_def = Define ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::remove_from_list]: forward function *)
-  hashmap_hash_map_remove_from_list_fwd
-    (key : usize) (ls : 't hashmap_list_t) : 't option result =
-    hashmap_hash_map_remove_from_list_loop_fwd key ls
-’
-
-val [hashmap_hash_map_remove_from_list_loop_back_def] = DefineDiv ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::remove_from_list]: loop 0: backward function 1 *)
-  hashmap_hash_map_remove_from_list_loop_back
-    (key : usize) (ls : 't hashmap_list_t) : 't hashmap_list_t result =
-    (case ls of
-    | HashmapListCons ckey t tl =>
-      if ckey = key
-      then
-        let mv_ls = mem_replace_fwd (HashmapListCons ckey t tl) HashmapListNil
-          in
-        (case mv_ls of
-        | HashmapListCons i cvalue tl0 => Return tl0
-        | HashmapListNil => Fail Failure)
-      else (
-        do
-        tl0 <- hashmap_hash_map_remove_from_list_loop_back key tl;
-        Return (HashmapListCons ckey t tl0)
-        od)
-    | HashmapListNil => Return HashmapListNil)
-’
-
-val hashmap_hash_map_remove_from_list_back_def = Define ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::remove_from_list]: backward function 1 *)
-  hashmap_hash_map_remove_from_list_back
-    (key : usize) (ls : 't hashmap_list_t) : 't hashmap_list_t result =
-    hashmap_hash_map_remove_from_list_loop_back key ls
-’
-
-val hashmap_hash_map_remove_fwd_def = Define ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::remove]: forward function *)
-  hashmap_hash_map_remove_fwd
-    (self : 't hashmap_hash_map_t) (key : usize) : 't option result =
-    do
-    hash <- hashmap_hash_key_fwd key;
-    let i = vec_len self.hashmap_hash_map_slots in
-    do
-    hash_mod <- usize_rem hash i;
-    l <- vec_index_mut_fwd self.hashmap_hash_map_slots hash_mod;
-    x <- hashmap_hash_map_remove_from_list_fwd key l;
-    (case x of
-    | NONE => Return NONE
-    | SOME x0 =>
-      do
-      _ <- usize_sub self.hashmap_hash_map_num_entries (int_to_usize 1);
-      Return (SOME x0)
-      od)
-    od
-    od
-’
-
-val hashmap_hash_map_remove_back_def = Define ‘
-  (** [hashmap_main::hashmap::HashMap::{0}::remove]: backward function 0 *)
-  hashmap_hash_map_remove_back
-    (self : 't hashmap_hash_map_t) (key : usize) :
-    't hashmap_hash_map_t result
-    =
-    do
-    hash <- hashmap_hash_key_fwd key;
-    let i = vec_len self.hashmap_hash_map_slots in
-    do
-    hash_mod <- usize_rem hash i;
-    l <- vec_index_mut_fwd self.hashmap_hash_map_slots hash_mod;
-    x <- hashmap_hash_map_remove_from_list_fwd key l;
-    (case x of
-    | NONE =>
-      do
-      l0 <- hashmap_hash_map_remove_from_list_back key l;
-      v <- vec_index_mut_back self.hashmap_hash_map_slots hash_mod l0;
-      Return (self with <| hashmap_hash_map_slots := v |>)
-      od
-    | SOME x0 =>
-      do
-      i0 <- usize_sub self.hashmap_hash_map_num_entries (int_to_usize 1);
-      l0 <- hashmap_hash_map_remove_from_list_back key l;
-      v <- vec_index_mut_back self.hashmap_hash_map_slots hash_mod l0;
-      Return
-        (self
-           with
-           <|
-           hashmap_hash_map_num_entries := i0; hashmap_hash_map_slots := v
-           |>)
-      od)
-    od
-    od
-’
-
-val hashmap_test1_fwd_def = Define ‘
-  (** [hashmap_main::hashmap::test1]: forward function *)
-  hashmap_test1_fwd : unit result =
-    do
-    hm <- hashmap_hash_map_new_fwd;
-    hm0 <-
-      hashmap_hash_map_insert_fwd_back hm (int_to_usize 0) (int_to_u64 42);
-    hm1 <-
-      hashmap_hash_map_insert_fwd_back hm0 (int_to_usize 128) (int_to_u64 18);
-    hm2 <-
-      hashmap_hash_map_insert_fwd_back hm1 (int_to_usize 1024) (int_to_u64 138);
-    hm3 <-
-      hashmap_hash_map_insert_fwd_back hm2 (int_to_usize 1056) (int_to_u64 256);
-    i <- hashmap_hash_map_get_fwd hm3 (int_to_usize 128);
-    if ~ (i = int_to_u64 18)
-    then Fail Failure
-    else (
-      do
-      hm4 <-
-        hashmap_hash_map_get_mut_back hm3 (int_to_usize 1024) (int_to_u64 56);
-      i0 <- hashmap_hash_map_get_fwd hm4 (int_to_usize 1024);
-      if ~ (i0 = int_to_u64 56)
-      then Fail Failure
-      else (
-        do
-        x <- hashmap_hash_map_remove_fwd hm4 (int_to_usize 1024);
-        (case x of
-        | NONE => Fail Failure
-        | SOME x0 =>
-          if ~ (x0 = int_to_u64 56)
-          then Fail Failure
-          else (
-            do
-            hm5 <- hashmap_hash_map_remove_back hm4 (int_to_usize 1024);
-            i1 <- hashmap_hash_map_get_fwd hm5 (int_to_usize 0);
-            if ~ (i1 = int_to_u64 42)
-            then Fail Failure
-            else (
-              do
-              i2 <- hashmap_hash_map_get_fwd hm5 (int_to_usize 128);
-              if ~ (i2 = int_to_u64 18)
-              then Fail Failure
-              else (
-                do
-                i3 <- hashmap_hash_map_get_fwd hm5 (int_to_usize 1056);
-                if ~ (i3 = int_to_u64 256) then Fail Failure else Return ()
-                od)
-              od)
-            od))
-        od)
-      od)
-    od
-’
-
-(** Unit test for [hashmap_main::hashmap::test1] *)
-val _ = assert_return (“hashmap_test1_fwd”)
-
-val insert_on_disk_fwd_def = Define ‘
-  (** [hashmap_main::insert_on_disk]: forward function *)
-  insert_on_disk_fwd
-    (key : usize) (value : u64) (st : state) : (state # unit) result =
-    do
-    (st0, hm) <- hashmap_utils_deserialize_fwd st;
-    hm0 <- hashmap_hash_map_insert_fwd_back hm key value;
-    (st1, _) <- hashmap_utils_serialize_fwd hm0 st0;
-    Return (st1, ())
-    od
-’
-
-val main_fwd_def = Define ‘
-  (** [hashmap_main::main]: forward function *)
-  main_fwd : unit result =
-    Return ()
-’
-
-(** Unit test for [hashmap_main::main] *)
-val _ = assert_return (“main_fwd”)
-
-val _ = export_theory ()
diff --git a/tests/hol4/hashmap_on_disk/hashmapMain_FunsTheory.sig b/tests/hol4/hashmap_on_disk/hashmapMain_FunsTheory.sig
deleted file mode 100644
index d4e43d9a..00000000
--- a/tests/hol4/hashmap_on_disk/hashmapMain_FunsTheory.sig
+++ /dev/null
@@ -1,598 +0,0 @@
-signature hashmapMain_FunsTheory =
-sig
-  type thm = Thm.thm
-  
-  (*  Definitions  *)
-    val hashmap_hash_key_fwd_def : thm
-    val hashmap_hash_map_allocate_slots_fwd_def : thm
-    val hashmap_hash_map_allocate_slots_loop_fwd_def : thm
-    val hashmap_hash_map_clear_fwd_back_def : thm
-    val hashmap_hash_map_clear_loop_fwd_back_def : thm
-    val hashmap_hash_map_contains_key_fwd_def : thm
-    val hashmap_hash_map_contains_key_in_list_fwd_def : thm
-    val hashmap_hash_map_contains_key_in_list_loop_fwd_def : thm
-    val hashmap_hash_map_get_fwd_def : thm
-    val hashmap_hash_map_get_in_list_fwd_def : thm
-    val hashmap_hash_map_get_in_list_loop_fwd_def : thm
-    val hashmap_hash_map_get_mut_back_def : thm
-    val hashmap_hash_map_get_mut_fwd_def : thm
-    val hashmap_hash_map_get_mut_in_list_back_def : thm
-    val hashmap_hash_map_get_mut_in_list_fwd_def : thm
-    val hashmap_hash_map_get_mut_in_list_loop_back_def : thm
-    val hashmap_hash_map_get_mut_in_list_loop_fwd_def : thm
-    val hashmap_hash_map_insert_fwd_back_def : thm
-    val hashmap_hash_map_insert_in_list_back_def : thm
-    val hashmap_hash_map_insert_in_list_fwd_def : thm
-    val hashmap_hash_map_insert_in_list_loop_back_def : thm
-    val hashmap_hash_map_insert_in_list_loop_fwd_def : thm
-    val hashmap_hash_map_insert_no_resize_fwd_back_def : thm
-    val hashmap_hash_map_len_fwd_def : thm
-    val hashmap_hash_map_move_elements_from_list_fwd_back_def : thm
-    val hashmap_hash_map_move_elements_from_list_loop_fwd_back_def : thm
-    val hashmap_hash_map_move_elements_fwd_back_def : thm
-    val hashmap_hash_map_move_elements_loop_fwd_back_def : thm
-    val hashmap_hash_map_new_fwd_def : thm
-    val hashmap_hash_map_new_with_capacity_fwd_def : thm
-    val hashmap_hash_map_remove_back_def : thm
-    val hashmap_hash_map_remove_from_list_back_def : thm
-    val hashmap_hash_map_remove_from_list_fwd_def : thm
-    val hashmap_hash_map_remove_from_list_loop_back_def : thm
-    val hashmap_hash_map_remove_from_list_loop_fwd_def : thm
-    val hashmap_hash_map_remove_fwd_def : thm
-    val hashmap_hash_map_try_resize_fwd_back_def : thm
-    val hashmap_test1_fwd_def : thm
-    val insert_on_disk_fwd_def : thm
-    val main_fwd_def : thm
-  
-  val hashmapMain_Funs_grammars : type_grammar.grammar * term_grammar.grammar
-(*
-   [hashmapMain_Opaque] Parent theory of "hashmapMain_Funs"
-   
-   [hashmap_hash_key_fwd_def]  Definition
-      
-      ⊢ ∀k. hashmap_hash_key_fwd k = Return k
-   
-   [hashmap_hash_map_allocate_slots_fwd_def]  Definition
-      
-      ⊢ ∀slots n.
-          hashmap_hash_map_allocate_slots_fwd slots n =
-          hashmap_hash_map_allocate_slots_loop_fwd slots n
-   
-   [hashmap_hash_map_allocate_slots_loop_fwd_def]  Definition
-      
-      ⊢ ∀slots n.
-          hashmap_hash_map_allocate_slots_loop_fwd slots n =
-          if usize_gt n (int_to_usize 0) then
-            do
-              slots0 <- vec_push_back slots HashmapListNil;
-              n0 <- usize_sub n (int_to_usize 1);
-              hashmap_hash_map_allocate_slots_loop_fwd slots0 n0
-            od
-          else Return slots
-   
-   [hashmap_hash_map_clear_fwd_back_def]  Definition
-      
-      ⊢ ∀self.
-          hashmap_hash_map_clear_fwd_back self =
-          do
-            v <-
-              hashmap_hash_map_clear_loop_fwd_back
-                self.hashmap_hash_map_slots (int_to_usize 0);
-            Return
-              (self with
-               <|hashmap_hash_map_num_entries := int_to_usize 0;
-                 hashmap_hash_map_slots := v|>)
-          od
-   
-   [hashmap_hash_map_clear_loop_fwd_back_def]  Definition
-      
-      ⊢ ∀slots i.
-          hashmap_hash_map_clear_loop_fwd_back slots i =
-          (let
-             i0 = vec_len slots
-           in
-             if usize_lt i i0 then
-               do
-                 i1 <- usize_add i (int_to_usize 1);
-                 slots0 <- vec_index_mut_back slots i HashmapListNil;
-                 hashmap_hash_map_clear_loop_fwd_back slots0 i1
-               od
-             else Return slots)
-   
-   [hashmap_hash_map_contains_key_fwd_def]  Definition
-      
-      ⊢ ∀self key.
-          hashmap_hash_map_contains_key_fwd self key =
-          do
-            hash <- hashmap_hash_key_fwd key;
-            i <<- vec_len self.hashmap_hash_map_slots;
-            hash_mod <- usize_rem hash i;
-            l <- vec_index_fwd self.hashmap_hash_map_slots hash_mod;
-            hashmap_hash_map_contains_key_in_list_fwd key l
-          od
-   
-   [hashmap_hash_map_contains_key_in_list_fwd_def]  Definition
-      
-      ⊢ ∀key ls.
-          hashmap_hash_map_contains_key_in_list_fwd key ls =
-          hashmap_hash_map_contains_key_in_list_loop_fwd key ls
-   
-   [hashmap_hash_map_contains_key_in_list_loop_fwd_def]  Definition
-      
-      ⊢ ∀key ls.
-          hashmap_hash_map_contains_key_in_list_loop_fwd key ls =
-          case ls of
-            HashmapListCons ckey t tl =>
-              if ckey = key then Return T
-              else hashmap_hash_map_contains_key_in_list_loop_fwd key tl
-          | HashmapListNil => Return F
-   
-   [hashmap_hash_map_get_fwd_def]  Definition
-      
-      ⊢ ∀self key.
-          hashmap_hash_map_get_fwd self key =
-          do
-            hash <- hashmap_hash_key_fwd key;
-            i <<- vec_len self.hashmap_hash_map_slots;
-            hash_mod <- usize_rem hash i;
-            l <- vec_index_fwd self.hashmap_hash_map_slots hash_mod;
-            hashmap_hash_map_get_in_list_fwd key l
-          od
-   
-   [hashmap_hash_map_get_in_list_fwd_def]  Definition
-      
-      ⊢ ∀key ls.
-          hashmap_hash_map_get_in_list_fwd key ls =
-          hashmap_hash_map_get_in_list_loop_fwd key ls
-   
-   [hashmap_hash_map_get_in_list_loop_fwd_def]  Definition
-      
-      ⊢ ∀key ls.
-          hashmap_hash_map_get_in_list_loop_fwd key ls =
-          case ls of
-            HashmapListCons ckey cvalue tl =>
-              if ckey = key then Return cvalue
-              else hashmap_hash_map_get_in_list_loop_fwd key tl
-          | HashmapListNil => Fail Failure
-   
-   [hashmap_hash_map_get_mut_back_def]  Definition
-      
-      ⊢ ∀self key ret.
-          hashmap_hash_map_get_mut_back self key ret =
-          do
-            hash <- hashmap_hash_key_fwd key;
-            i <<- vec_len self.hashmap_hash_map_slots;
-            hash_mod <- usize_rem hash i;
-            l <- vec_index_mut_fwd self.hashmap_hash_map_slots hash_mod;
-            l0 <- hashmap_hash_map_get_mut_in_list_back l key ret;
-            v <- vec_index_mut_back self.hashmap_hash_map_slots hash_mod l0;
-            Return (self with hashmap_hash_map_slots := v)
-          od
-   
-   [hashmap_hash_map_get_mut_fwd_def]  Definition
-      
-      ⊢ ∀self key.
-          hashmap_hash_map_get_mut_fwd self key =
-          do
-            hash <- hashmap_hash_key_fwd key;
-            i <<- vec_len self.hashmap_hash_map_slots;
-            hash_mod <- usize_rem hash i;
-            l <- vec_index_mut_fwd self.hashmap_hash_map_slots hash_mod;
-            hashmap_hash_map_get_mut_in_list_fwd l key
-          od
-   
-   [hashmap_hash_map_get_mut_in_list_back_def]  Definition
-      
-      ⊢ ∀ls key ret.
-          hashmap_hash_map_get_mut_in_list_back ls key ret =
-          hashmap_hash_map_get_mut_in_list_loop_back ls key ret
-   
-   [hashmap_hash_map_get_mut_in_list_fwd_def]  Definition
-      
-      ⊢ ∀ls key.
-          hashmap_hash_map_get_mut_in_list_fwd ls key =
-          hashmap_hash_map_get_mut_in_list_loop_fwd ls key
-   
-   [hashmap_hash_map_get_mut_in_list_loop_back_def]  Definition
-      
-      ⊢ ∀ls key ret.
-          hashmap_hash_map_get_mut_in_list_loop_back ls key ret =
-          case ls of
-            HashmapListCons ckey cvalue tl =>
-              if ckey = key then Return (HashmapListCons ckey ret tl)
-              else
-                do
-                  tl0 <-
-                    hashmap_hash_map_get_mut_in_list_loop_back tl key ret;
-                  Return (HashmapListCons ckey cvalue tl0)
-                od
-          | HashmapListNil => Fail Failure
-   
-   [hashmap_hash_map_get_mut_in_list_loop_fwd_def]  Definition
-      
-      ⊢ ∀ls key.
-          hashmap_hash_map_get_mut_in_list_loop_fwd ls key =
-          case ls of
-            HashmapListCons ckey cvalue tl =>
-              if ckey = key then Return cvalue
-              else hashmap_hash_map_get_mut_in_list_loop_fwd tl key
-          | HashmapListNil => Fail Failure
-   
-   [hashmap_hash_map_insert_fwd_back_def]  Definition
-      
-      ⊢ ∀self key value.
-          hashmap_hash_map_insert_fwd_back self key value =
-          do
-            self0 <-
-              hashmap_hash_map_insert_no_resize_fwd_back self key value;
-            i <- hashmap_hash_map_len_fwd self0;
-            if usize_gt i self0.hashmap_hash_map_max_load then
-              hashmap_hash_map_try_resize_fwd_back self0
-            else Return self0
-          od
-   
-   [hashmap_hash_map_insert_in_list_back_def]  Definition
-      
-      ⊢ ∀key value ls.
-          hashmap_hash_map_insert_in_list_back key value ls =
-          hashmap_hash_map_insert_in_list_loop_back key value ls
-   
-   [hashmap_hash_map_insert_in_list_fwd_def]  Definition
-      
-      ⊢ ∀key value ls.
-          hashmap_hash_map_insert_in_list_fwd key value ls =
-          hashmap_hash_map_insert_in_list_loop_fwd key value ls
-   
-   [hashmap_hash_map_insert_in_list_loop_back_def]  Definition
-      
-      ⊢ ∀key value ls.
-          hashmap_hash_map_insert_in_list_loop_back key value ls =
-          case ls of
-            HashmapListCons ckey cvalue tl =>
-              if ckey = key then Return (HashmapListCons ckey value tl)
-              else
-                do
-                  tl0 <-
-                    hashmap_hash_map_insert_in_list_loop_back key value tl;
-                  Return (HashmapListCons ckey cvalue tl0)
-                od
-          | HashmapListNil =>
-            (let
-               l = HashmapListNil
-             in
-               Return (HashmapListCons key value l))
-   
-   [hashmap_hash_map_insert_in_list_loop_fwd_def]  Definition
-      
-      ⊢ ∀key value ls.
-          hashmap_hash_map_insert_in_list_loop_fwd key value ls =
-          case ls of
-            HashmapListCons ckey cvalue tl =>
-              if ckey = key then Return F
-              else hashmap_hash_map_insert_in_list_loop_fwd key value tl
-          | HashmapListNil => Return T
-   
-   [hashmap_hash_map_insert_no_resize_fwd_back_def]  Definition
-      
-      ⊢ ∀self key value.
-          hashmap_hash_map_insert_no_resize_fwd_back self key value =
-          do
-            hash <- hashmap_hash_key_fwd key;
-            i <<- vec_len self.hashmap_hash_map_slots;
-            hash_mod <- usize_rem hash i;
-            l <- vec_index_mut_fwd self.hashmap_hash_map_slots hash_mod;
-            inserted <- hashmap_hash_map_insert_in_list_fwd key value l;
-            if inserted then
-              do
-                i0 <-
-                  usize_add self.hashmap_hash_map_num_entries
-                    (int_to_usize 1);
-                l0 <- hashmap_hash_map_insert_in_list_back key value l;
-                v <-
-                  vec_index_mut_back self.hashmap_hash_map_slots hash_mod
-                    l0;
-                Return
-                  (self with
-                   <|hashmap_hash_map_num_entries := i0;
-                     hashmap_hash_map_slots := v|>)
-              od
-            else
-              do
-                l0 <- hashmap_hash_map_insert_in_list_back key value l;
-                v <-
-                  vec_index_mut_back self.hashmap_hash_map_slots hash_mod
-                    l0;
-                Return (self with hashmap_hash_map_slots := v)
-              od
-          od
-   
-   [hashmap_hash_map_len_fwd_def]  Definition
-      
-      ⊢ ∀self.
-          hashmap_hash_map_len_fwd self =
-          Return self.hashmap_hash_map_num_entries
-   
-   [hashmap_hash_map_move_elements_from_list_fwd_back_def]  Definition
-      
-      ⊢ ∀ntable ls.
-          hashmap_hash_map_move_elements_from_list_fwd_back ntable ls =
-          hashmap_hash_map_move_elements_from_list_loop_fwd_back ntable ls
-   
-   [hashmap_hash_map_move_elements_from_list_loop_fwd_back_def]  Definition
-      
-      ⊢ ∀ntable ls.
-          hashmap_hash_map_move_elements_from_list_loop_fwd_back ntable ls =
-          case ls of
-            HashmapListCons k v tl =>
-              do
-                ntable0 <-
-                  hashmap_hash_map_insert_no_resize_fwd_back ntable k v;
-                hashmap_hash_map_move_elements_from_list_loop_fwd_back
-                  ntable0 tl
-              od
-          | HashmapListNil => Return ntable
-   
-   [hashmap_hash_map_move_elements_fwd_back_def]  Definition
-      
-      ⊢ ∀ntable slots i.
-          hashmap_hash_map_move_elements_fwd_back ntable slots i =
-          hashmap_hash_map_move_elements_loop_fwd_back ntable slots i
-   
-   [hashmap_hash_map_move_elements_loop_fwd_back_def]  Definition
-      
-      ⊢ ∀ntable slots i.
-          hashmap_hash_map_move_elements_loop_fwd_back ntable slots i =
-          (let
-             i0 = vec_len slots
-           in
-             if usize_lt i i0 then
-               do
-                 l <- vec_index_mut_fwd slots i;
-                 ls <<- mem_replace_fwd l HashmapListNil;
-                 ntable0 <-
-                   hashmap_hash_map_move_elements_from_list_fwd_back ntable
-                     ls;
-                 i1 <- usize_add i (int_to_usize 1);
-                 l0 <<- mem_replace_back l HashmapListNil;
-                 slots0 <- vec_index_mut_back slots i l0;
-                 hashmap_hash_map_move_elements_loop_fwd_back ntable0
-                   slots0 i1
-               od
-             else Return (ntable,slots))
-   
-   [hashmap_hash_map_new_fwd_def]  Definition
-      
-      ⊢ hashmap_hash_map_new_fwd =
-        hashmap_hash_map_new_with_capacity_fwd (int_to_usize 32)
-          (int_to_usize 4) (int_to_usize 5)
-   
-   [hashmap_hash_map_new_with_capacity_fwd_def]  Definition
-      
-      ⊢ ∀capacity max_load_dividend max_load_divisor.
-          hashmap_hash_map_new_with_capacity_fwd capacity max_load_dividend
-            max_load_divisor =
-          (let
-             v = vec_new
-           in
-             do
-               slots <- hashmap_hash_map_allocate_slots_fwd v capacity;
-               i <- usize_mul capacity max_load_dividend;
-               i0 <- usize_div i max_load_divisor;
-               Return
-                 <|hashmap_hash_map_num_entries := int_to_usize 0;
-                   hashmap_hash_map_max_load_factor :=
-                     (max_load_dividend,max_load_divisor);
-                   hashmap_hash_map_max_load := i0;
-                   hashmap_hash_map_slots := slots|>
-             od)
-   
-   [hashmap_hash_map_remove_back_def]  Definition
-      
-      ⊢ ∀self key.
-          hashmap_hash_map_remove_back self key =
-          do
-            hash <- hashmap_hash_key_fwd key;
-            i <<- vec_len self.hashmap_hash_map_slots;
-            hash_mod <- usize_rem hash i;
-            l <- vec_index_mut_fwd self.hashmap_hash_map_slots hash_mod;
-            x <- hashmap_hash_map_remove_from_list_fwd key l;
-            case x of
-              NONE =>
-                do
-                  l0 <- hashmap_hash_map_remove_from_list_back key l;
-                  v <-
-                    vec_index_mut_back self.hashmap_hash_map_slots hash_mod
-                      l0;
-                  Return (self with hashmap_hash_map_slots := v)
-                od
-            | SOME x0 =>
-              do
-                i0 <-
-                  usize_sub self.hashmap_hash_map_num_entries
-                    (int_to_usize 1);
-                l0 <- hashmap_hash_map_remove_from_list_back key l;
-                v <-
-                  vec_index_mut_back self.hashmap_hash_map_slots hash_mod
-                    l0;
-                Return
-                  (self with
-                   <|hashmap_hash_map_num_entries := i0;
-                     hashmap_hash_map_slots := v|>)
-              od
-          od
-   
-   [hashmap_hash_map_remove_from_list_back_def]  Definition
-      
-      ⊢ ∀key ls.
-          hashmap_hash_map_remove_from_list_back key ls =
-          hashmap_hash_map_remove_from_list_loop_back key ls
-   
-   [hashmap_hash_map_remove_from_list_fwd_def]  Definition
-      
-      ⊢ ∀key ls.
-          hashmap_hash_map_remove_from_list_fwd key ls =
-          hashmap_hash_map_remove_from_list_loop_fwd key ls
-   
-   [hashmap_hash_map_remove_from_list_loop_back_def]  Definition
-      
-      ⊢ ∀key ls.
-          hashmap_hash_map_remove_from_list_loop_back key ls =
-          case ls of
-            HashmapListCons ckey t tl =>
-              if ckey = key then
-                (let
-                   mv_ls =
-                     mem_replace_fwd (HashmapListCons ckey t tl)
-                       HashmapListNil
-                 in
-                   case mv_ls of
-                     HashmapListCons i cvalue tl0 => Return tl0
-                   | HashmapListNil => Fail Failure)
-              else
-                do
-                  tl0 <- hashmap_hash_map_remove_from_list_loop_back key tl;
-                  Return (HashmapListCons ckey t tl0)
-                od
-          | HashmapListNil => Return HashmapListNil
-   
-   [hashmap_hash_map_remove_from_list_loop_fwd_def]  Definition
-      
-      ⊢ ∀key ls.
-          hashmap_hash_map_remove_from_list_loop_fwd key ls =
-          case ls of
-            HashmapListCons ckey t tl =>
-              if ckey = key then
-                (let
-                   mv_ls =
-                     mem_replace_fwd (HashmapListCons ckey t tl)
-                       HashmapListNil
-                 in
-                   case mv_ls of
-                     HashmapListCons i cvalue tl0 => Return (SOME cvalue)
-                   | HashmapListNil => Fail Failure)
-              else hashmap_hash_map_remove_from_list_loop_fwd key tl
-          | HashmapListNil => Return NONE
-   
-   [hashmap_hash_map_remove_fwd_def]  Definition
-      
-      ⊢ ∀self key.
-          hashmap_hash_map_remove_fwd self key =
-          do
-            hash <- hashmap_hash_key_fwd key;
-            i <<- vec_len self.hashmap_hash_map_slots;
-            hash_mod <- usize_rem hash i;
-            l <- vec_index_mut_fwd self.hashmap_hash_map_slots hash_mod;
-            x <- hashmap_hash_map_remove_from_list_fwd key l;
-            case x of
-              NONE => Return NONE
-            | SOME x0 =>
-              monad_ignore_bind
-                (usize_sub self.hashmap_hash_map_num_entries
-                   (int_to_usize 1)) (Return (SOME x0))
-          od
-   
-   [hashmap_hash_map_try_resize_fwd_back_def]  Definition
-      
-      ⊢ ∀self.
-          hashmap_hash_map_try_resize_fwd_back self =
-          do
-            max_usize <- mk_usize (u32_to_int core_u32_max);
-            capacity <<- vec_len self.hashmap_hash_map_slots;
-            n1 <- usize_div max_usize (int_to_usize 2);
-            (i,i0) <<- self.hashmap_hash_map_max_load_factor;
-            i1 <- usize_div n1 i;
-            if usize_le capacity i1 then
-              do
-                i2 <- usize_mul capacity (int_to_usize 2);
-                ntable <- hashmap_hash_map_new_with_capacity_fwd i2 i i0;
-                (ntable0,_) <-
-                  hashmap_hash_map_move_elements_fwd_back ntable
-                    self.hashmap_hash_map_slots (int_to_usize 0);
-                Return
-                  (ntable0 with
-                   <|hashmap_hash_map_num_entries :=
-                       self.hashmap_hash_map_num_entries;
-                     hashmap_hash_map_max_load_factor := (i,i0)|>)
-              od
-            else
-              Return (self with hashmap_hash_map_max_load_factor := (i,i0))
-          od
-   
-   [hashmap_test1_fwd_def]  Definition
-      
-      ⊢ hashmap_test1_fwd =
-        do
-          hm <- hashmap_hash_map_new_fwd;
-          hm0 <-
-            hashmap_hash_map_insert_fwd_back hm (int_to_usize 0)
-              (int_to_u64 42);
-          hm1 <-
-            hashmap_hash_map_insert_fwd_back hm0 (int_to_usize 128)
-              (int_to_u64 18);
-          hm2 <-
-            hashmap_hash_map_insert_fwd_back hm1 (int_to_usize 1024)
-              (int_to_u64 138);
-          hm3 <-
-            hashmap_hash_map_insert_fwd_back hm2 (int_to_usize 1056)
-              (int_to_u64 256);
-          i <- hashmap_hash_map_get_fwd hm3 (int_to_usize 128);
-          if i ≠ int_to_u64 18 then Fail Failure
-          else
-            do
-              hm4 <-
-                hashmap_hash_map_get_mut_back hm3 (int_to_usize 1024)
-                  (int_to_u64 56);
-              i0 <- hashmap_hash_map_get_fwd hm4 (int_to_usize 1024);
-              if i0 ≠ int_to_u64 56 then Fail Failure
-              else
-                do
-                  x <- hashmap_hash_map_remove_fwd hm4 (int_to_usize 1024);
-                  case x of
-                    NONE => Fail Failure
-                  | SOME x0 =>
-                    if x0 ≠ int_to_u64 56 then Fail Failure
-                    else
-                      do
-                        hm5 <-
-                          hashmap_hash_map_remove_back hm4
-                            (int_to_usize 1024);
-                        i1 <- hashmap_hash_map_get_fwd hm5 (int_to_usize 0);
-                        if i1 ≠ int_to_u64 42 then Fail Failure
-                        else
-                          do
-                            i2 <-
-                              hashmap_hash_map_get_fwd hm5
-                                (int_to_usize 128);
-                            if i2 ≠ int_to_u64 18 then Fail Failure
-                            else
-                              do
-                                i3 <-
-                                  hashmap_hash_map_get_fwd hm5
-                                    (int_to_usize 1056);
-                                if i3 ≠ int_to_u64 256 then Fail Failure
-                                else Return ()
-                              od
-                          od
-                      od
-                od
-            od
-        od
-   
-   [insert_on_disk_fwd_def]  Definition
-      
-      ⊢ ∀key value st.
-          insert_on_disk_fwd key value st =
-          do
-            (st0,hm) <- hashmap_utils_deserialize_fwd st;
-            hm0 <- hashmap_hash_map_insert_fwd_back hm key value;
-            (st1,_) <- hashmap_utils_serialize_fwd hm0 st0;
-            Return (st1,())
-          od
-   
-   [main_fwd_def]  Definition
-      
-      ⊢ main_fwd = Return ()
-   
-   
-*)
-end
diff --git a/tests/hol4/hashmap_on_disk/hashmapMain_OpaqueScript.sml b/tests/hol4/hashmap_on_disk/hashmapMain_OpaqueScript.sml
deleted file mode 100644
index f7221d92..00000000
--- a/tests/hol4/hashmap_on_disk/hashmapMain_OpaqueScript.sml
+++ /dev/null
@@ -1,15 +0,0 @@
-(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
-(** [hashmap_main]: external function declarations *)
-open primitivesLib divDefLib
-open hashmapMain_TypesTheory
-
-val _ = new_theory "hashmapMain_Opaque"
-
-
-(** [hashmap_main::hashmap_utils::deserialize]: forward function *)val _ = new_constant ("hashmap_utils_deserialize_fwd",
-  “:state -> (state # u64 hashmap_hash_map_t) result”)
-
-(** [hashmap_main::hashmap_utils::serialize]: forward function *)val _ = new_constant ("hashmap_utils_serialize_fwd",
-  “:u64 hashmap_hash_map_t -> state -> (state # unit) result”)
-
-val _ = export_theory ()
diff --git a/tests/hol4/hashmap_on_disk/hashmapMain_OpaqueTheory.sig b/tests/hol4/hashmap_on_disk/hashmapMain_OpaqueTheory.sig
deleted file mode 100644
index f7373609..00000000
--- a/tests/hol4/hashmap_on_disk/hashmapMain_OpaqueTheory.sig
+++ /dev/null
@@ -1,11 +0,0 @@
-signature hashmapMain_OpaqueTheory =
-sig
-  type thm = Thm.thm
-  
-  val hashmapMain_Opaque_grammars : type_grammar.grammar * term_grammar.grammar
-(*
-   [hashmapMain_Types] Parent theory of "hashmapMain_Opaque"
-   
-   
-*)
-end
diff --git a/tests/hol4/hashmap_on_disk/hashmapMain_TypesScript.sml b/tests/hol4/hashmap_on_disk/hashmapMain_TypesScript.sml
deleted file mode 100644
index 3f8ca9b9..00000000
--- a/tests/hol4/hashmap_on_disk/hashmapMain_TypesScript.sml
+++ /dev/null
@@ -1,27 +0,0 @@
-(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
-(** [hashmap_main]: type definitions *)
-open primitivesLib divDefLib
-
-val _ = new_theory "hashmapMain_Types"
-
-
-Datatype:
-  (** [hashmap_main::hashmap::List] *)
-  hashmap_list_t = | HashmapListCons usize 't hashmap_list_t | HashmapListNil
-End
-
-Datatype:
-  (** [hashmap_main::hashmap::HashMap] *)
-  hashmap_hash_map_t =
-  <|
-    hashmap_hash_map_num_entries : usize;
-    hashmap_hash_map_max_load_factor : (usize # usize);
-    hashmap_hash_map_max_load : usize;
-    hashmap_hash_map_slots : 't hashmap_list_t vec;
-  |>
-End
-
-(** The state type used in the state-error monad *)
-val _ = new_type ("state", 0)
-
-val _ = export_theory ()
diff --git a/tests/hol4/hashmap_on_disk/hashmapMain_TypesTheory.sig b/tests/hol4/hashmap_on_disk/hashmapMain_TypesTheory.sig
deleted file mode 100644
index a3e770ea..00000000
--- a/tests/hol4/hashmap_on_disk/hashmapMain_TypesTheory.sig
+++ /dev/null
@@ -1,568 +0,0 @@
-signature hashmapMain_TypesTheory =
-sig
-  type thm = Thm.thm
-  
-  (*  Definitions  *)
-    val hashmap_hash_map_t_TY_DEF : thm
-    val hashmap_hash_map_t_case_def : thm
-    val hashmap_hash_map_t_hashmap_hash_map_max_load : thm
-    val hashmap_hash_map_t_hashmap_hash_map_max_load_factor : thm
-    val hashmap_hash_map_t_hashmap_hash_map_max_load_factor_fupd : thm
-    val hashmap_hash_map_t_hashmap_hash_map_max_load_fupd : thm
-    val hashmap_hash_map_t_hashmap_hash_map_num_entries : thm
-    val hashmap_hash_map_t_hashmap_hash_map_num_entries_fupd : thm
-    val hashmap_hash_map_t_hashmap_hash_map_slots : thm
-    val hashmap_hash_map_t_hashmap_hash_map_slots_fupd : thm
-    val hashmap_hash_map_t_size_def : thm
-    val hashmap_list_t_TY_DEF : thm
-    val hashmap_list_t_case_def : thm
-    val hashmap_list_t_size_def : thm
-  
-  (*  Theorems  *)
-    val EXISTS_hashmap_hash_map_t : thm
-    val FORALL_hashmap_hash_map_t : thm
-    val datatype_hashmap_hash_map_t : thm
-    val datatype_hashmap_list_t : thm
-    val hashmap_hash_map_t_11 : thm
-    val hashmap_hash_map_t_Axiom : thm
-    val hashmap_hash_map_t_accessors : thm
-    val hashmap_hash_map_t_accfupds : thm
-    val hashmap_hash_map_t_case_cong : thm
-    val hashmap_hash_map_t_case_eq : thm
-    val hashmap_hash_map_t_component_equality : thm
-    val hashmap_hash_map_t_fn_updates : thm
-    val hashmap_hash_map_t_fupdcanon : thm
-    val hashmap_hash_map_t_fupdcanon_comp : thm
-    val hashmap_hash_map_t_fupdfupds : thm
-    val hashmap_hash_map_t_fupdfupds_comp : thm
-    val hashmap_hash_map_t_induction : thm
-    val hashmap_hash_map_t_literal_11 : thm
-    val hashmap_hash_map_t_literal_nchotomy : thm
-    val hashmap_hash_map_t_nchotomy : thm
-    val hashmap_hash_map_t_updates_eq_literal : thm
-    val hashmap_list_t_11 : thm
-    val hashmap_list_t_Axiom : thm
-    val hashmap_list_t_case_cong : thm
-    val hashmap_list_t_case_eq : thm
-    val hashmap_list_t_distinct : thm
-    val hashmap_list_t_induction : thm
-    val hashmap_list_t_nchotomy : thm
-  
-  val hashmapMain_Types_grammars : type_grammar.grammar * term_grammar.grammar
-(*
-   [divDef] Parent theory of "hashmapMain_Types"
-   
-   [hashmap_hash_map_t_TY_DEF]  Definition
-      
-      ⊢ ∃rep.
-          TYPE_DEFINITION
-            (λa0'.
-                 ∀ $var$('hashmap_hash_map_t').
-                   (∀a0'.
-                      (∃a0 a1 a2 a3.
-                         a0' =
-                         (λa0 a1 a2 a3.
-                              ind_type$CONSTR 0 (a0,a1,a2,a3)
-                                (λn. ind_type$BOTTOM)) a0 a1 a2 a3) ⇒
-                      $var$('hashmap_hash_map_t') a0') ⇒
-                   $var$('hashmap_hash_map_t') a0') rep
-   
-   [hashmap_hash_map_t_case_def]  Definition
-      
-      ⊢ ∀a0 a1 a2 a3 f.
-          hashmap_hash_map_t_CASE (hashmap_hash_map_t a0 a1 a2 a3) f =
-          f a0 a1 a2 a3
-   
-   [hashmap_hash_map_t_hashmap_hash_map_max_load]  Definition
-      
-      ⊢ ∀u p u0 v.
-          (hashmap_hash_map_t u p u0 v).hashmap_hash_map_max_load = u0
-   
-   [hashmap_hash_map_t_hashmap_hash_map_max_load_factor]  Definition
-      
-      ⊢ ∀u p u0 v.
-          (hashmap_hash_map_t u p u0 v).hashmap_hash_map_max_load_factor =
-          p
-   
-   [hashmap_hash_map_t_hashmap_hash_map_max_load_factor_fupd]  Definition
-      
-      ⊢ ∀f u p u0 v.
-          hashmap_hash_map_t u p u0 v with
-          hashmap_hash_map_max_load_factor updated_by f =
-          hashmap_hash_map_t u (f p) u0 v
-   
-   [hashmap_hash_map_t_hashmap_hash_map_max_load_fupd]  Definition
-      
-      ⊢ ∀f u p u0 v.
-          hashmap_hash_map_t u p u0 v with
-          hashmap_hash_map_max_load updated_by f =
-          hashmap_hash_map_t u p (f u0) v
-   
-   [hashmap_hash_map_t_hashmap_hash_map_num_entries]  Definition
-      
-      ⊢ ∀u p u0 v.
-          (hashmap_hash_map_t u p u0 v).hashmap_hash_map_num_entries = u
-   
-   [hashmap_hash_map_t_hashmap_hash_map_num_entries_fupd]  Definition
-      
-      ⊢ ∀f u p u0 v.
-          hashmap_hash_map_t u p u0 v with
-          hashmap_hash_map_num_entries updated_by f =
-          hashmap_hash_map_t (f u) p u0 v
-   
-   [hashmap_hash_map_t_hashmap_hash_map_slots]  Definition
-      
-      ⊢ ∀u p u0 v. (hashmap_hash_map_t u p u0 v).hashmap_hash_map_slots = v
-   
-   [hashmap_hash_map_t_hashmap_hash_map_slots_fupd]  Definition
-      
-      ⊢ ∀f u p u0 v.
-          hashmap_hash_map_t u p u0 v with
-          hashmap_hash_map_slots updated_by f =
-          hashmap_hash_map_t u p u0 (f v)
-   
-   [hashmap_hash_map_t_size_def]  Definition
-      
-      ⊢ ∀f a0 a1 a2 a3.
-          hashmap_hash_map_t_size f (hashmap_hash_map_t a0 a1 a2 a3) =
-          1 + pair_size (λv. 0) (λv. 0) a1
-   
-   [hashmap_list_t_TY_DEF]  Definition
-      
-      ⊢ ∃rep.
-          TYPE_DEFINITION
-            (λa0'.
-                 ∀ $var$('hashmap_list_t').
-                   (∀a0'.
-                      (∃a0 a1 a2.
-                         a0' =
-                         (λa0 a1 a2.
-                              ind_type$CONSTR 0 (a0,a1)
-                                (ind_type$FCONS a2 (λn. ind_type$BOTTOM)))
-                           a0 a1 a2 ∧ $var$('hashmap_list_t') a2) ∨
-                      a0' =
-                      ind_type$CONSTR (SUC 0) (ARB,ARB)
-                        (λn. ind_type$BOTTOM) ⇒
-                      $var$('hashmap_list_t') a0') ⇒
-                   $var$('hashmap_list_t') a0') rep
-   
-   [hashmap_list_t_case_def]  Definition
-      
-      ⊢ (∀a0 a1 a2 f v.
-           hashmap_list_t_CASE (HashmapListCons a0 a1 a2) f v = f a0 a1 a2) ∧
-        ∀f v. hashmap_list_t_CASE HashmapListNil f v = v
-   
-   [hashmap_list_t_size_def]  Definition
-      
-      ⊢ (∀f a0 a1 a2.
-           hashmap_list_t_size f (HashmapListCons a0 a1 a2) =
-           1 + (f a1 + hashmap_list_t_size f a2)) ∧
-        ∀f. hashmap_list_t_size f HashmapListNil = 0
-   
-   [EXISTS_hashmap_hash_map_t]  Theorem
-      
-      ⊢ ∀P. (∃h. P h) ⇔
-            ∃u0 p u v.
-              P
-                <|hashmap_hash_map_num_entries := u0;
-                  hashmap_hash_map_max_load_factor := p;
-                  hashmap_hash_map_max_load := u;
-                  hashmap_hash_map_slots := v|>
-   
-   [FORALL_hashmap_hash_map_t]  Theorem
-      
-      ⊢ ∀P. (∀h. P h) ⇔
-            ∀u0 p u v.
-              P
-                <|hashmap_hash_map_num_entries := u0;
-                  hashmap_hash_map_max_load_factor := p;
-                  hashmap_hash_map_max_load := u;
-                  hashmap_hash_map_slots := v|>
-   
-   [datatype_hashmap_hash_map_t]  Theorem
-      
-      ⊢ DATATYPE
-          (record hashmap_hash_map_t hashmap_hash_map_num_entries
-             hashmap_hash_map_max_load_factor hashmap_hash_map_max_load
-             hashmap_hash_map_slots)
-   
-   [datatype_hashmap_list_t]  Theorem
-      
-      ⊢ DATATYPE (hashmap_list_t HashmapListCons HashmapListNil)
-   
-   [hashmap_hash_map_t_11]  Theorem
-      
-      ⊢ ∀a0 a1 a2 a3 a0' a1' a2' a3'.
-          hashmap_hash_map_t a0 a1 a2 a3 =
-          hashmap_hash_map_t a0' a1' a2' a3' ⇔
-          a0 = a0' ∧ a1 = a1' ∧ a2 = a2' ∧ a3 = a3'
-   
-   [hashmap_hash_map_t_Axiom]  Theorem
-      
-      ⊢ ∀f. ∃fn. ∀a0 a1 a2 a3.
-          fn (hashmap_hash_map_t a0 a1 a2 a3) = f a0 a1 a2 a3
-   
-   [hashmap_hash_map_t_accessors]  Theorem
-      
-      ⊢ (∀u p u0 v.
-           (hashmap_hash_map_t u p u0 v).hashmap_hash_map_num_entries = u) ∧
-        (∀u p u0 v.
-           (hashmap_hash_map_t u p u0 v).hashmap_hash_map_max_load_factor =
-           p) ∧
-        (∀u p u0 v.
-           (hashmap_hash_map_t u p u0 v).hashmap_hash_map_max_load = u0) ∧
-        ∀u p u0 v. (hashmap_hash_map_t u p u0 v).hashmap_hash_map_slots = v
-   
-   [hashmap_hash_map_t_accfupds]  Theorem
-      
-      ⊢ (∀h f.
-           (h with hashmap_hash_map_max_load_factor updated_by f).
-           hashmap_hash_map_num_entries =
-           h.hashmap_hash_map_num_entries) ∧
-        (∀h f.
-           (h with hashmap_hash_map_max_load updated_by f).
-           hashmap_hash_map_num_entries =
-           h.hashmap_hash_map_num_entries) ∧
-        (∀h f.
-           (h with hashmap_hash_map_slots updated_by f).
-           hashmap_hash_map_num_entries =
-           h.hashmap_hash_map_num_entries) ∧
-        (∀h f.
-           (h with hashmap_hash_map_num_entries updated_by f).
-           hashmap_hash_map_max_load_factor =
-           h.hashmap_hash_map_max_load_factor) ∧
-        (∀h f.
-           (h with hashmap_hash_map_max_load updated_by f).
-           hashmap_hash_map_max_load_factor =
-           h.hashmap_hash_map_max_load_factor) ∧
-        (∀h f.
-           (h with hashmap_hash_map_slots updated_by f).
-           hashmap_hash_map_max_load_factor =
-           h.hashmap_hash_map_max_load_factor) ∧
-        (∀h f.
-           (h with hashmap_hash_map_num_entries updated_by f).
-           hashmap_hash_map_max_load =
-           h.hashmap_hash_map_max_load) ∧
-        (∀h f.
-           (h with hashmap_hash_map_max_load_factor updated_by f).
-           hashmap_hash_map_max_load =
-           h.hashmap_hash_map_max_load) ∧
-        (∀h f.
-           (h with hashmap_hash_map_slots updated_by f).
-           hashmap_hash_map_max_load =
-           h.hashmap_hash_map_max_load) ∧
-        (∀h f.
-           (h with hashmap_hash_map_num_entries updated_by f).
-           hashmap_hash_map_slots =
-           h.hashmap_hash_map_slots) ∧
-        (∀h f.
-           (h with hashmap_hash_map_max_load_factor updated_by f).
-           hashmap_hash_map_slots =
-           h.hashmap_hash_map_slots) ∧
-        (∀h f.
-           (h with hashmap_hash_map_max_load updated_by f).
-           hashmap_hash_map_slots =
-           h.hashmap_hash_map_slots) ∧
-        (∀h f.
-           (h with hashmap_hash_map_num_entries updated_by f).
-           hashmap_hash_map_num_entries =
-           f h.hashmap_hash_map_num_entries) ∧
-        (∀h f.
-           (h with hashmap_hash_map_max_load_factor updated_by f).
-           hashmap_hash_map_max_load_factor =
-           f h.hashmap_hash_map_max_load_factor) ∧
-        (∀h f.
-           (h with hashmap_hash_map_max_load updated_by f).
-           hashmap_hash_map_max_load =
-           f h.hashmap_hash_map_max_load) ∧
-        ∀h f.
-          (h with hashmap_hash_map_slots updated_by f).
-          hashmap_hash_map_slots =
-          f h.hashmap_hash_map_slots
-   
-   [hashmap_hash_map_t_case_cong]  Theorem
-      
-      ⊢ ∀M M' f.
-          M = M' ∧
-          (∀a0 a1 a2 a3.
-             M' = hashmap_hash_map_t a0 a1 a2 a3 ⇒
-             f a0 a1 a2 a3 = f' a0 a1 a2 a3) ⇒
-          hashmap_hash_map_t_CASE M f = hashmap_hash_map_t_CASE M' f'
-   
-   [hashmap_hash_map_t_case_eq]  Theorem
-      
-      ⊢ hashmap_hash_map_t_CASE x f = v ⇔
-        ∃u p u0 v'. x = hashmap_hash_map_t u p u0 v' ∧ f u p u0 v' = v
-   
-   [hashmap_hash_map_t_component_equality]  Theorem
-      
-      ⊢ ∀h1 h2.
-          h1 = h2 ⇔
-          h1.hashmap_hash_map_num_entries = h2.hashmap_hash_map_num_entries ∧
-          h1.hashmap_hash_map_max_load_factor =
-          h2.hashmap_hash_map_max_load_factor ∧
-          h1.hashmap_hash_map_max_load = h2.hashmap_hash_map_max_load ∧
-          h1.hashmap_hash_map_slots = h2.hashmap_hash_map_slots
-   
-   [hashmap_hash_map_t_fn_updates]  Theorem
-      
-      ⊢ (∀f u p u0 v.
-           hashmap_hash_map_t u p u0 v with
-           hashmap_hash_map_num_entries updated_by f =
-           hashmap_hash_map_t (f u) p u0 v) ∧
-        (∀f u p u0 v.
-           hashmap_hash_map_t u p u0 v with
-           hashmap_hash_map_max_load_factor updated_by f =
-           hashmap_hash_map_t u (f p) u0 v) ∧
-        (∀f u p u0 v.
-           hashmap_hash_map_t u p u0 v with
-           hashmap_hash_map_max_load updated_by f =
-           hashmap_hash_map_t u p (f u0) v) ∧
-        ∀f u p u0 v.
-          hashmap_hash_map_t u p u0 v with
-          hashmap_hash_map_slots updated_by f =
-          hashmap_hash_map_t u p u0 (f v)
-   
-   [hashmap_hash_map_t_fupdcanon]  Theorem
-      
-      ⊢ (∀h g f.
-           h with
-           <|hashmap_hash_map_max_load_factor updated_by f;
-             hashmap_hash_map_num_entries updated_by g|> =
-           h with
-           <|hashmap_hash_map_num_entries updated_by g;
-             hashmap_hash_map_max_load_factor updated_by f|>) ∧
-        (∀h g f.
-           h with
-           <|hashmap_hash_map_max_load updated_by f;
-             hashmap_hash_map_num_entries updated_by g|> =
-           h with
-           <|hashmap_hash_map_num_entries updated_by g;
-             hashmap_hash_map_max_load updated_by f|>) ∧
-        (∀h g f.
-           h with
-           <|hashmap_hash_map_max_load updated_by f;
-             hashmap_hash_map_max_load_factor updated_by g|> =
-           h with
-           <|hashmap_hash_map_max_load_factor updated_by g;
-             hashmap_hash_map_max_load updated_by f|>) ∧
-        (∀h g f.
-           h with
-           <|hashmap_hash_map_slots updated_by f;
-             hashmap_hash_map_num_entries updated_by g|> =
-           h with
-           <|hashmap_hash_map_num_entries updated_by g;
-             hashmap_hash_map_slots updated_by f|>) ∧
-        (∀h g f.
-           h with
-           <|hashmap_hash_map_slots updated_by f;
-             hashmap_hash_map_max_load_factor updated_by g|> =
-           h with
-           <|hashmap_hash_map_max_load_factor updated_by g;
-             hashmap_hash_map_slots updated_by f|>) ∧
-        ∀h g f.
-          h with
-          <|hashmap_hash_map_slots updated_by f;
-            hashmap_hash_map_max_load updated_by g|> =
-          h with
-          <|hashmap_hash_map_max_load updated_by g;
-            hashmap_hash_map_slots updated_by f|>
-   
-   [hashmap_hash_map_t_fupdcanon_comp]  Theorem
-      
-      ⊢ ((∀g f.
-            hashmap_hash_map_max_load_factor_fupd f ∘
-            hashmap_hash_map_num_entries_fupd g =
-            hashmap_hash_map_num_entries_fupd g ∘
-            hashmap_hash_map_max_load_factor_fupd f) ∧
-         ∀h g f.
-           hashmap_hash_map_max_load_factor_fupd f ∘
-           hashmap_hash_map_num_entries_fupd g ∘ h =
-           hashmap_hash_map_num_entries_fupd g ∘
-           hashmap_hash_map_max_load_factor_fupd f ∘ h) ∧
-        ((∀g f.
-            hashmap_hash_map_max_load_fupd f ∘
-            hashmap_hash_map_num_entries_fupd g =
-            hashmap_hash_map_num_entries_fupd g ∘
-            hashmap_hash_map_max_load_fupd f) ∧
-         ∀h g f.
-           hashmap_hash_map_max_load_fupd f ∘
-           hashmap_hash_map_num_entries_fupd g ∘ h =
-           hashmap_hash_map_num_entries_fupd g ∘
-           hashmap_hash_map_max_load_fupd f ∘ h) ∧
-        ((∀g f.
-            hashmap_hash_map_max_load_fupd f ∘
-            hashmap_hash_map_max_load_factor_fupd g =
-            hashmap_hash_map_max_load_factor_fupd g ∘
-            hashmap_hash_map_max_load_fupd f) ∧
-         ∀h g f.
-           hashmap_hash_map_max_load_fupd f ∘
-           hashmap_hash_map_max_load_factor_fupd g ∘ h =
-           hashmap_hash_map_max_load_factor_fupd g ∘
-           hashmap_hash_map_max_load_fupd f ∘ h) ∧
-        ((∀g f.
-            hashmap_hash_map_slots_fupd f ∘
-            hashmap_hash_map_num_entries_fupd g =
-            hashmap_hash_map_num_entries_fupd g ∘
-            hashmap_hash_map_slots_fupd f) ∧
-         ∀h g f.
-           hashmap_hash_map_slots_fupd f ∘
-           hashmap_hash_map_num_entries_fupd g ∘ h =
-           hashmap_hash_map_num_entries_fupd g ∘
-           hashmap_hash_map_slots_fupd f ∘ h) ∧
-        ((∀g f.
-            hashmap_hash_map_slots_fupd f ∘
-            hashmap_hash_map_max_load_factor_fupd g =
-            hashmap_hash_map_max_load_factor_fupd g ∘
-            hashmap_hash_map_slots_fupd f) ∧
-         ∀h g f.
-           hashmap_hash_map_slots_fupd f ∘
-           hashmap_hash_map_max_load_factor_fupd g ∘ h =
-           hashmap_hash_map_max_load_factor_fupd g ∘
-           hashmap_hash_map_slots_fupd f ∘ h) ∧
-        (∀g f.
-           hashmap_hash_map_slots_fupd f ∘ hashmap_hash_map_max_load_fupd g =
-           hashmap_hash_map_max_load_fupd g ∘ hashmap_hash_map_slots_fupd f) ∧
-        ∀h g f.
-          hashmap_hash_map_slots_fupd f ∘
-          hashmap_hash_map_max_load_fupd g ∘ h =
-          hashmap_hash_map_max_load_fupd g ∘
-          hashmap_hash_map_slots_fupd f ∘ h
-   
-   [hashmap_hash_map_t_fupdfupds]  Theorem
-      
-      ⊢ (∀h g f.
-           h with
-           <|hashmap_hash_map_num_entries updated_by f;
-             hashmap_hash_map_num_entries updated_by g|> =
-           h with hashmap_hash_map_num_entries updated_by f ∘ g) ∧
-        (∀h g f.
-           h with
-           <|hashmap_hash_map_max_load_factor updated_by f;
-             hashmap_hash_map_max_load_factor updated_by g|> =
-           h with hashmap_hash_map_max_load_factor updated_by f ∘ g) ∧
-        (∀h g f.
-           h with
-           <|hashmap_hash_map_max_load updated_by f;
-             hashmap_hash_map_max_load updated_by g|> =
-           h with hashmap_hash_map_max_load updated_by f ∘ g) ∧
-        ∀h g f.
-          h with
-          <|hashmap_hash_map_slots updated_by f;
-            hashmap_hash_map_slots updated_by g|> =
-          h with hashmap_hash_map_slots updated_by f ∘ g
-   
-   [hashmap_hash_map_t_fupdfupds_comp]  Theorem
-      
-      ⊢ ((∀g f.
-            hashmap_hash_map_num_entries_fupd f ∘
-            hashmap_hash_map_num_entries_fupd g =
-            hashmap_hash_map_num_entries_fupd (f ∘ g)) ∧
-         ∀h g f.
-           hashmap_hash_map_num_entries_fupd f ∘
-           hashmap_hash_map_num_entries_fupd g ∘ h =
-           hashmap_hash_map_num_entries_fupd (f ∘ g) ∘ h) ∧
-        ((∀g f.
-            hashmap_hash_map_max_load_factor_fupd f ∘
-            hashmap_hash_map_max_load_factor_fupd g =
-            hashmap_hash_map_max_load_factor_fupd (f ∘ g)) ∧
-         ∀h g f.
-           hashmap_hash_map_max_load_factor_fupd f ∘
-           hashmap_hash_map_max_load_factor_fupd g ∘ h =
-           hashmap_hash_map_max_load_factor_fupd (f ∘ g) ∘ h) ∧
-        ((∀g f.
-            hashmap_hash_map_max_load_fupd f ∘
-            hashmap_hash_map_max_load_fupd g =
-            hashmap_hash_map_max_load_fupd (f ∘ g)) ∧
-         ∀h g f.
-           hashmap_hash_map_max_load_fupd f ∘
-           hashmap_hash_map_max_load_fupd g ∘ h =
-           hashmap_hash_map_max_load_fupd (f ∘ g) ∘ h) ∧
-        (∀g f.
-           hashmap_hash_map_slots_fupd f ∘ hashmap_hash_map_slots_fupd g =
-           hashmap_hash_map_slots_fupd (f ∘ g)) ∧
-        ∀h g f.
-          hashmap_hash_map_slots_fupd f ∘ hashmap_hash_map_slots_fupd g ∘ h =
-          hashmap_hash_map_slots_fupd (f ∘ g) ∘ h
-   
-   [hashmap_hash_map_t_induction]  Theorem
-      
-      ⊢ ∀P. (∀u p u0 v. P (hashmap_hash_map_t u p u0 v)) ⇒ ∀h. P h
-   
-   [hashmap_hash_map_t_literal_11]  Theorem
-      
-      ⊢ ∀u01 p1 u1 v1 u02 p2 u2 v2.
-          <|hashmap_hash_map_num_entries := u01;
-            hashmap_hash_map_max_load_factor := p1;
-            hashmap_hash_map_max_load := u1; hashmap_hash_map_slots := v1|> =
-          <|hashmap_hash_map_num_entries := u02;
-            hashmap_hash_map_max_load_factor := p2;
-            hashmap_hash_map_max_load := u2; hashmap_hash_map_slots := v2|> ⇔
-          u01 = u02 ∧ p1 = p2 ∧ u1 = u2 ∧ v1 = v2
-   
-   [hashmap_hash_map_t_literal_nchotomy]  Theorem
-      
-      ⊢ ∀h. ∃u0 p u v.
-          h =
-          <|hashmap_hash_map_num_entries := u0;
-            hashmap_hash_map_max_load_factor := p;
-            hashmap_hash_map_max_load := u; hashmap_hash_map_slots := v|>
-   
-   [hashmap_hash_map_t_nchotomy]  Theorem
-      
-      ⊢ ∀hh. ∃u p u0 v. hh = hashmap_hash_map_t u p u0 v
-   
-   [hashmap_hash_map_t_updates_eq_literal]  Theorem
-      
-      ⊢ ∀h u0 p u v.
-          h with
-          <|hashmap_hash_map_num_entries := u0;
-            hashmap_hash_map_max_load_factor := p;
-            hashmap_hash_map_max_load := u; hashmap_hash_map_slots := v|> =
-          <|hashmap_hash_map_num_entries := u0;
-            hashmap_hash_map_max_load_factor := p;
-            hashmap_hash_map_max_load := u; hashmap_hash_map_slots := v|>
-   
-   [hashmap_list_t_11]  Theorem
-      
-      ⊢ ∀a0 a1 a2 a0' a1' a2'.
-          HashmapListCons a0 a1 a2 = HashmapListCons a0' a1' a2' ⇔
-          a0 = a0' ∧ a1 = a1' ∧ a2 = a2'
-   
-   [hashmap_list_t_Axiom]  Theorem
-      
-      ⊢ ∀f0 f1. ∃fn.
-          (∀a0 a1 a2. fn (HashmapListCons a0 a1 a2) = f0 a0 a1 a2 (fn a2)) ∧
-          fn HashmapListNil = f1
-   
-   [hashmap_list_t_case_cong]  Theorem
-      
-      ⊢ ∀M M' f v.
-          M = M' ∧
-          (∀a0 a1 a2.
-             M' = HashmapListCons a0 a1 a2 ⇒ f a0 a1 a2 = f' a0 a1 a2) ∧
-          (M' = HashmapListNil ⇒ v = v') ⇒
-          hashmap_list_t_CASE M f v = hashmap_list_t_CASE M' f' v'
-   
-   [hashmap_list_t_case_eq]  Theorem
-      
-      ⊢ hashmap_list_t_CASE x f v = v' ⇔
-        (∃u t h. x = HashmapListCons u t h ∧ f u t h = v') ∨
-        x = HashmapListNil ∧ v = v'
-   
-   [hashmap_list_t_distinct]  Theorem
-      
-      ⊢ ∀a2 a1 a0. HashmapListCons a0 a1 a2 ≠ HashmapListNil
-   
-   [hashmap_list_t_induction]  Theorem
-      
-      ⊢ ∀P. (∀h. P h ⇒ ∀t u. P (HashmapListCons u t h)) ∧ P HashmapListNil ⇒
-            ∀h. P h
-   
-   [hashmap_list_t_nchotomy]  Theorem
-      
-      ⊢ ∀hh. (∃u t h. hh = HashmapListCons u t h) ∨ hh = HashmapListNil
-   
-   
-*)
-end
diff --git a/tests/hol4/loops/Holmakefile b/tests/hol4/loops/Holmakefile
new file mode 100644
index 00000000..3c4b8973
--- /dev/null
+++ b/tests/hol4/loops/Holmakefile
@@ -0,0 +1,5 @@
+# This file was automatically generated - modify ../Holmakefile.template instead
+INCLUDES =  ../../../backends/hol4
+
+all: $(DEFAULT_TARGETS)
+.PHONY: all
diff --git a/tests/hol4/loops/loops_FunsScript.sml b/tests/hol4/loops/loops_FunsScript.sml
new file mode 100644
index 00000000..65cf77d4
--- /dev/null
+++ b/tests/hol4/loops/loops_FunsScript.sml
@@ -0,0 +1,755 @@
+(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
+(** [loops]: function definitions *)
+open primitivesLib divDefLib
+open loops_TypesTheory
+
+val _ = new_theory "loops_Funs"
+
+
+val [sum_loop_fwd_def] = DefineDiv ‘
+  (** [loops::sum]: loop 0: forward function *)
+  sum_loop_fwd (max : u32) (i : u32) (s : u32) : u32 result =
+    if u32_lt i max
+    then (
+      do
+      s0 <- u32_add s i;
+      i0 <- u32_add i (int_to_u32 1);
+      sum_loop_fwd max i0 s0
+      od)
+    else u32_mul s (int_to_u32 2)
+’
+
+val sum_fwd_def = Define ‘
+  (** [loops::sum]: forward function *)
+  sum_fwd (max : u32) : u32 result =
+    sum_loop_fwd max (int_to_u32 0) (int_to_u32 0)
+’
+
+val [sum_with_mut_borrows_loop_fwd_def] = DefineDiv ‘
+  (** [loops::sum_with_mut_borrows]: loop 0: forward function *)
+  sum_with_mut_borrows_loop_fwd
+    (max : u32) (mi : u32) (ms : u32) : u32 result =
+    if u32_lt mi max
+    then (
+      do
+      ms0 <- u32_add ms mi;
+      mi0 <- u32_add mi (int_to_u32 1);
+      sum_with_mut_borrows_loop_fwd max mi0 ms0
+      od)
+    else u32_mul ms (int_to_u32 2)
+’
+
+val sum_with_mut_borrows_fwd_def = Define ‘
+  (** [loops::sum_with_mut_borrows]: forward function *)
+  sum_with_mut_borrows_fwd (max : u32) : u32 result =
+    sum_with_mut_borrows_loop_fwd max (int_to_u32 0) (int_to_u32 0)
+’
+
+val [sum_with_shared_borrows_loop_fwd_def] = DefineDiv ‘
+  (** [loops::sum_with_shared_borrows]: loop 0: forward function *)
+  sum_with_shared_borrows_loop_fwd
+    (max : u32) (i : u32) (s : u32) : u32 result =
+    if u32_lt i max
+    then (
+      do
+      i0 <- u32_add i (int_to_u32 1);
+      s0 <- u32_add s i0;
+      sum_with_shared_borrows_loop_fwd max i0 s0
+      od)
+    else u32_mul s (int_to_u32 2)
+’
+
+val sum_with_shared_borrows_fwd_def = Define ‘
+  (** [loops::sum_with_shared_borrows]: forward function *)
+  sum_with_shared_borrows_fwd (max : u32) : u32 result =
+    sum_with_shared_borrows_loop_fwd max (int_to_u32 0) (int_to_u32 0)
+’
+
+val [clear_loop_fwd_back_def] = DefineDiv ‘
+  (** [loops::clear]: loop 0: merged forward/backward function
+      (there is a single backward function, and the forward function returns ()) *)
+  clear_loop_fwd_back (v : u32 vec) (i : usize) : u32 vec result =
+    let i0 = vec_len v in
+    if usize_lt i i0
+    then (
+      do
+      i1 <- usize_add i (int_to_usize 1);
+      v0 <- vec_index_mut_back v i (int_to_u32 0);
+      clear_loop_fwd_back v0 i1
+      od)
+    else Return v
+’
+
+val clear_fwd_back_def = Define ‘
+  (** [loops::clear]: merged forward/backward function
+      (there is a single backward function, and the forward function returns ()) *)
+  clear_fwd_back (v : u32 vec) : u32 vec result =
+    clear_loop_fwd_back v (int_to_usize 0)
+’
+
+val [list_mem_loop_fwd_def] = DefineDiv ‘
+  (** [loops::list_mem]: loop 0: forward function *)
+  list_mem_loop_fwd (x : u32) (ls : u32 list_t) : bool result =
+    (case ls of
+    | ListCons y tl => if y = x then Return T else list_mem_loop_fwd x tl
+    | ListNil => Return F)
+’
+
+val list_mem_fwd_def = Define ‘
+  (** [loops::list_mem]: forward function *)
+  list_mem_fwd (x : u32) (ls : u32 list_t) : bool result =
+    list_mem_loop_fwd x ls
+’
+
+val [list_nth_mut_loop_loop_fwd_def] = DefineDiv ‘
+  (** [loops::list_nth_mut_loop]: loop 0: forward function *)
+  list_nth_mut_loop_loop_fwd (ls : 't list_t) (i : u32) : 't result =
+    (case ls of
+    | ListCons x tl =>
+      if i = int_to_u32 0
+      then Return x
+      else (
+        do
+        i0 <- u32_sub i (int_to_u32 1);
+        list_nth_mut_loop_loop_fwd tl i0
+        od)
+    | ListNil => Fail Failure)
+’
+
+val list_nth_mut_loop_fwd_def = Define ‘
+  (** [loops::list_nth_mut_loop]: forward function *)
+  list_nth_mut_loop_fwd (ls : 't list_t) (i : u32) : 't result =
+    list_nth_mut_loop_loop_fwd ls i
+’
+
+val [list_nth_mut_loop_loop_back_def] = DefineDiv ‘
+  (** [loops::list_nth_mut_loop]: loop 0: backward function 0 *)
+  list_nth_mut_loop_loop_back
+    (ls : 't list_t) (i : u32) (ret : 't) : 't list_t result =
+    (case ls of
+    | ListCons x tl =>
+      if i = int_to_u32 0
+      then Return (ListCons ret tl)
+      else (
+        do
+        i0 <- u32_sub i (int_to_u32 1);
+        tl0 <- list_nth_mut_loop_loop_back tl i0 ret;
+        Return (ListCons x tl0)
+        od)
+    | ListNil => Fail Failure)
+’
+
+val list_nth_mut_loop_back_def = Define ‘
+  (** [loops::list_nth_mut_loop]: backward function 0 *)
+  list_nth_mut_loop_back
+    (ls : 't list_t) (i : u32) (ret : 't) : 't list_t result =
+    list_nth_mut_loop_loop_back ls i ret
+’
+
+val [list_nth_shared_loop_loop_fwd_def] = DefineDiv ‘
+  (** [loops::list_nth_shared_loop]: loop 0: forward function *)
+  list_nth_shared_loop_loop_fwd (ls : 't list_t) (i : u32) : 't result =
+    (case ls of
+    | ListCons x tl =>
+      if i = int_to_u32 0
+      then Return x
+      else (
+        do
+        i0 <- u32_sub i (int_to_u32 1);
+        list_nth_shared_loop_loop_fwd tl i0
+        od)
+    | ListNil => Fail Failure)
+’
+
+val list_nth_shared_loop_fwd_def = Define ‘
+  (** [loops::list_nth_shared_loop]: forward function *)
+  list_nth_shared_loop_fwd (ls : 't list_t) (i : u32) : 't result =
+    list_nth_shared_loop_loop_fwd ls i
+’
+
+val [get_elem_mut_loop_fwd_def] = DefineDiv ‘
+  (** [loops::get_elem_mut]: loop 0: forward function *)
+  get_elem_mut_loop_fwd (x : usize) (ls : usize list_t) : usize result =
+    (case ls of
+    | ListCons y tl => if y = x then Return y else get_elem_mut_loop_fwd x tl
+    | ListNil => Fail Failure)
+’
+
+val get_elem_mut_fwd_def = Define ‘
+  (** [loops::get_elem_mut]: forward function *)
+  get_elem_mut_fwd (slots : usize list_t vec) (x : usize) : usize result =
+    do
+    l <- vec_index_mut_fwd slots (int_to_usize 0);
+    get_elem_mut_loop_fwd x l
+    od
+’
+
+val [get_elem_mut_loop_back_def] = DefineDiv ‘
+  (** [loops::get_elem_mut]: loop 0: backward function 0 *)
+  get_elem_mut_loop_back
+    (x : usize) (ls : usize list_t) (ret : usize) : usize list_t result =
+    (case ls of
+    | ListCons y tl =>
+      if y = x
+      then Return (ListCons ret tl)
+      else (
+        do
+        tl0 <- get_elem_mut_loop_back x tl ret;
+        Return (ListCons y tl0)
+        od)
+    | ListNil => Fail Failure)
+’
+
+val get_elem_mut_back_def = Define ‘
+  (** [loops::get_elem_mut]: backward function 0 *)
+  get_elem_mut_back
+    (slots : usize list_t vec) (x : usize) (ret : usize) :
+    usize list_t vec result
+    =
+    do
+    l <- vec_index_mut_fwd slots (int_to_usize 0);
+    l0 <- get_elem_mut_loop_back x l ret;
+    vec_index_mut_back slots (int_to_usize 0) l0
+    od
+’
+
+val [get_elem_shared_loop_fwd_def] = DefineDiv ‘
+  (** [loops::get_elem_shared]: loop 0: forward function *)
+  get_elem_shared_loop_fwd (x : usize) (ls : usize list_t) : usize result =
+    (case ls of
+    | ListCons y tl =>
+      if y = x then Return y else get_elem_shared_loop_fwd x tl
+    | ListNil => Fail Failure)
+’
+
+val get_elem_shared_fwd_def = Define ‘
+  (** [loops::get_elem_shared]: forward function *)
+  get_elem_shared_fwd (slots : usize list_t vec) (x : usize) : usize result =
+    do
+    l <- vec_index_fwd slots (int_to_usize 0);
+    get_elem_shared_loop_fwd x l
+    od
+’
+
+val id_mut_fwd_def = Define ‘
+  (** [loops::id_mut]: forward function *)
+  id_mut_fwd (ls : 't list_t) : 't list_t result =
+    Return ls
+’
+
+val id_mut_back_def = Define ‘
+  (** [loops::id_mut]: backward function 0 *)
+  id_mut_back (ls : 't list_t) (ret : 't list_t) : 't list_t result =
+    Return ret
+’
+
+val id_shared_fwd_def = Define ‘
+  (** [loops::id_shared]: forward function *)
+  id_shared_fwd (ls : 't list_t) : 't list_t result =
+    Return ls
+’
+
+val [list_nth_mut_loop_with_id_loop_fwd_def] = DefineDiv ‘
+  (** [loops::list_nth_mut_loop_with_id]: loop 0: forward function *)
+  list_nth_mut_loop_with_id_loop_fwd (i : u32) (ls : 't list_t) : 't result =
+    (case ls of
+    | ListCons x tl =>
+      if i = int_to_u32 0
+      then Return x
+      else (
+        do
+        i0 <- u32_sub i (int_to_u32 1);
+        list_nth_mut_loop_with_id_loop_fwd i0 tl
+        od)
+    | ListNil => Fail Failure)
+’
+
+val list_nth_mut_loop_with_id_fwd_def = Define ‘
+  (** [loops::list_nth_mut_loop_with_id]: forward function *)
+  list_nth_mut_loop_with_id_fwd (ls : 't list_t) (i : u32) : 't result =
+    do
+    ls0 <- id_mut_fwd ls;
+    list_nth_mut_loop_with_id_loop_fwd i ls0
+    od
+’
+
+val [list_nth_mut_loop_with_id_loop_back_def] = DefineDiv ‘
+  (** [loops::list_nth_mut_loop_with_id]: loop 0: backward function 0 *)
+  list_nth_mut_loop_with_id_loop_back
+    (i : u32) (ls : 't list_t) (ret : 't) : 't list_t result =
+    (case ls of
+    | ListCons x tl =>
+      if i = int_to_u32 0
+      then Return (ListCons ret tl)
+      else (
+        do
+        i0 <- u32_sub i (int_to_u32 1);
+        tl0 <- list_nth_mut_loop_with_id_loop_back i0 tl ret;
+        Return (ListCons x tl0)
+        od)
+    | ListNil => Fail Failure)
+’
+
+val list_nth_mut_loop_with_id_back_def = Define ‘
+  (** [loops::list_nth_mut_loop_with_id]: backward function 0 *)
+  list_nth_mut_loop_with_id_back
+    (ls : 't list_t) (i : u32) (ret : 't) : 't list_t result =
+    do
+    ls0 <- id_mut_fwd ls;
+    l <- list_nth_mut_loop_with_id_loop_back i ls0 ret;
+    id_mut_back ls l
+    od
+’
+
+val [list_nth_shared_loop_with_id_loop_fwd_def] = DefineDiv ‘
+  (** [loops::list_nth_shared_loop_with_id]: loop 0: forward function *)
+  list_nth_shared_loop_with_id_loop_fwd
+    (i : u32) (ls : 't list_t) : 't result =
+    (case ls of
+    | ListCons x tl =>
+      if i = int_to_u32 0
+      then Return x
+      else (
+        do
+        i0 <- u32_sub i (int_to_u32 1);
+        list_nth_shared_loop_with_id_loop_fwd i0 tl
+        od)
+    | ListNil => Fail Failure)
+’
+
+val list_nth_shared_loop_with_id_fwd_def = Define ‘
+  (** [loops::list_nth_shared_loop_with_id]: forward function *)
+  list_nth_shared_loop_with_id_fwd (ls : 't list_t) (i : u32) : 't result =
+    do
+    ls0 <- id_shared_fwd ls;
+    list_nth_shared_loop_with_id_loop_fwd i ls0
+    od
+’
+
+val [list_nth_mut_loop_pair_loop_fwd_def] = DefineDiv ‘
+  (** [loops::list_nth_mut_loop_pair]: loop 0: forward function *)
+  list_nth_mut_loop_pair_loop_fwd
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
+    (case ls0 of
+    | ListCons x0 tl0 =>
+      (case ls1 of
+      | ListCons x1 tl1 =>
+        if i = int_to_u32 0
+        then Return (x0, x1)
+        else (
+          do
+          i0 <- u32_sub i (int_to_u32 1);
+          list_nth_mut_loop_pair_loop_fwd tl0 tl1 i0
+          od)
+      | ListNil => Fail Failure)
+    | ListNil => Fail Failure)
+’
+
+val list_nth_mut_loop_pair_fwd_def = Define ‘
+  (** [loops::list_nth_mut_loop_pair]: forward function *)
+  list_nth_mut_loop_pair_fwd
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
+    list_nth_mut_loop_pair_loop_fwd ls0 ls1 i
+’
+
+val [list_nth_mut_loop_pair_loop_back'a_def] = DefineDiv ‘
+  (** [loops::list_nth_mut_loop_pair]: loop 0: backward function 0 *)
+  list_nth_mut_loop_pair_loop_back'a
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : 't) :
+    't list_t result
+    =
+    (case ls0 of
+    | ListCons x0 tl0 =>
+      (case ls1 of
+      | ListCons x1 tl1 =>
+        if i = int_to_u32 0
+        then Return (ListCons ret tl0)
+        else (
+          do
+          i0 <- u32_sub i (int_to_u32 1);
+          tl00 <- list_nth_mut_loop_pair_loop_back'a tl0 tl1 i0 ret;
+          Return (ListCons x0 tl00)
+          od)
+      | ListNil => Fail Failure)
+    | ListNil => Fail Failure)
+’
+
+val list_nth_mut_loop_pair_back'a_def = Define ‘
+  (** [loops::list_nth_mut_loop_pair]: backward function 0 *)
+  list_nth_mut_loop_pair_back'a
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : 't) :
+    't list_t result
+    =
+    list_nth_mut_loop_pair_loop_back'a ls0 ls1 i ret
+’
+
+val [list_nth_mut_loop_pair_loop_back'b_def] = DefineDiv ‘
+  (** [loops::list_nth_mut_loop_pair]: loop 0: backward function 1 *)
+  list_nth_mut_loop_pair_loop_back'b
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : 't) :
+    't list_t result
+    =
+    (case ls0 of
+    | ListCons x0 tl0 =>
+      (case ls1 of
+      | ListCons x1 tl1 =>
+        if i = int_to_u32 0
+        then Return (ListCons ret tl1)
+        else (
+          do
+          i0 <- u32_sub i (int_to_u32 1);
+          tl10 <- list_nth_mut_loop_pair_loop_back'b tl0 tl1 i0 ret;
+          Return (ListCons x1 tl10)
+          od)
+      | ListNil => Fail Failure)
+    | ListNil => Fail Failure)
+’
+
+val list_nth_mut_loop_pair_back'b_def = Define ‘
+  (** [loops::list_nth_mut_loop_pair]: backward function 1 *)
+  list_nth_mut_loop_pair_back'b
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : 't) :
+    't list_t result
+    =
+    list_nth_mut_loop_pair_loop_back'b ls0 ls1 i ret
+’
+
+val [list_nth_shared_loop_pair_loop_fwd_def] = DefineDiv ‘
+  (** [loops::list_nth_shared_loop_pair]: loop 0: forward function *)
+  list_nth_shared_loop_pair_loop_fwd
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
+    (case ls0 of
+    | ListCons x0 tl0 =>
+      (case ls1 of
+      | ListCons x1 tl1 =>
+        if i = int_to_u32 0
+        then Return (x0, x1)
+        else (
+          do
+          i0 <- u32_sub i (int_to_u32 1);
+          list_nth_shared_loop_pair_loop_fwd tl0 tl1 i0
+          od)
+      | ListNil => Fail Failure)
+    | ListNil => Fail Failure)
+’
+
+val list_nth_shared_loop_pair_fwd_def = Define ‘
+  (** [loops::list_nth_shared_loop_pair]: forward function *)
+  list_nth_shared_loop_pair_fwd
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
+    list_nth_shared_loop_pair_loop_fwd ls0 ls1 i
+’
+
+val [list_nth_mut_loop_pair_merge_loop_fwd_def] = DefineDiv ‘
+  (** [loops::list_nth_mut_loop_pair_merge]: loop 0: forward function *)
+  list_nth_mut_loop_pair_merge_loop_fwd
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
+    (case ls0 of
+    | ListCons x0 tl0 =>
+      (case ls1 of
+      | ListCons x1 tl1 =>
+        if i = int_to_u32 0
+        then Return (x0, x1)
+        else (
+          do
+          i0 <- u32_sub i (int_to_u32 1);
+          list_nth_mut_loop_pair_merge_loop_fwd tl0 tl1 i0
+          od)
+      | ListNil => Fail Failure)
+    | ListNil => Fail Failure)
+’
+
+val list_nth_mut_loop_pair_merge_fwd_def = Define ‘
+  (** [loops::list_nth_mut_loop_pair_merge]: forward function *)
+  list_nth_mut_loop_pair_merge_fwd
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
+    list_nth_mut_loop_pair_merge_loop_fwd ls0 ls1 i
+’
+
+val [list_nth_mut_loop_pair_merge_loop_back_def] = DefineDiv ‘
+  (** [loops::list_nth_mut_loop_pair_merge]: loop 0: backward function 0 *)
+  list_nth_mut_loop_pair_merge_loop_back
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : ('t # 't)) :
+    ('t list_t # 't list_t) result
+    =
+    (case ls0 of
+    | ListCons x0 tl0 =>
+      (case ls1 of
+      | ListCons x1 tl1 =>
+        if i = int_to_u32 0
+        then let (t, t0) = ret in Return (ListCons t tl0, ListCons t0 tl1)
+        else (
+          do
+          i0 <- u32_sub i (int_to_u32 1);
+          (tl00, tl10) <-
+            list_nth_mut_loop_pair_merge_loop_back tl0 tl1 i0 ret;
+          Return (ListCons x0 tl00, ListCons x1 tl10)
+          od)
+      | ListNil => Fail Failure)
+    | ListNil => Fail Failure)
+’
+
+val list_nth_mut_loop_pair_merge_back_def = Define ‘
+  (** [loops::list_nth_mut_loop_pair_merge]: backward function 0 *)
+  list_nth_mut_loop_pair_merge_back
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : ('t # 't)) :
+    ('t list_t # 't list_t) result
+    =
+    list_nth_mut_loop_pair_merge_loop_back ls0 ls1 i ret
+’
+
+val [list_nth_shared_loop_pair_merge_loop_fwd_def] = DefineDiv ‘
+  (** [loops::list_nth_shared_loop_pair_merge]: loop 0: forward function *)
+  list_nth_shared_loop_pair_merge_loop_fwd
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
+    (case ls0 of
+    | ListCons x0 tl0 =>
+      (case ls1 of
+      | ListCons x1 tl1 =>
+        if i = int_to_u32 0
+        then Return (x0, x1)
+        else (
+          do
+          i0 <- u32_sub i (int_to_u32 1);
+          list_nth_shared_loop_pair_merge_loop_fwd tl0 tl1 i0
+          od)
+      | ListNil => Fail Failure)
+    | ListNil => Fail Failure)
+’
+
+val list_nth_shared_loop_pair_merge_fwd_def = Define ‘
+  (** [loops::list_nth_shared_loop_pair_merge]: forward function *)
+  list_nth_shared_loop_pair_merge_fwd
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
+    list_nth_shared_loop_pair_merge_loop_fwd ls0 ls1 i
+’
+
+val [list_nth_mut_shared_loop_pair_loop_fwd_def] = DefineDiv ‘
+  (** [loops::list_nth_mut_shared_loop_pair]: loop 0: forward function *)
+  list_nth_mut_shared_loop_pair_loop_fwd
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
+    (case ls0 of
+    | ListCons x0 tl0 =>
+      (case ls1 of
+      | ListCons x1 tl1 =>
+        if i = int_to_u32 0
+        then Return (x0, x1)
+        else (
+          do
+          i0 <- u32_sub i (int_to_u32 1);
+          list_nth_mut_shared_loop_pair_loop_fwd tl0 tl1 i0
+          od)
+      | ListNil => Fail Failure)
+    | ListNil => Fail Failure)
+’
+
+val list_nth_mut_shared_loop_pair_fwd_def = Define ‘
+  (** [loops::list_nth_mut_shared_loop_pair]: forward function *)
+  list_nth_mut_shared_loop_pair_fwd
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
+    list_nth_mut_shared_loop_pair_loop_fwd ls0 ls1 i
+’
+
+val [list_nth_mut_shared_loop_pair_loop_back_def] = DefineDiv ‘
+  (** [loops::list_nth_mut_shared_loop_pair]: loop 0: backward function 0 *)
+  list_nth_mut_shared_loop_pair_loop_back
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : 't) :
+    't list_t result
+    =
+    (case ls0 of
+    | ListCons x0 tl0 =>
+      (case ls1 of
+      | ListCons x1 tl1 =>
+        if i = int_to_u32 0
+        then Return (ListCons ret tl0)
+        else (
+          do
+          i0 <- u32_sub i (int_to_u32 1);
+          tl00 <- list_nth_mut_shared_loop_pair_loop_back tl0 tl1 i0 ret;
+          Return (ListCons x0 tl00)
+          od)
+      | ListNil => Fail Failure)
+    | ListNil => Fail Failure)
+’
+
+val list_nth_mut_shared_loop_pair_back_def = Define ‘
+  (** [loops::list_nth_mut_shared_loop_pair]: backward function 0 *)
+  list_nth_mut_shared_loop_pair_back
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : 't) :
+    't list_t result
+    =
+    list_nth_mut_shared_loop_pair_loop_back ls0 ls1 i ret
+’
+
+val [list_nth_mut_shared_loop_pair_merge_loop_fwd_def] = DefineDiv ‘
+  (** [loops::list_nth_mut_shared_loop_pair_merge]: loop 0: forward function *)
+  list_nth_mut_shared_loop_pair_merge_loop_fwd
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
+    (case ls0 of
+    | ListCons x0 tl0 =>
+      (case ls1 of
+      | ListCons x1 tl1 =>
+        if i = int_to_u32 0
+        then Return (x0, x1)
+        else (
+          do
+          i0 <- u32_sub i (int_to_u32 1);
+          list_nth_mut_shared_loop_pair_merge_loop_fwd tl0 tl1 i0
+          od)
+      | ListNil => Fail Failure)
+    | ListNil => Fail Failure)
+’
+
+val list_nth_mut_shared_loop_pair_merge_fwd_def = Define ‘
+  (** [loops::list_nth_mut_shared_loop_pair_merge]: forward function *)
+  list_nth_mut_shared_loop_pair_merge_fwd
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
+    list_nth_mut_shared_loop_pair_merge_loop_fwd ls0 ls1 i
+’
+
+val [list_nth_mut_shared_loop_pair_merge_loop_back_def] = DefineDiv ‘
+  (** [loops::list_nth_mut_shared_loop_pair_merge]: loop 0: backward function 0 *)
+  list_nth_mut_shared_loop_pair_merge_loop_back
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : 't) :
+    't list_t result
+    =
+    (case ls0 of
+    | ListCons x0 tl0 =>
+      (case ls1 of
+      | ListCons x1 tl1 =>
+        if i = int_to_u32 0
+        then Return (ListCons ret tl0)
+        else (
+          do
+          i0 <- u32_sub i (int_to_u32 1);
+          tl00 <- list_nth_mut_shared_loop_pair_merge_loop_back tl0 tl1 i0 ret;
+          Return (ListCons x0 tl00)
+          od)
+      | ListNil => Fail Failure)
+    | ListNil => Fail Failure)
+’
+
+val list_nth_mut_shared_loop_pair_merge_back_def = Define ‘
+  (** [loops::list_nth_mut_shared_loop_pair_merge]: backward function 0 *)
+  list_nth_mut_shared_loop_pair_merge_back
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : 't) :
+    't list_t result
+    =
+    list_nth_mut_shared_loop_pair_merge_loop_back ls0 ls1 i ret
+’
+
+val [list_nth_shared_mut_loop_pair_loop_fwd_def] = DefineDiv ‘
+  (** [loops::list_nth_shared_mut_loop_pair]: loop 0: forward function *)
+  list_nth_shared_mut_loop_pair_loop_fwd
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
+    (case ls0 of
+    | ListCons x0 tl0 =>
+      (case ls1 of
+      | ListCons x1 tl1 =>
+        if i = int_to_u32 0
+        then Return (x0, x1)
+        else (
+          do
+          i0 <- u32_sub i (int_to_u32 1);
+          list_nth_shared_mut_loop_pair_loop_fwd tl0 tl1 i0
+          od)
+      | ListNil => Fail Failure)
+    | ListNil => Fail Failure)
+’
+
+val list_nth_shared_mut_loop_pair_fwd_def = Define ‘
+  (** [loops::list_nth_shared_mut_loop_pair]: forward function *)
+  list_nth_shared_mut_loop_pair_fwd
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
+    list_nth_shared_mut_loop_pair_loop_fwd ls0 ls1 i
+’
+
+val [list_nth_shared_mut_loop_pair_loop_back_def] = DefineDiv ‘
+  (** [loops::list_nth_shared_mut_loop_pair]: loop 0: backward function 1 *)
+  list_nth_shared_mut_loop_pair_loop_back
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : 't) :
+    't list_t result
+    =
+    (case ls0 of
+    | ListCons x0 tl0 =>
+      (case ls1 of
+      | ListCons x1 tl1 =>
+        if i = int_to_u32 0
+        then Return (ListCons ret tl1)
+        else (
+          do
+          i0 <- u32_sub i (int_to_u32 1);
+          tl10 <- list_nth_shared_mut_loop_pair_loop_back tl0 tl1 i0 ret;
+          Return (ListCons x1 tl10)
+          od)
+      | ListNil => Fail Failure)
+    | ListNil => Fail Failure)
+’
+
+val list_nth_shared_mut_loop_pair_back_def = Define ‘
+  (** [loops::list_nth_shared_mut_loop_pair]: backward function 1 *)
+  list_nth_shared_mut_loop_pair_back
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : 't) :
+    't list_t result
+    =
+    list_nth_shared_mut_loop_pair_loop_back ls0 ls1 i ret
+’
+
+val [list_nth_shared_mut_loop_pair_merge_loop_fwd_def] = DefineDiv ‘
+  (** [loops::list_nth_shared_mut_loop_pair_merge]: loop 0: forward function *)
+  list_nth_shared_mut_loop_pair_merge_loop_fwd
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
+    (case ls0 of
+    | ListCons x0 tl0 =>
+      (case ls1 of
+      | ListCons x1 tl1 =>
+        if i = int_to_u32 0
+        then Return (x0, x1)
+        else (
+          do
+          i0 <- u32_sub i (int_to_u32 1);
+          list_nth_shared_mut_loop_pair_merge_loop_fwd tl0 tl1 i0
+          od)
+      | ListNil => Fail Failure)
+    | ListNil => Fail Failure)
+’
+
+val list_nth_shared_mut_loop_pair_merge_fwd_def = Define ‘
+  (** [loops::list_nth_shared_mut_loop_pair_merge]: forward function *)
+  list_nth_shared_mut_loop_pair_merge_fwd
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
+    list_nth_shared_mut_loop_pair_merge_loop_fwd ls0 ls1 i
+’
+
+val [list_nth_shared_mut_loop_pair_merge_loop_back_def] = DefineDiv ‘
+  (** [loops::list_nth_shared_mut_loop_pair_merge]: loop 0: backward function 0 *)
+  list_nth_shared_mut_loop_pair_merge_loop_back
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : 't) :
+    't list_t result
+    =
+    (case ls0 of
+    | ListCons x0 tl0 =>
+      (case ls1 of
+      | ListCons x1 tl1 =>
+        if i = int_to_u32 0
+        then Return (ListCons ret tl1)
+        else (
+          do
+          i0 <- u32_sub i (int_to_u32 1);
+          tl10 <- list_nth_shared_mut_loop_pair_merge_loop_back tl0 tl1 i0 ret;
+          Return (ListCons x1 tl10)
+          od)
+      | ListNil => Fail Failure)
+    | ListNil => Fail Failure)
+’
+
+val list_nth_shared_mut_loop_pair_merge_back_def = Define ‘
+  (** [loops::list_nth_shared_mut_loop_pair_merge]: backward function 0 *)
+  list_nth_shared_mut_loop_pair_merge_back
+    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : 't) :
+    't list_t result
+    =
+    list_nth_shared_mut_loop_pair_merge_loop_back ls0 ls1 i ret
+’
+
+val _ = export_theory ()
diff --git a/tests/hol4/loops/loops_FunsTheory.sig b/tests/hol4/loops/loops_FunsTheory.sig
new file mode 100644
index 00000000..63fe56c9
--- /dev/null
+++ b/tests/hol4/loops/loops_FunsTheory.sig
@@ -0,0 +1,731 @@
+signature loops_FunsTheory =
+sig
+  type thm = Thm.thm
+  
+  (*  Definitions  *)
+    val clear_fwd_back_def : thm
+    val clear_loop_fwd_back_def : thm
+    val get_elem_mut_back_def : thm
+    val get_elem_mut_fwd_def : thm
+    val get_elem_mut_loop_back_def : thm
+    val get_elem_mut_loop_fwd_def : thm
+    val get_elem_shared_fwd_def : thm
+    val get_elem_shared_loop_fwd_def : thm
+    val id_mut_back_def : thm
+    val id_mut_fwd_def : thm
+    val id_shared_fwd_def : thm
+    val list_mem_fwd_def : thm
+    val list_mem_loop_fwd_def : thm
+    val list_nth_mut_loop_back_def : thm
+    val list_nth_mut_loop_fwd_def : thm
+    val list_nth_mut_loop_loop_back_def : thm
+    val list_nth_mut_loop_loop_fwd_def : thm
+    val list_nth_mut_loop_pair_back'a_def : thm
+    val list_nth_mut_loop_pair_back'b_def : thm
+    val list_nth_mut_loop_pair_fwd_def : thm
+    val list_nth_mut_loop_pair_loop_back'a_def : thm
+    val list_nth_mut_loop_pair_loop_back'b_def : thm
+    val list_nth_mut_loop_pair_loop_fwd_def : thm
+    val list_nth_mut_loop_pair_merge_back_def : thm
+    val list_nth_mut_loop_pair_merge_fwd_def : thm
+    val list_nth_mut_loop_pair_merge_loop_back_def : thm
+    val list_nth_mut_loop_pair_merge_loop_fwd_def : thm
+    val list_nth_mut_loop_with_id_back_def : thm
+    val list_nth_mut_loop_with_id_fwd_def : thm
+    val list_nth_mut_loop_with_id_loop_back_def : thm
+    val list_nth_mut_loop_with_id_loop_fwd_def : thm
+    val list_nth_mut_shared_loop_pair_back_def : thm
+    val list_nth_mut_shared_loop_pair_fwd_def : thm
+    val list_nth_mut_shared_loop_pair_loop_back_def : thm
+    val list_nth_mut_shared_loop_pair_loop_fwd_def : thm
+    val list_nth_mut_shared_loop_pair_merge_back_def : thm
+    val list_nth_mut_shared_loop_pair_merge_fwd_def : thm
+    val list_nth_mut_shared_loop_pair_merge_loop_back_def : thm
+    val list_nth_mut_shared_loop_pair_merge_loop_fwd_def : thm
+    val list_nth_shared_loop_fwd_def : thm
+    val list_nth_shared_loop_loop_fwd_def : thm
+    val list_nth_shared_loop_pair_fwd_def : thm
+    val list_nth_shared_loop_pair_loop_fwd_def : thm
+    val list_nth_shared_loop_pair_merge_fwd_def : thm
+    val list_nth_shared_loop_pair_merge_loop_fwd_def : thm
+    val list_nth_shared_loop_with_id_fwd_def : thm
+    val list_nth_shared_loop_with_id_loop_fwd_def : thm
+    val list_nth_shared_mut_loop_pair_back_def : thm
+    val list_nth_shared_mut_loop_pair_fwd_def : thm
+    val list_nth_shared_mut_loop_pair_loop_back_def : thm
+    val list_nth_shared_mut_loop_pair_loop_fwd_def : thm
+    val list_nth_shared_mut_loop_pair_merge_back_def : thm
+    val list_nth_shared_mut_loop_pair_merge_fwd_def : thm
+    val list_nth_shared_mut_loop_pair_merge_loop_back_def : thm
+    val list_nth_shared_mut_loop_pair_merge_loop_fwd_def : thm
+    val sum_fwd_def : thm
+    val sum_loop_fwd_def : thm
+    val sum_with_mut_borrows_fwd_def : thm
+    val sum_with_mut_borrows_loop_fwd_def : thm
+    val sum_with_shared_borrows_fwd_def : thm
+    val sum_with_shared_borrows_loop_fwd_def : thm
+  
+  val loops_Funs_grammars : type_grammar.grammar * term_grammar.grammar
+(*
+   [loops_Types] Parent theory of "loops_Funs"
+   
+   [clear_fwd_back_def]  Definition
+      
+      ⊢ ∀v. clear_fwd_back v = clear_loop_fwd_back v (int_to_usize 0)
+   
+   [clear_loop_fwd_back_def]  Definition
+      
+      ⊢ ∀v i.
+          clear_loop_fwd_back v i =
+          (let
+             i0 = vec_len v
+           in
+             if usize_lt i i0 then
+               do
+                 i1 <- usize_add i (int_to_usize 1);
+                 v0 <- vec_index_mut_back v i (int_to_u32 0);
+                 clear_loop_fwd_back v0 i1
+               od
+             else Return v)
+   
+   [get_elem_mut_back_def]  Definition
+      
+      ⊢ ∀slots x ret.
+          get_elem_mut_back slots x ret =
+          do
+            l <- vec_index_mut_fwd slots (int_to_usize 0);
+            l0 <- get_elem_mut_loop_back x l ret;
+            vec_index_mut_back slots (int_to_usize 0) l0
+          od
+   
+   [get_elem_mut_fwd_def]  Definition
+      
+      ⊢ ∀slots x.
+          get_elem_mut_fwd slots x =
+          do
+            l <- vec_index_mut_fwd slots (int_to_usize 0);
+            get_elem_mut_loop_fwd x l
+          od
+   
+   [get_elem_mut_loop_back_def]  Definition
+      
+      ⊢ ∀x ls ret.
+          get_elem_mut_loop_back x ls ret =
+          case ls of
+            ListCons y tl =>
+              if y = x then Return (ListCons ret tl)
+              else
+                do
+                  tl0 <- get_elem_mut_loop_back x tl ret;
+                  Return (ListCons y tl0)
+                od
+          | ListNil => Fail Failure
+   
+   [get_elem_mut_loop_fwd_def]  Definition
+      
+      ⊢ ∀x ls.
+          get_elem_mut_loop_fwd x ls =
+          case ls of
+            ListCons y tl =>
+              if y = x then Return y else get_elem_mut_loop_fwd x tl
+          | ListNil => Fail Failure
+   
+   [get_elem_shared_fwd_def]  Definition
+      
+      ⊢ ∀slots x.
+          get_elem_shared_fwd slots x =
+          do
+            l <- vec_index_fwd slots (int_to_usize 0);
+            get_elem_shared_loop_fwd x l
+          od
+   
+   [get_elem_shared_loop_fwd_def]  Definition
+      
+      ⊢ ∀x ls.
+          get_elem_shared_loop_fwd x ls =
+          case ls of
+            ListCons y tl =>
+              if y = x then Return y else get_elem_shared_loop_fwd x tl
+          | ListNil => Fail Failure
+   
+   [id_mut_back_def]  Definition
+      
+      ⊢ ∀ls ret. id_mut_back ls ret = Return ret
+   
+   [id_mut_fwd_def]  Definition
+      
+      ⊢ ∀ls. id_mut_fwd ls = Return ls
+   
+   [id_shared_fwd_def]  Definition
+      
+      ⊢ ∀ls. id_shared_fwd ls = Return ls
+   
+   [list_mem_fwd_def]  Definition
+      
+      ⊢ ∀x ls. list_mem_fwd x ls = list_mem_loop_fwd x ls
+   
+   [list_mem_loop_fwd_def]  Definition
+      
+      ⊢ ∀x ls.
+          list_mem_loop_fwd x ls =
+          case ls of
+            ListCons y tl =>
+              if y = x then Return T else list_mem_loop_fwd x tl
+          | ListNil => Return F
+   
+   [list_nth_mut_loop_back_def]  Definition
+      
+      ⊢ ∀ls i ret.
+          list_nth_mut_loop_back ls i ret =
+          list_nth_mut_loop_loop_back ls i ret
+   
+   [list_nth_mut_loop_fwd_def]  Definition
+      
+      ⊢ ∀ls i. list_nth_mut_loop_fwd ls i = list_nth_mut_loop_loop_fwd ls i
+   
+   [list_nth_mut_loop_loop_back_def]  Definition
+      
+      ⊢ ∀ls i ret.
+          list_nth_mut_loop_loop_back ls i ret =
+          case ls of
+            ListCons x tl =>
+              if i = int_to_u32 0 then Return (ListCons ret tl)
+              else
+                do
+                  i0 <- u32_sub i (int_to_u32 1);
+                  tl0 <- list_nth_mut_loop_loop_back tl i0 ret;
+                  Return (ListCons x tl0)
+                od
+          | ListNil => Fail Failure
+   
+   [list_nth_mut_loop_loop_fwd_def]  Definition
+      
+      ⊢ ∀ls i.
+          list_nth_mut_loop_loop_fwd ls i =
+          case ls of
+            ListCons x tl =>
+              if i = int_to_u32 0 then Return x
+              else
+                do
+                  i0 <- u32_sub i (int_to_u32 1);
+                  list_nth_mut_loop_loop_fwd tl i0
+                od
+          | ListNil => Fail Failure
+   
+   [list_nth_mut_loop_pair_back'a_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i ret.
+          list_nth_mut_loop_pair_back'a ls0 ls1 i ret =
+          list_nth_mut_loop_pair_loop_back'a ls0 ls1 i ret
+   
+   [list_nth_mut_loop_pair_back'b_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i ret.
+          list_nth_mut_loop_pair_back'b ls0 ls1 i ret =
+          list_nth_mut_loop_pair_loop_back'b ls0 ls1 i ret
+   
+   [list_nth_mut_loop_pair_fwd_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i.
+          list_nth_mut_loop_pair_fwd ls0 ls1 i =
+          list_nth_mut_loop_pair_loop_fwd ls0 ls1 i
+   
+   [list_nth_mut_loop_pair_loop_back'a_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i ret.
+          list_nth_mut_loop_pair_loop_back'a ls0 ls1 i ret =
+          case ls0 of
+            ListCons x0 tl0 =>
+              (case ls1 of
+                 ListCons x1 tl1 =>
+                   if i = int_to_u32 0 then Return (ListCons ret tl0)
+                   else
+                     do
+                       i0 <- u32_sub i (int_to_u32 1);
+                       tl00 <-
+                         list_nth_mut_loop_pair_loop_back'a tl0 tl1 i0 ret;
+                       Return (ListCons x0 tl00)
+                     od
+               | ListNil => Fail Failure)
+          | ListNil => Fail Failure
+   
+   [list_nth_mut_loop_pair_loop_back'b_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i ret.
+          list_nth_mut_loop_pair_loop_back'b ls0 ls1 i ret =
+          case ls0 of
+            ListCons x0 tl0 =>
+              (case ls1 of
+                 ListCons x1 tl1 =>
+                   if i = int_to_u32 0 then Return (ListCons ret tl1)
+                   else
+                     do
+                       i0 <- u32_sub i (int_to_u32 1);
+                       tl10 <-
+                         list_nth_mut_loop_pair_loop_back'b tl0 tl1 i0 ret;
+                       Return (ListCons x1 tl10)
+                     od
+               | ListNil => Fail Failure)
+          | ListNil => Fail Failure
+   
+   [list_nth_mut_loop_pair_loop_fwd_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i.
+          list_nth_mut_loop_pair_loop_fwd ls0 ls1 i =
+          case ls0 of
+            ListCons x0 tl0 =>
+              (case ls1 of
+                 ListCons x1 tl1 =>
+                   if i = int_to_u32 0 then Return (x0,x1)
+                   else
+                     do
+                       i0 <- u32_sub i (int_to_u32 1);
+                       list_nth_mut_loop_pair_loop_fwd tl0 tl1 i0
+                     od
+               | ListNil => Fail Failure)
+          | ListNil => Fail Failure
+   
+   [list_nth_mut_loop_pair_merge_back_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i ret.
+          list_nth_mut_loop_pair_merge_back ls0 ls1 i ret =
+          list_nth_mut_loop_pair_merge_loop_back ls0 ls1 i ret
+   
+   [list_nth_mut_loop_pair_merge_fwd_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i.
+          list_nth_mut_loop_pair_merge_fwd ls0 ls1 i =
+          list_nth_mut_loop_pair_merge_loop_fwd ls0 ls1 i
+   
+   [list_nth_mut_loop_pair_merge_loop_back_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i ret.
+          list_nth_mut_loop_pair_merge_loop_back ls0 ls1 i ret =
+          case ls0 of
+            ListCons x0 tl0 =>
+              (case ls1 of
+                 ListCons x1 tl1 =>
+                   if i = int_to_u32 0 then
+                     (let
+                        (t,t0) = ret
+                      in
+                        Return (ListCons t tl0,ListCons t0 tl1))
+                   else
+                     do
+                       i0 <- u32_sub i (int_to_u32 1);
+                       (tl00,tl10) <-
+                         list_nth_mut_loop_pair_merge_loop_back tl0 tl1 i0
+                           ret;
+                       Return (ListCons x0 tl00,ListCons x1 tl10)
+                     od
+               | ListNil => Fail Failure)
+          | ListNil => Fail Failure
+   
+   [list_nth_mut_loop_pair_merge_loop_fwd_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i.
+          list_nth_mut_loop_pair_merge_loop_fwd ls0 ls1 i =
+          case ls0 of
+            ListCons x0 tl0 =>
+              (case ls1 of
+                 ListCons x1 tl1 =>
+                   if i = int_to_u32 0 then Return (x0,x1)
+                   else
+                     do
+                       i0 <- u32_sub i (int_to_u32 1);
+                       list_nth_mut_loop_pair_merge_loop_fwd tl0 tl1 i0
+                     od
+               | ListNil => Fail Failure)
+          | ListNil => Fail Failure
+   
+   [list_nth_mut_loop_with_id_back_def]  Definition
+      
+      ⊢ ∀ls i ret.
+          list_nth_mut_loop_with_id_back ls i ret =
+          do
+            ls0 <- id_mut_fwd ls;
+            l <- list_nth_mut_loop_with_id_loop_back i ls0 ret;
+            id_mut_back ls l
+          od
+   
+   [list_nth_mut_loop_with_id_fwd_def]  Definition
+      
+      ⊢ ∀ls i.
+          list_nth_mut_loop_with_id_fwd ls i =
+          do
+            ls0 <- id_mut_fwd ls;
+            list_nth_mut_loop_with_id_loop_fwd i ls0
+          od
+   
+   [list_nth_mut_loop_with_id_loop_back_def]  Definition
+      
+      ⊢ ∀i ls ret.
+          list_nth_mut_loop_with_id_loop_back i ls ret =
+          case ls of
+            ListCons x tl =>
+              if i = int_to_u32 0 then Return (ListCons ret tl)
+              else
+                do
+                  i0 <- u32_sub i (int_to_u32 1);
+                  tl0 <- list_nth_mut_loop_with_id_loop_back i0 tl ret;
+                  Return (ListCons x tl0)
+                od
+          | ListNil => Fail Failure
+   
+   [list_nth_mut_loop_with_id_loop_fwd_def]  Definition
+      
+      ⊢ ∀i ls.
+          list_nth_mut_loop_with_id_loop_fwd i ls =
+          case ls of
+            ListCons x tl =>
+              if i = int_to_u32 0 then Return x
+              else
+                do
+                  i0 <- u32_sub i (int_to_u32 1);
+                  list_nth_mut_loop_with_id_loop_fwd i0 tl
+                od
+          | ListNil => Fail Failure
+   
+   [list_nth_mut_shared_loop_pair_back_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i ret.
+          list_nth_mut_shared_loop_pair_back ls0 ls1 i ret =
+          list_nth_mut_shared_loop_pair_loop_back ls0 ls1 i ret
+   
+   [list_nth_mut_shared_loop_pair_fwd_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i.
+          list_nth_mut_shared_loop_pair_fwd ls0 ls1 i =
+          list_nth_mut_shared_loop_pair_loop_fwd ls0 ls1 i
+   
+   [list_nth_mut_shared_loop_pair_loop_back_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i ret.
+          list_nth_mut_shared_loop_pair_loop_back ls0 ls1 i ret =
+          case ls0 of
+            ListCons x0 tl0 =>
+              (case ls1 of
+                 ListCons x1 tl1 =>
+                   if i = int_to_u32 0 then Return (ListCons ret tl0)
+                   else
+                     do
+                       i0 <- u32_sub i (int_to_u32 1);
+                       tl00 <-
+                         list_nth_mut_shared_loop_pair_loop_back tl0 tl1 i0
+                           ret;
+                       Return (ListCons x0 tl00)
+                     od
+               | ListNil => Fail Failure)
+          | ListNil => Fail Failure
+   
+   [list_nth_mut_shared_loop_pair_loop_fwd_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i.
+          list_nth_mut_shared_loop_pair_loop_fwd ls0 ls1 i =
+          case ls0 of
+            ListCons x0 tl0 =>
+              (case ls1 of
+                 ListCons x1 tl1 =>
+                   if i = int_to_u32 0 then Return (x0,x1)
+                   else
+                     do
+                       i0 <- u32_sub i (int_to_u32 1);
+                       list_nth_mut_shared_loop_pair_loop_fwd tl0 tl1 i0
+                     od
+               | ListNil => Fail Failure)
+          | ListNil => Fail Failure
+   
+   [list_nth_mut_shared_loop_pair_merge_back_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i ret.
+          list_nth_mut_shared_loop_pair_merge_back ls0 ls1 i ret =
+          list_nth_mut_shared_loop_pair_merge_loop_back ls0 ls1 i ret
+   
+   [list_nth_mut_shared_loop_pair_merge_fwd_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i.
+          list_nth_mut_shared_loop_pair_merge_fwd ls0 ls1 i =
+          list_nth_mut_shared_loop_pair_merge_loop_fwd ls0 ls1 i
+   
+   [list_nth_mut_shared_loop_pair_merge_loop_back_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i ret.
+          list_nth_mut_shared_loop_pair_merge_loop_back ls0 ls1 i ret =
+          case ls0 of
+            ListCons x0 tl0 =>
+              (case ls1 of
+                 ListCons x1 tl1 =>
+                   if i = int_to_u32 0 then Return (ListCons ret tl0)
+                   else
+                     do
+                       i0 <- u32_sub i (int_to_u32 1);
+                       tl00 <-
+                         list_nth_mut_shared_loop_pair_merge_loop_back tl0
+                           tl1 i0 ret;
+                       Return (ListCons x0 tl00)
+                     od
+               | ListNil => Fail Failure)
+          | ListNil => Fail Failure
+   
+   [list_nth_mut_shared_loop_pair_merge_loop_fwd_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i.
+          list_nth_mut_shared_loop_pair_merge_loop_fwd ls0 ls1 i =
+          case ls0 of
+            ListCons x0 tl0 =>
+              (case ls1 of
+                 ListCons x1 tl1 =>
+                   if i = int_to_u32 0 then Return (x0,x1)
+                   else
+                     do
+                       i0 <- u32_sub i (int_to_u32 1);
+                       list_nth_mut_shared_loop_pair_merge_loop_fwd tl0 tl1
+                         i0
+                     od
+               | ListNil => Fail Failure)
+          | ListNil => Fail Failure
+   
+   [list_nth_shared_loop_fwd_def]  Definition
+      
+      ⊢ ∀ls i.
+          list_nth_shared_loop_fwd ls i =
+          list_nth_shared_loop_loop_fwd ls i
+   
+   [list_nth_shared_loop_loop_fwd_def]  Definition
+      
+      ⊢ ∀ls i.
+          list_nth_shared_loop_loop_fwd ls i =
+          case ls of
+            ListCons x tl =>
+              if i = int_to_u32 0 then Return x
+              else
+                do
+                  i0 <- u32_sub i (int_to_u32 1);
+                  list_nth_shared_loop_loop_fwd tl i0
+                od
+          | ListNil => Fail Failure
+   
+   [list_nth_shared_loop_pair_fwd_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i.
+          list_nth_shared_loop_pair_fwd ls0 ls1 i =
+          list_nth_shared_loop_pair_loop_fwd ls0 ls1 i
+   
+   [list_nth_shared_loop_pair_loop_fwd_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i.
+          list_nth_shared_loop_pair_loop_fwd ls0 ls1 i =
+          case ls0 of
+            ListCons x0 tl0 =>
+              (case ls1 of
+                 ListCons x1 tl1 =>
+                   if i = int_to_u32 0 then Return (x0,x1)
+                   else
+                     do
+                       i0 <- u32_sub i (int_to_u32 1);
+                       list_nth_shared_loop_pair_loop_fwd tl0 tl1 i0
+                     od
+               | ListNil => Fail Failure)
+          | ListNil => Fail Failure
+   
+   [list_nth_shared_loop_pair_merge_fwd_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i.
+          list_nth_shared_loop_pair_merge_fwd ls0 ls1 i =
+          list_nth_shared_loop_pair_merge_loop_fwd ls0 ls1 i
+   
+   [list_nth_shared_loop_pair_merge_loop_fwd_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i.
+          list_nth_shared_loop_pair_merge_loop_fwd ls0 ls1 i =
+          case ls0 of
+            ListCons x0 tl0 =>
+              (case ls1 of
+                 ListCons x1 tl1 =>
+                   if i = int_to_u32 0 then Return (x0,x1)
+                   else
+                     do
+                       i0 <- u32_sub i (int_to_u32 1);
+                       list_nth_shared_loop_pair_merge_loop_fwd tl0 tl1 i0
+                     od
+               | ListNil => Fail Failure)
+          | ListNil => Fail Failure
+   
+   [list_nth_shared_loop_with_id_fwd_def]  Definition
+      
+      ⊢ ∀ls i.
+          list_nth_shared_loop_with_id_fwd ls i =
+          do
+            ls0 <- id_shared_fwd ls;
+            list_nth_shared_loop_with_id_loop_fwd i ls0
+          od
+   
+   [list_nth_shared_loop_with_id_loop_fwd_def]  Definition
+      
+      ⊢ ∀i ls.
+          list_nth_shared_loop_with_id_loop_fwd i ls =
+          case ls of
+            ListCons x tl =>
+              if i = int_to_u32 0 then Return x
+              else
+                do
+                  i0 <- u32_sub i (int_to_u32 1);
+                  list_nth_shared_loop_with_id_loop_fwd i0 tl
+                od
+          | ListNil => Fail Failure
+   
+   [list_nth_shared_mut_loop_pair_back_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i ret.
+          list_nth_shared_mut_loop_pair_back ls0 ls1 i ret =
+          list_nth_shared_mut_loop_pair_loop_back ls0 ls1 i ret
+   
+   [list_nth_shared_mut_loop_pair_fwd_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i.
+          list_nth_shared_mut_loop_pair_fwd ls0 ls1 i =
+          list_nth_shared_mut_loop_pair_loop_fwd ls0 ls1 i
+   
+   [list_nth_shared_mut_loop_pair_loop_back_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i ret.
+          list_nth_shared_mut_loop_pair_loop_back ls0 ls1 i ret =
+          case ls0 of
+            ListCons x0 tl0 =>
+              (case ls1 of
+                 ListCons x1 tl1 =>
+                   if i = int_to_u32 0 then Return (ListCons ret tl1)
+                   else
+                     do
+                       i0 <- u32_sub i (int_to_u32 1);
+                       tl10 <-
+                         list_nth_shared_mut_loop_pair_loop_back tl0 tl1 i0
+                           ret;
+                       Return (ListCons x1 tl10)
+                     od
+               | ListNil => Fail Failure)
+          | ListNil => Fail Failure
+   
+   [list_nth_shared_mut_loop_pair_loop_fwd_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i.
+          list_nth_shared_mut_loop_pair_loop_fwd ls0 ls1 i =
+          case ls0 of
+            ListCons x0 tl0 =>
+              (case ls1 of
+                 ListCons x1 tl1 =>
+                   if i = int_to_u32 0 then Return (x0,x1)
+                   else
+                     do
+                       i0 <- u32_sub i (int_to_u32 1);
+                       list_nth_shared_mut_loop_pair_loop_fwd tl0 tl1 i0
+                     od
+               | ListNil => Fail Failure)
+          | ListNil => Fail Failure
+   
+   [list_nth_shared_mut_loop_pair_merge_back_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i ret.
+          list_nth_shared_mut_loop_pair_merge_back ls0 ls1 i ret =
+          list_nth_shared_mut_loop_pair_merge_loop_back ls0 ls1 i ret
+   
+   [list_nth_shared_mut_loop_pair_merge_fwd_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i.
+          list_nth_shared_mut_loop_pair_merge_fwd ls0 ls1 i =
+          list_nth_shared_mut_loop_pair_merge_loop_fwd ls0 ls1 i
+   
+   [list_nth_shared_mut_loop_pair_merge_loop_back_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i ret.
+          list_nth_shared_mut_loop_pair_merge_loop_back ls0 ls1 i ret =
+          case ls0 of
+            ListCons x0 tl0 =>
+              (case ls1 of
+                 ListCons x1 tl1 =>
+                   if i = int_to_u32 0 then Return (ListCons ret tl1)
+                   else
+                     do
+                       i0 <- u32_sub i (int_to_u32 1);
+                       tl10 <-
+                         list_nth_shared_mut_loop_pair_merge_loop_back tl0
+                           tl1 i0 ret;
+                       Return (ListCons x1 tl10)
+                     od
+               | ListNil => Fail Failure)
+          | ListNil => Fail Failure
+   
+   [list_nth_shared_mut_loop_pair_merge_loop_fwd_def]  Definition
+      
+      ⊢ ∀ls0 ls1 i.
+          list_nth_shared_mut_loop_pair_merge_loop_fwd ls0 ls1 i =
+          case ls0 of
+            ListCons x0 tl0 =>
+              (case ls1 of
+                 ListCons x1 tl1 =>
+                   if i = int_to_u32 0 then Return (x0,x1)
+                   else
+                     do
+                       i0 <- u32_sub i (int_to_u32 1);
+                       list_nth_shared_mut_loop_pair_merge_loop_fwd tl0 tl1
+                         i0
+                     od
+               | ListNil => Fail Failure)
+          | ListNil => Fail Failure
+   
+   [sum_fwd_def]  Definition
+      
+      ⊢ ∀max. sum_fwd max = sum_loop_fwd max (int_to_u32 0) (int_to_u32 0)
+   
+   [sum_loop_fwd_def]  Definition
+      
+      ⊢ ∀max i s.
+          sum_loop_fwd max i s =
+          if u32_lt i max then
+            do
+              s0 <- u32_add s i;
+              i0 <- u32_add i (int_to_u32 1);
+              sum_loop_fwd max i0 s0
+            od
+          else u32_mul s (int_to_u32 2)
+   
+   [sum_with_mut_borrows_fwd_def]  Definition
+      
+      ⊢ ∀max.
+          sum_with_mut_borrows_fwd max =
+          sum_with_mut_borrows_loop_fwd max (int_to_u32 0) (int_to_u32 0)
+   
+   [sum_with_mut_borrows_loop_fwd_def]  Definition
+      
+      ⊢ ∀max mi ms.
+          sum_with_mut_borrows_loop_fwd max mi ms =
+          if u32_lt mi max then
+            do
+              ms0 <- u32_add ms mi;
+              mi0 <- u32_add mi (int_to_u32 1);
+              sum_with_mut_borrows_loop_fwd max mi0 ms0
+            od
+          else u32_mul ms (int_to_u32 2)
+   
+   [sum_with_shared_borrows_fwd_def]  Definition
+      
+      ⊢ ∀max.
+          sum_with_shared_borrows_fwd max =
+          sum_with_shared_borrows_loop_fwd max (int_to_u32 0)
+            (int_to_u32 0)
+   
+   [sum_with_shared_borrows_loop_fwd_def]  Definition
+      
+      ⊢ ∀max i s.
+          sum_with_shared_borrows_loop_fwd max i s =
+          if u32_lt i max then
+            do
+              i0 <- u32_add i (int_to_u32 1);
+              s0 <- u32_add s i0;
+              sum_with_shared_borrows_loop_fwd max i0 s0
+            od
+          else u32_mul s (int_to_u32 2)
+   
+   
+*)
+end
diff --git a/tests/hol4/loops/loops_TypesScript.sml b/tests/hol4/loops/loops_TypesScript.sml
new file mode 100644
index 00000000..e3e5b8d1
--- /dev/null
+++ b/tests/hol4/loops/loops_TypesScript.sml
@@ -0,0 +1,13 @@
+(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
+(** [loops]: type definitions *)
+open primitivesLib divDefLib
+
+val _ = new_theory "loops_Types"
+
+
+Datatype:
+  (** [loops::List] *)
+  list_t = | ListCons 't list_t | ListNil
+End
+
+val _ = export_theory ()
diff --git a/tests/hol4/loops/loops_TypesTheory.sig b/tests/hol4/loops/loops_TypesTheory.sig
new file mode 100644
index 00000000..c3e638d8
--- /dev/null
+++ b/tests/hol4/loops/loops_TypesTheory.sig
@@ -0,0 +1,94 @@
+signature loops_TypesTheory =
+sig
+  type thm = Thm.thm
+  
+  (*  Definitions  *)
+    val list_t_TY_DEF : thm
+    val list_t_case_def : thm
+    val list_t_size_def : thm
+  
+  (*  Theorems  *)
+    val datatype_list_t : thm
+    val list_t_11 : thm
+    val list_t_Axiom : thm
+    val list_t_case_cong : thm
+    val list_t_case_eq : thm
+    val list_t_distinct : thm
+    val list_t_induction : thm
+    val list_t_nchotomy : thm
+  
+  val loops_Types_grammars : type_grammar.grammar * term_grammar.grammar
+(*
+   [divDef] Parent theory of "loops_Types"
+   
+   [list_t_TY_DEF]  Definition
+      
+      ⊢ ∃rep.
+          TYPE_DEFINITION
+            (λa0'.
+                 ∀ $var$('list_t').
+                   (∀a0'.
+                      (∃a0 a1.
+                         a0' =
+                         (λa0 a1.
+                              ind_type$CONSTR 0 a0
+                                (ind_type$FCONS a1 (λn. ind_type$BOTTOM)))
+                           a0 a1 ∧ $var$('list_t') a1) ∨
+                      a0' =
+                      ind_type$CONSTR (SUC 0) ARB (λn. ind_type$BOTTOM) ⇒
+                      $var$('list_t') a0') ⇒
+                   $var$('list_t') a0') rep
+   
+   [list_t_case_def]  Definition
+      
+      ⊢ (∀a0 a1 f v. list_t_CASE (ListCons a0 a1) f v = f a0 a1) ∧
+        ∀f v. list_t_CASE ListNil f v = v
+   
+   [list_t_size_def]  Definition
+      
+      ⊢ (∀f a0 a1.
+           list_t_size f (ListCons a0 a1) = 1 + (f a0 + list_t_size f a1)) ∧
+        ∀f. list_t_size f ListNil = 0
+   
+   [datatype_list_t]  Theorem
+      
+      ⊢ DATATYPE (list_t ListCons ListNil)
+   
+   [list_t_11]  Theorem
+      
+      ⊢ ∀a0 a1 a0' a1'.
+          ListCons a0 a1 = ListCons a0' a1' ⇔ a0 = a0' ∧ a1 = a1'
+   
+   [list_t_Axiom]  Theorem
+      
+      ⊢ ∀f0 f1. ∃fn.
+          (∀a0 a1. fn (ListCons a0 a1) = f0 a0 a1 (fn a1)) ∧
+          fn ListNil = f1
+   
+   [list_t_case_cong]  Theorem
+      
+      ⊢ ∀M M' f v.
+          M = M' ∧ (∀a0 a1. M' = ListCons a0 a1 ⇒ f a0 a1 = f' a0 a1) ∧
+          (M' = ListNil ⇒ v = v') ⇒
+          list_t_CASE M f v = list_t_CASE M' f' v'
+   
+   [list_t_case_eq]  Theorem
+      
+      ⊢ list_t_CASE x f v = v' ⇔
+        (∃t l. x = ListCons t l ∧ f t l = v') ∨ x = ListNil ∧ v = v'
+   
+   [list_t_distinct]  Theorem
+      
+      ⊢ ∀a1 a0. ListCons a0 a1 ≠ ListNil
+   
+   [list_t_induction]  Theorem
+      
+      ⊢ ∀P. (∀l. P l ⇒ ∀t. P (ListCons t l)) ∧ P ListNil ⇒ ∀l. P l
+   
+   [list_t_nchotomy]  Theorem
+      
+      ⊢ ∀ll. (∃t l. ll = ListCons t l) ∨ ll = ListNil
+   
+   
+*)
+end
diff --git a/tests/hol4/misc-constants/Holmakefile b/tests/hol4/misc-constants/Holmakefile
deleted file mode 100644
index 3c4b8973..00000000
--- a/tests/hol4/misc-constants/Holmakefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# This file was automatically generated - modify ../Holmakefile.template instead
-INCLUDES =  ../../../backends/hol4
-
-all: $(DEFAULT_TARGETS)
-.PHONY: all
diff --git a/tests/hol4/misc-constants/constantsScript.sml b/tests/hol4/misc-constants/constantsScript.sml
deleted file mode 100644
index 40a319c6..00000000
--- a/tests/hol4/misc-constants/constantsScript.sml
+++ /dev/null
@@ -1,217 +0,0 @@
-(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
-(** [constants] *)
-open primitivesLib divDefLib
-
-val _ = new_theory "constants"
-
-
-(** [constants::X0] *)
-Definition x0_body_def:
-  x0_body : u32 result = Return (int_to_u32 0)
-End
-Definition x0_c_def:
-  x0_c : u32 = get_return_value x0_body
-End
-
-(** [constants::X1] *)
-Definition x1_body_def:
-  x1_body : u32 result = Return core_u32_max
-End
-Definition x1_c_def:
-  x1_c : u32 = get_return_value x1_body
-End
-
-(** [constants::X2] *)
-Definition x2_body_def:
-  x2_body : u32 result = Return (int_to_u32 3)
-End
-Definition x2_c_def:
-  x2_c : u32 = get_return_value x2_body
-End
-
-val incr_fwd_def = Define ‘
-  (** [constants::incr]: forward function *)
-  incr_fwd (n : u32) : u32 result =
-    u32_add n (int_to_u32 1)
-’
-
-(** [constants::X3] *)
-Definition x3_body_def:
-  x3_body : u32 result = incr_fwd (int_to_u32 32)
-End
-Definition x3_c_def:
-  x3_c : u32 = get_return_value x3_body
-End
-
-val mk_pair0_fwd_def = Define ‘
-  (** [constants::mk_pair0]: forward function *)
-  mk_pair0_fwd (x : u32) (y : u32) : (u32 # u32) result =
-    Return (x, y)
-’
-
-Datatype:
-  (** [constants::Pair] *)
-  pair_t = <| pair_x : 't1; pair_y : 't2; |>
-End
-
-val mk_pair1_fwd_def = Define ‘
-  (** [constants::mk_pair1]: forward function *)
-  mk_pair1_fwd (x : u32) (y : u32) : (u32, u32) pair_t result =
-    Return (<| pair_x := x; pair_y := y |>)
-’
-
-(** [constants::P0] *)
-Definition p0_body_def:
-  p0_body : (u32 # u32) result = mk_pair0_fwd (int_to_u32 0) (int_to_u32 1)
-End
-Definition p0_c_def:
-  p0_c : (u32 # u32) = get_return_value p0_body
-End
-
-(** [constants::P1] *)
-Definition p1_body_def:
-  p1_body : (u32, u32) pair_t result =
-    mk_pair1_fwd (int_to_u32 0) (int_to_u32 1)
-End
-Definition p1_c_def:
-  p1_c : (u32, u32) pair_t = get_return_value p1_body
-End
-
-(** [constants::P2] *)
-Definition p2_body_def:
-  p2_body : (u32 # u32) result = Return (int_to_u32 0, int_to_u32 1)
-End
-Definition p2_c_def:
-  p2_c : (u32 # u32) = get_return_value p2_body
-End
-
-(** [constants::P3] *)
-Definition p3_body_def:
-  p3_body : (u32, u32) pair_t result =
-    Return (<| pair_x := (int_to_u32 0); pair_y := (int_to_u32 1) |>)
-End
-Definition p3_c_def:
-  p3_c : (u32, u32) pair_t = get_return_value p3_body
-End
-
-Datatype:
-  (** [constants::Wrap] *)
-  wrap_t = <| wrap_val : 't; |>
-End
-
-val wrap_new_fwd_def = Define ‘
-  (** [constants::Wrap::{0}::new]: forward function *)
-  wrap_new_fwd (val : 't) : 't wrap_t result =
-    Return (<| wrap_val := val |>)
-’
-
-(** [constants::Y] *)
-Definition y_body_def:
-  y_body : i32 wrap_t result = wrap_new_fwd (int_to_i32 2)
-End
-Definition y_c_def:
-  y_c : i32 wrap_t = get_return_value y_body
-End
-
-val unwrap_y_fwd_def = Define ‘
-  (** [constants::unwrap_y]: forward function *)
-  unwrap_y_fwd : i32 result =
-    Return y_c.wrap_val
-’
-
-(** [constants::YVAL] *)
-Definition yval_body_def:
-  yval_body : i32 result = unwrap_y_fwd
-End
-Definition yval_c_def:
-  yval_c : i32 = get_return_value yval_body
-End
-
-(** [constants::get_z1::Z1] *)
-Definition get_z1_z1_body_def:
-  get_z1_z1_body : i32 result = Return (int_to_i32 3)
-End
-Definition get_z1_z1_c_def:
-  get_z1_z1_c : i32 = get_return_value get_z1_z1_body
-End
-
-val get_z1_fwd_def = Define ‘
-  (** [constants::get_z1]: forward function *)
-  get_z1_fwd : i32 result =
-    Return get_z1_z1_c
-’
-
-val add_fwd_def = Define ‘
-  (** [constants::add]: forward function *)
-  add_fwd (a : i32) (b : i32) : i32 result =
-    i32_add a b
-’
-
-(** [constants::Q1] *)
-Definition q1_body_def:
-  q1_body : i32 result = Return (int_to_i32 5)
-End
-Definition q1_c_def:
-  q1_c : i32 = get_return_value q1_body
-End
-
-(** [constants::Q2] *)
-Definition q2_body_def:
-  q2_body : i32 result = Return q1_c
-End
-Definition q2_c_def:
-  q2_c : i32 = get_return_value q2_body
-End
-
-(** [constants::Q3] *)
-Definition q3_body_def:
-  q3_body : i32 result = add_fwd q2_c (int_to_i32 3)
-End
-Definition q3_c_def:
-  q3_c : i32 = get_return_value q3_body
-End
-
-val get_z2_fwd_def = Define ‘
-  (** [constants::get_z2]: forward function *)
-  get_z2_fwd : i32 result =
-    do
-    i <- get_z1_fwd;
-    i0 <- add_fwd i q3_c;
-    add_fwd q1_c i0
-    od
-’
-
-(** [constants::S1] *)
-Definition s1_body_def:
-  s1_body : u32 result = Return (int_to_u32 6)
-End
-Definition s1_c_def:
-  s1_c : u32 = get_return_value s1_body
-End
-
-(** [constants::S2] *)
-Definition s2_body_def:
-  s2_body : u32 result = incr_fwd s1_c
-End
-Definition s2_c_def:
-  s2_c : u32 = get_return_value s2_body
-End
-
-(** [constants::S3] *)
-Definition s3_body_def:
-  s3_body : (u32, u32) pair_t result = Return p3_c
-End
-Definition s3_c_def:
-  s3_c : (u32, u32) pair_t = get_return_value s3_body
-End
-
-(** [constants::S4] *)
-Definition s4_body_def:
-  s4_body : (u32, u32) pair_t result =
-    mk_pair1_fwd (int_to_u32 7) (int_to_u32 8)
-End
-Definition s4_c_def:
-  s4_c : (u32, u32) pair_t = get_return_value s4_body
-End
-
-val _ = export_theory ()
diff --git a/tests/hol4/misc-constants/constantsTheory.sig b/tests/hol4/misc-constants/constantsTheory.sig
deleted file mode 100644
index 287ad5f5..00000000
--- a/tests/hol4/misc-constants/constantsTheory.sig
+++ /dev/null
@@ -1,538 +0,0 @@
-signature constantsTheory =
-sig
-  type thm = Thm.thm
-  
-  (*  Definitions  *)
-    val add_fwd_def : thm
-    val get_z1_fwd_def : thm
-    val get_z1_z1_body_def : thm
-    val get_z1_z1_c_def : thm
-    val get_z2_fwd_def : thm
-    val incr_fwd_def : thm
-    val mk_pair0_fwd_def : thm
-    val mk_pair1_fwd_def : thm
-    val p0_body_def : thm
-    val p0_c_def : thm
-    val p1_body_def : thm
-    val p1_c_def : thm
-    val p2_body_def : thm
-    val p2_c_def : thm
-    val p3_body_def : thm
-    val p3_c_def : thm
-    val pair_t_TY_DEF : thm
-    val pair_t_case_def : thm
-    val pair_t_pair_x : thm
-    val pair_t_pair_x_fupd : thm
-    val pair_t_pair_y : thm
-    val pair_t_pair_y_fupd : thm
-    val pair_t_size_def : thm
-    val q1_body_def : thm
-    val q1_c_def : thm
-    val q2_body_def : thm
-    val q2_c_def : thm
-    val q3_body_def : thm
-    val q3_c_def : thm
-    val s1_body_def : thm
-    val s1_c_def : thm
-    val s2_body_def : thm
-    val s2_c_def : thm
-    val s3_body_def : thm
-    val s3_c_def : thm
-    val s4_body_def : thm
-    val s4_c_def : thm
-    val unwrap_y_fwd_def : thm
-    val wrap_new_fwd_def : thm
-    val wrap_t_TY_DEF : thm
-    val wrap_t_case_def : thm
-    val wrap_t_size_def : thm
-    val wrap_t_wrap_val : thm
-    val wrap_t_wrap_val_fupd : thm
-    val x0_body_def : thm
-    val x0_c_def : thm
-    val x1_body_def : thm
-    val x1_c_def : thm
-    val x2_body_def : thm
-    val x2_c_def : thm
-    val x3_body_def : thm
-    val x3_c_def : thm
-    val y_body_def : thm
-    val y_c_def : thm
-    val yval_body_def : thm
-    val yval_c_def : thm
-  
-  (*  Theorems  *)
-    val EXISTS_pair_t : thm
-    val EXISTS_wrap_t : thm
-    val FORALL_pair_t : thm
-    val FORALL_wrap_t : thm
-    val datatype_pair_t : thm
-    val datatype_wrap_t : thm
-    val pair_t_11 : thm
-    val pair_t_Axiom : thm
-    val pair_t_accessors : thm
-    val pair_t_accfupds : thm
-    val pair_t_case_cong : thm
-    val pair_t_case_eq : thm
-    val pair_t_component_equality : thm
-    val pair_t_fn_updates : thm
-    val pair_t_fupdcanon : thm
-    val pair_t_fupdcanon_comp : thm
-    val pair_t_fupdfupds : thm
-    val pair_t_fupdfupds_comp : thm
-    val pair_t_induction : thm
-    val pair_t_literal_11 : thm
-    val pair_t_literal_nchotomy : thm
-    val pair_t_nchotomy : thm
-    val pair_t_updates_eq_literal : thm
-    val wrap_t_11 : thm
-    val wrap_t_Axiom : thm
-    val wrap_t_accessors : thm
-    val wrap_t_accfupds : thm
-    val wrap_t_case_cong : thm
-    val wrap_t_case_eq : thm
-    val wrap_t_component_equality : thm
-    val wrap_t_fn_updates : thm
-    val wrap_t_fupdfupds : thm
-    val wrap_t_fupdfupds_comp : thm
-    val wrap_t_induction : thm
-    val wrap_t_literal_11 : thm
-    val wrap_t_literal_nchotomy : thm
-    val wrap_t_nchotomy : thm
-    val wrap_t_updates_eq_literal : thm
-  
-  val constants_grammars : type_grammar.grammar * term_grammar.grammar
-(*
-   [divDef] Parent theory of "constants"
-   
-   [add_fwd_def]  Definition
-      
-      ⊢ ∀a b. add_fwd a b = i32_add a b
-   
-   [get_z1_fwd_def]  Definition
-      
-      ⊢ get_z1_fwd = Return get_z1_z1_c
-   
-   [get_z1_z1_body_def]  Definition
-      
-      ⊢ get_z1_z1_body = Return (int_to_i32 3)
-   
-   [get_z1_z1_c_def]  Definition
-      
-      ⊢ get_z1_z1_c = get_return_value get_z1_z1_body
-   
-   [get_z2_fwd_def]  Definition
-      
-      ⊢ get_z2_fwd =
-        do i <- get_z1_fwd; i0 <- add_fwd i q3_c; add_fwd q1_c i0 od
-   
-   [incr_fwd_def]  Definition
-      
-      ⊢ ∀n. incr_fwd n = u32_add n (int_to_u32 1)
-   
-   [mk_pair0_fwd_def]  Definition
-      
-      ⊢ ∀x y. mk_pair0_fwd x y = Return (x,y)
-   
-   [mk_pair1_fwd_def]  Definition
-      
-      ⊢ ∀x y. mk_pair1_fwd x y = Return <|pair_x := x; pair_y := y|>
-   
-   [p0_body_def]  Definition
-      
-      ⊢ p0_body = mk_pair0_fwd (int_to_u32 0) (int_to_u32 1)
-   
-   [p0_c_def]  Definition
-      
-      ⊢ p0_c = get_return_value p0_body
-   
-   [p1_body_def]  Definition
-      
-      ⊢ p1_body = mk_pair1_fwd (int_to_u32 0) (int_to_u32 1)
-   
-   [p1_c_def]  Definition
-      
-      ⊢ p1_c = get_return_value p1_body
-   
-   [p2_body_def]  Definition
-      
-      ⊢ p2_body = Return (int_to_u32 0,int_to_u32 1)
-   
-   [p2_c_def]  Definition
-      
-      ⊢ p2_c = get_return_value p2_body
-   
-   [p3_body_def]  Definition
-      
-      ⊢ p3_body = Return <|pair_x := int_to_u32 0; pair_y := int_to_u32 1|>
-   
-   [p3_c_def]  Definition
-      
-      ⊢ p3_c = get_return_value p3_body
-   
-   [pair_t_TY_DEF]  Definition
-      
-      ⊢ ∃rep.
-          TYPE_DEFINITION
-            (λa0'.
-                 ∀ $var$('pair_t').
-                   (∀a0'.
-                      (∃a0 a1.
-                         a0' =
-                         (λa0 a1.
-                              ind_type$CONSTR 0 (a0,a1)
-                                (λn. ind_type$BOTTOM)) a0 a1) ⇒
-                      $var$('pair_t') a0') ⇒
-                   $var$('pair_t') a0') rep
-   
-   [pair_t_case_def]  Definition
-      
-      ⊢ ∀a0 a1 f. pair_t_CASE (pair_t a0 a1) f = f a0 a1
-   
-   [pair_t_pair_x]  Definition
-      
-      ⊢ ∀t t0. (pair_t t t0).pair_x = t
-   
-   [pair_t_pair_x_fupd]  Definition
-      
-      ⊢ ∀f t t0. pair_t t t0 with pair_x updated_by f = pair_t (f t) t0
-   
-   [pair_t_pair_y]  Definition
-      
-      ⊢ ∀t t0. (pair_t t t0).pair_y = t0
-   
-   [pair_t_pair_y_fupd]  Definition
-      
-      ⊢ ∀f t t0. pair_t t t0 with pair_y updated_by f = pair_t t (f t0)
-   
-   [pair_t_size_def]  Definition
-      
-      ⊢ ∀f f1 a0 a1. pair_t_size f f1 (pair_t a0 a1) = 1 + (f a0 + f1 a1)
-   
-   [q1_body_def]  Definition
-      
-      ⊢ q1_body = Return (int_to_i32 5)
-   
-   [q1_c_def]  Definition
-      
-      ⊢ q1_c = get_return_value q1_body
-   
-   [q2_body_def]  Definition
-      
-      ⊢ q2_body = Return q1_c
-   
-   [q2_c_def]  Definition
-      
-      ⊢ q2_c = get_return_value q2_body
-   
-   [q3_body_def]  Definition
-      
-      ⊢ q3_body = add_fwd q2_c (int_to_i32 3)
-   
-   [q3_c_def]  Definition
-      
-      ⊢ q3_c = get_return_value q3_body
-   
-   [s1_body_def]  Definition
-      
-      ⊢ s1_body = Return (int_to_u32 6)
-   
-   [s1_c_def]  Definition
-      
-      ⊢ s1_c = get_return_value s1_body
-   
-   [s2_body_def]  Definition
-      
-      ⊢ s2_body = incr_fwd s1_c
-   
-   [s2_c_def]  Definition
-      
-      ⊢ s2_c = get_return_value s2_body
-   
-   [s3_body_def]  Definition
-      
-      ⊢ s3_body = Return p3_c
-   
-   [s3_c_def]  Definition
-      
-      ⊢ s3_c = get_return_value s3_body
-   
-   [s4_body_def]  Definition
-      
-      ⊢ s4_body = mk_pair1_fwd (int_to_u32 7) (int_to_u32 8)
-   
-   [s4_c_def]  Definition
-      
-      ⊢ s4_c = get_return_value s4_body
-   
-   [unwrap_y_fwd_def]  Definition
-      
-      ⊢ unwrap_y_fwd = Return y_c.wrap_val
-   
-   [wrap_new_fwd_def]  Definition
-      
-      ⊢ ∀val. wrap_new_fwd val = Return <|wrap_val := val|>
-   
-   [wrap_t_TY_DEF]  Definition
-      
-      ⊢ ∃rep.
-          TYPE_DEFINITION
-            (λa0.
-                 ∀ $var$('wrap_t').
-                   (∀a0.
-                      (∃a. a0 =
-                           (λa. ind_type$CONSTR 0 a (λn. ind_type$BOTTOM))
-                             a) ⇒
-                      $var$('wrap_t') a0) ⇒
-                   $var$('wrap_t') a0) rep
-   
-   [wrap_t_case_def]  Definition
-      
-      ⊢ ∀a f. wrap_t_CASE (wrap_t a) f = f a
-   
-   [wrap_t_size_def]  Definition
-      
-      ⊢ ∀f a. wrap_t_size f (wrap_t a) = 1 + f a
-   
-   [wrap_t_wrap_val]  Definition
-      
-      ⊢ ∀t. (wrap_t t).wrap_val = t
-   
-   [wrap_t_wrap_val_fupd]  Definition
-      
-      ⊢ ∀f t. wrap_t t with wrap_val updated_by f = wrap_t (f t)
-   
-   [x0_body_def]  Definition
-      
-      ⊢ x0_body = Return (int_to_u32 0)
-   
-   [x0_c_def]  Definition
-      
-      ⊢ x0_c = get_return_value x0_body
-   
-   [x1_body_def]  Definition
-      
-      ⊢ x1_body = Return core_u32_max
-   
-   [x1_c_def]  Definition
-      
-      ⊢ x1_c = get_return_value x1_body
-   
-   [x2_body_def]  Definition
-      
-      ⊢ x2_body = Return (int_to_u32 3)
-   
-   [x2_c_def]  Definition
-      
-      ⊢ x2_c = get_return_value x2_body
-   
-   [x3_body_def]  Definition
-      
-      ⊢ x3_body = incr_fwd (int_to_u32 32)
-   
-   [x3_c_def]  Definition
-      
-      ⊢ x3_c = get_return_value x3_body
-   
-   [y_body_def]  Definition
-      
-      ⊢ y_body = wrap_new_fwd (int_to_i32 2)
-   
-   [y_c_def]  Definition
-      
-      ⊢ y_c = get_return_value y_body
-   
-   [yval_body_def]  Definition
-      
-      ⊢ yval_body = unwrap_y_fwd
-   
-   [yval_c_def]  Definition
-      
-      ⊢ yval_c = get_return_value yval_body
-   
-   [EXISTS_pair_t]  Theorem
-      
-      ⊢ ∀P. (∃p. P p) ⇔ ∃t0 t. P <|pair_x := t0; pair_y := t|>
-   
-   [EXISTS_wrap_t]  Theorem
-      
-      ⊢ ∀P. (∃w. P w) ⇔ ∃u. P <|wrap_val := u|>
-   
-   [FORALL_pair_t]  Theorem
-      
-      ⊢ ∀P. (∀p. P p) ⇔ ∀t0 t. P <|pair_x := t0; pair_y := t|>
-   
-   [FORALL_wrap_t]  Theorem
-      
-      ⊢ ∀P. (∀w. P w) ⇔ ∀u. P <|wrap_val := u|>
-   
-   [datatype_pair_t]  Theorem
-      
-      ⊢ DATATYPE (record pair_t pair_x pair_y)
-   
-   [datatype_wrap_t]  Theorem
-      
-      ⊢ DATATYPE (record wrap_t wrap_val)
-   
-   [pair_t_11]  Theorem
-      
-      ⊢ ∀a0 a1 a0' a1'. pair_t a0 a1 = pair_t a0' a1' ⇔ a0 = a0' ∧ a1 = a1'
-   
-   [pair_t_Axiom]  Theorem
-      
-      ⊢ ∀f. ∃fn. ∀a0 a1. fn (pair_t a0 a1) = f a0 a1
-   
-   [pair_t_accessors]  Theorem
-      
-      ⊢ (∀t t0. (pair_t t t0).pair_x = t) ∧
-        ∀t t0. (pair_t t t0).pair_y = t0
-   
-   [pair_t_accfupds]  Theorem
-      
-      ⊢ (∀p f. (p with pair_y updated_by f).pair_x = p.pair_x) ∧
-        (∀p f. (p with pair_x updated_by f).pair_y = p.pair_y) ∧
-        (∀p f. (p with pair_x updated_by f).pair_x = f p.pair_x) ∧
-        ∀p f. (p with pair_y updated_by f).pair_y = f p.pair_y
-   
-   [pair_t_case_cong]  Theorem
-      
-      ⊢ ∀M M' f.
-          M = M' ∧ (∀a0 a1. M' = pair_t a0 a1 ⇒ f a0 a1 = f' a0 a1) ⇒
-          pair_t_CASE M f = pair_t_CASE M' f'
-   
-   [pair_t_case_eq]  Theorem
-      
-      ⊢ pair_t_CASE x f = v ⇔ ∃t t0. x = pair_t t t0 ∧ f t t0 = v
-   
-   [pair_t_component_equality]  Theorem
-      
-      ⊢ ∀p1 p2. p1 = p2 ⇔ p1.pair_x = p2.pair_x ∧ p1.pair_y = p2.pair_y
-   
-   [pair_t_fn_updates]  Theorem
-      
-      ⊢ (∀f t t0. pair_t t t0 with pair_x updated_by f = pair_t (f t) t0) ∧
-        ∀f t t0. pair_t t t0 with pair_y updated_by f = pair_t t (f t0)
-   
-   [pair_t_fupdcanon]  Theorem
-      
-      ⊢ ∀p g f.
-          p with <|pair_y updated_by f; pair_x updated_by g|> =
-          p with <|pair_x updated_by g; pair_y updated_by f|>
-   
-   [pair_t_fupdcanon_comp]  Theorem
-      
-      ⊢ (∀g f.
-           pair_y_fupd f ∘ pair_x_fupd g = pair_x_fupd g ∘ pair_y_fupd f) ∧
-        ∀h g f.
-          pair_y_fupd f ∘ pair_x_fupd g ∘ h =
-          pair_x_fupd g ∘ pair_y_fupd f ∘ h
-   
-   [pair_t_fupdfupds]  Theorem
-      
-      ⊢ (∀p g f.
-           p with <|pair_x updated_by f; pair_x updated_by g|> =
-           p with pair_x updated_by f ∘ g) ∧
-        ∀p g f.
-          p with <|pair_y updated_by f; pair_y updated_by g|> =
-          p with pair_y updated_by f ∘ g
-   
-   [pair_t_fupdfupds_comp]  Theorem
-      
-      ⊢ ((∀g f. pair_x_fupd f ∘ pair_x_fupd g = pair_x_fupd (f ∘ g)) ∧
-         ∀h g f.
-           pair_x_fupd f ∘ pair_x_fupd g ∘ h = pair_x_fupd (f ∘ g) ∘ h) ∧
-        (∀g f. pair_y_fupd f ∘ pair_y_fupd g = pair_y_fupd (f ∘ g)) ∧
-        ∀h g f. pair_y_fupd f ∘ pair_y_fupd g ∘ h = pair_y_fupd (f ∘ g) ∘ h
-   
-   [pair_t_induction]  Theorem
-      
-      ⊢ ∀P. (∀t t0. P (pair_t t t0)) ⇒ ∀p. P p
-   
-   [pair_t_literal_11]  Theorem
-      
-      ⊢ ∀t01 t1 t02 t2.
-          <|pair_x := t01; pair_y := t1|> = <|pair_x := t02; pair_y := t2|> ⇔
-          t01 = t02 ∧ t1 = t2
-   
-   [pair_t_literal_nchotomy]  Theorem
-      
-      ⊢ ∀p. ∃t0 t. p = <|pair_x := t0; pair_y := t|>
-   
-   [pair_t_nchotomy]  Theorem
-      
-      ⊢ ∀pp. ∃t t0. pp = pair_t t t0
-   
-   [pair_t_updates_eq_literal]  Theorem
-      
-      ⊢ ∀p t0 t.
-          p with <|pair_x := t0; pair_y := t|> =
-          <|pair_x := t0; pair_y := t|>
-   
-   [wrap_t_11]  Theorem
-      
-      ⊢ ∀a a'. wrap_t a = wrap_t a' ⇔ a = a'
-   
-   [wrap_t_Axiom]  Theorem
-      
-      ⊢ ∀f. ∃fn. ∀a. fn (wrap_t a) = f a
-   
-   [wrap_t_accessors]  Theorem
-      
-      ⊢ ∀t. (wrap_t t).wrap_val = t
-   
-   [wrap_t_accfupds]  Theorem
-      
-      ⊢ ∀w f. (w with wrap_val updated_by f).wrap_val = f w.wrap_val
-   
-   [wrap_t_case_cong]  Theorem
-      
-      ⊢ ∀M M' f.
-          M = M' ∧ (∀a. M' = wrap_t a ⇒ f a = f' a) ⇒
-          wrap_t_CASE M f = wrap_t_CASE M' f'
-   
-   [wrap_t_case_eq]  Theorem
-      
-      ⊢ wrap_t_CASE x f = v ⇔ ∃t. x = wrap_t t ∧ f t = v
-   
-   [wrap_t_component_equality]  Theorem
-      
-      ⊢ ∀w1 w2. w1 = w2 ⇔ w1.wrap_val = w2.wrap_val
-   
-   [wrap_t_fn_updates]  Theorem
-      
-      ⊢ ∀f t. wrap_t t with wrap_val updated_by f = wrap_t (f t)
-   
-   [wrap_t_fupdfupds]  Theorem
-      
-      ⊢ ∀w g f.
-          w with <|wrap_val updated_by f; wrap_val updated_by g|> =
-          w with wrap_val updated_by f ∘ g
-   
-   [wrap_t_fupdfupds_comp]  Theorem
-      
-      ⊢ (∀g f. wrap_val_fupd f ∘ wrap_val_fupd g = wrap_val_fupd (f ∘ g)) ∧
-        ∀h g f.
-          wrap_val_fupd f ∘ wrap_val_fupd g ∘ h = wrap_val_fupd (f ∘ g) ∘ h
-   
-   [wrap_t_induction]  Theorem
-      
-      ⊢ ∀P. (∀t. P (wrap_t t)) ⇒ ∀w. P w
-   
-   [wrap_t_literal_11]  Theorem
-      
-      ⊢ ∀u1 u2. <|wrap_val := u1|> = <|wrap_val := u2|> ⇔ u1 = u2
-   
-   [wrap_t_literal_nchotomy]  Theorem
-      
-      ⊢ ∀w. ∃u. w = <|wrap_val := u|>
-   
-   [wrap_t_nchotomy]  Theorem
-      
-      ⊢ ∀ww. ∃t. ww = wrap_t t
-   
-   [wrap_t_updates_eq_literal]  Theorem
-      
-      ⊢ ∀w u. w with wrap_val := u = <|wrap_val := u|>
-   
-   
-*)
-end
diff --git a/tests/hol4/misc-external/Holmakefile b/tests/hol4/misc-external/Holmakefile
deleted file mode 100644
index 3c4b8973..00000000
--- a/tests/hol4/misc-external/Holmakefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# This file was automatically generated - modify ../Holmakefile.template instead
-INCLUDES =  ../../../backends/hol4
-
-all: $(DEFAULT_TARGETS)
-.PHONY: all
diff --git a/tests/hol4/misc-external/external_FunsScript.sml b/tests/hol4/misc-external/external_FunsScript.sml
deleted file mode 100644
index f3692ee2..00000000
--- a/tests/hol4/misc-external/external_FunsScript.sml
+++ /dev/null
@@ -1,108 +0,0 @@
-(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
-(** [external]: function definitions *)
-open primitivesLib divDefLib
-open external_TypesTheory external_OpaqueTheory
-
-val _ = new_theory "external_Funs"
-
-
-val swap_fwd_def = Define ‘
-  (** [external::swap]: forward function *)
-  swap_fwd (x : 't) (y : 't) (st : state) : (state # unit) result =
-    do
-    (st0, _) <- core_mem_swap_fwd x y st;
-    (st1, _) <- core_mem_swap_back0 x y st st0;
-    (st2, _) <- core_mem_swap_back1 x y st st1;
-    Return (st2, ())
-    od
-’
-
-val swap_back_def = Define ‘
-  (** [external::swap]: backward function 0 *)
-  swap_back
-    (x : 't) (y : 't) (st : state) (st0 : state) : (state # ('t # 't)) result =
-    do
-    (st1, _) <- core_mem_swap_fwd x y st;
-    (st2, x0) <- core_mem_swap_back0 x y st st1;
-    (_, y0) <- core_mem_swap_back1 x y st st2;
-    Return (st0, (x0, y0))
-    od
-’
-
-val test_new_non_zero_u32_fwd_def = Define ‘
-  (** [external::test_new_non_zero_u32]: forward function *)
-  test_new_non_zero_u32_fwd
-    (x : u32) (st : state) : (state # core_num_nonzero_non_zero_u32_t) result =
-    do
-    (st0, opt) <- core_num_nonzero_non_zero_u32_new_fwd x st;
-    core_option_option_unwrap_fwd opt st0
-    od
-’
-
-val test_vec_fwd_def = Define ‘
-  (** [external::test_vec]: forward function *)
-  test_vec_fwd : unit result =
-    let v = vec_new in do
-                       _ <- vec_push_back v (int_to_u32 0);
-                       Return ()
-                       od
-’
-
-(** Unit test for [external::test_vec] *)
-val _ = assert_return (“test_vec_fwd”)
-
-val custom_swap_fwd_def = Define ‘
-  (** [external::custom_swap]: forward function *)
-  custom_swap_fwd (x : 't) (y : 't) (st : state) : (state # 't) result =
-    do
-    (st0, _) <- core_mem_swap_fwd x y st;
-    (st1, x0) <- core_mem_swap_back0 x y st st0;
-    (st2, _) <- core_mem_swap_back1 x y st st1;
-    Return (st2, x0)
-    od
-’
-
-val custom_swap_back_def = Define ‘
-  (** [external::custom_swap]: backward function 0 *)
-  custom_swap_back
-    (x : 't) (y : 't) (st : state) (ret : 't) (st0 : state) :
-    (state # ('t # 't)) result
-    =
-    do
-    (st1, _) <- core_mem_swap_fwd x y st;
-    (st2, _) <- core_mem_swap_back0 x y st st1;
-    (_, y0) <- core_mem_swap_back1 x y st st2;
-    Return (st0, (ret, y0))
-    od
-’
-
-val test_custom_swap_fwd_def = Define ‘
-  (** [external::test_custom_swap]: forward function *)
-  test_custom_swap_fwd
-    (x : u32) (y : u32) (st : state) : (state # unit) result =
-    do
-    (st0, _) <- custom_swap_fwd x y st;
-    Return (st0, ())
-    od
-’
-
-val test_custom_swap_back_def = Define ‘
-  (** [external::test_custom_swap]: backward function 0 *)
-  test_custom_swap_back
-    (x : u32) (y : u32) (st : state) (st0 : state) :
-    (state # (u32 # u32)) result
-    =
-    custom_swap_back x y st (int_to_u32 1) st0
-’
-
-val test_swap_non_zero_fwd_def = Define ‘
-  (** [external::test_swap_non_zero]: forward function *)
-  test_swap_non_zero_fwd (x : u32) (st : state) : (state # u32) result =
-    do
-    (st0, _) <- swap_fwd x (int_to_u32 0) st;
-    (st1, (x0, _)) <- swap_back x (int_to_u32 0) st st0;
-    if x0 = int_to_u32 0 then Fail Failure else Return (st1, x0)
-    od
-’
-
-val _ = export_theory ()
diff --git a/tests/hol4/misc-external/external_FunsTheory.sig b/tests/hol4/misc-external/external_FunsTheory.sig
deleted file mode 100644
index 490f9d06..00000000
--- a/tests/hol4/misc-external/external_FunsTheory.sig
+++ /dev/null
@@ -1,105 +0,0 @@
-signature external_FunsTheory =
-sig
-  type thm = Thm.thm
-  
-  (*  Definitions  *)
-    val custom_swap_back_def : thm
-    val custom_swap_fwd_def : thm
-    val swap_back_def : thm
-    val swap_fwd_def : thm
-    val test_custom_swap_back_def : thm
-    val test_custom_swap_fwd_def : thm
-    val test_new_non_zero_u32_fwd_def : thm
-    val test_swap_non_zero_fwd_def : thm
-    val test_vec_fwd_def : thm
-  
-  val external_Funs_grammars : type_grammar.grammar * term_grammar.grammar
-(*
-   [external_Opaque] Parent theory of "external_Funs"
-   
-   [custom_swap_back_def]  Definition
-      
-      ⊢ ∀x y st ret st0.
-          custom_swap_back x y st ret st0 =
-          do
-            (st1,_) <- core_mem_swap_fwd x y st;
-            (st2,_) <- core_mem_swap_back0 x y st st1;
-            (_,y0) <- core_mem_swap_back1 x y st st2;
-            Return (st0,ret,y0)
-          od
-   
-   [custom_swap_fwd_def]  Definition
-      
-      ⊢ ∀x y st.
-          custom_swap_fwd x y st =
-          do
-            (st0,_) <- core_mem_swap_fwd x y st;
-            (st1,x0) <- core_mem_swap_back0 x y st st0;
-            (st2,_) <- core_mem_swap_back1 x y st st1;
-            Return (st2,x0)
-          od
-   
-   [swap_back_def]  Definition
-      
-      ⊢ ∀x y st st0.
-          swap_back x y st st0 =
-          do
-            (st1,_) <- core_mem_swap_fwd x y st;
-            (st2,x0) <- core_mem_swap_back0 x y st st1;
-            (_,y0) <- core_mem_swap_back1 x y st st2;
-            Return (st0,x0,y0)
-          od
-   
-   [swap_fwd_def]  Definition
-      
-      ⊢ ∀x y st.
-          swap_fwd x y st =
-          do
-            (st0,_) <- core_mem_swap_fwd x y st;
-            (st1,_) <- core_mem_swap_back0 x y st st0;
-            (st2,_) <- core_mem_swap_back1 x y st st1;
-            Return (st2,())
-          od
-   
-   [test_custom_swap_back_def]  Definition
-      
-      ⊢ ∀x y st st0.
-          test_custom_swap_back x y st st0 =
-          custom_swap_back x y st (int_to_u32 1) st0
-   
-   [test_custom_swap_fwd_def]  Definition
-      
-      ⊢ ∀x y st.
-          test_custom_swap_fwd x y st =
-          do (st0,_) <- custom_swap_fwd x y st; Return (st0,()) od
-   
-   [test_new_non_zero_u32_fwd_def]  Definition
-      
-      ⊢ ∀x st.
-          test_new_non_zero_u32_fwd x st =
-          do
-            (st0,opt) <- core_num_nonzero_non_zero_u32_new_fwd x st;
-            core_option_option_unwrap_fwd opt st0
-          od
-   
-   [test_swap_non_zero_fwd_def]  Definition
-      
-      ⊢ ∀x st.
-          test_swap_non_zero_fwd x st =
-          do
-            (st0,_) <- swap_fwd x (int_to_u32 0) st;
-            (st1,x0,_) <- swap_back x (int_to_u32 0) st st0;
-            if x0 = int_to_u32 0 then Fail Failure else Return (st1,x0)
-          od
-   
-   [test_vec_fwd_def]  Definition
-      
-      ⊢ test_vec_fwd =
-        (let
-           v = vec_new
-         in
-           monad_ignore_bind (vec_push_back v (int_to_u32 0)) (Return ()))
-   
-   
-*)
-end
diff --git a/tests/hol4/misc-external/external_OpaqueScript.sml b/tests/hol4/misc-external/external_OpaqueScript.sml
deleted file mode 100644
index b5a6d91d..00000000
--- a/tests/hol4/misc-external/external_OpaqueScript.sml
+++ /dev/null
@@ -1,25 +0,0 @@
-(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
-(** [external]: external function declarations *)
-open primitivesLib divDefLib
-open external_TypesTheory
-
-val _ = new_theory "external_Opaque"
-
-
-(** [core::mem::swap]: forward function *)val _ = new_constant ("core_mem_swap_fwd",
-  “:'t -> 't -> state -> (state # unit) result”)
-
-(** [core::mem::swap]: backward function 0 *)val _ = new_constant ("core_mem_swap_back0",
-  “:'t -> 't -> state -> state -> (state # 't) result”)
-
-(** [core::mem::swap]: backward function 1 *)val _ = new_constant ("core_mem_swap_back1",
-  “:'t -> 't -> state -> state -> (state # 't) result”)
-
-(** [core::num::nonzero::NonZeroU32::{14}::new]: forward function *)val _ = new_constant ("core_num_nonzero_non_zero_u32_new_fwd",
-  “:u32 -> state -> (state # core_num_nonzero_non_zero_u32_t option)
-  result”)
-
-(** [core::option::Option::{0}::unwrap]: forward function *)val _ = new_constant ("core_option_option_unwrap_fwd",
-  “:'t option -> state -> (state # 't) result”)
-
-val _ = export_theory ()
diff --git a/tests/hol4/misc-external/external_OpaqueTheory.sig b/tests/hol4/misc-external/external_OpaqueTheory.sig
deleted file mode 100644
index 7cd7a08c..00000000
--- a/tests/hol4/misc-external/external_OpaqueTheory.sig
+++ /dev/null
@@ -1,11 +0,0 @@
-signature external_OpaqueTheory =
-sig
-  type thm = Thm.thm
-  
-  val external_Opaque_grammars : type_grammar.grammar * term_grammar.grammar
-(*
-   [external_Types] Parent theory of "external_Opaque"
-   
-   
-*)
-end
diff --git a/tests/hol4/misc-external/external_TypesScript.sml b/tests/hol4/misc-external/external_TypesScript.sml
deleted file mode 100644
index d290c3f6..00000000
--- a/tests/hol4/misc-external/external_TypesScript.sml
+++ /dev/null
@@ -1,13 +0,0 @@
-(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
-(** [external]: type definitions *)
-open primitivesLib divDefLib
-
-val _ = new_theory "external_Types"
-
-
-val _ = new_type ("core_num_nonzero_non_zero_u32_t", 0)
-
-(** The state type used in the state-error monad *)
-val _ = new_type ("state", 0)
-
-val _ = export_theory ()
diff --git a/tests/hol4/misc-external/external_TypesTheory.sig b/tests/hol4/misc-external/external_TypesTheory.sig
deleted file mode 100644
index 17e2e8e3..00000000
--- a/tests/hol4/misc-external/external_TypesTheory.sig
+++ /dev/null
@@ -1,11 +0,0 @@
-signature external_TypesTheory =
-sig
-  type thm = Thm.thm
-  
-  val external_Types_grammars : type_grammar.grammar * term_grammar.grammar
-(*
-   [divDef] Parent theory of "external_Types"
-   
-   
-*)
-end
diff --git a/tests/hol4/misc-loops/Holmakefile b/tests/hol4/misc-loops/Holmakefile
deleted file mode 100644
index 3c4b8973..00000000
--- a/tests/hol4/misc-loops/Holmakefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# This file was automatically generated - modify ../Holmakefile.template instead
-INCLUDES =  ../../../backends/hol4
-
-all: $(DEFAULT_TARGETS)
-.PHONY: all
diff --git a/tests/hol4/misc-loops/loops_FunsScript.sml b/tests/hol4/misc-loops/loops_FunsScript.sml
deleted file mode 100644
index 65cf77d4..00000000
--- a/tests/hol4/misc-loops/loops_FunsScript.sml
+++ /dev/null
@@ -1,755 +0,0 @@
-(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
-(** [loops]: function definitions *)
-open primitivesLib divDefLib
-open loops_TypesTheory
-
-val _ = new_theory "loops_Funs"
-
-
-val [sum_loop_fwd_def] = DefineDiv ‘
-  (** [loops::sum]: loop 0: forward function *)
-  sum_loop_fwd (max : u32) (i : u32) (s : u32) : u32 result =
-    if u32_lt i max
-    then (
-      do
-      s0 <- u32_add s i;
-      i0 <- u32_add i (int_to_u32 1);
-      sum_loop_fwd max i0 s0
-      od)
-    else u32_mul s (int_to_u32 2)
-’
-
-val sum_fwd_def = Define ‘
-  (** [loops::sum]: forward function *)
-  sum_fwd (max : u32) : u32 result =
-    sum_loop_fwd max (int_to_u32 0) (int_to_u32 0)
-’
-
-val [sum_with_mut_borrows_loop_fwd_def] = DefineDiv ‘
-  (** [loops::sum_with_mut_borrows]: loop 0: forward function *)
-  sum_with_mut_borrows_loop_fwd
-    (max : u32) (mi : u32) (ms : u32) : u32 result =
-    if u32_lt mi max
-    then (
-      do
-      ms0 <- u32_add ms mi;
-      mi0 <- u32_add mi (int_to_u32 1);
-      sum_with_mut_borrows_loop_fwd max mi0 ms0
-      od)
-    else u32_mul ms (int_to_u32 2)
-’
-
-val sum_with_mut_borrows_fwd_def = Define ‘
-  (** [loops::sum_with_mut_borrows]: forward function *)
-  sum_with_mut_borrows_fwd (max : u32) : u32 result =
-    sum_with_mut_borrows_loop_fwd max (int_to_u32 0) (int_to_u32 0)
-’
-
-val [sum_with_shared_borrows_loop_fwd_def] = DefineDiv ‘
-  (** [loops::sum_with_shared_borrows]: loop 0: forward function *)
-  sum_with_shared_borrows_loop_fwd
-    (max : u32) (i : u32) (s : u32) : u32 result =
-    if u32_lt i max
-    then (
-      do
-      i0 <- u32_add i (int_to_u32 1);
-      s0 <- u32_add s i0;
-      sum_with_shared_borrows_loop_fwd max i0 s0
-      od)
-    else u32_mul s (int_to_u32 2)
-’
-
-val sum_with_shared_borrows_fwd_def = Define ‘
-  (** [loops::sum_with_shared_borrows]: forward function *)
-  sum_with_shared_borrows_fwd (max : u32) : u32 result =
-    sum_with_shared_borrows_loop_fwd max (int_to_u32 0) (int_to_u32 0)
-’
-
-val [clear_loop_fwd_back_def] = DefineDiv ‘
-  (** [loops::clear]: loop 0: merged forward/backward function
-      (there is a single backward function, and the forward function returns ()) *)
-  clear_loop_fwd_back (v : u32 vec) (i : usize) : u32 vec result =
-    let i0 = vec_len v in
-    if usize_lt i i0
-    then (
-      do
-      i1 <- usize_add i (int_to_usize 1);
-      v0 <- vec_index_mut_back v i (int_to_u32 0);
-      clear_loop_fwd_back v0 i1
-      od)
-    else Return v
-’
-
-val clear_fwd_back_def = Define ‘
-  (** [loops::clear]: merged forward/backward function
-      (there is a single backward function, and the forward function returns ()) *)
-  clear_fwd_back (v : u32 vec) : u32 vec result =
-    clear_loop_fwd_back v (int_to_usize 0)
-’
-
-val [list_mem_loop_fwd_def] = DefineDiv ‘
-  (** [loops::list_mem]: loop 0: forward function *)
-  list_mem_loop_fwd (x : u32) (ls : u32 list_t) : bool result =
-    (case ls of
-    | ListCons y tl => if y = x then Return T else list_mem_loop_fwd x tl
-    | ListNil => Return F)
-’
-
-val list_mem_fwd_def = Define ‘
-  (** [loops::list_mem]: forward function *)
-  list_mem_fwd (x : u32) (ls : u32 list_t) : bool result =
-    list_mem_loop_fwd x ls
-’
-
-val [list_nth_mut_loop_loop_fwd_def] = DefineDiv ‘
-  (** [loops::list_nth_mut_loop]: loop 0: forward function *)
-  list_nth_mut_loop_loop_fwd (ls : 't list_t) (i : u32) : 't result =
-    (case ls of
-    | ListCons x tl =>
-      if i = int_to_u32 0
-      then Return x
-      else (
-        do
-        i0 <- u32_sub i (int_to_u32 1);
-        list_nth_mut_loop_loop_fwd tl i0
-        od)
-    | ListNil => Fail Failure)
-’
-
-val list_nth_mut_loop_fwd_def = Define ‘
-  (** [loops::list_nth_mut_loop]: forward function *)
-  list_nth_mut_loop_fwd (ls : 't list_t) (i : u32) : 't result =
-    list_nth_mut_loop_loop_fwd ls i
-’
-
-val [list_nth_mut_loop_loop_back_def] = DefineDiv ‘
-  (** [loops::list_nth_mut_loop]: loop 0: backward function 0 *)
-  list_nth_mut_loop_loop_back
-    (ls : 't list_t) (i : u32) (ret : 't) : 't list_t result =
-    (case ls of
-    | ListCons x tl =>
-      if i = int_to_u32 0
-      then Return (ListCons ret tl)
-      else (
-        do
-        i0 <- u32_sub i (int_to_u32 1);
-        tl0 <- list_nth_mut_loop_loop_back tl i0 ret;
-        Return (ListCons x tl0)
-        od)
-    | ListNil => Fail Failure)
-’
-
-val list_nth_mut_loop_back_def = Define ‘
-  (** [loops::list_nth_mut_loop]: backward function 0 *)
-  list_nth_mut_loop_back
-    (ls : 't list_t) (i : u32) (ret : 't) : 't list_t result =
-    list_nth_mut_loop_loop_back ls i ret
-’
-
-val [list_nth_shared_loop_loop_fwd_def] = DefineDiv ‘
-  (** [loops::list_nth_shared_loop]: loop 0: forward function *)
-  list_nth_shared_loop_loop_fwd (ls : 't list_t) (i : u32) : 't result =
-    (case ls of
-    | ListCons x tl =>
-      if i = int_to_u32 0
-      then Return x
-      else (
-        do
-        i0 <- u32_sub i (int_to_u32 1);
-        list_nth_shared_loop_loop_fwd tl i0
-        od)
-    | ListNil => Fail Failure)
-’
-
-val list_nth_shared_loop_fwd_def = Define ‘
-  (** [loops::list_nth_shared_loop]: forward function *)
-  list_nth_shared_loop_fwd (ls : 't list_t) (i : u32) : 't result =
-    list_nth_shared_loop_loop_fwd ls i
-’
-
-val [get_elem_mut_loop_fwd_def] = DefineDiv ‘
-  (** [loops::get_elem_mut]: loop 0: forward function *)
-  get_elem_mut_loop_fwd (x : usize) (ls : usize list_t) : usize result =
-    (case ls of
-    | ListCons y tl => if y = x then Return y else get_elem_mut_loop_fwd x tl
-    | ListNil => Fail Failure)
-’
-
-val get_elem_mut_fwd_def = Define ‘
-  (** [loops::get_elem_mut]: forward function *)
-  get_elem_mut_fwd (slots : usize list_t vec) (x : usize) : usize result =
-    do
-    l <- vec_index_mut_fwd slots (int_to_usize 0);
-    get_elem_mut_loop_fwd x l
-    od
-’
-
-val [get_elem_mut_loop_back_def] = DefineDiv ‘
-  (** [loops::get_elem_mut]: loop 0: backward function 0 *)
-  get_elem_mut_loop_back
-    (x : usize) (ls : usize list_t) (ret : usize) : usize list_t result =
-    (case ls of
-    | ListCons y tl =>
-      if y = x
-      then Return (ListCons ret tl)
-      else (
-        do
-        tl0 <- get_elem_mut_loop_back x tl ret;
-        Return (ListCons y tl0)
-        od)
-    | ListNil => Fail Failure)
-’
-
-val get_elem_mut_back_def = Define ‘
-  (** [loops::get_elem_mut]: backward function 0 *)
-  get_elem_mut_back
-    (slots : usize list_t vec) (x : usize) (ret : usize) :
-    usize list_t vec result
-    =
-    do
-    l <- vec_index_mut_fwd slots (int_to_usize 0);
-    l0 <- get_elem_mut_loop_back x l ret;
-    vec_index_mut_back slots (int_to_usize 0) l0
-    od
-’
-
-val [get_elem_shared_loop_fwd_def] = DefineDiv ‘
-  (** [loops::get_elem_shared]: loop 0: forward function *)
-  get_elem_shared_loop_fwd (x : usize) (ls : usize list_t) : usize result =
-    (case ls of
-    | ListCons y tl =>
-      if y = x then Return y else get_elem_shared_loop_fwd x tl
-    | ListNil => Fail Failure)
-’
-
-val get_elem_shared_fwd_def = Define ‘
-  (** [loops::get_elem_shared]: forward function *)
-  get_elem_shared_fwd (slots : usize list_t vec) (x : usize) : usize result =
-    do
-    l <- vec_index_fwd slots (int_to_usize 0);
-    get_elem_shared_loop_fwd x l
-    od
-’
-
-val id_mut_fwd_def = Define ‘
-  (** [loops::id_mut]: forward function *)
-  id_mut_fwd (ls : 't list_t) : 't list_t result =
-    Return ls
-’
-
-val id_mut_back_def = Define ‘
-  (** [loops::id_mut]: backward function 0 *)
-  id_mut_back (ls : 't list_t) (ret : 't list_t) : 't list_t result =
-    Return ret
-’
-
-val id_shared_fwd_def = Define ‘
-  (** [loops::id_shared]: forward function *)
-  id_shared_fwd (ls : 't list_t) : 't list_t result =
-    Return ls
-’
-
-val [list_nth_mut_loop_with_id_loop_fwd_def] = DefineDiv ‘
-  (** [loops::list_nth_mut_loop_with_id]: loop 0: forward function *)
-  list_nth_mut_loop_with_id_loop_fwd (i : u32) (ls : 't list_t) : 't result =
-    (case ls of
-    | ListCons x tl =>
-      if i = int_to_u32 0
-      then Return x
-      else (
-        do
-        i0 <- u32_sub i (int_to_u32 1);
-        list_nth_mut_loop_with_id_loop_fwd i0 tl
-        od)
-    | ListNil => Fail Failure)
-’
-
-val list_nth_mut_loop_with_id_fwd_def = Define ‘
-  (** [loops::list_nth_mut_loop_with_id]: forward function *)
-  list_nth_mut_loop_with_id_fwd (ls : 't list_t) (i : u32) : 't result =
-    do
-    ls0 <- id_mut_fwd ls;
-    list_nth_mut_loop_with_id_loop_fwd i ls0
-    od
-’
-
-val [list_nth_mut_loop_with_id_loop_back_def] = DefineDiv ‘
-  (** [loops::list_nth_mut_loop_with_id]: loop 0: backward function 0 *)
-  list_nth_mut_loop_with_id_loop_back
-    (i : u32) (ls : 't list_t) (ret : 't) : 't list_t result =
-    (case ls of
-    | ListCons x tl =>
-      if i = int_to_u32 0
-      then Return (ListCons ret tl)
-      else (
-        do
-        i0 <- u32_sub i (int_to_u32 1);
-        tl0 <- list_nth_mut_loop_with_id_loop_back i0 tl ret;
-        Return (ListCons x tl0)
-        od)
-    | ListNil => Fail Failure)
-’
-
-val list_nth_mut_loop_with_id_back_def = Define ‘
-  (** [loops::list_nth_mut_loop_with_id]: backward function 0 *)
-  list_nth_mut_loop_with_id_back
-    (ls : 't list_t) (i : u32) (ret : 't) : 't list_t result =
-    do
-    ls0 <- id_mut_fwd ls;
-    l <- list_nth_mut_loop_with_id_loop_back i ls0 ret;
-    id_mut_back ls l
-    od
-’
-
-val [list_nth_shared_loop_with_id_loop_fwd_def] = DefineDiv ‘
-  (** [loops::list_nth_shared_loop_with_id]: loop 0: forward function *)
-  list_nth_shared_loop_with_id_loop_fwd
-    (i : u32) (ls : 't list_t) : 't result =
-    (case ls of
-    | ListCons x tl =>
-      if i = int_to_u32 0
-      then Return x
-      else (
-        do
-        i0 <- u32_sub i (int_to_u32 1);
-        list_nth_shared_loop_with_id_loop_fwd i0 tl
-        od)
-    | ListNil => Fail Failure)
-’
-
-val list_nth_shared_loop_with_id_fwd_def = Define ‘
-  (** [loops::list_nth_shared_loop_with_id]: forward function *)
-  list_nth_shared_loop_with_id_fwd (ls : 't list_t) (i : u32) : 't result =
-    do
-    ls0 <- id_shared_fwd ls;
-    list_nth_shared_loop_with_id_loop_fwd i ls0
-    od
-’
-
-val [list_nth_mut_loop_pair_loop_fwd_def] = DefineDiv ‘
-  (** [loops::list_nth_mut_loop_pair]: loop 0: forward function *)
-  list_nth_mut_loop_pair_loop_fwd
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
-    (case ls0 of
-    | ListCons x0 tl0 =>
-      (case ls1 of
-      | ListCons x1 tl1 =>
-        if i = int_to_u32 0
-        then Return (x0, x1)
-        else (
-          do
-          i0 <- u32_sub i (int_to_u32 1);
-          list_nth_mut_loop_pair_loop_fwd tl0 tl1 i0
-          od)
-      | ListNil => Fail Failure)
-    | ListNil => Fail Failure)
-’
-
-val list_nth_mut_loop_pair_fwd_def = Define ‘
-  (** [loops::list_nth_mut_loop_pair]: forward function *)
-  list_nth_mut_loop_pair_fwd
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
-    list_nth_mut_loop_pair_loop_fwd ls0 ls1 i
-’
-
-val [list_nth_mut_loop_pair_loop_back'a_def] = DefineDiv ‘
-  (** [loops::list_nth_mut_loop_pair]: loop 0: backward function 0 *)
-  list_nth_mut_loop_pair_loop_back'a
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : 't) :
-    't list_t result
-    =
-    (case ls0 of
-    | ListCons x0 tl0 =>
-      (case ls1 of
-      | ListCons x1 tl1 =>
-        if i = int_to_u32 0
-        then Return (ListCons ret tl0)
-        else (
-          do
-          i0 <- u32_sub i (int_to_u32 1);
-          tl00 <- list_nth_mut_loop_pair_loop_back'a tl0 tl1 i0 ret;
-          Return (ListCons x0 tl00)
-          od)
-      | ListNil => Fail Failure)
-    | ListNil => Fail Failure)
-’
-
-val list_nth_mut_loop_pair_back'a_def = Define ‘
-  (** [loops::list_nth_mut_loop_pair]: backward function 0 *)
-  list_nth_mut_loop_pair_back'a
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : 't) :
-    't list_t result
-    =
-    list_nth_mut_loop_pair_loop_back'a ls0 ls1 i ret
-’
-
-val [list_nth_mut_loop_pair_loop_back'b_def] = DefineDiv ‘
-  (** [loops::list_nth_mut_loop_pair]: loop 0: backward function 1 *)
-  list_nth_mut_loop_pair_loop_back'b
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : 't) :
-    't list_t result
-    =
-    (case ls0 of
-    | ListCons x0 tl0 =>
-      (case ls1 of
-      | ListCons x1 tl1 =>
-        if i = int_to_u32 0
-        then Return (ListCons ret tl1)
-        else (
-          do
-          i0 <- u32_sub i (int_to_u32 1);
-          tl10 <- list_nth_mut_loop_pair_loop_back'b tl0 tl1 i0 ret;
-          Return (ListCons x1 tl10)
-          od)
-      | ListNil => Fail Failure)
-    | ListNil => Fail Failure)
-’
-
-val list_nth_mut_loop_pair_back'b_def = Define ‘
-  (** [loops::list_nth_mut_loop_pair]: backward function 1 *)
-  list_nth_mut_loop_pair_back'b
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : 't) :
-    't list_t result
-    =
-    list_nth_mut_loop_pair_loop_back'b ls0 ls1 i ret
-’
-
-val [list_nth_shared_loop_pair_loop_fwd_def] = DefineDiv ‘
-  (** [loops::list_nth_shared_loop_pair]: loop 0: forward function *)
-  list_nth_shared_loop_pair_loop_fwd
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
-    (case ls0 of
-    | ListCons x0 tl0 =>
-      (case ls1 of
-      | ListCons x1 tl1 =>
-        if i = int_to_u32 0
-        then Return (x0, x1)
-        else (
-          do
-          i0 <- u32_sub i (int_to_u32 1);
-          list_nth_shared_loop_pair_loop_fwd tl0 tl1 i0
-          od)
-      | ListNil => Fail Failure)
-    | ListNil => Fail Failure)
-’
-
-val list_nth_shared_loop_pair_fwd_def = Define ‘
-  (** [loops::list_nth_shared_loop_pair]: forward function *)
-  list_nth_shared_loop_pair_fwd
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
-    list_nth_shared_loop_pair_loop_fwd ls0 ls1 i
-’
-
-val [list_nth_mut_loop_pair_merge_loop_fwd_def] = DefineDiv ‘
-  (** [loops::list_nth_mut_loop_pair_merge]: loop 0: forward function *)
-  list_nth_mut_loop_pair_merge_loop_fwd
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
-    (case ls0 of
-    | ListCons x0 tl0 =>
-      (case ls1 of
-      | ListCons x1 tl1 =>
-        if i = int_to_u32 0
-        then Return (x0, x1)
-        else (
-          do
-          i0 <- u32_sub i (int_to_u32 1);
-          list_nth_mut_loop_pair_merge_loop_fwd tl0 tl1 i0
-          od)
-      | ListNil => Fail Failure)
-    | ListNil => Fail Failure)
-’
-
-val list_nth_mut_loop_pair_merge_fwd_def = Define ‘
-  (** [loops::list_nth_mut_loop_pair_merge]: forward function *)
-  list_nth_mut_loop_pair_merge_fwd
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
-    list_nth_mut_loop_pair_merge_loop_fwd ls0 ls1 i
-’
-
-val [list_nth_mut_loop_pair_merge_loop_back_def] = DefineDiv ‘
-  (** [loops::list_nth_mut_loop_pair_merge]: loop 0: backward function 0 *)
-  list_nth_mut_loop_pair_merge_loop_back
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : ('t # 't)) :
-    ('t list_t # 't list_t) result
-    =
-    (case ls0 of
-    | ListCons x0 tl0 =>
-      (case ls1 of
-      | ListCons x1 tl1 =>
-        if i = int_to_u32 0
-        then let (t, t0) = ret in Return (ListCons t tl0, ListCons t0 tl1)
-        else (
-          do
-          i0 <- u32_sub i (int_to_u32 1);
-          (tl00, tl10) <-
-            list_nth_mut_loop_pair_merge_loop_back tl0 tl1 i0 ret;
-          Return (ListCons x0 tl00, ListCons x1 tl10)
-          od)
-      | ListNil => Fail Failure)
-    | ListNil => Fail Failure)
-’
-
-val list_nth_mut_loop_pair_merge_back_def = Define ‘
-  (** [loops::list_nth_mut_loop_pair_merge]: backward function 0 *)
-  list_nth_mut_loop_pair_merge_back
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : ('t # 't)) :
-    ('t list_t # 't list_t) result
-    =
-    list_nth_mut_loop_pair_merge_loop_back ls0 ls1 i ret
-’
-
-val [list_nth_shared_loop_pair_merge_loop_fwd_def] = DefineDiv ‘
-  (** [loops::list_nth_shared_loop_pair_merge]: loop 0: forward function *)
-  list_nth_shared_loop_pair_merge_loop_fwd
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
-    (case ls0 of
-    | ListCons x0 tl0 =>
-      (case ls1 of
-      | ListCons x1 tl1 =>
-        if i = int_to_u32 0
-        then Return (x0, x1)
-        else (
-          do
-          i0 <- u32_sub i (int_to_u32 1);
-          list_nth_shared_loop_pair_merge_loop_fwd tl0 tl1 i0
-          od)
-      | ListNil => Fail Failure)
-    | ListNil => Fail Failure)
-’
-
-val list_nth_shared_loop_pair_merge_fwd_def = Define ‘
-  (** [loops::list_nth_shared_loop_pair_merge]: forward function *)
-  list_nth_shared_loop_pair_merge_fwd
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
-    list_nth_shared_loop_pair_merge_loop_fwd ls0 ls1 i
-’
-
-val [list_nth_mut_shared_loop_pair_loop_fwd_def] = DefineDiv ‘
-  (** [loops::list_nth_mut_shared_loop_pair]: loop 0: forward function *)
-  list_nth_mut_shared_loop_pair_loop_fwd
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
-    (case ls0 of
-    | ListCons x0 tl0 =>
-      (case ls1 of
-      | ListCons x1 tl1 =>
-        if i = int_to_u32 0
-        then Return (x0, x1)
-        else (
-          do
-          i0 <- u32_sub i (int_to_u32 1);
-          list_nth_mut_shared_loop_pair_loop_fwd tl0 tl1 i0
-          od)
-      | ListNil => Fail Failure)
-    | ListNil => Fail Failure)
-’
-
-val list_nth_mut_shared_loop_pair_fwd_def = Define ‘
-  (** [loops::list_nth_mut_shared_loop_pair]: forward function *)
-  list_nth_mut_shared_loop_pair_fwd
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
-    list_nth_mut_shared_loop_pair_loop_fwd ls0 ls1 i
-’
-
-val [list_nth_mut_shared_loop_pair_loop_back_def] = DefineDiv ‘
-  (** [loops::list_nth_mut_shared_loop_pair]: loop 0: backward function 0 *)
-  list_nth_mut_shared_loop_pair_loop_back
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : 't) :
-    't list_t result
-    =
-    (case ls0 of
-    | ListCons x0 tl0 =>
-      (case ls1 of
-      | ListCons x1 tl1 =>
-        if i = int_to_u32 0
-        then Return (ListCons ret tl0)
-        else (
-          do
-          i0 <- u32_sub i (int_to_u32 1);
-          tl00 <- list_nth_mut_shared_loop_pair_loop_back tl0 tl1 i0 ret;
-          Return (ListCons x0 tl00)
-          od)
-      | ListNil => Fail Failure)
-    | ListNil => Fail Failure)
-’
-
-val list_nth_mut_shared_loop_pair_back_def = Define ‘
-  (** [loops::list_nth_mut_shared_loop_pair]: backward function 0 *)
-  list_nth_mut_shared_loop_pair_back
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : 't) :
-    't list_t result
-    =
-    list_nth_mut_shared_loop_pair_loop_back ls0 ls1 i ret
-’
-
-val [list_nth_mut_shared_loop_pair_merge_loop_fwd_def] = DefineDiv ‘
-  (** [loops::list_nth_mut_shared_loop_pair_merge]: loop 0: forward function *)
-  list_nth_mut_shared_loop_pair_merge_loop_fwd
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
-    (case ls0 of
-    | ListCons x0 tl0 =>
-      (case ls1 of
-      | ListCons x1 tl1 =>
-        if i = int_to_u32 0
-        then Return (x0, x1)
-        else (
-          do
-          i0 <- u32_sub i (int_to_u32 1);
-          list_nth_mut_shared_loop_pair_merge_loop_fwd tl0 tl1 i0
-          od)
-      | ListNil => Fail Failure)
-    | ListNil => Fail Failure)
-’
-
-val list_nth_mut_shared_loop_pair_merge_fwd_def = Define ‘
-  (** [loops::list_nth_mut_shared_loop_pair_merge]: forward function *)
-  list_nth_mut_shared_loop_pair_merge_fwd
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
-    list_nth_mut_shared_loop_pair_merge_loop_fwd ls0 ls1 i
-’
-
-val [list_nth_mut_shared_loop_pair_merge_loop_back_def] = DefineDiv ‘
-  (** [loops::list_nth_mut_shared_loop_pair_merge]: loop 0: backward function 0 *)
-  list_nth_mut_shared_loop_pair_merge_loop_back
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : 't) :
-    't list_t result
-    =
-    (case ls0 of
-    | ListCons x0 tl0 =>
-      (case ls1 of
-      | ListCons x1 tl1 =>
-        if i = int_to_u32 0
-        then Return (ListCons ret tl0)
-        else (
-          do
-          i0 <- u32_sub i (int_to_u32 1);
-          tl00 <- list_nth_mut_shared_loop_pair_merge_loop_back tl0 tl1 i0 ret;
-          Return (ListCons x0 tl00)
-          od)
-      | ListNil => Fail Failure)
-    | ListNil => Fail Failure)
-’
-
-val list_nth_mut_shared_loop_pair_merge_back_def = Define ‘
-  (** [loops::list_nth_mut_shared_loop_pair_merge]: backward function 0 *)
-  list_nth_mut_shared_loop_pair_merge_back
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : 't) :
-    't list_t result
-    =
-    list_nth_mut_shared_loop_pair_merge_loop_back ls0 ls1 i ret
-’
-
-val [list_nth_shared_mut_loop_pair_loop_fwd_def] = DefineDiv ‘
-  (** [loops::list_nth_shared_mut_loop_pair]: loop 0: forward function *)
-  list_nth_shared_mut_loop_pair_loop_fwd
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
-    (case ls0 of
-    | ListCons x0 tl0 =>
-      (case ls1 of
-      | ListCons x1 tl1 =>
-        if i = int_to_u32 0
-        then Return (x0, x1)
-        else (
-          do
-          i0 <- u32_sub i (int_to_u32 1);
-          list_nth_shared_mut_loop_pair_loop_fwd tl0 tl1 i0
-          od)
-      | ListNil => Fail Failure)
-    | ListNil => Fail Failure)
-’
-
-val list_nth_shared_mut_loop_pair_fwd_def = Define ‘
-  (** [loops::list_nth_shared_mut_loop_pair]: forward function *)
-  list_nth_shared_mut_loop_pair_fwd
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
-    list_nth_shared_mut_loop_pair_loop_fwd ls0 ls1 i
-’
-
-val [list_nth_shared_mut_loop_pair_loop_back_def] = DefineDiv ‘
-  (** [loops::list_nth_shared_mut_loop_pair]: loop 0: backward function 1 *)
-  list_nth_shared_mut_loop_pair_loop_back
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : 't) :
-    't list_t result
-    =
-    (case ls0 of
-    | ListCons x0 tl0 =>
-      (case ls1 of
-      | ListCons x1 tl1 =>
-        if i = int_to_u32 0
-        then Return (ListCons ret tl1)
-        else (
-          do
-          i0 <- u32_sub i (int_to_u32 1);
-          tl10 <- list_nth_shared_mut_loop_pair_loop_back tl0 tl1 i0 ret;
-          Return (ListCons x1 tl10)
-          od)
-      | ListNil => Fail Failure)
-    | ListNil => Fail Failure)
-’
-
-val list_nth_shared_mut_loop_pair_back_def = Define ‘
-  (** [loops::list_nth_shared_mut_loop_pair]: backward function 1 *)
-  list_nth_shared_mut_loop_pair_back
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : 't) :
-    't list_t result
-    =
-    list_nth_shared_mut_loop_pair_loop_back ls0 ls1 i ret
-’
-
-val [list_nth_shared_mut_loop_pair_merge_loop_fwd_def] = DefineDiv ‘
-  (** [loops::list_nth_shared_mut_loop_pair_merge]: loop 0: forward function *)
-  list_nth_shared_mut_loop_pair_merge_loop_fwd
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
-    (case ls0 of
-    | ListCons x0 tl0 =>
-      (case ls1 of
-      | ListCons x1 tl1 =>
-        if i = int_to_u32 0
-        then Return (x0, x1)
-        else (
-          do
-          i0 <- u32_sub i (int_to_u32 1);
-          list_nth_shared_mut_loop_pair_merge_loop_fwd tl0 tl1 i0
-          od)
-      | ListNil => Fail Failure)
-    | ListNil => Fail Failure)
-’
-
-val list_nth_shared_mut_loop_pair_merge_fwd_def = Define ‘
-  (** [loops::list_nth_shared_mut_loop_pair_merge]: forward function *)
-  list_nth_shared_mut_loop_pair_merge_fwd
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) : ('t # 't) result =
-    list_nth_shared_mut_loop_pair_merge_loop_fwd ls0 ls1 i
-’
-
-val [list_nth_shared_mut_loop_pair_merge_loop_back_def] = DefineDiv ‘
-  (** [loops::list_nth_shared_mut_loop_pair_merge]: loop 0: backward function 0 *)
-  list_nth_shared_mut_loop_pair_merge_loop_back
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : 't) :
-    't list_t result
-    =
-    (case ls0 of
-    | ListCons x0 tl0 =>
-      (case ls1 of
-      | ListCons x1 tl1 =>
-        if i = int_to_u32 0
-        then Return (ListCons ret tl1)
-        else (
-          do
-          i0 <- u32_sub i (int_to_u32 1);
-          tl10 <- list_nth_shared_mut_loop_pair_merge_loop_back tl0 tl1 i0 ret;
-          Return (ListCons x1 tl10)
-          od)
-      | ListNil => Fail Failure)
-    | ListNil => Fail Failure)
-’
-
-val list_nth_shared_mut_loop_pair_merge_back_def = Define ‘
-  (** [loops::list_nth_shared_mut_loop_pair_merge]: backward function 0 *)
-  list_nth_shared_mut_loop_pair_merge_back
-    (ls0 : 't list_t) (ls1 : 't list_t) (i : u32) (ret : 't) :
-    't list_t result
-    =
-    list_nth_shared_mut_loop_pair_merge_loop_back ls0 ls1 i ret
-’
-
-val _ = export_theory ()
diff --git a/tests/hol4/misc-loops/loops_FunsTheory.sig b/tests/hol4/misc-loops/loops_FunsTheory.sig
deleted file mode 100644
index 63fe56c9..00000000
--- a/tests/hol4/misc-loops/loops_FunsTheory.sig
+++ /dev/null
@@ -1,731 +0,0 @@
-signature loops_FunsTheory =
-sig
-  type thm = Thm.thm
-  
-  (*  Definitions  *)
-    val clear_fwd_back_def : thm
-    val clear_loop_fwd_back_def : thm
-    val get_elem_mut_back_def : thm
-    val get_elem_mut_fwd_def : thm
-    val get_elem_mut_loop_back_def : thm
-    val get_elem_mut_loop_fwd_def : thm
-    val get_elem_shared_fwd_def : thm
-    val get_elem_shared_loop_fwd_def : thm
-    val id_mut_back_def : thm
-    val id_mut_fwd_def : thm
-    val id_shared_fwd_def : thm
-    val list_mem_fwd_def : thm
-    val list_mem_loop_fwd_def : thm
-    val list_nth_mut_loop_back_def : thm
-    val list_nth_mut_loop_fwd_def : thm
-    val list_nth_mut_loop_loop_back_def : thm
-    val list_nth_mut_loop_loop_fwd_def : thm
-    val list_nth_mut_loop_pair_back'a_def : thm
-    val list_nth_mut_loop_pair_back'b_def : thm
-    val list_nth_mut_loop_pair_fwd_def : thm
-    val list_nth_mut_loop_pair_loop_back'a_def : thm
-    val list_nth_mut_loop_pair_loop_back'b_def : thm
-    val list_nth_mut_loop_pair_loop_fwd_def : thm
-    val list_nth_mut_loop_pair_merge_back_def : thm
-    val list_nth_mut_loop_pair_merge_fwd_def : thm
-    val list_nth_mut_loop_pair_merge_loop_back_def : thm
-    val list_nth_mut_loop_pair_merge_loop_fwd_def : thm
-    val list_nth_mut_loop_with_id_back_def : thm
-    val list_nth_mut_loop_with_id_fwd_def : thm
-    val list_nth_mut_loop_with_id_loop_back_def : thm
-    val list_nth_mut_loop_with_id_loop_fwd_def : thm
-    val list_nth_mut_shared_loop_pair_back_def : thm
-    val list_nth_mut_shared_loop_pair_fwd_def : thm
-    val list_nth_mut_shared_loop_pair_loop_back_def : thm
-    val list_nth_mut_shared_loop_pair_loop_fwd_def : thm
-    val list_nth_mut_shared_loop_pair_merge_back_def : thm
-    val list_nth_mut_shared_loop_pair_merge_fwd_def : thm
-    val list_nth_mut_shared_loop_pair_merge_loop_back_def : thm
-    val list_nth_mut_shared_loop_pair_merge_loop_fwd_def : thm
-    val list_nth_shared_loop_fwd_def : thm
-    val list_nth_shared_loop_loop_fwd_def : thm
-    val list_nth_shared_loop_pair_fwd_def : thm
-    val list_nth_shared_loop_pair_loop_fwd_def : thm
-    val list_nth_shared_loop_pair_merge_fwd_def : thm
-    val list_nth_shared_loop_pair_merge_loop_fwd_def : thm
-    val list_nth_shared_loop_with_id_fwd_def : thm
-    val list_nth_shared_loop_with_id_loop_fwd_def : thm
-    val list_nth_shared_mut_loop_pair_back_def : thm
-    val list_nth_shared_mut_loop_pair_fwd_def : thm
-    val list_nth_shared_mut_loop_pair_loop_back_def : thm
-    val list_nth_shared_mut_loop_pair_loop_fwd_def : thm
-    val list_nth_shared_mut_loop_pair_merge_back_def : thm
-    val list_nth_shared_mut_loop_pair_merge_fwd_def : thm
-    val list_nth_shared_mut_loop_pair_merge_loop_back_def : thm
-    val list_nth_shared_mut_loop_pair_merge_loop_fwd_def : thm
-    val sum_fwd_def : thm
-    val sum_loop_fwd_def : thm
-    val sum_with_mut_borrows_fwd_def : thm
-    val sum_with_mut_borrows_loop_fwd_def : thm
-    val sum_with_shared_borrows_fwd_def : thm
-    val sum_with_shared_borrows_loop_fwd_def : thm
-  
-  val loops_Funs_grammars : type_grammar.grammar * term_grammar.grammar
-(*
-   [loops_Types] Parent theory of "loops_Funs"
-   
-   [clear_fwd_back_def]  Definition
-      
-      ⊢ ∀v. clear_fwd_back v = clear_loop_fwd_back v (int_to_usize 0)
-   
-   [clear_loop_fwd_back_def]  Definition
-      
-      ⊢ ∀v i.
-          clear_loop_fwd_back v i =
-          (let
-             i0 = vec_len v
-           in
-             if usize_lt i i0 then
-               do
-                 i1 <- usize_add i (int_to_usize 1);
-                 v0 <- vec_index_mut_back v i (int_to_u32 0);
-                 clear_loop_fwd_back v0 i1
-               od
-             else Return v)
-   
-   [get_elem_mut_back_def]  Definition
-      
-      ⊢ ∀slots x ret.
-          get_elem_mut_back slots x ret =
-          do
-            l <- vec_index_mut_fwd slots (int_to_usize 0);
-            l0 <- get_elem_mut_loop_back x l ret;
-            vec_index_mut_back slots (int_to_usize 0) l0
-          od
-   
-   [get_elem_mut_fwd_def]  Definition
-      
-      ⊢ ∀slots x.
-          get_elem_mut_fwd slots x =
-          do
-            l <- vec_index_mut_fwd slots (int_to_usize 0);
-            get_elem_mut_loop_fwd x l
-          od
-   
-   [get_elem_mut_loop_back_def]  Definition
-      
-      ⊢ ∀x ls ret.
-          get_elem_mut_loop_back x ls ret =
-          case ls of
-            ListCons y tl =>
-              if y = x then Return (ListCons ret tl)
-              else
-                do
-                  tl0 <- get_elem_mut_loop_back x tl ret;
-                  Return (ListCons y tl0)
-                od
-          | ListNil => Fail Failure
-   
-   [get_elem_mut_loop_fwd_def]  Definition
-      
-      ⊢ ∀x ls.
-          get_elem_mut_loop_fwd x ls =
-          case ls of
-            ListCons y tl =>
-              if y = x then Return y else get_elem_mut_loop_fwd x tl
-          | ListNil => Fail Failure
-   
-   [get_elem_shared_fwd_def]  Definition
-      
-      ⊢ ∀slots x.
-          get_elem_shared_fwd slots x =
-          do
-            l <- vec_index_fwd slots (int_to_usize 0);
-            get_elem_shared_loop_fwd x l
-          od
-   
-   [get_elem_shared_loop_fwd_def]  Definition
-      
-      ⊢ ∀x ls.
-          get_elem_shared_loop_fwd x ls =
-          case ls of
-            ListCons y tl =>
-              if y = x then Return y else get_elem_shared_loop_fwd x tl
-          | ListNil => Fail Failure
-   
-   [id_mut_back_def]  Definition
-      
-      ⊢ ∀ls ret. id_mut_back ls ret = Return ret
-   
-   [id_mut_fwd_def]  Definition
-      
-      ⊢ ∀ls. id_mut_fwd ls = Return ls
-   
-   [id_shared_fwd_def]  Definition
-      
-      ⊢ ∀ls. id_shared_fwd ls = Return ls
-   
-   [list_mem_fwd_def]  Definition
-      
-      ⊢ ∀x ls. list_mem_fwd x ls = list_mem_loop_fwd x ls
-   
-   [list_mem_loop_fwd_def]  Definition
-      
-      ⊢ ∀x ls.
-          list_mem_loop_fwd x ls =
-          case ls of
-            ListCons y tl =>
-              if y = x then Return T else list_mem_loop_fwd x tl
-          | ListNil => Return F
-   
-   [list_nth_mut_loop_back_def]  Definition
-      
-      ⊢ ∀ls i ret.
-          list_nth_mut_loop_back ls i ret =
-          list_nth_mut_loop_loop_back ls i ret
-   
-   [list_nth_mut_loop_fwd_def]  Definition
-      
-      ⊢ ∀ls i. list_nth_mut_loop_fwd ls i = list_nth_mut_loop_loop_fwd ls i
-   
-   [list_nth_mut_loop_loop_back_def]  Definition
-      
-      ⊢ ∀ls i ret.
-          list_nth_mut_loop_loop_back ls i ret =
-          case ls of
-            ListCons x tl =>
-              if i = int_to_u32 0 then Return (ListCons ret tl)
-              else
-                do
-                  i0 <- u32_sub i (int_to_u32 1);
-                  tl0 <- list_nth_mut_loop_loop_back tl i0 ret;
-                  Return (ListCons x tl0)
-                od
-          | ListNil => Fail Failure
-   
-   [list_nth_mut_loop_loop_fwd_def]  Definition
-      
-      ⊢ ∀ls i.
-          list_nth_mut_loop_loop_fwd ls i =
-          case ls of
-            ListCons x tl =>
-              if i = int_to_u32 0 then Return x
-              else
-                do
-                  i0 <- u32_sub i (int_to_u32 1);
-                  list_nth_mut_loop_loop_fwd tl i0
-                od
-          | ListNil => Fail Failure
-   
-   [list_nth_mut_loop_pair_back'a_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i ret.
-          list_nth_mut_loop_pair_back'a ls0 ls1 i ret =
-          list_nth_mut_loop_pair_loop_back'a ls0 ls1 i ret
-   
-   [list_nth_mut_loop_pair_back'b_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i ret.
-          list_nth_mut_loop_pair_back'b ls0 ls1 i ret =
-          list_nth_mut_loop_pair_loop_back'b ls0 ls1 i ret
-   
-   [list_nth_mut_loop_pair_fwd_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i.
-          list_nth_mut_loop_pair_fwd ls0 ls1 i =
-          list_nth_mut_loop_pair_loop_fwd ls0 ls1 i
-   
-   [list_nth_mut_loop_pair_loop_back'a_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i ret.
-          list_nth_mut_loop_pair_loop_back'a ls0 ls1 i ret =
-          case ls0 of
-            ListCons x0 tl0 =>
-              (case ls1 of
-                 ListCons x1 tl1 =>
-                   if i = int_to_u32 0 then Return (ListCons ret tl0)
-                   else
-                     do
-                       i0 <- u32_sub i (int_to_u32 1);
-                       tl00 <-
-                         list_nth_mut_loop_pair_loop_back'a tl0 tl1 i0 ret;
-                       Return (ListCons x0 tl00)
-                     od
-               | ListNil => Fail Failure)
-          | ListNil => Fail Failure
-   
-   [list_nth_mut_loop_pair_loop_back'b_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i ret.
-          list_nth_mut_loop_pair_loop_back'b ls0 ls1 i ret =
-          case ls0 of
-            ListCons x0 tl0 =>
-              (case ls1 of
-                 ListCons x1 tl1 =>
-                   if i = int_to_u32 0 then Return (ListCons ret tl1)
-                   else
-                     do
-                       i0 <- u32_sub i (int_to_u32 1);
-                       tl10 <-
-                         list_nth_mut_loop_pair_loop_back'b tl0 tl1 i0 ret;
-                       Return (ListCons x1 tl10)
-                     od
-               | ListNil => Fail Failure)
-          | ListNil => Fail Failure
-   
-   [list_nth_mut_loop_pair_loop_fwd_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i.
-          list_nth_mut_loop_pair_loop_fwd ls0 ls1 i =
-          case ls0 of
-            ListCons x0 tl0 =>
-              (case ls1 of
-                 ListCons x1 tl1 =>
-                   if i = int_to_u32 0 then Return (x0,x1)
-                   else
-                     do
-                       i0 <- u32_sub i (int_to_u32 1);
-                       list_nth_mut_loop_pair_loop_fwd tl0 tl1 i0
-                     od
-               | ListNil => Fail Failure)
-          | ListNil => Fail Failure
-   
-   [list_nth_mut_loop_pair_merge_back_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i ret.
-          list_nth_mut_loop_pair_merge_back ls0 ls1 i ret =
-          list_nth_mut_loop_pair_merge_loop_back ls0 ls1 i ret
-   
-   [list_nth_mut_loop_pair_merge_fwd_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i.
-          list_nth_mut_loop_pair_merge_fwd ls0 ls1 i =
-          list_nth_mut_loop_pair_merge_loop_fwd ls0 ls1 i
-   
-   [list_nth_mut_loop_pair_merge_loop_back_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i ret.
-          list_nth_mut_loop_pair_merge_loop_back ls0 ls1 i ret =
-          case ls0 of
-            ListCons x0 tl0 =>
-              (case ls1 of
-                 ListCons x1 tl1 =>
-                   if i = int_to_u32 0 then
-                     (let
-                        (t,t0) = ret
-                      in
-                        Return (ListCons t tl0,ListCons t0 tl1))
-                   else
-                     do
-                       i0 <- u32_sub i (int_to_u32 1);
-                       (tl00,tl10) <-
-                         list_nth_mut_loop_pair_merge_loop_back tl0 tl1 i0
-                           ret;
-                       Return (ListCons x0 tl00,ListCons x1 tl10)
-                     od
-               | ListNil => Fail Failure)
-          | ListNil => Fail Failure
-   
-   [list_nth_mut_loop_pair_merge_loop_fwd_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i.
-          list_nth_mut_loop_pair_merge_loop_fwd ls0 ls1 i =
-          case ls0 of
-            ListCons x0 tl0 =>
-              (case ls1 of
-                 ListCons x1 tl1 =>
-                   if i = int_to_u32 0 then Return (x0,x1)
-                   else
-                     do
-                       i0 <- u32_sub i (int_to_u32 1);
-                       list_nth_mut_loop_pair_merge_loop_fwd tl0 tl1 i0
-                     od
-               | ListNil => Fail Failure)
-          | ListNil => Fail Failure
-   
-   [list_nth_mut_loop_with_id_back_def]  Definition
-      
-      ⊢ ∀ls i ret.
-          list_nth_mut_loop_with_id_back ls i ret =
-          do
-            ls0 <- id_mut_fwd ls;
-            l <- list_nth_mut_loop_with_id_loop_back i ls0 ret;
-            id_mut_back ls l
-          od
-   
-   [list_nth_mut_loop_with_id_fwd_def]  Definition
-      
-      ⊢ ∀ls i.
-          list_nth_mut_loop_with_id_fwd ls i =
-          do
-            ls0 <- id_mut_fwd ls;
-            list_nth_mut_loop_with_id_loop_fwd i ls0
-          od
-   
-   [list_nth_mut_loop_with_id_loop_back_def]  Definition
-      
-      ⊢ ∀i ls ret.
-          list_nth_mut_loop_with_id_loop_back i ls ret =
-          case ls of
-            ListCons x tl =>
-              if i = int_to_u32 0 then Return (ListCons ret tl)
-              else
-                do
-                  i0 <- u32_sub i (int_to_u32 1);
-                  tl0 <- list_nth_mut_loop_with_id_loop_back i0 tl ret;
-                  Return (ListCons x tl0)
-                od
-          | ListNil => Fail Failure
-   
-   [list_nth_mut_loop_with_id_loop_fwd_def]  Definition
-      
-      ⊢ ∀i ls.
-          list_nth_mut_loop_with_id_loop_fwd i ls =
-          case ls of
-            ListCons x tl =>
-              if i = int_to_u32 0 then Return x
-              else
-                do
-                  i0 <- u32_sub i (int_to_u32 1);
-                  list_nth_mut_loop_with_id_loop_fwd i0 tl
-                od
-          | ListNil => Fail Failure
-   
-   [list_nth_mut_shared_loop_pair_back_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i ret.
-          list_nth_mut_shared_loop_pair_back ls0 ls1 i ret =
-          list_nth_mut_shared_loop_pair_loop_back ls0 ls1 i ret
-   
-   [list_nth_mut_shared_loop_pair_fwd_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i.
-          list_nth_mut_shared_loop_pair_fwd ls0 ls1 i =
-          list_nth_mut_shared_loop_pair_loop_fwd ls0 ls1 i
-   
-   [list_nth_mut_shared_loop_pair_loop_back_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i ret.
-          list_nth_mut_shared_loop_pair_loop_back ls0 ls1 i ret =
-          case ls0 of
-            ListCons x0 tl0 =>
-              (case ls1 of
-                 ListCons x1 tl1 =>
-                   if i = int_to_u32 0 then Return (ListCons ret tl0)
-                   else
-                     do
-                       i0 <- u32_sub i (int_to_u32 1);
-                       tl00 <-
-                         list_nth_mut_shared_loop_pair_loop_back tl0 tl1 i0
-                           ret;
-                       Return (ListCons x0 tl00)
-                     od
-               | ListNil => Fail Failure)
-          | ListNil => Fail Failure
-   
-   [list_nth_mut_shared_loop_pair_loop_fwd_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i.
-          list_nth_mut_shared_loop_pair_loop_fwd ls0 ls1 i =
-          case ls0 of
-            ListCons x0 tl0 =>
-              (case ls1 of
-                 ListCons x1 tl1 =>
-                   if i = int_to_u32 0 then Return (x0,x1)
-                   else
-                     do
-                       i0 <- u32_sub i (int_to_u32 1);
-                       list_nth_mut_shared_loop_pair_loop_fwd tl0 tl1 i0
-                     od
-               | ListNil => Fail Failure)
-          | ListNil => Fail Failure
-   
-   [list_nth_mut_shared_loop_pair_merge_back_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i ret.
-          list_nth_mut_shared_loop_pair_merge_back ls0 ls1 i ret =
-          list_nth_mut_shared_loop_pair_merge_loop_back ls0 ls1 i ret
-   
-   [list_nth_mut_shared_loop_pair_merge_fwd_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i.
-          list_nth_mut_shared_loop_pair_merge_fwd ls0 ls1 i =
-          list_nth_mut_shared_loop_pair_merge_loop_fwd ls0 ls1 i
-   
-   [list_nth_mut_shared_loop_pair_merge_loop_back_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i ret.
-          list_nth_mut_shared_loop_pair_merge_loop_back ls0 ls1 i ret =
-          case ls0 of
-            ListCons x0 tl0 =>
-              (case ls1 of
-                 ListCons x1 tl1 =>
-                   if i = int_to_u32 0 then Return (ListCons ret tl0)
-                   else
-                     do
-                       i0 <- u32_sub i (int_to_u32 1);
-                       tl00 <-
-                         list_nth_mut_shared_loop_pair_merge_loop_back tl0
-                           tl1 i0 ret;
-                       Return (ListCons x0 tl00)
-                     od
-               | ListNil => Fail Failure)
-          | ListNil => Fail Failure
-   
-   [list_nth_mut_shared_loop_pair_merge_loop_fwd_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i.
-          list_nth_mut_shared_loop_pair_merge_loop_fwd ls0 ls1 i =
-          case ls0 of
-            ListCons x0 tl0 =>
-              (case ls1 of
-                 ListCons x1 tl1 =>
-                   if i = int_to_u32 0 then Return (x0,x1)
-                   else
-                     do
-                       i0 <- u32_sub i (int_to_u32 1);
-                       list_nth_mut_shared_loop_pair_merge_loop_fwd tl0 tl1
-                         i0
-                     od
-               | ListNil => Fail Failure)
-          | ListNil => Fail Failure
-   
-   [list_nth_shared_loop_fwd_def]  Definition
-      
-      ⊢ ∀ls i.
-          list_nth_shared_loop_fwd ls i =
-          list_nth_shared_loop_loop_fwd ls i
-   
-   [list_nth_shared_loop_loop_fwd_def]  Definition
-      
-      ⊢ ∀ls i.
-          list_nth_shared_loop_loop_fwd ls i =
-          case ls of
-            ListCons x tl =>
-              if i = int_to_u32 0 then Return x
-              else
-                do
-                  i0 <- u32_sub i (int_to_u32 1);
-                  list_nth_shared_loop_loop_fwd tl i0
-                od
-          | ListNil => Fail Failure
-   
-   [list_nth_shared_loop_pair_fwd_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i.
-          list_nth_shared_loop_pair_fwd ls0 ls1 i =
-          list_nth_shared_loop_pair_loop_fwd ls0 ls1 i
-   
-   [list_nth_shared_loop_pair_loop_fwd_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i.
-          list_nth_shared_loop_pair_loop_fwd ls0 ls1 i =
-          case ls0 of
-            ListCons x0 tl0 =>
-              (case ls1 of
-                 ListCons x1 tl1 =>
-                   if i = int_to_u32 0 then Return (x0,x1)
-                   else
-                     do
-                       i0 <- u32_sub i (int_to_u32 1);
-                       list_nth_shared_loop_pair_loop_fwd tl0 tl1 i0
-                     od
-               | ListNil => Fail Failure)
-          | ListNil => Fail Failure
-   
-   [list_nth_shared_loop_pair_merge_fwd_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i.
-          list_nth_shared_loop_pair_merge_fwd ls0 ls1 i =
-          list_nth_shared_loop_pair_merge_loop_fwd ls0 ls1 i
-   
-   [list_nth_shared_loop_pair_merge_loop_fwd_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i.
-          list_nth_shared_loop_pair_merge_loop_fwd ls0 ls1 i =
-          case ls0 of
-            ListCons x0 tl0 =>
-              (case ls1 of
-                 ListCons x1 tl1 =>
-                   if i = int_to_u32 0 then Return (x0,x1)
-                   else
-                     do
-                       i0 <- u32_sub i (int_to_u32 1);
-                       list_nth_shared_loop_pair_merge_loop_fwd tl0 tl1 i0
-                     od
-               | ListNil => Fail Failure)
-          | ListNil => Fail Failure
-   
-   [list_nth_shared_loop_with_id_fwd_def]  Definition
-      
-      ⊢ ∀ls i.
-          list_nth_shared_loop_with_id_fwd ls i =
-          do
-            ls0 <- id_shared_fwd ls;
-            list_nth_shared_loop_with_id_loop_fwd i ls0
-          od
-   
-   [list_nth_shared_loop_with_id_loop_fwd_def]  Definition
-      
-      ⊢ ∀i ls.
-          list_nth_shared_loop_with_id_loop_fwd i ls =
-          case ls of
-            ListCons x tl =>
-              if i = int_to_u32 0 then Return x
-              else
-                do
-                  i0 <- u32_sub i (int_to_u32 1);
-                  list_nth_shared_loop_with_id_loop_fwd i0 tl
-                od
-          | ListNil => Fail Failure
-   
-   [list_nth_shared_mut_loop_pair_back_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i ret.
-          list_nth_shared_mut_loop_pair_back ls0 ls1 i ret =
-          list_nth_shared_mut_loop_pair_loop_back ls0 ls1 i ret
-   
-   [list_nth_shared_mut_loop_pair_fwd_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i.
-          list_nth_shared_mut_loop_pair_fwd ls0 ls1 i =
-          list_nth_shared_mut_loop_pair_loop_fwd ls0 ls1 i
-   
-   [list_nth_shared_mut_loop_pair_loop_back_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i ret.
-          list_nth_shared_mut_loop_pair_loop_back ls0 ls1 i ret =
-          case ls0 of
-            ListCons x0 tl0 =>
-              (case ls1 of
-                 ListCons x1 tl1 =>
-                   if i = int_to_u32 0 then Return (ListCons ret tl1)
-                   else
-                     do
-                       i0 <- u32_sub i (int_to_u32 1);
-                       tl10 <-
-                         list_nth_shared_mut_loop_pair_loop_back tl0 tl1 i0
-                           ret;
-                       Return (ListCons x1 tl10)
-                     od
-               | ListNil => Fail Failure)
-          | ListNil => Fail Failure
-   
-   [list_nth_shared_mut_loop_pair_loop_fwd_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i.
-          list_nth_shared_mut_loop_pair_loop_fwd ls0 ls1 i =
-          case ls0 of
-            ListCons x0 tl0 =>
-              (case ls1 of
-                 ListCons x1 tl1 =>
-                   if i = int_to_u32 0 then Return (x0,x1)
-                   else
-                     do
-                       i0 <- u32_sub i (int_to_u32 1);
-                       list_nth_shared_mut_loop_pair_loop_fwd tl0 tl1 i0
-                     od
-               | ListNil => Fail Failure)
-          | ListNil => Fail Failure
-   
-   [list_nth_shared_mut_loop_pair_merge_back_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i ret.
-          list_nth_shared_mut_loop_pair_merge_back ls0 ls1 i ret =
-          list_nth_shared_mut_loop_pair_merge_loop_back ls0 ls1 i ret
-   
-   [list_nth_shared_mut_loop_pair_merge_fwd_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i.
-          list_nth_shared_mut_loop_pair_merge_fwd ls0 ls1 i =
-          list_nth_shared_mut_loop_pair_merge_loop_fwd ls0 ls1 i
-   
-   [list_nth_shared_mut_loop_pair_merge_loop_back_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i ret.
-          list_nth_shared_mut_loop_pair_merge_loop_back ls0 ls1 i ret =
-          case ls0 of
-            ListCons x0 tl0 =>
-              (case ls1 of
-                 ListCons x1 tl1 =>
-                   if i = int_to_u32 0 then Return (ListCons ret tl1)
-                   else
-                     do
-                       i0 <- u32_sub i (int_to_u32 1);
-                       tl10 <-
-                         list_nth_shared_mut_loop_pair_merge_loop_back tl0
-                           tl1 i0 ret;
-                       Return (ListCons x1 tl10)
-                     od
-               | ListNil => Fail Failure)
-          | ListNil => Fail Failure
-   
-   [list_nth_shared_mut_loop_pair_merge_loop_fwd_def]  Definition
-      
-      ⊢ ∀ls0 ls1 i.
-          list_nth_shared_mut_loop_pair_merge_loop_fwd ls0 ls1 i =
-          case ls0 of
-            ListCons x0 tl0 =>
-              (case ls1 of
-                 ListCons x1 tl1 =>
-                   if i = int_to_u32 0 then Return (x0,x1)
-                   else
-                     do
-                       i0 <- u32_sub i (int_to_u32 1);
-                       list_nth_shared_mut_loop_pair_merge_loop_fwd tl0 tl1
-                         i0
-                     od
-               | ListNil => Fail Failure)
-          | ListNil => Fail Failure
-   
-   [sum_fwd_def]  Definition
-      
-      ⊢ ∀max. sum_fwd max = sum_loop_fwd max (int_to_u32 0) (int_to_u32 0)
-   
-   [sum_loop_fwd_def]  Definition
-      
-      ⊢ ∀max i s.
-          sum_loop_fwd max i s =
-          if u32_lt i max then
-            do
-              s0 <- u32_add s i;
-              i0 <- u32_add i (int_to_u32 1);
-              sum_loop_fwd max i0 s0
-            od
-          else u32_mul s (int_to_u32 2)
-   
-   [sum_with_mut_borrows_fwd_def]  Definition
-      
-      ⊢ ∀max.
-          sum_with_mut_borrows_fwd max =
-          sum_with_mut_borrows_loop_fwd max (int_to_u32 0) (int_to_u32 0)
-   
-   [sum_with_mut_borrows_loop_fwd_def]  Definition
-      
-      ⊢ ∀max mi ms.
-          sum_with_mut_borrows_loop_fwd max mi ms =
-          if u32_lt mi max then
-            do
-              ms0 <- u32_add ms mi;
-              mi0 <- u32_add mi (int_to_u32 1);
-              sum_with_mut_borrows_loop_fwd max mi0 ms0
-            od
-          else u32_mul ms (int_to_u32 2)
-   
-   [sum_with_shared_borrows_fwd_def]  Definition
-      
-      ⊢ ∀max.
-          sum_with_shared_borrows_fwd max =
-          sum_with_shared_borrows_loop_fwd max (int_to_u32 0)
-            (int_to_u32 0)
-   
-   [sum_with_shared_borrows_loop_fwd_def]  Definition
-      
-      ⊢ ∀max i s.
-          sum_with_shared_borrows_loop_fwd max i s =
-          if u32_lt i max then
-            do
-              i0 <- u32_add i (int_to_u32 1);
-              s0 <- u32_add s i0;
-              sum_with_shared_borrows_loop_fwd max i0 s0
-            od
-          else u32_mul s (int_to_u32 2)
-   
-   
-*)
-end
diff --git a/tests/hol4/misc-loops/loops_TypesScript.sml b/tests/hol4/misc-loops/loops_TypesScript.sml
deleted file mode 100644
index e3e5b8d1..00000000
--- a/tests/hol4/misc-loops/loops_TypesScript.sml
+++ /dev/null
@@ -1,13 +0,0 @@
-(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
-(** [loops]: type definitions *)
-open primitivesLib divDefLib
-
-val _ = new_theory "loops_Types"
-
-
-Datatype:
-  (** [loops::List] *)
-  list_t = | ListCons 't list_t | ListNil
-End
-
-val _ = export_theory ()
diff --git a/tests/hol4/misc-loops/loops_TypesTheory.sig b/tests/hol4/misc-loops/loops_TypesTheory.sig
deleted file mode 100644
index c3e638d8..00000000
--- a/tests/hol4/misc-loops/loops_TypesTheory.sig
+++ /dev/null
@@ -1,94 +0,0 @@
-signature loops_TypesTheory =
-sig
-  type thm = Thm.thm
-  
-  (*  Definitions  *)
-    val list_t_TY_DEF : thm
-    val list_t_case_def : thm
-    val list_t_size_def : thm
-  
-  (*  Theorems  *)
-    val datatype_list_t : thm
-    val list_t_11 : thm
-    val list_t_Axiom : thm
-    val list_t_case_cong : thm
-    val list_t_case_eq : thm
-    val list_t_distinct : thm
-    val list_t_induction : thm
-    val list_t_nchotomy : thm
-  
-  val loops_Types_grammars : type_grammar.grammar * term_grammar.grammar
-(*
-   [divDef] Parent theory of "loops_Types"
-   
-   [list_t_TY_DEF]  Definition
-      
-      ⊢ ∃rep.
-          TYPE_DEFINITION
-            (λa0'.
-                 ∀ $var$('list_t').
-                   (∀a0'.
-                      (∃a0 a1.
-                         a0' =
-                         (λa0 a1.
-                              ind_type$CONSTR 0 a0
-                                (ind_type$FCONS a1 (λn. ind_type$BOTTOM)))
-                           a0 a1 ∧ $var$('list_t') a1) ∨
-                      a0' =
-                      ind_type$CONSTR (SUC 0) ARB (λn. ind_type$BOTTOM) ⇒
-                      $var$('list_t') a0') ⇒
-                   $var$('list_t') a0') rep
-   
-   [list_t_case_def]  Definition
-      
-      ⊢ (∀a0 a1 f v. list_t_CASE (ListCons a0 a1) f v = f a0 a1) ∧
-        ∀f v. list_t_CASE ListNil f v = v
-   
-   [list_t_size_def]  Definition
-      
-      ⊢ (∀f a0 a1.
-           list_t_size f (ListCons a0 a1) = 1 + (f a0 + list_t_size f a1)) ∧
-        ∀f. list_t_size f ListNil = 0
-   
-   [datatype_list_t]  Theorem
-      
-      ⊢ DATATYPE (list_t ListCons ListNil)
-   
-   [list_t_11]  Theorem
-      
-      ⊢ ∀a0 a1 a0' a1'.
-          ListCons a0 a1 = ListCons a0' a1' ⇔ a0 = a0' ∧ a1 = a1'
-   
-   [list_t_Axiom]  Theorem
-      
-      ⊢ ∀f0 f1. ∃fn.
-          (∀a0 a1. fn (ListCons a0 a1) = f0 a0 a1 (fn a1)) ∧
-          fn ListNil = f1
-   
-   [list_t_case_cong]  Theorem
-      
-      ⊢ ∀M M' f v.
-          M = M' ∧ (∀a0 a1. M' = ListCons a0 a1 ⇒ f a0 a1 = f' a0 a1) ∧
-          (M' = ListNil ⇒ v = v') ⇒
-          list_t_CASE M f v = list_t_CASE M' f' v'
-   
-   [list_t_case_eq]  Theorem
-      
-      ⊢ list_t_CASE x f v = v' ⇔
-        (∃t l. x = ListCons t l ∧ f t l = v') ∨ x = ListNil ∧ v = v'
-   
-   [list_t_distinct]  Theorem
-      
-      ⊢ ∀a1 a0. ListCons a0 a1 ≠ ListNil
-   
-   [list_t_induction]  Theorem
-      
-      ⊢ ∀P. (∀l. P l ⇒ ∀t. P (ListCons t l)) ∧ P ListNil ⇒ ∀l. P l
-   
-   [list_t_nchotomy]  Theorem
-      
-      ⊢ ∀ll. (∃t l. ll = ListCons t l) ∨ ll = ListNil
-   
-   
-*)
-end
diff --git a/tests/hol4/misc-no_nested_borrows/Holmakefile b/tests/hol4/misc-no_nested_borrows/Holmakefile
deleted file mode 100644
index 3c4b8973..00000000
--- a/tests/hol4/misc-no_nested_borrows/Holmakefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# This file was automatically generated - modify ../Holmakefile.template instead
-INCLUDES =  ../../../backends/hol4
-
-all: $(DEFAULT_TARGETS)
-.PHONY: all
diff --git a/tests/hol4/misc-no_nested_borrows/noNestedBorrowsScript.sml b/tests/hol4/misc-no_nested_borrows/noNestedBorrowsScript.sml
deleted file mode 100644
index 1b2d6121..00000000
--- a/tests/hol4/misc-no_nested_borrows/noNestedBorrowsScript.sml
+++ /dev/null
@@ -1,592 +0,0 @@
-(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
-(** [no_nested_borrows] *)
-open primitivesLib divDefLib
-
-val _ = new_theory "noNestedBorrows"
-
-
-Datatype:
-  (** [no_nested_borrows::Pair] *)
-  pair_t = <| pair_x : 't1; pair_y : 't2; |>
-End
-
-Datatype:
-  (** [no_nested_borrows::List] *)
-  list_t = | ListCons 't list_t | ListNil
-End
-
-Datatype:
-  (** [no_nested_borrows::One] *)
-  one_t = | OneOne 't1
-End
-
-Datatype:
-  (** [no_nested_borrows::EmptyEnum] *)
-  empty_enum_t = | EmptyEnumEmpty
-End
-
-Datatype:
-  (** [no_nested_borrows::Enum] *)
-  enum_t = | EnumVariant1 | EnumVariant2
-End
-
-Type empty_struct_t = “: unit”
-
-Datatype:
-  (** [no_nested_borrows::Sum] *)
-  sum_t = | SumLeft 't1 | SumRight 't2
-End
-
-val neg_test_fwd_def = Define ‘
-  (** [no_nested_borrows::neg_test]: forward function *)
-  neg_test_fwd (x : i32) : i32 result =
-    i32_neg x
-’
-
-val add_test_fwd_def = Define ‘
-  (** [no_nested_borrows::add_test]: forward function *)
-  add_test_fwd (x : u32) (y : u32) : u32 result =
-    u32_add x y
-’
-
-val subs_test_fwd_def = Define ‘
-  (** [no_nested_borrows::subs_test]: forward function *)
-  subs_test_fwd (x : u32) (y : u32) : u32 result =
-    u32_sub x y
-’
-
-val div_test_fwd_def = Define ‘
-  (** [no_nested_borrows::div_test]: forward function *)
-  div_test_fwd (x : u32) (y : u32) : u32 result =
-    u32_div x y
-’
-
-val div_test1_fwd_def = Define ‘
-  (** [no_nested_borrows::div_test1]: forward function *)
-  div_test1_fwd (x : u32) : u32 result =
-    u32_div x (int_to_u32 2)
-’
-
-val rem_test_fwd_def = Define ‘
-  (** [no_nested_borrows::rem_test]: forward function *)
-  rem_test_fwd (x : u32) (y : u32) : u32 result =
-    u32_rem x y
-’
-
-val cast_test_fwd_def = Define ‘
-  (** [no_nested_borrows::cast_test]: forward function *)
-  cast_test_fwd (x : u32) : i32 result =
-    mk_i32 (u32_to_int x)
-’
-
-val test2_fwd_def = Define ‘
-  (** [no_nested_borrows::test2]: forward function *)
-  test2_fwd : unit result =
-    do
-    _ <- u32_add (int_to_u32 23) (int_to_u32 44);
-    Return ()
-    od
-’
-
-(** Unit test for [no_nested_borrows::test2] *)
-val _ = assert_return (“test2_fwd”)
-
-val get_max_fwd_def = Define ‘
-  (** [no_nested_borrows::get_max]: forward function *)
-  get_max_fwd (x : u32) (y : u32) : u32 result =
-    if u32_ge x y then Return x else Return y
-’
-
-val test3_fwd_def = Define ‘
-  (** [no_nested_borrows::test3]: forward function *)
-  test3_fwd : unit result =
-    do
-    x <- get_max_fwd (int_to_u32 4) (int_to_u32 3);
-    y <- get_max_fwd (int_to_u32 10) (int_to_u32 11);
-    z <- u32_add x y;
-    if ~ (z = int_to_u32 15) then Fail Failure else Return ()
-    od
-’
-
-(** Unit test for [no_nested_borrows::test3] *)
-val _ = assert_return (“test3_fwd”)
-
-val test_neg1_fwd_def = Define ‘
-  (** [no_nested_borrows::test_neg1]: forward function *)
-  test_neg1_fwd : unit result =
-    do
-    y <- i32_neg (int_to_i32 3);
-    if ~ (y = int_to_i32 (-3)) then Fail Failure else Return ()
-    od
-’
-
-(** Unit test for [no_nested_borrows::test_neg1] *)
-val _ = assert_return (“test_neg1_fwd”)
-
-val refs_test1_fwd_def = Define ‘
-  (** [no_nested_borrows::refs_test1]: forward function *)
-  refs_test1_fwd : unit result =
-    if ~ (int_to_i32 1 = int_to_i32 1) then Fail Failure else Return ()
-’
-
-(** Unit test for [no_nested_borrows::refs_test1] *)
-val _ = assert_return (“refs_test1_fwd”)
-
-val refs_test2_fwd_def = Define ‘
-  (** [no_nested_borrows::refs_test2]: forward function *)
-  refs_test2_fwd : unit result =
-    if ~ (int_to_i32 2 = int_to_i32 2)
-    then Fail Failure
-    else
-      if ~ (int_to_i32 0 = int_to_i32 0)
-      then Fail Failure
-      else
-        if ~ (int_to_i32 2 = int_to_i32 2)
-        then Fail Failure
-        else
-          if ~ (int_to_i32 2 = int_to_i32 2) then Fail Failure else Return ()
-’
-
-(** Unit test for [no_nested_borrows::refs_test2] *)
-val _ = assert_return (“refs_test2_fwd”)
-
-val test_list1_fwd_def = Define ‘
-  (** [no_nested_borrows::test_list1]: forward function *)
-  test_list1_fwd : unit result =
-    Return ()
-’
-
-(** Unit test for [no_nested_borrows::test_list1] *)
-val _ = assert_return (“test_list1_fwd”)
-
-val test_box1_fwd_def = Define ‘
-  (** [no_nested_borrows::test_box1]: forward function *)
-  test_box1_fwd : unit result =
-    let b = int_to_i32 1 in
-    let x = b in
-    if ~ (x = int_to_i32 1) then Fail Failure else Return ()
-’
-
-(** Unit test for [no_nested_borrows::test_box1] *)
-val _ = assert_return (“test_box1_fwd”)
-
-val copy_int_fwd_def = Define ‘
-  (** [no_nested_borrows::copy_int]: forward function *)
-  copy_int_fwd (x : i32) : i32 result =
-    Return x
-’
-
-val test_unreachable_fwd_def = Define ‘
-  (** [no_nested_borrows::test_unreachable]: forward function *)
-  test_unreachable_fwd (b : bool) : unit result =
-    if b then Fail Failure else Return ()
-’
-
-val test_panic_fwd_def = Define ‘
-  (** [no_nested_borrows::test_panic]: forward function *)
-  test_panic_fwd (b : bool) : unit result =
-    if b then Fail Failure else Return ()
-’
-
-val test_copy_int_fwd_def = Define ‘
-  (** [no_nested_borrows::test_copy_int]: forward function *)
-  test_copy_int_fwd : unit result =
-    do
-    y <- copy_int_fwd (int_to_i32 0);
-    if ~ (int_to_i32 0 = y) then Fail Failure else Return ()
-    od
-’
-
-(** Unit test for [no_nested_borrows::test_copy_int] *)
-val _ = assert_return (“test_copy_int_fwd”)
-
-val is_cons_fwd_def = Define ‘
-  (** [no_nested_borrows::is_cons]: forward function *)
-  is_cons_fwd (l : 't list_t) : bool result =
-    (case l of | ListCons t l0 => Return T | ListNil => Return F)
-’
-
-val test_is_cons_fwd_def = Define ‘
-  (** [no_nested_borrows::test_is_cons]: forward function *)
-  test_is_cons_fwd : unit result =
-    let l = ListNil in
-    do
-    b <- is_cons_fwd (ListCons (int_to_i32 0) l);
-    if ~ b then Fail Failure else Return ()
-    od
-’
-
-(** Unit test for [no_nested_borrows::test_is_cons] *)
-val _ = assert_return (“test_is_cons_fwd”)
-
-val split_list_fwd_def = Define ‘
-  (** [no_nested_borrows::split_list]: forward function *)
-  split_list_fwd (l : 't list_t) : ('t # 't list_t) result =
-    (case l of | ListCons hd tl => Return (hd, tl) | ListNil => Fail Failure)
-’
-
-val test_split_list_fwd_def = Define ‘
-  (** [no_nested_borrows::test_split_list]: forward function *)
-  test_split_list_fwd : unit result =
-    let l = ListNil in
-    do
-    p <- split_list_fwd (ListCons (int_to_i32 0) l);
-    let (hd, _) = p in
-    if ~ (hd = int_to_i32 0) then Fail Failure else Return ()
-    od
-’
-
-(** Unit test for [no_nested_borrows::test_split_list] *)
-val _ = assert_return (“test_split_list_fwd”)
-
-val choose_fwd_def = Define ‘
-  (** [no_nested_borrows::choose]: forward function *)
-  choose_fwd (b : bool) (x : 't) (y : 't) : 't result =
-    if b then Return x else Return y
-’
-
-val choose_back_def = Define ‘
-  (** [no_nested_borrows::choose]: backward function 0 *)
-  choose_back (b : bool) (x : 't) (y : 't) (ret : 't) : ('t # 't) result =
-    if b then Return (ret, y) else Return (x, ret)
-’
-
-val choose_test_fwd_def = Define ‘
-  (** [no_nested_borrows::choose_test]: forward function *)
-  choose_test_fwd : unit result =
-    do
-    z <- choose_fwd T (int_to_i32 0) (int_to_i32 0);
-    z0 <- i32_add z (int_to_i32 1);
-    if ~ (z0 = int_to_i32 1)
-    then Fail Failure
-    else (
-      do
-      (x, y) <- choose_back T (int_to_i32 0) (int_to_i32 0) z0;
-      if ~ (x = int_to_i32 1)
-      then Fail Failure
-      else if ~ (y = int_to_i32 0) then Fail Failure else Return ()
-      od)
-    od
-’
-
-(** Unit test for [no_nested_borrows::choose_test] *)
-val _ = assert_return (“choose_test_fwd”)
-
-val test_char_fwd_def = Define ‘
-  (** [no_nested_borrows::test_char]: forward function *)
-  test_char_fwd : char result =
-    Return #"a"
-’
-
-Datatype:
-  (** [no_nested_borrows::Tree] *)
-  tree_t = | TreeLeaf 't | TreeNode 't node_elem_t tree_t ;
-  
-  (** [no_nested_borrows::NodeElem] *)
-  node_elem_t = | NodeElemCons tree_t node_elem_t | NodeElemNil
-End
-
-val [list_length_fwd_def] = DefineDiv ‘
-  (** [no_nested_borrows::list_length]: forward function *)
-  list_length_fwd (l : 't list_t) : u32 result =
-    (case l of
-    | ListCons t l1 => do
-                       i <- list_length_fwd l1;
-                       u32_add (int_to_u32 1) i
-                       od
-    | ListNil => Return (int_to_u32 0))
-’
-
-val [list_nth_shared_fwd_def] = DefineDiv ‘
-  (** [no_nested_borrows::list_nth_shared]: forward function *)
-  list_nth_shared_fwd (l : 't list_t) (i : u32) : 't result =
-    (case l of
-    | ListCons x tl =>
-      if i = int_to_u32 0
-      then Return x
-      else (do
-            i0 <- u32_sub i (int_to_u32 1);
-            list_nth_shared_fwd tl i0
-            od)
-    | ListNil => Fail Failure)
-’
-
-val [list_nth_mut_fwd_def] = DefineDiv ‘
-  (** [no_nested_borrows::list_nth_mut]: forward function *)
-  list_nth_mut_fwd (l : 't list_t) (i : u32) : 't result =
-    (case l of
-    | ListCons x tl =>
-      if i = int_to_u32 0
-      then Return x
-      else (do
-            i0 <- u32_sub i (int_to_u32 1);
-            list_nth_mut_fwd tl i0
-            od)
-    | ListNil => Fail Failure)
-’
-
-val [list_nth_mut_back_def] = DefineDiv ‘
-  (** [no_nested_borrows::list_nth_mut]: backward function 0 *)
-  list_nth_mut_back (l : 't list_t) (i : u32) (ret : 't) : 't list_t result =
-    (case l of
-    | ListCons x tl =>
-      if i = int_to_u32 0
-      then Return (ListCons ret tl)
-      else (
-        do
-        i0 <- u32_sub i (int_to_u32 1);
-        tl0 <- list_nth_mut_back tl i0 ret;
-        Return (ListCons x tl0)
-        od)
-    | ListNil => Fail Failure)
-’
-
-val [list_rev_aux_fwd_def] = DefineDiv ‘
-  (** [no_nested_borrows::list_rev_aux]: forward function *)
-  list_rev_aux_fwd (li : 't list_t) (lo : 't list_t) : 't list_t result =
-    (case li of
-    | ListCons hd tl => list_rev_aux_fwd tl (ListCons hd lo)
-    | ListNil => Return lo)
-’
-
-val list_rev_fwd_back_def = Define ‘
-  (** [no_nested_borrows::list_rev]: merged forward/backward function
-      (there is a single backward function, and the forward function returns ()) *)
-  list_rev_fwd_back (l : 't list_t) : 't list_t result =
-    let li = mem_replace_fwd l ListNil in list_rev_aux_fwd li ListNil
-’
-
-val test_list_functions_fwd_def = Define ‘
-  (** [no_nested_borrows::test_list_functions]: forward function *)
-  test_list_functions_fwd : unit result =
-    let l = ListNil in
-    let l0 = ListCons (int_to_i32 2) l in
-    let l1 = ListCons (int_to_i32 1) l0 in
-    do
-    i <- list_length_fwd (ListCons (int_to_i32 0) l1);
-    if ~ (i = int_to_u32 3)
-    then Fail Failure
-    else (
-      do
-      i0 <- list_nth_shared_fwd (ListCons (int_to_i32 0) l1) (int_to_u32 0);
-      if ~ (i0 = int_to_i32 0)
-      then Fail Failure
-      else (
-        do
-        i1 <- list_nth_shared_fwd (ListCons (int_to_i32 0) l1) (int_to_u32 1);
-        if ~ (i1 = int_to_i32 1)
-        then Fail Failure
-        else (
-          do
-          i2 <-
-            list_nth_shared_fwd (ListCons (int_to_i32 0) l1) (int_to_u32 2);
-          if ~ (i2 = int_to_i32 2)
-          then Fail Failure
-          else (
-            do
-            ls <-
-              list_nth_mut_back (ListCons (int_to_i32 0) l1) (int_to_u32 1)
-                (int_to_i32 3);
-            i3 <- list_nth_shared_fwd ls (int_to_u32 0);
-            if ~ (i3 = int_to_i32 0)
-            then Fail Failure
-            else (
-              do
-              i4 <- list_nth_shared_fwd ls (int_to_u32 1);
-              if ~ (i4 = int_to_i32 3)
-              then Fail Failure
-              else (
-                do
-                i5 <- list_nth_shared_fwd ls (int_to_u32 2);
-                if ~ (i5 = int_to_i32 2) then Fail Failure else Return ()
-                od)
-              od)
-            od)
-          od)
-        od)
-      od)
-    od
-’
-
-(** Unit test for [no_nested_borrows::test_list_functions] *)
-val _ = assert_return (“test_list_functions_fwd”)
-
-val id_mut_pair1_fwd_def = Define ‘
-  (** [no_nested_borrows::id_mut_pair1]: forward function *)
-  id_mut_pair1_fwd (x : 't1) (y : 't2) : ('t1 # 't2) result =
-    Return (x, y)
-’
-
-val id_mut_pair1_back_def = Define ‘
-  (** [no_nested_borrows::id_mut_pair1]: backward function 0 *)
-  id_mut_pair1_back
-    (x : 't1) (y : 't2) (ret : ('t1 # 't2)) : ('t1 # 't2) result =
-    let (t, t0) = ret in Return (t, t0)
-’
-
-val id_mut_pair2_fwd_def = Define ‘
-  (** [no_nested_borrows::id_mut_pair2]: forward function *)
-  id_mut_pair2_fwd (p : ('t1 # 't2)) : ('t1 # 't2) result =
-    let (t, t0) = p in Return (t, t0)
-’
-
-val id_mut_pair2_back_def = Define ‘
-  (** [no_nested_borrows::id_mut_pair2]: backward function 0 *)
-  id_mut_pair2_back
-    (p : ('t1 # 't2)) (ret : ('t1 # 't2)) : ('t1 # 't2) result =
-    let (t, t0) = ret in Return (t, t0)
-’
-
-val id_mut_pair3_fwd_def = Define ‘
-  (** [no_nested_borrows::id_mut_pair3]: forward function *)
-  id_mut_pair3_fwd (x : 't1) (y : 't2) : ('t1 # 't2) result =
-    Return (x, y)
-’
-
-val id_mut_pair3_back'a_def = Define ‘
-  (** [no_nested_borrows::id_mut_pair3]: backward function 0 *)
-  id_mut_pair3_back'a (x : 't1) (y : 't2) (ret : 't1) : 't1 result =
-    Return ret
-’
-
-val id_mut_pair3_back'b_def = Define ‘
-  (** [no_nested_borrows::id_mut_pair3]: backward function 1 *)
-  id_mut_pair3_back'b (x : 't1) (y : 't2) (ret : 't2) : 't2 result =
-    Return ret
-’
-
-val id_mut_pair4_fwd_def = Define ‘
-  (** [no_nested_borrows::id_mut_pair4]: forward function *)
-  id_mut_pair4_fwd (p : ('t1 # 't2)) : ('t1 # 't2) result =
-    let (t, t0) = p in Return (t, t0)
-’
-
-val id_mut_pair4_back'a_def = Define ‘
-  (** [no_nested_borrows::id_mut_pair4]: backward function 0 *)
-  id_mut_pair4_back'a (p : ('t1 # 't2)) (ret : 't1) : 't1 result =
-    Return ret
-’
-
-val id_mut_pair4_back'b_def = Define ‘
-  (** [no_nested_borrows::id_mut_pair4]: backward function 1 *)
-  id_mut_pair4_back'b (p : ('t1 # 't2)) (ret : 't2) : 't2 result =
-    Return ret
-’
-
-Datatype:
-  (** [no_nested_borrows::StructWithTuple] *)
-  struct_with_tuple_t = <| struct_with_tuple_p : ('t1 # 't2); |>
-End
-
-val new_tuple1_fwd_def = Define ‘
-  (** [no_nested_borrows::new_tuple1]: forward function *)
-  new_tuple1_fwd : (u32, u32) struct_with_tuple_t result =
-    Return (<| struct_with_tuple_p := (int_to_u32 1, int_to_u32 2) |>)
-’
-
-val new_tuple2_fwd_def = Define ‘
-  (** [no_nested_borrows::new_tuple2]: forward function *)
-  new_tuple2_fwd : (i16, i16) struct_with_tuple_t result =
-    Return (<| struct_with_tuple_p := (int_to_i16 1, int_to_i16 2) |>)
-’
-
-val new_tuple3_fwd_def = Define ‘
-  (** [no_nested_borrows::new_tuple3]: forward function *)
-  new_tuple3_fwd : (u64, i64) struct_with_tuple_t result =
-    Return (<| struct_with_tuple_p := (int_to_u64 1, int_to_i64 2) |>)
-’
-
-Datatype:
-  (** [no_nested_borrows::StructWithPair] *)
-  struct_with_pair_t = <| struct_with_pair_p : ('t1, 't2) pair_t; |>
-End
-
-val new_pair1_fwd_def = Define ‘
-  (** [no_nested_borrows::new_pair1]: forward function *)
-  new_pair1_fwd : (u32, u32) struct_with_pair_t result =
-    Return
-    (<|
-       struct_with_pair_p :=
-         (<| pair_x := (int_to_u32 1); pair_y := (int_to_u32 2) |>)
-       |>)
-’
-
-val test_constants_fwd_def = Define ‘
-  (** [no_nested_borrows::test_constants]: forward function *)
-  test_constants_fwd : unit result =
-    do
-    swt <- new_tuple1_fwd;
-    let (i, _) = swt.struct_with_tuple_p in
-    if ~ (i = int_to_u32 1)
-    then Fail Failure
-    else (
-      do
-      swt0 <- new_tuple2_fwd;
-      let (i0, _) = swt0.struct_with_tuple_p in
-      if ~ (i0 = int_to_i16 1)
-      then Fail Failure
-      else (
-        do
-        swt1 <- new_tuple3_fwd;
-        let (i1, _) = swt1.struct_with_tuple_p in
-        if ~ (i1 = int_to_u64 1)
-        then Fail Failure
-        else (
-          do
-          swp <- new_pair1_fwd;
-          if ~ (swp.struct_with_pair_p.pair_x = int_to_u32 1)
-          then Fail Failure
-          else Return ()
-          od)
-        od)
-      od)
-    od
-’
-
-(** Unit test for [no_nested_borrows::test_constants] *)
-val _ = assert_return (“test_constants_fwd”)
-
-val test_weird_borrows1_fwd_def = Define ‘
-  (** [no_nested_borrows::test_weird_borrows1]: forward function *)
-  test_weird_borrows1_fwd : unit result =
-    Return ()
-’
-
-(** Unit test for [no_nested_borrows::test_weird_borrows1] *)
-val _ = assert_return (“test_weird_borrows1_fwd”)
-
-val test_mem_replace_fwd_back_def = Define ‘
-  (** [no_nested_borrows::test_mem_replace]: merged forward/backward function
-      (there is a single backward function, and the forward function returns ()) *)
-  test_mem_replace_fwd_back (px : u32) : u32 result =
-    let y = mem_replace_fwd px (int_to_u32 1) in
-    if ~ (y = int_to_u32 0) then Fail Failure else Return (int_to_u32 2)
-’
-
-val test_shared_borrow_bool1_fwd_def = Define ‘
-  (** [no_nested_borrows::test_shared_borrow_bool1]: forward function *)
-  test_shared_borrow_bool1_fwd (b : bool) : u32 result =
-    if b then Return (int_to_u32 0) else Return (int_to_u32 1)
-’
-
-val test_shared_borrow_bool2_fwd_def = Define ‘
-  (** [no_nested_borrows::test_shared_borrow_bool2]: forward function *)
-  test_shared_borrow_bool2_fwd : u32 result =
-    Return (int_to_u32 0)
-’
-
-val test_shared_borrow_enum1_fwd_def = Define ‘
-  (** [no_nested_borrows::test_shared_borrow_enum1]: forward function *)
-  test_shared_borrow_enum1_fwd (l : u32 list_t) : u32 result =
-    (case l of
-    | ListCons i l0 => Return (int_to_u32 1)
-    | ListNil => Return (int_to_u32 0))
-’
-
-val test_shared_borrow_enum2_fwd_def = Define ‘
-  (** [no_nested_borrows::test_shared_borrow_enum2]: forward function *)
-  test_shared_borrow_enum2_fwd : u32 result =
-    Return (int_to_u32 0)
-’
-
-val _ = export_theory ()
diff --git a/tests/hol4/misc-no_nested_borrows/noNestedBorrowsTheory.sig b/tests/hol4/misc-no_nested_borrows/noNestedBorrowsTheory.sig
deleted file mode 100644
index 67368e38..00000000
--- a/tests/hol4/misc-no_nested_borrows/noNestedBorrowsTheory.sig
+++ /dev/null
@@ -1,1598 +0,0 @@
-signature noNestedBorrowsTheory =
-sig
-  type thm = Thm.thm
-  
-  (*  Definitions  *)
-    val add_test_fwd_def : thm
-    val cast_test_fwd_def : thm
-    val choose_back_def : thm
-    val choose_fwd_def : thm
-    val choose_test_fwd_def : thm
-    val copy_int_fwd_def : thm
-    val div_test1_fwd_def : thm
-    val div_test_fwd_def : thm
-    val empty_enum_t_BIJ : thm
-    val empty_enum_t_CASE : thm
-    val empty_enum_t_TY_DEF : thm
-    val empty_enum_t_size_def : thm
-    val enum_t_BIJ : thm
-    val enum_t_CASE : thm
-    val enum_t_TY_DEF : thm
-    val enum_t_size_def : thm
-    val get_max_fwd_def : thm
-    val id_mut_pair1_back_def : thm
-    val id_mut_pair1_fwd_def : thm
-    val id_mut_pair2_back_def : thm
-    val id_mut_pair2_fwd_def : thm
-    val id_mut_pair3_back'a_def : thm
-    val id_mut_pair3_back'b_def : thm
-    val id_mut_pair3_fwd_def : thm
-    val id_mut_pair4_back'a_def : thm
-    val id_mut_pair4_back'b_def : thm
-    val id_mut_pair4_fwd_def : thm
-    val is_cons_fwd_def : thm
-    val list_length_fwd_def : thm
-    val list_nth_mut_back_def : thm
-    val list_nth_mut_fwd_def : thm
-    val list_nth_shared_fwd_def : thm
-    val list_rev_aux_fwd_def : thm
-    val list_rev_fwd_back_def : thm
-    val list_t_TY_DEF : thm
-    val list_t_case_def : thm
-    val list_t_size_def : thm
-    val neg_test_fwd_def : thm
-    val new_pair1_fwd_def : thm
-    val new_tuple1_fwd_def : thm
-    val new_tuple2_fwd_def : thm
-    val new_tuple3_fwd_def : thm
-    val node_elem_t_TY_DEF : thm
-    val node_elem_t_case_def : thm
-    val one_t_TY_DEF : thm
-    val one_t_case_def : thm
-    val one_t_size_def : thm
-    val pair_t_TY_DEF : thm
-    val pair_t_case_def : thm
-    val pair_t_pair_x : thm
-    val pair_t_pair_x_fupd : thm
-    val pair_t_pair_y : thm
-    val pair_t_pair_y_fupd : thm
-    val pair_t_size_def : thm
-    val refs_test1_fwd_def : thm
-    val refs_test2_fwd_def : thm
-    val rem_test_fwd_def : thm
-    val split_list_fwd_def : thm
-    val struct_with_pair_t_TY_DEF : thm
-    val struct_with_pair_t_case_def : thm
-    val struct_with_pair_t_size_def : thm
-    val struct_with_pair_t_struct_with_pair_p : thm
-    val struct_with_pair_t_struct_with_pair_p_fupd : thm
-    val struct_with_tuple_t_TY_DEF : thm
-    val struct_with_tuple_t_case_def : thm
-    val struct_with_tuple_t_size_def : thm
-    val struct_with_tuple_t_struct_with_tuple_p : thm
-    val struct_with_tuple_t_struct_with_tuple_p_fupd : thm
-    val subs_test_fwd_def : thm
-    val sum_t_TY_DEF : thm
-    val sum_t_case_def : thm
-    val sum_t_size_def : thm
-    val test2_fwd_def : thm
-    val test3_fwd_def : thm
-    val test_box1_fwd_def : thm
-    val test_char_fwd_def : thm
-    val test_constants_fwd_def : thm
-    val test_copy_int_fwd_def : thm
-    val test_is_cons_fwd_def : thm
-    val test_list1_fwd_def : thm
-    val test_list_functions_fwd_def : thm
-    val test_mem_replace_fwd_back_def : thm
-    val test_neg1_fwd_def : thm
-    val test_panic_fwd_def : thm
-    val test_shared_borrow_bool1_fwd_def : thm
-    val test_shared_borrow_bool2_fwd_def : thm
-    val test_shared_borrow_enum1_fwd_def : thm
-    val test_shared_borrow_enum2_fwd_def : thm
-    val test_split_list_fwd_def : thm
-    val test_unreachable_fwd_def : thm
-    val test_weird_borrows1_fwd_def : thm
-    val tree_t_TY_DEF : thm
-    val tree_t_case_def : thm
-    val tree_t_size_def : thm
-  
-  (*  Theorems  *)
-    val EXISTS_pair_t : thm
-    val EXISTS_struct_with_pair_t : thm
-    val EXISTS_struct_with_tuple_t : thm
-    val FORALL_pair_t : thm
-    val FORALL_struct_with_pair_t : thm
-    val FORALL_struct_with_tuple_t : thm
-    val datatype_empty_enum_t : thm
-    val datatype_enum_t : thm
-    val datatype_list_t : thm
-    val datatype_one_t : thm
-    val datatype_pair_t : thm
-    val datatype_struct_with_pair_t : thm
-    val datatype_struct_with_tuple_t : thm
-    val datatype_sum_t : thm
-    val datatype_tree_t : thm
-    val empty_enum_t2num_11 : thm
-    val empty_enum_t2num_ONTO : thm
-    val empty_enum_t2num_num2empty_enum_t : thm
-    val empty_enum_t2num_thm : thm
-    val empty_enum_t_Axiom : thm
-    val empty_enum_t_EQ_empty_enum_t : thm
-    val empty_enum_t_case_cong : thm
-    val empty_enum_t_case_def : thm
-    val empty_enum_t_case_eq : thm
-    val empty_enum_t_induction : thm
-    val empty_enum_t_nchotomy : thm
-    val enum_t2num_11 : thm
-    val enum_t2num_ONTO : thm
-    val enum_t2num_num2enum_t : thm
-    val enum_t2num_thm : thm
-    val enum_t_Axiom : thm
-    val enum_t_EQ_enum_t : thm
-    val enum_t_case_cong : thm
-    val enum_t_case_def : thm
-    val enum_t_case_eq : thm
-    val enum_t_distinct : thm
-    val enum_t_induction : thm
-    val enum_t_nchotomy : thm
-    val list_t_11 : thm
-    val list_t_Axiom : thm
-    val list_t_case_cong : thm
-    val list_t_case_eq : thm
-    val list_t_distinct : thm
-    val list_t_induction : thm
-    val list_t_nchotomy : thm
-    val node_elem_t_11 : thm
-    val node_elem_t_Axiom : thm
-    val node_elem_t_case_cong : thm
-    val node_elem_t_case_eq : thm
-    val node_elem_t_distinct : thm
-    val node_elem_t_induction : thm
-    val node_elem_t_nchotomy : thm
-    val num2empty_enum_t_11 : thm
-    val num2empty_enum_t_ONTO : thm
-    val num2empty_enum_t_empty_enum_t2num : thm
-    val num2empty_enum_t_thm : thm
-    val num2enum_t_11 : thm
-    val num2enum_t_ONTO : thm
-    val num2enum_t_enum_t2num : thm
-    val num2enum_t_thm : thm
-    val one_t_11 : thm
-    val one_t_Axiom : thm
-    val one_t_case_cong : thm
-    val one_t_case_eq : thm
-    val one_t_induction : thm
-    val one_t_nchotomy : thm
-    val pair_t_11 : thm
-    val pair_t_Axiom : thm
-    val pair_t_accessors : thm
-    val pair_t_accfupds : thm
-    val pair_t_case_cong : thm
-    val pair_t_case_eq : thm
-    val pair_t_component_equality : thm
-    val pair_t_fn_updates : thm
-    val pair_t_fupdcanon : thm
-    val pair_t_fupdcanon_comp : thm
-    val pair_t_fupdfupds : thm
-    val pair_t_fupdfupds_comp : thm
-    val pair_t_induction : thm
-    val pair_t_literal_11 : thm
-    val pair_t_literal_nchotomy : thm
-    val pair_t_nchotomy : thm
-    val pair_t_updates_eq_literal : thm
-    val struct_with_pair_t_11 : thm
-    val struct_with_pair_t_Axiom : thm
-    val struct_with_pair_t_accessors : thm
-    val struct_with_pair_t_accfupds : thm
-    val struct_with_pair_t_case_cong : thm
-    val struct_with_pair_t_case_eq : thm
-    val struct_with_pair_t_component_equality : thm
-    val struct_with_pair_t_fn_updates : thm
-    val struct_with_pair_t_fupdfupds : thm
-    val struct_with_pair_t_fupdfupds_comp : thm
-    val struct_with_pair_t_induction : thm
-    val struct_with_pair_t_literal_11 : thm
-    val struct_with_pair_t_literal_nchotomy : thm
-    val struct_with_pair_t_nchotomy : thm
-    val struct_with_pair_t_updates_eq_literal : thm
-    val struct_with_tuple_t_11 : thm
-    val struct_with_tuple_t_Axiom : thm
-    val struct_with_tuple_t_accessors : thm
-    val struct_with_tuple_t_accfupds : thm
-    val struct_with_tuple_t_case_cong : thm
-    val struct_with_tuple_t_case_eq : thm
-    val struct_with_tuple_t_component_equality : thm
-    val struct_with_tuple_t_fn_updates : thm
-    val struct_with_tuple_t_fupdfupds : thm
-    val struct_with_tuple_t_fupdfupds_comp : thm
-    val struct_with_tuple_t_induction : thm
-    val struct_with_tuple_t_literal_11 : thm
-    val struct_with_tuple_t_literal_nchotomy : thm
-    val struct_with_tuple_t_nchotomy : thm
-    val struct_with_tuple_t_updates_eq_literal : thm
-    val sum_t_11 : thm
-    val sum_t_Axiom : thm
-    val sum_t_case_cong : thm
-    val sum_t_case_eq : thm
-    val sum_t_distinct : thm
-    val sum_t_induction : thm
-    val sum_t_nchotomy : thm
-    val tree_t_11 : thm
-    val tree_t_Axiom : thm
-    val tree_t_case_cong : thm
-    val tree_t_case_eq : thm
-    val tree_t_distinct : thm
-    val tree_t_induction : thm
-    val tree_t_nchotomy : thm
-  
-  val noNestedBorrows_grammars : type_grammar.grammar * term_grammar.grammar
-(*
-   [divDef] Parent theory of "noNestedBorrows"
-   
-   [add_test_fwd_def]  Definition
-      
-      ⊢ ∀x y. add_test_fwd x y = u32_add x y
-   
-   [cast_test_fwd_def]  Definition
-      
-      ⊢ ∀x. cast_test_fwd x = mk_i32 (u32_to_int x)
-   
-   [choose_back_def]  Definition
-      
-      ⊢ ∀b x y ret.
-          choose_back b x y ret =
-          if b then Return (ret,y) else Return (x,ret)
-   
-   [choose_fwd_def]  Definition
-      
-      ⊢ ∀b x y. choose_fwd b x y = if b then Return x else Return y
-   
-   [choose_test_fwd_def]  Definition
-      
-      ⊢ choose_test_fwd =
-        do
-          z <- choose_fwd T (int_to_i32 0) (int_to_i32 0);
-          z0 <- i32_add z (int_to_i32 1);
-          if z0 ≠ int_to_i32 1 then Fail Failure
-          else
-            do
-              (x,y) <- choose_back T (int_to_i32 0) (int_to_i32 0) z0;
-              if x ≠ int_to_i32 1 then Fail Failure
-              else if y ≠ int_to_i32 0 then Fail Failure
-              else Return ()
-            od
-        od
-   
-   [copy_int_fwd_def]  Definition
-      
-      ⊢ ∀x. copy_int_fwd x = Return x
-   
-   [div_test1_fwd_def]  Definition
-      
-      ⊢ ∀x. div_test1_fwd x = u32_div x (int_to_u32 2)
-   
-   [div_test_fwd_def]  Definition
-      
-      ⊢ ∀x y. div_test_fwd x y = u32_div x y
-   
-   [empty_enum_t_BIJ]  Definition
-      
-      ⊢ (∀a. num2empty_enum_t (empty_enum_t2num a) = a) ∧
-        ∀r. (λn. n < 1) r ⇔ empty_enum_t2num (num2empty_enum_t r) = r
-   
-   [empty_enum_t_CASE]  Definition
-      
-      ⊢ ∀x v0.
-          (case x of EmptyEnumEmpty => v0) = (λm. v0) (empty_enum_t2num x)
-   
-   [empty_enum_t_TY_DEF]  Definition
-      
-      ⊢ ∃rep. TYPE_DEFINITION (λn. n < 1) rep
-   
-   [empty_enum_t_size_def]  Definition
-      
-      ⊢ ∀x. empty_enum_t_size x = 0
-   
-   [enum_t_BIJ]  Definition
-      
-      ⊢ (∀a. num2enum_t (enum_t2num a) = a) ∧
-        ∀r. (λn. n < 2) r ⇔ enum_t2num (num2enum_t r) = r
-   
-   [enum_t_CASE]  Definition
-      
-      ⊢ ∀x v0 v1.
-          (case x of EnumVariant1 => v0 | EnumVariant2 => v1) =
-          (λm. if m = 0 then v0 else v1) (enum_t2num x)
-   
-   [enum_t_TY_DEF]  Definition
-      
-      ⊢ ∃rep. TYPE_DEFINITION (λn. n < 2) rep
-   
-   [enum_t_size_def]  Definition
-      
-      ⊢ ∀x. enum_t_size x = 0
-   
-   [get_max_fwd_def]  Definition
-      
-      ⊢ ∀x y. get_max_fwd x y = if u32_ge x y then Return x else Return y
-   
-   [id_mut_pair1_back_def]  Definition
-      
-      ⊢ ∀x y ret.
-          id_mut_pair1_back x y ret = (let (t,t0) = ret in Return (t,t0))
-   
-   [id_mut_pair1_fwd_def]  Definition
-      
-      ⊢ ∀x y. id_mut_pair1_fwd x y = Return (x,y)
-   
-   [id_mut_pair2_back_def]  Definition
-      
-      ⊢ ∀p ret.
-          id_mut_pair2_back p ret = (let (t,t0) = ret in Return (t,t0))
-   
-   [id_mut_pair2_fwd_def]  Definition
-      
-      ⊢ ∀p. id_mut_pair2_fwd p = (let (t,t0) = p in Return (t,t0))
-   
-   [id_mut_pair3_back'a_def]  Definition
-      
-      ⊢ ∀x y ret. id_mut_pair3_back'a x y ret = Return ret
-   
-   [id_mut_pair3_back'b_def]  Definition
-      
-      ⊢ ∀x y ret. id_mut_pair3_back'b x y ret = Return ret
-   
-   [id_mut_pair3_fwd_def]  Definition
-      
-      ⊢ ∀x y. id_mut_pair3_fwd x y = Return (x,y)
-   
-   [id_mut_pair4_back'a_def]  Definition
-      
-      ⊢ ∀p ret. id_mut_pair4_back'a p ret = Return ret
-   
-   [id_mut_pair4_back'b_def]  Definition
-      
-      ⊢ ∀p ret. id_mut_pair4_back'b p ret = Return ret
-   
-   [id_mut_pair4_fwd_def]  Definition
-      
-      ⊢ ∀p. id_mut_pair4_fwd p = (let (t,t0) = p in Return (t,t0))
-   
-   [is_cons_fwd_def]  Definition
-      
-      ⊢ ∀l. is_cons_fwd l =
-            case l of ListCons t l0 => Return T | ListNil => Return F
-   
-   [list_length_fwd_def]  Definition
-      
-      ⊢ ∀l. list_length_fwd l =
-            case l of
-              ListCons t l1 =>
-                do i <- list_length_fwd l1; u32_add (int_to_u32 1) i od
-            | ListNil => Return (int_to_u32 0)
-   
-   [list_nth_mut_back_def]  Definition
-      
-      ⊢ ∀l i ret.
-          list_nth_mut_back l i ret =
-          case l of
-            ListCons x tl =>
-              if i = int_to_u32 0 then Return (ListCons ret tl)
-              else
-                do
-                  i0 <- u32_sub i (int_to_u32 1);
-                  tl0 <- list_nth_mut_back tl i0 ret;
-                  Return (ListCons x tl0)
-                od
-          | ListNil => Fail Failure
-   
-   [list_nth_mut_fwd_def]  Definition
-      
-      ⊢ ∀l i.
-          list_nth_mut_fwd l i =
-          case l of
-            ListCons x tl =>
-              if i = int_to_u32 0 then Return x
-              else
-                do
-                  i0 <- u32_sub i (int_to_u32 1);
-                  list_nth_mut_fwd tl i0
-                od
-          | ListNil => Fail Failure
-   
-   [list_nth_shared_fwd_def]  Definition
-      
-      ⊢ ∀l i.
-          list_nth_shared_fwd l i =
-          case l of
-            ListCons x tl =>
-              if i = int_to_u32 0 then Return x
-              else
-                do
-                  i0 <- u32_sub i (int_to_u32 1);
-                  list_nth_shared_fwd tl i0
-                od
-          | ListNil => Fail Failure
-   
-   [list_rev_aux_fwd_def]  Definition
-      
-      ⊢ ∀li lo.
-          list_rev_aux_fwd li lo =
-          case li of
-            ListCons hd tl => list_rev_aux_fwd tl (ListCons hd lo)
-          | ListNil => Return lo
-   
-   [list_rev_fwd_back_def]  Definition
-      
-      ⊢ ∀l. list_rev_fwd_back l =
-            (let
-               li = mem_replace_fwd l ListNil
-             in
-               list_rev_aux_fwd li ListNil)
-   
-   [list_t_TY_DEF]  Definition
-      
-      ⊢ ∃rep.
-          TYPE_DEFINITION
-            (λa0'.
-                 ∀ $var$('list_t').
-                   (∀a0'.
-                      (∃a0 a1.
-                         a0' =
-                         (λa0 a1.
-                              ind_type$CONSTR 0 a0
-                                (ind_type$FCONS a1 (λn. ind_type$BOTTOM)))
-                           a0 a1 ∧ $var$('list_t') a1) ∨
-                      a0' =
-                      ind_type$CONSTR (SUC 0) ARB (λn. ind_type$BOTTOM) ⇒
-                      $var$('list_t') a0') ⇒
-                   $var$('list_t') a0') rep
-   
-   [list_t_case_def]  Definition
-      
-      ⊢ (∀a0 a1 f v. list_t_CASE (ListCons a0 a1) f v = f a0 a1) ∧
-        ∀f v. list_t_CASE ListNil f v = v
-   
-   [list_t_size_def]  Definition
-      
-      ⊢ (∀f a0 a1.
-           list_t_size f (ListCons a0 a1) = 1 + (f a0 + list_t_size f a1)) ∧
-        ∀f. list_t_size f ListNil = 0
-   
-   [neg_test_fwd_def]  Definition
-      
-      ⊢ ∀x. neg_test_fwd x = i32_neg x
-   
-   [new_pair1_fwd_def]  Definition
-      
-      ⊢ new_pair1_fwd =
-        Return
-          <|struct_with_pair_p :=
-              <|pair_x := int_to_u32 1; pair_y := int_to_u32 2|> |>
-   
-   [new_tuple1_fwd_def]  Definition
-      
-      ⊢ new_tuple1_fwd =
-        Return <|struct_with_tuple_p := (int_to_u32 1,int_to_u32 2)|>
-   
-   [new_tuple2_fwd_def]  Definition
-      
-      ⊢ new_tuple2_fwd =
-        Return <|struct_with_tuple_p := (int_to_i16 1,int_to_i16 2)|>
-   
-   [new_tuple3_fwd_def]  Definition
-      
-      ⊢ new_tuple3_fwd =
-        Return <|struct_with_tuple_p := (int_to_u64 1,int_to_i64 2)|>
-   
-   [node_elem_t_TY_DEF]  Definition
-      
-      ⊢ ∃rep.
-          TYPE_DEFINITION
-            (λa1'.
-                 ∀ $var$('tree_t') $var$('node_elem_t').
-                   (∀a0'.
-                      (∃a. a0' =
-                           (λa. ind_type$CONSTR 0 a (λn. ind_type$BOTTOM))
-                             a) ∨
-                      (∃a0 a1 a2.
-                         a0' =
-                         (λa0 a1 a2.
-                              ind_type$CONSTR (SUC 0) a0
-                                (ind_type$FCONS a1
-                                   (ind_type$FCONS a2 (λn. ind_type$BOTTOM))))
-                           a0 a1 a2 ∧ $var$('node_elem_t') a1 ∧
-                         $var$('tree_t') a2) ⇒
-                      $var$('tree_t') a0') ∧
-                   (∀a1'.
-                      (∃a0 a1.
-                         a1' =
-                         (λa0 a1.
-                              ind_type$CONSTR (SUC (SUC 0)) ARB
-                                (ind_type$FCONS a0
-                                   (ind_type$FCONS a1 (λn. ind_type$BOTTOM))))
-                           a0 a1 ∧ $var$('tree_t') a0 ∧
-                         $var$('node_elem_t') a1) ∨
-                      a1' =
-                      ind_type$CONSTR (SUC (SUC (SUC 0))) ARB
-                        (λn. ind_type$BOTTOM) ⇒
-                      $var$('node_elem_t') a1') ⇒
-                   $var$('node_elem_t') a1') rep
-   
-   [node_elem_t_case_def]  Definition
-      
-      ⊢ (∀a0 a1 f v. node_elem_t_CASE (NodeElemCons a0 a1) f v = f a0 a1) ∧
-        ∀f v. node_elem_t_CASE NodeElemNil f v = v
-   
-   [one_t_TY_DEF]  Definition
-      
-      ⊢ ∃rep.
-          TYPE_DEFINITION
-            (λa0.
-                 ∀ $var$('one_t').
-                   (∀a0.
-                      (∃a. a0 =
-                           (λa. ind_type$CONSTR 0 a (λn. ind_type$BOTTOM))
-                             a) ⇒
-                      $var$('one_t') a0) ⇒
-                   $var$('one_t') a0) rep
-   
-   [one_t_case_def]  Definition
-      
-      ⊢ ∀a f. one_t_CASE (OneOne a) f = f a
-   
-   [one_t_size_def]  Definition
-      
-      ⊢ ∀f a. one_t_size f (OneOne a) = 1 + f a
-   
-   [pair_t_TY_DEF]  Definition
-      
-      ⊢ ∃rep.
-          TYPE_DEFINITION
-            (λa0'.
-                 ∀ $var$('pair_t').
-                   (∀a0'.
-                      (∃a0 a1.
-                         a0' =
-                         (λa0 a1.
-                              ind_type$CONSTR 0 (a0,a1)
-                                (λn. ind_type$BOTTOM)) a0 a1) ⇒
-                      $var$('pair_t') a0') ⇒
-                   $var$('pair_t') a0') rep
-   
-   [pair_t_case_def]  Definition
-      
-      ⊢ ∀a0 a1 f. pair_t_CASE (pair_t a0 a1) f = f a0 a1
-   
-   [pair_t_pair_x]  Definition
-      
-      ⊢ ∀t t0. (pair_t t t0).pair_x = t
-   
-   [pair_t_pair_x_fupd]  Definition
-      
-      ⊢ ∀f t t0. pair_t t t0 with pair_x updated_by f = pair_t (f t) t0
-   
-   [pair_t_pair_y]  Definition
-      
-      ⊢ ∀t t0. (pair_t t t0).pair_y = t0
-   
-   [pair_t_pair_y_fupd]  Definition
-      
-      ⊢ ∀f t t0. pair_t t t0 with pair_y updated_by f = pair_t t (f t0)
-   
-   [pair_t_size_def]  Definition
-      
-      ⊢ ∀f f1 a0 a1. pair_t_size f f1 (pair_t a0 a1) = 1 + (f a0 + f1 a1)
-   
-   [refs_test1_fwd_def]  Definition
-      
-      ⊢ refs_test1_fwd =
-        if int_to_i32 1 ≠ int_to_i32 1 then Fail Failure else Return ()
-   
-   [refs_test2_fwd_def]  Definition
-      
-      ⊢ refs_test2_fwd =
-        if int_to_i32 2 ≠ int_to_i32 2 then Fail Failure
-        else if int_to_i32 0 ≠ int_to_i32 0 then Fail Failure
-        else if int_to_i32 2 ≠ int_to_i32 2 then Fail Failure
-        else if int_to_i32 2 ≠ int_to_i32 2 then Fail Failure
-        else Return ()
-   
-   [rem_test_fwd_def]  Definition
-      
-      ⊢ ∀x y. rem_test_fwd x y = u32_rem x y
-   
-   [split_list_fwd_def]  Definition
-      
-      ⊢ ∀l. split_list_fwd l =
-            case l of
-              ListCons hd tl => Return (hd,tl)
-            | ListNil => Fail Failure
-   
-   [struct_with_pair_t_TY_DEF]  Definition
-      
-      ⊢ ∃rep.
-          TYPE_DEFINITION
-            (λa0.
-                 ∀ $var$('struct_with_pair_t').
-                   (∀a0.
-                      (∃a. a0 =
-                           (λa. ind_type$CONSTR 0 a (λn. ind_type$BOTTOM))
-                             a) ⇒
-                      $var$('struct_with_pair_t') a0) ⇒
-                   $var$('struct_with_pair_t') a0) rep
-   
-   [struct_with_pair_t_case_def]  Definition
-      
-      ⊢ ∀a f. struct_with_pair_t_CASE (struct_with_pair_t a) f = f a
-   
-   [struct_with_pair_t_size_def]  Definition
-      
-      ⊢ ∀f f1 a.
-          struct_with_pair_t_size f f1 (struct_with_pair_t a) =
-          1 + pair_t_size f f1 a
-   
-   [struct_with_pair_t_struct_with_pair_p]  Definition
-      
-      ⊢ ∀p. (struct_with_pair_t p).struct_with_pair_p = p
-   
-   [struct_with_pair_t_struct_with_pair_p_fupd]  Definition
-      
-      ⊢ ∀f p.
-          struct_with_pair_t p with struct_with_pair_p updated_by f =
-          struct_with_pair_t (f p)
-   
-   [struct_with_tuple_t_TY_DEF]  Definition
-      
-      ⊢ ∃rep.
-          TYPE_DEFINITION
-            (λa0.
-                 ∀ $var$('struct_with_tuple_t').
-                   (∀a0.
-                      (∃a. a0 =
-                           (λa. ind_type$CONSTR 0 a (λn. ind_type$BOTTOM))
-                             a) ⇒
-                      $var$('struct_with_tuple_t') a0) ⇒
-                   $var$('struct_with_tuple_t') a0) rep
-   
-   [struct_with_tuple_t_case_def]  Definition
-      
-      ⊢ ∀a f. struct_with_tuple_t_CASE (struct_with_tuple_t a) f = f a
-   
-   [struct_with_tuple_t_size_def]  Definition
-      
-      ⊢ ∀f f1 a.
-          struct_with_tuple_t_size f f1 (struct_with_tuple_t a) =
-          1 + pair_size f f1 a
-   
-   [struct_with_tuple_t_struct_with_tuple_p]  Definition
-      
-      ⊢ ∀p. (struct_with_tuple_t p).struct_with_tuple_p = p
-   
-   [struct_with_tuple_t_struct_with_tuple_p_fupd]  Definition
-      
-      ⊢ ∀f p.
-          struct_with_tuple_t p with struct_with_tuple_p updated_by f =
-          struct_with_tuple_t (f p)
-   
-   [subs_test_fwd_def]  Definition
-      
-      ⊢ ∀x y. subs_test_fwd x y = u32_sub x y
-   
-   [sum_t_TY_DEF]  Definition
-      
-      ⊢ ∃rep.
-          TYPE_DEFINITION
-            (λa0.
-                 ∀ $var$('sum_t').
-                   (∀a0.
-                      (∃a. a0 =
-                           (λa.
-                                ind_type$CONSTR 0 (a,ARB)
-                                  (λn. ind_type$BOTTOM)) a) ∨
-                      (∃a. a0 =
-                           (λa.
-                                ind_type$CONSTR (SUC 0) (ARB,a)
-                                  (λn. ind_type$BOTTOM)) a) ⇒
-                      $var$('sum_t') a0) ⇒
-                   $var$('sum_t') a0) rep
-   
-   [sum_t_case_def]  Definition
-      
-      ⊢ (∀a f f1. sum_t_CASE (SumLeft a) f f1 = f a) ∧
-        ∀a f f1. sum_t_CASE (SumRight a) f f1 = f1 a
-   
-   [sum_t_size_def]  Definition
-      
-      ⊢ (∀f f1 a. sum_t_size f f1 (SumLeft a) = 1 + f a) ∧
-        ∀f f1 a. sum_t_size f f1 (SumRight a) = 1 + f1 a
-   
-   [test2_fwd_def]  Definition
-      
-      ⊢ test2_fwd =
-        monad_ignore_bind (u32_add (int_to_u32 23) (int_to_u32 44))
-          (Return ())
-   
-   [test3_fwd_def]  Definition
-      
-      ⊢ test3_fwd =
-        do
-          x <- get_max_fwd (int_to_u32 4) (int_to_u32 3);
-          y <- get_max_fwd (int_to_u32 10) (int_to_u32 11);
-          z <- u32_add x y;
-          if z ≠ int_to_u32 15 then Fail Failure else Return ()
-        od
-   
-   [test_box1_fwd_def]  Definition
-      
-      ⊢ test_box1_fwd =
-        (let
-           b = int_to_i32 1;
-           x = b
-         in
-           if x ≠ int_to_i32 1 then Fail Failure else Return ())
-   
-   [test_char_fwd_def]  Definition
-      
-      ⊢ test_char_fwd = Return #"a"
-   
-   [test_constants_fwd_def]  Definition
-      
-      ⊢ test_constants_fwd =
-        do
-          swt <- new_tuple1_fwd;
-          (i,_) <<- swt.struct_with_tuple_p;
-          if i ≠ int_to_u32 1 then Fail Failure
-          else
-            do
-              swt0 <- new_tuple2_fwd;
-              (i0,_) <<- swt0.struct_with_tuple_p;
-              if i0 ≠ int_to_i16 1 then Fail Failure
-              else
-                do
-                  swt1 <- new_tuple3_fwd;
-                  (i1,_) <<- swt1.struct_with_tuple_p;
-                  if i1 ≠ int_to_u64 1 then Fail Failure
-                  else
-                    do
-                      swp <- new_pair1_fwd;
-                      if swp.struct_with_pair_p.pair_x ≠ int_to_u32 1 then
-                        Fail Failure
-                      else Return ()
-                    od
-                od
-            od
-        od
-   
-   [test_copy_int_fwd_def]  Definition
-      
-      ⊢ test_copy_int_fwd =
-        do
-          y <- copy_int_fwd (int_to_i32 0);
-          if int_to_i32 0 ≠ y then Fail Failure else Return ()
-        od
-   
-   [test_is_cons_fwd_def]  Definition
-      
-      ⊢ test_is_cons_fwd =
-        (let
-           l = ListNil
-         in
-           do
-             b <- is_cons_fwd (ListCons (int_to_i32 0) l);
-             if ¬b then Fail Failure else Return ()
-           od)
-   
-   [test_list1_fwd_def]  Definition
-      
-      ⊢ test_list1_fwd = Return ()
-   
-   [test_list_functions_fwd_def]  Definition
-      
-      ⊢ test_list_functions_fwd =
-        (let
-           l = ListNil;
-           l0 = ListCons (int_to_i32 2) l;
-           l1 = ListCons (int_to_i32 1) l0
-         in
-           do
-             i <- list_length_fwd (ListCons (int_to_i32 0) l1);
-             if i ≠ int_to_u32 3 then Fail Failure
-             else
-               do
-                 i0 <-
-                   list_nth_shared_fwd (ListCons (int_to_i32 0) l1)
-                     (int_to_u32 0);
-                 if i0 ≠ int_to_i32 0 then Fail Failure
-                 else
-                   do
-                     i1 <-
-                       list_nth_shared_fwd (ListCons (int_to_i32 0) l1)
-                         (int_to_u32 1);
-                     if i1 ≠ int_to_i32 1 then Fail Failure
-                     else
-                       do
-                         i2 <-
-                           list_nth_shared_fwd (ListCons (int_to_i32 0) l1)
-                             (int_to_u32 2);
-                         if i2 ≠ int_to_i32 2 then Fail Failure
-                         else
-                           do
-                             ls <-
-                               list_nth_mut_back
-                                 (ListCons (int_to_i32 0) l1)
-                                 (int_to_u32 1) (int_to_i32 3);
-                             i3 <- list_nth_shared_fwd ls (int_to_u32 0);
-                             if i3 ≠ int_to_i32 0 then Fail Failure
-                             else
-                               do
-                                 i4 <-
-                                   list_nth_shared_fwd ls (int_to_u32 1);
-                                 if i4 ≠ int_to_i32 3 then Fail Failure
-                                 else
-                                   do
-                                     i5 <-
-                                       list_nth_shared_fwd ls
-                                         (int_to_u32 2);
-                                     if i5 ≠ int_to_i32 2 then Fail Failure
-                                     else Return ()
-                                   od
-                               od
-                           od
-                       od
-                   od
-               od
-           od)
-   
-   [test_mem_replace_fwd_back_def]  Definition
-      
-      ⊢ ∀px.
-          test_mem_replace_fwd_back px =
-          (let
-             y = mem_replace_fwd px (int_to_u32 1)
-           in
-             if y ≠ int_to_u32 0 then Fail Failure
-             else Return (int_to_u32 2))
-   
-   [test_neg1_fwd_def]  Definition
-      
-      ⊢ test_neg1_fwd =
-        do
-          y <- i32_neg (int_to_i32 3);
-          if y ≠ int_to_i32 (-3) then Fail Failure else Return ()
-        od
-   
-   [test_panic_fwd_def]  Definition
-      
-      ⊢ ∀b. test_panic_fwd b = if b then Fail Failure else Return ()
-   
-   [test_shared_borrow_bool1_fwd_def]  Definition
-      
-      ⊢ ∀b. test_shared_borrow_bool1_fwd b =
-            if b then Return (int_to_u32 0) else Return (int_to_u32 1)
-   
-   [test_shared_borrow_bool2_fwd_def]  Definition
-      
-      ⊢ test_shared_borrow_bool2_fwd = Return (int_to_u32 0)
-   
-   [test_shared_borrow_enum1_fwd_def]  Definition
-      
-      ⊢ ∀l. test_shared_borrow_enum1_fwd l =
-            case l of
-              ListCons i l0 => Return (int_to_u32 1)
-            | ListNil => Return (int_to_u32 0)
-   
-   [test_shared_borrow_enum2_fwd_def]  Definition
-      
-      ⊢ test_shared_borrow_enum2_fwd = Return (int_to_u32 0)
-   
-   [test_split_list_fwd_def]  Definition
-      
-      ⊢ test_split_list_fwd =
-        (let
-           l = ListNil
-         in
-           do
-             p <- split_list_fwd (ListCons (int_to_i32 0) l);
-             (hd,_) <<- p;
-             if hd ≠ int_to_i32 0 then Fail Failure else Return ()
-           od)
-   
-   [test_unreachable_fwd_def]  Definition
-      
-      ⊢ ∀b. test_unreachable_fwd b = if b then Fail Failure else Return ()
-   
-   [test_weird_borrows1_fwd_def]  Definition
-      
-      ⊢ test_weird_borrows1_fwd = Return ()
-   
-   [tree_t_TY_DEF]  Definition
-      
-      ⊢ ∃rep.
-          TYPE_DEFINITION
-            (λa0'.
-                 ∀ $var$('tree_t') $var$('node_elem_t').
-                   (∀a0'.
-                      (∃a. a0' =
-                           (λa. ind_type$CONSTR 0 a (λn. ind_type$BOTTOM))
-                             a) ∨
-                      (∃a0 a1 a2.
-                         a0' =
-                         (λa0 a1 a2.
-                              ind_type$CONSTR (SUC 0) a0
-                                (ind_type$FCONS a1
-                                   (ind_type$FCONS a2 (λn. ind_type$BOTTOM))))
-                           a0 a1 a2 ∧ $var$('node_elem_t') a1 ∧
-                         $var$('tree_t') a2) ⇒
-                      $var$('tree_t') a0') ∧
-                   (∀a1'.
-                      (∃a0 a1.
-                         a1' =
-                         (λa0 a1.
-                              ind_type$CONSTR (SUC (SUC 0)) ARB
-                                (ind_type$FCONS a0
-                                   (ind_type$FCONS a1 (λn. ind_type$BOTTOM))))
-                           a0 a1 ∧ $var$('tree_t') a0 ∧
-                         $var$('node_elem_t') a1) ∨
-                      a1' =
-                      ind_type$CONSTR (SUC (SUC (SUC 0))) ARB
-                        (λn. ind_type$BOTTOM) ⇒
-                      $var$('node_elem_t') a1') ⇒
-                   $var$('tree_t') a0') rep
-   
-   [tree_t_case_def]  Definition
-      
-      ⊢ (∀a f f1. tree_t_CASE (TreeLeaf a) f f1 = f a) ∧
-        ∀a0 a1 a2 f f1. tree_t_CASE (TreeNode a0 a1 a2) f f1 = f1 a0 a1 a2
-   
-   [tree_t_size_def]  Definition
-      
-      ⊢ (∀f a. tree_t_size f (TreeLeaf a) = 1 + f a) ∧
-        (∀f a0 a1 a2.
-           tree_t_size f (TreeNode a0 a1 a2) =
-           1 + (f a0 + (node_elem_t_size f a1 + tree_t_size f a2))) ∧
-        (∀f a0 a1.
-           node_elem_t_size f (NodeElemCons a0 a1) =
-           1 + (tree_t_size f a0 + node_elem_t_size f a1)) ∧
-        ∀f. node_elem_t_size f NodeElemNil = 0
-   
-   [EXISTS_pair_t]  Theorem
-      
-      ⊢ ∀P. (∃p. P p) ⇔ ∃t0 t. P <|pair_x := t0; pair_y := t|>
-   
-   [EXISTS_struct_with_pair_t]  Theorem
-      
-      ⊢ ∀P. (∃s. P s) ⇔ ∃p. P <|struct_with_pair_p := p|>
-   
-   [EXISTS_struct_with_tuple_t]  Theorem
-      
-      ⊢ ∀P. (∃s. P s) ⇔ ∃p. P <|struct_with_tuple_p := p|>
-   
-   [FORALL_pair_t]  Theorem
-      
-      ⊢ ∀P. (∀p. P p) ⇔ ∀t0 t. P <|pair_x := t0; pair_y := t|>
-   
-   [FORALL_struct_with_pair_t]  Theorem
-      
-      ⊢ ∀P. (∀s. P s) ⇔ ∀p. P <|struct_with_pair_p := p|>
-   
-   [FORALL_struct_with_tuple_t]  Theorem
-      
-      ⊢ ∀P. (∀s. P s) ⇔ ∀p. P <|struct_with_tuple_p := p|>
-   
-   [datatype_empty_enum_t]  Theorem
-      
-      ⊢ DATATYPE (empty_enum_t EmptyEnumEmpty)
-   
-   [datatype_enum_t]  Theorem
-      
-      ⊢ DATATYPE (enum_t EnumVariant1 EnumVariant2)
-   
-   [datatype_list_t]  Theorem
-      
-      ⊢ DATATYPE (list_t ListCons ListNil)
-   
-   [datatype_one_t]  Theorem
-      
-      ⊢ DATATYPE (one_t OneOne)
-   
-   [datatype_pair_t]  Theorem
-      
-      ⊢ DATATYPE (record pair_t pair_x pair_y)
-   
-   [datatype_struct_with_pair_t]  Theorem
-      
-      ⊢ DATATYPE (record struct_with_pair_t struct_with_pair_p)
-   
-   [datatype_struct_with_tuple_t]  Theorem
-      
-      ⊢ DATATYPE (record struct_with_tuple_t struct_with_tuple_p)
-   
-   [datatype_sum_t]  Theorem
-      
-      ⊢ DATATYPE (sum_t SumLeft SumRight)
-   
-   [datatype_tree_t]  Theorem
-      
-      ⊢ DATATYPE
-          (tree_t TreeLeaf TreeNode ∧ node_elem_t NodeElemCons NodeElemNil)
-   
-   [empty_enum_t2num_11]  Theorem
-      
-      ⊢ ∀a a'. empty_enum_t2num a = empty_enum_t2num a' ⇔ a = a'
-   
-   [empty_enum_t2num_ONTO]  Theorem
-      
-      ⊢ ∀r. r < 1 ⇔ ∃a. r = empty_enum_t2num a
-   
-   [empty_enum_t2num_num2empty_enum_t]  Theorem
-      
-      ⊢ ∀r. r < 1 ⇔ empty_enum_t2num (num2empty_enum_t r) = r
-   
-   [empty_enum_t2num_thm]  Theorem
-      
-      ⊢ empty_enum_t2num EmptyEnumEmpty = 0
-   
-   [empty_enum_t_Axiom]  Theorem
-      
-      ⊢ ∀x0. ∃f. f EmptyEnumEmpty = x0
-   
-   [empty_enum_t_EQ_empty_enum_t]  Theorem
-      
-      ⊢ ∀a a'. a = a' ⇔ empty_enum_t2num a = empty_enum_t2num a'
-   
-   [empty_enum_t_case_cong]  Theorem
-      
-      ⊢ ∀M M' v0.
-          M = M' ∧ (M' = EmptyEnumEmpty ⇒ v0 = v0') ⇒
-          (case M of EmptyEnumEmpty => v0) =
-          case M' of EmptyEnumEmpty => v0'
-   
-   [empty_enum_t_case_def]  Theorem
-      
-      ⊢ ∀v0. (case EmptyEnumEmpty of EmptyEnumEmpty => v0) = v0
-   
-   [empty_enum_t_case_eq]  Theorem
-      
-      ⊢ (case x of EmptyEnumEmpty => v0) = v ⇔ x = EmptyEnumEmpty ∧ v0 = v
-   
-   [empty_enum_t_induction]  Theorem
-      
-      ⊢ ∀P. P EmptyEnumEmpty ⇒ ∀a. P a
-   
-   [empty_enum_t_nchotomy]  Theorem
-      
-      ⊢ ∀a. a = EmptyEnumEmpty
-   
-   [enum_t2num_11]  Theorem
-      
-      ⊢ ∀a a'. enum_t2num a = enum_t2num a' ⇔ a = a'
-   
-   [enum_t2num_ONTO]  Theorem
-      
-      ⊢ ∀r. r < 2 ⇔ ∃a. r = enum_t2num a
-   
-   [enum_t2num_num2enum_t]  Theorem
-      
-      ⊢ ∀r. r < 2 ⇔ enum_t2num (num2enum_t r) = r
-   
-   [enum_t2num_thm]  Theorem
-      
-      ⊢ enum_t2num EnumVariant1 = 0 ∧ enum_t2num EnumVariant2 = 1
-   
-   [enum_t_Axiom]  Theorem
-      
-      ⊢ ∀x0 x1. ∃f. f EnumVariant1 = x0 ∧ f EnumVariant2 = x1
-   
-   [enum_t_EQ_enum_t]  Theorem
-      
-      ⊢ ∀a a'. a = a' ⇔ enum_t2num a = enum_t2num a'
-   
-   [enum_t_case_cong]  Theorem
-      
-      ⊢ ∀M M' v0 v1.
-          M = M' ∧ (M' = EnumVariant1 ⇒ v0 = v0') ∧
-          (M' = EnumVariant2 ⇒ v1 = v1') ⇒
-          (case M of EnumVariant1 => v0 | EnumVariant2 => v1) =
-          case M' of EnumVariant1 => v0' | EnumVariant2 => v1'
-   
-   [enum_t_case_def]  Theorem
-      
-      ⊢ (∀v0 v1.
-           (case EnumVariant1 of EnumVariant1 => v0 | EnumVariant2 => v1) =
-           v0) ∧
-        ∀v0 v1.
-          (case EnumVariant2 of EnumVariant1 => v0 | EnumVariant2 => v1) =
-          v1
-   
-   [enum_t_case_eq]  Theorem
-      
-      ⊢ (case x of EnumVariant1 => v0 | EnumVariant2 => v1) = v ⇔
-        x = EnumVariant1 ∧ v0 = v ∨ x = EnumVariant2 ∧ v1 = v
-   
-   [enum_t_distinct]  Theorem
-      
-      ⊢ EnumVariant1 ≠ EnumVariant2
-   
-   [enum_t_induction]  Theorem
-      
-      ⊢ ∀P. P EnumVariant1 ∧ P EnumVariant2 ⇒ ∀a. P a
-   
-   [enum_t_nchotomy]  Theorem
-      
-      ⊢ ∀a. a = EnumVariant1 ∨ a = EnumVariant2
-   
-   [list_t_11]  Theorem
-      
-      ⊢ ∀a0 a1 a0' a1'.
-          ListCons a0 a1 = ListCons a0' a1' ⇔ a0 = a0' ∧ a1 = a1'
-   
-   [list_t_Axiom]  Theorem
-      
-      ⊢ ∀f0 f1. ∃fn.
-          (∀a0 a1. fn (ListCons a0 a1) = f0 a0 a1 (fn a1)) ∧
-          fn ListNil = f1
-   
-   [list_t_case_cong]  Theorem
-      
-      ⊢ ∀M M' f v.
-          M = M' ∧ (∀a0 a1. M' = ListCons a0 a1 ⇒ f a0 a1 = f' a0 a1) ∧
-          (M' = ListNil ⇒ v = v') ⇒
-          list_t_CASE M f v = list_t_CASE M' f' v'
-   
-   [list_t_case_eq]  Theorem
-      
-      ⊢ list_t_CASE x f v = v' ⇔
-        (∃t l. x = ListCons t l ∧ f t l = v') ∨ x = ListNil ∧ v = v'
-   
-   [list_t_distinct]  Theorem
-      
-      ⊢ ∀a1 a0. ListCons a0 a1 ≠ ListNil
-   
-   [list_t_induction]  Theorem
-      
-      ⊢ ∀P. (∀l. P l ⇒ ∀t. P (ListCons t l)) ∧ P ListNil ⇒ ∀l. P l
-   
-   [list_t_nchotomy]  Theorem
-      
-      ⊢ ∀ll. (∃t l. ll = ListCons t l) ∨ ll = ListNil
-   
-   [node_elem_t_11]  Theorem
-      
-      ⊢ ∀a0 a1 a0' a1'.
-          NodeElemCons a0 a1 = NodeElemCons a0' a1' ⇔ a0 = a0' ∧ a1 = a1'
-   
-   [node_elem_t_Axiom]  Theorem
-      
-      ⊢ ∀f0 f1 f2 f3. ∃fn0 fn1.
-          (∀a. fn0 (TreeLeaf a) = f0 a) ∧
-          (∀a0 a1 a2.
-             fn0 (TreeNode a0 a1 a2) = f1 a0 a1 a2 (fn1 a1) (fn0 a2)) ∧
-          (∀a0 a1. fn1 (NodeElemCons a0 a1) = f2 a0 a1 (fn0 a0) (fn1 a1)) ∧
-          fn1 NodeElemNil = f3
-   
-   [node_elem_t_case_cong]  Theorem
-      
-      ⊢ ∀M M' f v.
-          M = M' ∧ (∀a0 a1. M' = NodeElemCons a0 a1 ⇒ f a0 a1 = f' a0 a1) ∧
-          (M' = NodeElemNil ⇒ v = v') ⇒
-          node_elem_t_CASE M f v = node_elem_t_CASE M' f' v'
-   
-   [node_elem_t_case_eq]  Theorem
-      
-      ⊢ node_elem_t_CASE x f v = v' ⇔
-        (∃t n. x = NodeElemCons t n ∧ f t n = v') ∨
-        x = NodeElemNil ∧ v = v'
-   
-   [node_elem_t_distinct]  Theorem
-      
-      ⊢ ∀a1 a0. NodeElemCons a0 a1 ≠ NodeElemNil
-   
-   [node_elem_t_induction]  Theorem
-      
-      ⊢ ∀P0 P1.
-          (∀t. P0 (TreeLeaf t)) ∧
-          (∀n t. P1 n ∧ P0 t ⇒ ∀t0. P0 (TreeNode t0 n t)) ∧
-          (∀t n. P0 t ∧ P1 n ⇒ P1 (NodeElemCons t n)) ∧ P1 NodeElemNil ⇒
-          (∀t. P0 t) ∧ ∀n. P1 n
-   
-   [node_elem_t_nchotomy]  Theorem
-      
-      ⊢ ∀nn. (∃t n. nn = NodeElemCons t n) ∨ nn = NodeElemNil
-   
-   [num2empty_enum_t_11]  Theorem
-      
-      ⊢ ∀r r'.
-          r < 1 ⇒
-          r' < 1 ⇒
-          (num2empty_enum_t r = num2empty_enum_t r' ⇔ r = r')
-   
-   [num2empty_enum_t_ONTO]  Theorem
-      
-      ⊢ ∀a. ∃r. a = num2empty_enum_t r ∧ r < 1
-   
-   [num2empty_enum_t_empty_enum_t2num]  Theorem
-      
-      ⊢ ∀a. num2empty_enum_t (empty_enum_t2num a) = a
-   
-   [num2empty_enum_t_thm]  Theorem
-      
-      ⊢ num2empty_enum_t 0 = EmptyEnumEmpty
-   
-   [num2enum_t_11]  Theorem
-      
-      ⊢ ∀r r'. r < 2 ⇒ r' < 2 ⇒ (num2enum_t r = num2enum_t r' ⇔ r = r')
-   
-   [num2enum_t_ONTO]  Theorem
-      
-      ⊢ ∀a. ∃r. a = num2enum_t r ∧ r < 2
-   
-   [num2enum_t_enum_t2num]  Theorem
-      
-      ⊢ ∀a. num2enum_t (enum_t2num a) = a
-   
-   [num2enum_t_thm]  Theorem
-      
-      ⊢ num2enum_t 0 = EnumVariant1 ∧ num2enum_t 1 = EnumVariant2
-   
-   [one_t_11]  Theorem
-      
-      ⊢ ∀a a'. OneOne a = OneOne a' ⇔ a = a'
-   
-   [one_t_Axiom]  Theorem
-      
-      ⊢ ∀f. ∃fn. ∀a. fn (OneOne a) = f a
-   
-   [one_t_case_cong]  Theorem
-      
-      ⊢ ∀M M' f.
-          M = M' ∧ (∀a. M' = OneOne a ⇒ f a = f' a) ⇒
-          one_t_CASE M f = one_t_CASE M' f'
-   
-   [one_t_case_eq]  Theorem
-      
-      ⊢ one_t_CASE x f = v ⇔ ∃t. x = OneOne t ∧ f t = v
-   
-   [one_t_induction]  Theorem
-      
-      ⊢ ∀P. (∀t. P (OneOne t)) ⇒ ∀ $o. P $o
-   
-   [one_t_nchotomy]  Theorem
-      
-      ⊢ ∀oo. ∃t. oo = OneOne t
-   
-   [pair_t_11]  Theorem
-      
-      ⊢ ∀a0 a1 a0' a1'. pair_t a0 a1 = pair_t a0' a1' ⇔ a0 = a0' ∧ a1 = a1'
-   
-   [pair_t_Axiom]  Theorem
-      
-      ⊢ ∀f. ∃fn. ∀a0 a1. fn (pair_t a0 a1) = f a0 a1
-   
-   [pair_t_accessors]  Theorem
-      
-      ⊢ (∀t t0. (pair_t t t0).pair_x = t) ∧
-        ∀t t0. (pair_t t t0).pair_y = t0
-   
-   [pair_t_accfupds]  Theorem
-      
-      ⊢ (∀p f. (p with pair_y updated_by f).pair_x = p.pair_x) ∧
-        (∀p f. (p with pair_x updated_by f).pair_y = p.pair_y) ∧
-        (∀p f. (p with pair_x updated_by f).pair_x = f p.pair_x) ∧
-        ∀p f. (p with pair_y updated_by f).pair_y = f p.pair_y
-   
-   [pair_t_case_cong]  Theorem
-      
-      ⊢ ∀M M' f.
-          M = M' ∧ (∀a0 a1. M' = pair_t a0 a1 ⇒ f a0 a1 = f' a0 a1) ⇒
-          pair_t_CASE M f = pair_t_CASE M' f'
-   
-   [pair_t_case_eq]  Theorem
-      
-      ⊢ pair_t_CASE x f = v ⇔ ∃t t0. x = pair_t t t0 ∧ f t t0 = v
-   
-   [pair_t_component_equality]  Theorem
-      
-      ⊢ ∀p1 p2. p1 = p2 ⇔ p1.pair_x = p2.pair_x ∧ p1.pair_y = p2.pair_y
-   
-   [pair_t_fn_updates]  Theorem
-      
-      ⊢ (∀f t t0. pair_t t t0 with pair_x updated_by f = pair_t (f t) t0) ∧
-        ∀f t t0. pair_t t t0 with pair_y updated_by f = pair_t t (f t0)
-   
-   [pair_t_fupdcanon]  Theorem
-      
-      ⊢ ∀p g f.
-          p with <|pair_y updated_by f; pair_x updated_by g|> =
-          p with <|pair_x updated_by g; pair_y updated_by f|>
-   
-   [pair_t_fupdcanon_comp]  Theorem
-      
-      ⊢ (∀g f.
-           pair_y_fupd f ∘ pair_x_fupd g = pair_x_fupd g ∘ pair_y_fupd f) ∧
-        ∀h g f.
-          pair_y_fupd f ∘ pair_x_fupd g ∘ h =
-          pair_x_fupd g ∘ pair_y_fupd f ∘ h
-   
-   [pair_t_fupdfupds]  Theorem
-      
-      ⊢ (∀p g f.
-           p with <|pair_x updated_by f; pair_x updated_by g|> =
-           p with pair_x updated_by f ∘ g) ∧
-        ∀p g f.
-          p with <|pair_y updated_by f; pair_y updated_by g|> =
-          p with pair_y updated_by f ∘ g
-   
-   [pair_t_fupdfupds_comp]  Theorem
-      
-      ⊢ ((∀g f. pair_x_fupd f ∘ pair_x_fupd g = pair_x_fupd (f ∘ g)) ∧
-         ∀h g f.
-           pair_x_fupd f ∘ pair_x_fupd g ∘ h = pair_x_fupd (f ∘ g) ∘ h) ∧
-        (∀g f. pair_y_fupd f ∘ pair_y_fupd g = pair_y_fupd (f ∘ g)) ∧
-        ∀h g f. pair_y_fupd f ∘ pair_y_fupd g ∘ h = pair_y_fupd (f ∘ g) ∘ h
-   
-   [pair_t_induction]  Theorem
-      
-      ⊢ ∀P. (∀t t0. P (pair_t t t0)) ⇒ ∀p. P p
-   
-   [pair_t_literal_11]  Theorem
-      
-      ⊢ ∀t01 t1 t02 t2.
-          <|pair_x := t01; pair_y := t1|> = <|pair_x := t02; pair_y := t2|> ⇔
-          t01 = t02 ∧ t1 = t2
-   
-   [pair_t_literal_nchotomy]  Theorem
-      
-      ⊢ ∀p. ∃t0 t. p = <|pair_x := t0; pair_y := t|>
-   
-   [pair_t_nchotomy]  Theorem
-      
-      ⊢ ∀pp. ∃t t0. pp = pair_t t t0
-   
-   [pair_t_updates_eq_literal]  Theorem
-      
-      ⊢ ∀p t0 t.
-          p with <|pair_x := t0; pair_y := t|> =
-          <|pair_x := t0; pair_y := t|>
-   
-   [struct_with_pair_t_11]  Theorem
-      
-      ⊢ ∀a a'. struct_with_pair_t a = struct_with_pair_t a' ⇔ a = a'
-   
-   [struct_with_pair_t_Axiom]  Theorem
-      
-      ⊢ ∀f. ∃fn. ∀a. fn (struct_with_pair_t a) = f a
-   
-   [struct_with_pair_t_accessors]  Theorem
-      
-      ⊢ ∀p. (struct_with_pair_t p).struct_with_pair_p = p
-   
-   [struct_with_pair_t_accfupds]  Theorem
-      
-      ⊢ ∀s f.
-          (s with struct_with_pair_p updated_by f).struct_with_pair_p =
-          f s.struct_with_pair_p
-   
-   [struct_with_pair_t_case_cong]  Theorem
-      
-      ⊢ ∀M M' f.
-          M = M' ∧ (∀a. M' = struct_with_pair_t a ⇒ f a = f' a) ⇒
-          struct_with_pair_t_CASE M f = struct_with_pair_t_CASE M' f'
-   
-   [struct_with_pair_t_case_eq]  Theorem
-      
-      ⊢ struct_with_pair_t_CASE x f = v ⇔
-        ∃p. x = struct_with_pair_t p ∧ f p = v
-   
-   [struct_with_pair_t_component_equality]  Theorem
-      
-      ⊢ ∀s1 s2. s1 = s2 ⇔ s1.struct_with_pair_p = s2.struct_with_pair_p
-   
-   [struct_with_pair_t_fn_updates]  Theorem
-      
-      ⊢ ∀f p.
-          struct_with_pair_t p with struct_with_pair_p updated_by f =
-          struct_with_pair_t (f p)
-   
-   [struct_with_pair_t_fupdfupds]  Theorem
-      
-      ⊢ ∀s g f.
-          s with
-          <|struct_with_pair_p updated_by f;
-            struct_with_pair_p updated_by g|> =
-          s with struct_with_pair_p updated_by f ∘ g
-   
-   [struct_with_pair_t_fupdfupds_comp]  Theorem
-      
-      ⊢ (∀g f.
-           struct_with_pair_p_fupd f ∘ struct_with_pair_p_fupd g =
-           struct_with_pair_p_fupd (f ∘ g)) ∧
-        ∀h g f.
-          struct_with_pair_p_fupd f ∘ struct_with_pair_p_fupd g ∘ h =
-          struct_with_pair_p_fupd (f ∘ g) ∘ h
-   
-   [struct_with_pair_t_induction]  Theorem
-      
-      ⊢ ∀P. (∀p. P (struct_with_pair_t p)) ⇒ ∀s. P s
-   
-   [struct_with_pair_t_literal_11]  Theorem
-      
-      ⊢ ∀p1 p2.
-          <|struct_with_pair_p := p1|> = <|struct_with_pair_p := p2|> ⇔
-          p1 = p2
-   
-   [struct_with_pair_t_literal_nchotomy]  Theorem
-      
-      ⊢ ∀s. ∃p. s = <|struct_with_pair_p := p|>
-   
-   [struct_with_pair_t_nchotomy]  Theorem
-      
-      ⊢ ∀ss. ∃p. ss = struct_with_pair_t p
-   
-   [struct_with_pair_t_updates_eq_literal]  Theorem
-      
-      ⊢ ∀s p. s with struct_with_pair_p := p = <|struct_with_pair_p := p|>
-   
-   [struct_with_tuple_t_11]  Theorem
-      
-      ⊢ ∀a a'. struct_with_tuple_t a = struct_with_tuple_t a' ⇔ a = a'
-   
-   [struct_with_tuple_t_Axiom]  Theorem
-      
-      ⊢ ∀f. ∃fn. ∀a. fn (struct_with_tuple_t a) = f a
-   
-   [struct_with_tuple_t_accessors]  Theorem
-      
-      ⊢ ∀p. (struct_with_tuple_t p).struct_with_tuple_p = p
-   
-   [struct_with_tuple_t_accfupds]  Theorem
-      
-      ⊢ ∀s f.
-          (s with struct_with_tuple_p updated_by f).struct_with_tuple_p =
-          f s.struct_with_tuple_p
-   
-   [struct_with_tuple_t_case_cong]  Theorem
-      
-      ⊢ ∀M M' f.
-          M = M' ∧ (∀a. M' = struct_with_tuple_t a ⇒ f a = f' a) ⇒
-          struct_with_tuple_t_CASE M f = struct_with_tuple_t_CASE M' f'
-   
-   [struct_with_tuple_t_case_eq]  Theorem
-      
-      ⊢ struct_with_tuple_t_CASE x f = v ⇔
-        ∃p. x = struct_with_tuple_t p ∧ f p = v
-   
-   [struct_with_tuple_t_component_equality]  Theorem
-      
-      ⊢ ∀s1 s2. s1 = s2 ⇔ s1.struct_with_tuple_p = s2.struct_with_tuple_p
-   
-   [struct_with_tuple_t_fn_updates]  Theorem
-      
-      ⊢ ∀f p.
-          struct_with_tuple_t p with struct_with_tuple_p updated_by f =
-          struct_with_tuple_t (f p)
-   
-   [struct_with_tuple_t_fupdfupds]  Theorem
-      
-      ⊢ ∀s g f.
-          s with
-          <|struct_with_tuple_p updated_by f;
-            struct_with_tuple_p updated_by g|> =
-          s with struct_with_tuple_p updated_by f ∘ g
-   
-   [struct_with_tuple_t_fupdfupds_comp]  Theorem
-      
-      ⊢ (∀g f.
-           struct_with_tuple_p_fupd f ∘ struct_with_tuple_p_fupd g =
-           struct_with_tuple_p_fupd (f ∘ g)) ∧
-        ∀h g f.
-          struct_with_tuple_p_fupd f ∘ struct_with_tuple_p_fupd g ∘ h =
-          struct_with_tuple_p_fupd (f ∘ g) ∘ h
-   
-   [struct_with_tuple_t_induction]  Theorem
-      
-      ⊢ ∀P. (∀p. P (struct_with_tuple_t p)) ⇒ ∀s. P s
-   
-   [struct_with_tuple_t_literal_11]  Theorem
-      
-      ⊢ ∀p1 p2.
-          <|struct_with_tuple_p := p1|> = <|struct_with_tuple_p := p2|> ⇔
-          p1 = p2
-   
-   [struct_with_tuple_t_literal_nchotomy]  Theorem
-      
-      ⊢ ∀s. ∃p. s = <|struct_with_tuple_p := p|>
-   
-   [struct_with_tuple_t_nchotomy]  Theorem
-      
-      ⊢ ∀ss. ∃p. ss = struct_with_tuple_t p
-   
-   [struct_with_tuple_t_updates_eq_literal]  Theorem
-      
-      ⊢ ∀s p.
-          s with struct_with_tuple_p := p = <|struct_with_tuple_p := p|>
-   
-   [sum_t_11]  Theorem
-      
-      ⊢ (∀a a'. SumLeft a = SumLeft a' ⇔ a = a') ∧
-        ∀a a'. SumRight a = SumRight a' ⇔ a = a'
-   
-   [sum_t_Axiom]  Theorem
-      
-      ⊢ ∀f0 f1. ∃fn.
-          (∀a. fn (SumLeft a) = f0 a) ∧ ∀a. fn (SumRight a) = f1 a
-   
-   [sum_t_case_cong]  Theorem
-      
-      ⊢ ∀M M' f f1.
-          M = M' ∧ (∀a. M' = SumLeft a ⇒ f a = f' a) ∧
-          (∀a. M' = SumRight a ⇒ f1 a = f1' a) ⇒
-          sum_t_CASE M f f1 = sum_t_CASE M' f' f1'
-   
-   [sum_t_case_eq]  Theorem
-      
-      ⊢ sum_t_CASE x f f1 = v ⇔
-        (∃t. x = SumLeft t ∧ f t = v) ∨ ∃t. x = SumRight t ∧ f1 t = v
-   
-   [sum_t_distinct]  Theorem
-      
-      ⊢ ∀a' a. SumLeft a ≠ SumRight a'
-   
-   [sum_t_induction]  Theorem
-      
-      ⊢ ∀P. (∀t. P (SumLeft t)) ∧ (∀t. P (SumRight t)) ⇒ ∀s. P s
-   
-   [sum_t_nchotomy]  Theorem
-      
-      ⊢ ∀ss. (∃t. ss = SumLeft t) ∨ ∃t. ss = SumRight t
-   
-   [tree_t_11]  Theorem
-      
-      ⊢ (∀a a'. TreeLeaf a = TreeLeaf a' ⇔ a = a') ∧
-        ∀a0 a1 a2 a0' a1' a2'.
-          TreeNode a0 a1 a2 = TreeNode a0' a1' a2' ⇔
-          a0 = a0' ∧ a1 = a1' ∧ a2 = a2'
-   
-   [tree_t_Axiom]  Theorem
-      
-      ⊢ ∀f0 f1 f2 f3. ∃fn0 fn1.
-          (∀a. fn0 (TreeLeaf a) = f0 a) ∧
-          (∀a0 a1 a2.
-             fn0 (TreeNode a0 a1 a2) = f1 a0 a1 a2 (fn1 a1) (fn0 a2)) ∧
-          (∀a0 a1. fn1 (NodeElemCons a0 a1) = f2 a0 a1 (fn0 a0) (fn1 a1)) ∧
-          fn1 NodeElemNil = f3
-   
-   [tree_t_case_cong]  Theorem
-      
-      ⊢ ∀M M' f f1.
-          M = M' ∧ (∀a. M' = TreeLeaf a ⇒ f a = f' a) ∧
-          (∀a0 a1 a2. M' = TreeNode a0 a1 a2 ⇒ f1 a0 a1 a2 = f1' a0 a1 a2) ⇒
-          tree_t_CASE M f f1 = tree_t_CASE M' f' f1'
-   
-   [tree_t_case_eq]  Theorem
-      
-      ⊢ tree_t_CASE x f f1 = v ⇔
-        (∃t. x = TreeLeaf t ∧ f t = v) ∨
-        ∃t0 n t. x = TreeNode t0 n t ∧ f1 t0 n t = v
-   
-   [tree_t_distinct]  Theorem
-      
-      ⊢ ∀a2 a1 a0 a. TreeLeaf a ≠ TreeNode a0 a1 a2
-   
-   [tree_t_induction]  Theorem
-      
-      ⊢ ∀P0 P1.
-          (∀t. P0 (TreeLeaf t)) ∧
-          (∀n t. P1 n ∧ P0 t ⇒ ∀t0. P0 (TreeNode t0 n t)) ∧
-          (∀t n. P0 t ∧ P1 n ⇒ P1 (NodeElemCons t n)) ∧ P1 NodeElemNil ⇒
-          (∀t. P0 t) ∧ ∀n. P1 n
-   
-   [tree_t_nchotomy]  Theorem
-      
-      ⊢ ∀tt. (∃t. tt = TreeLeaf t) ∨ ∃t0 n t. tt = TreeNode t0 n t
-   
-   
-*)
-end
diff --git a/tests/hol4/misc-paper/Holmakefile b/tests/hol4/misc-paper/Holmakefile
deleted file mode 100644
index 3c4b8973..00000000
--- a/tests/hol4/misc-paper/Holmakefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# This file was automatically generated - modify ../Holmakefile.template instead
-INCLUDES =  ../../../backends/hol4
-
-all: $(DEFAULT_TARGETS)
-.PHONY: all
diff --git a/tests/hol4/misc-paper/paperScript.sml b/tests/hol4/misc-paper/paperScript.sml
deleted file mode 100644
index 3ac5b6ca..00000000
--- a/tests/hol4/misc-paper/paperScript.sml
+++ /dev/null
@@ -1,136 +0,0 @@
-(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
-(** [paper] *)
-open primitivesLib divDefLib
-
-val _ = new_theory "paper"
-
-
-val ref_incr_fwd_back_def = Define ‘
-  (** [paper::ref_incr]: merged forward/backward function
-      (there is a single backward function, and the forward function returns ()) *)
-  ref_incr_fwd_back (x : i32) : i32 result =
-    i32_add x (int_to_i32 1)
-’
-
-val test_incr_fwd_def = Define ‘
-  (** [paper::test_incr]: forward function *)
-  test_incr_fwd : unit result =
-    do
-    x <- ref_incr_fwd_back (int_to_i32 0);
-    if ~ (x = int_to_i32 1) then Fail Failure else Return ()
-    od
-’
-
-(** Unit test for [paper::test_incr] *)
-val _ = assert_return (“test_incr_fwd”)
-
-val choose_fwd_def = Define ‘
-  (** [paper::choose]: forward function *)
-  choose_fwd (b : bool) (x : 't) (y : 't) : 't result =
-    if b then Return x else Return y
-’
-
-val choose_back_def = Define ‘
-  (** [paper::choose]: backward function 0 *)
-  choose_back (b : bool) (x : 't) (y : 't) (ret : 't) : ('t # 't) result =
-    if b then Return (ret, y) else Return (x, ret)
-’
-
-val test_choose_fwd_def = Define ‘
-  (** [paper::test_choose]: forward function *)
-  test_choose_fwd : unit result =
-    do
-    z <- choose_fwd T (int_to_i32 0) (int_to_i32 0);
-    z0 <- i32_add z (int_to_i32 1);
-    if ~ (z0 = int_to_i32 1)
-    then Fail Failure
-    else (
-      do
-      (x, y) <- choose_back T (int_to_i32 0) (int_to_i32 0) z0;
-      if ~ (x = int_to_i32 1)
-      then Fail Failure
-      else if ~ (y = int_to_i32 0) then Fail Failure else Return ()
-      od)
-    od
-’
-
-(** Unit test for [paper::test_choose] *)
-val _ = assert_return (“test_choose_fwd”)
-
-Datatype:
-  (** [paper::List] *)
-  list_t = | ListCons 't list_t | ListNil
-End
-
-val [list_nth_mut_fwd_def] = DefineDiv ‘
-  (** [paper::list_nth_mut]: forward function *)
-  list_nth_mut_fwd (l : 't list_t) (i : u32) : 't result =
-    (case l of
-    | ListCons x tl =>
-      if i = int_to_u32 0
-      then Return x
-      else (do
-            i0 <- u32_sub i (int_to_u32 1);
-            list_nth_mut_fwd tl i0
-            od)
-    | ListNil => Fail Failure)
-’
-
-val [list_nth_mut_back_def] = DefineDiv ‘
-  (** [paper::list_nth_mut]: backward function 0 *)
-  list_nth_mut_back (l : 't list_t) (i : u32) (ret : 't) : 't list_t result =
-    (case l of
-    | ListCons x tl =>
-      if i = int_to_u32 0
-      then Return (ListCons ret tl)
-      else (
-        do
-        i0 <- u32_sub i (int_to_u32 1);
-        tl0 <- list_nth_mut_back tl i0 ret;
-        Return (ListCons x tl0)
-        od)
-    | ListNil => Fail Failure)
-’
-
-val [sum_fwd_def] = DefineDiv ‘
-  (** [paper::sum]: forward function *)
-  sum_fwd (l : i32 list_t) : i32 result =
-    (case l of
-    | ListCons x tl => do
-                       i <- sum_fwd tl;
-                       i32_add x i
-                       od
-    | ListNil => Return (int_to_i32 0))
-’
-
-val test_nth_fwd_def = Define ‘
-  (** [paper::test_nth]: forward function *)
-  test_nth_fwd : unit result =
-    let l = ListNil in
-    let l0 = ListCons (int_to_i32 3) l in
-    let l1 = ListCons (int_to_i32 2) l0 in
-    do
-    x <- list_nth_mut_fwd (ListCons (int_to_i32 1) l1) (int_to_u32 2);
-    x0 <- i32_add x (int_to_i32 1);
-    l2 <- list_nth_mut_back (ListCons (int_to_i32 1) l1) (int_to_u32 2) x0;
-    i <- sum_fwd l2;
-    if ~ (i = int_to_i32 7) then Fail Failure else Return ()
-    od
-’
-
-(** Unit test for [paper::test_nth] *)
-val _ = assert_return (“test_nth_fwd”)
-
-val call_choose_fwd_def = Define ‘
-  (** [paper::call_choose]: forward function *)
-  call_choose_fwd (p : (u32 # u32)) : u32 result =
-    let (px, py) = p in
-    do
-    pz <- choose_fwd T px py;
-    pz0 <- u32_add pz (int_to_u32 1);
-    (px0, _) <- choose_back T px py pz0;
-    Return px0
-    od
-’
-
-val _ = export_theory ()
diff --git a/tests/hol4/misc-paper/paperTheory.sig b/tests/hol4/misc-paper/paperTheory.sig
deleted file mode 100644
index 2da80da1..00000000
--- a/tests/hol4/misc-paper/paperTheory.sig
+++ /dev/null
@@ -1,210 +0,0 @@
-signature paperTheory =
-sig
-  type thm = Thm.thm
-  
-  (*  Definitions  *)
-    val call_choose_fwd_def : thm
-    val choose_back_def : thm
-    val choose_fwd_def : thm
-    val list_nth_mut_back_def : thm
-    val list_nth_mut_fwd_def : thm
-    val list_t_TY_DEF : thm
-    val list_t_case_def : thm
-    val list_t_size_def : thm
-    val ref_incr_fwd_back_def : thm
-    val sum_fwd_def : thm
-    val test_choose_fwd_def : thm
-    val test_incr_fwd_def : thm
-    val test_nth_fwd_def : thm
-  
-  (*  Theorems  *)
-    val datatype_list_t : thm
-    val list_t_11 : thm
-    val list_t_Axiom : thm
-    val list_t_case_cong : thm
-    val list_t_case_eq : thm
-    val list_t_distinct : thm
-    val list_t_induction : thm
-    val list_t_nchotomy : thm
-  
-  val paper_grammars : type_grammar.grammar * term_grammar.grammar
-(*
-   [divDef] Parent theory of "paper"
-   
-   [call_choose_fwd_def]  Definition
-      
-      ⊢ ∀p. call_choose_fwd p =
-            (let
-               (px,py) = p
-             in
-               do
-                 pz <- choose_fwd T px py;
-                 pz0 <- u32_add pz (int_to_u32 1);
-                 (px0,_) <- choose_back T px py pz0;
-                 Return px0
-               od)
-   
-   [choose_back_def]  Definition
-      
-      ⊢ ∀b x y ret.
-          choose_back b x y ret =
-          if b then Return (ret,y) else Return (x,ret)
-   
-   [choose_fwd_def]  Definition
-      
-      ⊢ ∀b x y. choose_fwd b x y = if b then Return x else Return y
-   
-   [list_nth_mut_back_def]  Definition
-      
-      ⊢ ∀l i ret.
-          list_nth_mut_back l i ret =
-          case l of
-            ListCons x tl =>
-              if i = int_to_u32 0 then Return (ListCons ret tl)
-              else
-                do
-                  i0 <- u32_sub i (int_to_u32 1);
-                  tl0 <- list_nth_mut_back tl i0 ret;
-                  Return (ListCons x tl0)
-                od
-          | ListNil => Fail Failure
-   
-   [list_nth_mut_fwd_def]  Definition
-      
-      ⊢ ∀l i.
-          list_nth_mut_fwd l i =
-          case l of
-            ListCons x tl =>
-              if i = int_to_u32 0 then Return x
-              else
-                do
-                  i0 <- u32_sub i (int_to_u32 1);
-                  list_nth_mut_fwd tl i0
-                od
-          | ListNil => Fail Failure
-   
-   [list_t_TY_DEF]  Definition
-      
-      ⊢ ∃rep.
-          TYPE_DEFINITION
-            (λa0'.
-                 ∀ $var$('list_t').
-                   (∀a0'.
-                      (∃a0 a1.
-                         a0' =
-                         (λa0 a1.
-                              ind_type$CONSTR 0 a0
-                                (ind_type$FCONS a1 (λn. ind_type$BOTTOM)))
-                           a0 a1 ∧ $var$('list_t') a1) ∨
-                      a0' =
-                      ind_type$CONSTR (SUC 0) ARB (λn. ind_type$BOTTOM) ⇒
-                      $var$('list_t') a0') ⇒
-                   $var$('list_t') a0') rep
-   
-   [list_t_case_def]  Definition
-      
-      ⊢ (∀a0 a1 f v. list_t_CASE (ListCons a0 a1) f v = f a0 a1) ∧
-        ∀f v. list_t_CASE ListNil f v = v
-   
-   [list_t_size_def]  Definition
-      
-      ⊢ (∀f a0 a1.
-           list_t_size f (ListCons a0 a1) = 1 + (f a0 + list_t_size f a1)) ∧
-        ∀f. list_t_size f ListNil = 0
-   
-   [ref_incr_fwd_back_def]  Definition
-      
-      ⊢ ∀x. ref_incr_fwd_back x = i32_add x (int_to_i32 1)
-   
-   [sum_fwd_def]  Definition
-      
-      ⊢ ∀l. sum_fwd l =
-            case l of
-              ListCons x tl => do i <- sum_fwd tl; i32_add x i od
-            | ListNil => Return (int_to_i32 0)
-   
-   [test_choose_fwd_def]  Definition
-      
-      ⊢ test_choose_fwd =
-        do
-          z <- choose_fwd T (int_to_i32 0) (int_to_i32 0);
-          z0 <- i32_add z (int_to_i32 1);
-          if z0 ≠ int_to_i32 1 then Fail Failure
-          else
-            do
-              (x,y) <- choose_back T (int_to_i32 0) (int_to_i32 0) z0;
-              if x ≠ int_to_i32 1 then Fail Failure
-              else if y ≠ int_to_i32 0 then Fail Failure
-              else Return ()
-            od
-        od
-   
-   [test_incr_fwd_def]  Definition
-      
-      ⊢ test_incr_fwd =
-        do
-          x <- ref_incr_fwd_back (int_to_i32 0);
-          if x ≠ int_to_i32 1 then Fail Failure else Return ()
-        od
-   
-   [test_nth_fwd_def]  Definition
-      
-      ⊢ test_nth_fwd =
-        (let
-           l = ListNil;
-           l0 = ListCons (int_to_i32 3) l;
-           l1 = ListCons (int_to_i32 2) l0
-         in
-           do
-             x <-
-               list_nth_mut_fwd (ListCons (int_to_i32 1) l1) (int_to_u32 2);
-             x0 <- i32_add x (int_to_i32 1);
-             l2 <-
-               list_nth_mut_back (ListCons (int_to_i32 1) l1)
-                 (int_to_u32 2) x0;
-             i <- sum_fwd l2;
-             if i ≠ int_to_i32 7 then Fail Failure else Return ()
-           od)
-   
-   [datatype_list_t]  Theorem
-      
-      ⊢ DATATYPE (list_t ListCons ListNil)
-   
-   [list_t_11]  Theorem
-      
-      ⊢ ∀a0 a1 a0' a1'.
-          ListCons a0 a1 = ListCons a0' a1' ⇔ a0 = a0' ∧ a1 = a1'
-   
-   [list_t_Axiom]  Theorem
-      
-      ⊢ ∀f0 f1. ∃fn.
-          (∀a0 a1. fn (ListCons a0 a1) = f0 a0 a1 (fn a1)) ∧
-          fn ListNil = f1
-   
-   [list_t_case_cong]  Theorem
-      
-      ⊢ ∀M M' f v.
-          M = M' ∧ (∀a0 a1. M' = ListCons a0 a1 ⇒ f a0 a1 = f' a0 a1) ∧
-          (M' = ListNil ⇒ v = v') ⇒
-          list_t_CASE M f v = list_t_CASE M' f' v'
-   
-   [list_t_case_eq]  Theorem
-      
-      ⊢ list_t_CASE x f v = v' ⇔
-        (∃t l. x = ListCons t l ∧ f t l = v') ∨ x = ListNil ∧ v = v'
-   
-   [list_t_distinct]  Theorem
-      
-      ⊢ ∀a1 a0. ListCons a0 a1 ≠ ListNil
-   
-   [list_t_induction]  Theorem
-      
-      ⊢ ∀P. (∀l. P l ⇒ ∀t. P (ListCons t l)) ∧ P ListNil ⇒ ∀l. P l
-   
-   [list_t_nchotomy]  Theorem
-      
-      ⊢ ∀ll. (∃t l. ll = ListCons t l) ∨ ll = ListNil
-   
-   
-*)
-end
diff --git a/tests/hol4/misc-polonius_list/Holmakefile b/tests/hol4/misc-polonius_list/Holmakefile
deleted file mode 100644
index 3c4b8973..00000000
--- a/tests/hol4/misc-polonius_list/Holmakefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# This file was automatically generated - modify ../Holmakefile.template instead
-INCLUDES =  ../../../backends/hol4
-
-all: $(DEFAULT_TARGETS)
-.PHONY: all
diff --git a/tests/hol4/misc-polonius_list/poloniusListScript.sml b/tests/hol4/misc-polonius_list/poloniusListScript.sml
deleted file mode 100644
index 06876ed4..00000000
--- a/tests/hol4/misc-polonius_list/poloniusListScript.sml
+++ /dev/null
@@ -1,37 +0,0 @@
-(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
-(** [polonius_list] *)
-open primitivesLib divDefLib
-
-val _ = new_theory "poloniusList"
-
-
-Datatype:
-  (** [polonius_list::List] *)
-  list_t = | ListCons 't list_t | ListNil
-End
-
-val [get_list_at_x_fwd_def] = DefineDiv ‘
-  (** [polonius_list::get_list_at_x]: forward function *)
-  get_list_at_x_fwd (ls : u32 list_t) (x : u32) : u32 list_t result =
-    (case ls of
-    | ListCons hd tl =>
-      if hd = x then Return (ListCons hd tl) else get_list_at_x_fwd tl x
-    | ListNil => Return ListNil)
-’
-
-val [get_list_at_x_back_def] = DefineDiv ‘
-  (** [polonius_list::get_list_at_x]: backward function 0 *)
-  get_list_at_x_back
-    (ls : u32 list_t) (x : u32) (ret : u32 list_t) : u32 list_t result =
-    (case ls of
-    | ListCons hd tl =>
-      if hd = x
-      then Return ret
-      else (do
-            tl0 <- get_list_at_x_back tl x ret;
-            Return (ListCons hd tl0)
-            od)
-    | ListNil => Return ret)
-’
-
-val _ = export_theory ()
diff --git a/tests/hol4/misc-polonius_list/poloniusListTheory.sig b/tests/hol4/misc-polonius_list/poloniusListTheory.sig
deleted file mode 100644
index 41f21df7..00000000
--- a/tests/hol4/misc-polonius_list/poloniusListTheory.sig
+++ /dev/null
@@ -1,120 +0,0 @@
-signature poloniusListTheory =
-sig
-  type thm = Thm.thm
-  
-  (*  Definitions  *)
-    val get_list_at_x_back_def : thm
-    val get_list_at_x_fwd_def : thm
-    val list_t_TY_DEF : thm
-    val list_t_case_def : thm
-    val list_t_size_def : thm
-  
-  (*  Theorems  *)
-    val datatype_list_t : thm
-    val list_t_11 : thm
-    val list_t_Axiom : thm
-    val list_t_case_cong : thm
-    val list_t_case_eq : thm
-    val list_t_distinct : thm
-    val list_t_induction : thm
-    val list_t_nchotomy : thm
-  
-  val poloniusList_grammars : type_grammar.grammar * term_grammar.grammar
-(*
-   [divDef] Parent theory of "poloniusList"
-   
-   [get_list_at_x_back_def]  Definition
-      
-      ⊢ ∀ls x ret.
-          get_list_at_x_back ls x ret =
-          case ls of
-            ListCons hd tl =>
-              if hd = x then Return ret
-              else
-                do
-                  tl0 <- get_list_at_x_back tl x ret;
-                  Return (ListCons hd tl0)
-                od
-          | ListNil => Return ret
-   
-   [get_list_at_x_fwd_def]  Definition
-      
-      ⊢ ∀ls x.
-          get_list_at_x_fwd ls x =
-          case ls of
-            ListCons hd tl =>
-              if hd = x then Return (ListCons hd tl)
-              else get_list_at_x_fwd tl x
-          | ListNil => Return ListNil
-   
-   [list_t_TY_DEF]  Definition
-      
-      ⊢ ∃rep.
-          TYPE_DEFINITION
-            (λa0'.
-                 ∀ $var$('list_t').
-                   (∀a0'.
-                      (∃a0 a1.
-                         a0' =
-                         (λa0 a1.
-                              ind_type$CONSTR 0 a0
-                                (ind_type$FCONS a1 (λn. ind_type$BOTTOM)))
-                           a0 a1 ∧ $var$('list_t') a1) ∨
-                      a0' =
-                      ind_type$CONSTR (SUC 0) ARB (λn. ind_type$BOTTOM) ⇒
-                      $var$('list_t') a0') ⇒
-                   $var$('list_t') a0') rep
-   
-   [list_t_case_def]  Definition
-      
-      ⊢ (∀a0 a1 f v. list_t_CASE (ListCons a0 a1) f v = f a0 a1) ∧
-        ∀f v. list_t_CASE ListNil f v = v
-   
-   [list_t_size_def]  Definition
-      
-      ⊢ (∀f a0 a1.
-           list_t_size f (ListCons a0 a1) = 1 + (f a0 + list_t_size f a1)) ∧
-        ∀f. list_t_size f ListNil = 0
-   
-   [datatype_list_t]  Theorem
-      
-      ⊢ DATATYPE (list_t ListCons ListNil)
-   
-   [list_t_11]  Theorem
-      
-      ⊢ ∀a0 a1 a0' a1'.
-          ListCons a0 a1 = ListCons a0' a1' ⇔ a0 = a0' ∧ a1 = a1'
-   
-   [list_t_Axiom]  Theorem
-      
-      ⊢ ∀f0 f1. ∃fn.
-          (∀a0 a1. fn (ListCons a0 a1) = f0 a0 a1 (fn a1)) ∧
-          fn ListNil = f1
-   
-   [list_t_case_cong]  Theorem
-      
-      ⊢ ∀M M' f v.
-          M = M' ∧ (∀a0 a1. M' = ListCons a0 a1 ⇒ f a0 a1 = f' a0 a1) ∧
-          (M' = ListNil ⇒ v = v') ⇒
-          list_t_CASE M f v = list_t_CASE M' f' v'
-   
-   [list_t_case_eq]  Theorem
-      
-      ⊢ list_t_CASE x f v = v' ⇔
-        (∃t l. x = ListCons t l ∧ f t l = v') ∨ x = ListNil ∧ v = v'
-   
-   [list_t_distinct]  Theorem
-      
-      ⊢ ∀a1 a0. ListCons a0 a1 ≠ ListNil
-   
-   [list_t_induction]  Theorem
-      
-      ⊢ ∀P. (∀l. P l ⇒ ∀t. P (ListCons t l)) ∧ P ListNil ⇒ ∀l. P l
-   
-   [list_t_nchotomy]  Theorem
-      
-      ⊢ ∀ll. (∃t l. ll = ListCons t l) ∨ ll = ListNil
-   
-   
-*)
-end
diff --git a/tests/hol4/no_nested_borrows/Holmakefile b/tests/hol4/no_nested_borrows/Holmakefile
new file mode 100644
index 00000000..3c4b8973
--- /dev/null
+++ b/tests/hol4/no_nested_borrows/Holmakefile
@@ -0,0 +1,5 @@
+# This file was automatically generated - modify ../Holmakefile.template instead
+INCLUDES =  ../../../backends/hol4
+
+all: $(DEFAULT_TARGETS)
+.PHONY: all
diff --git a/tests/hol4/no_nested_borrows/noNestedBorrowsScript.sml b/tests/hol4/no_nested_borrows/noNestedBorrowsScript.sml
new file mode 100644
index 00000000..1b2d6121
--- /dev/null
+++ b/tests/hol4/no_nested_borrows/noNestedBorrowsScript.sml
@@ -0,0 +1,592 @@
+(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
+(** [no_nested_borrows] *)
+open primitivesLib divDefLib
+
+val _ = new_theory "noNestedBorrows"
+
+
+Datatype:
+  (** [no_nested_borrows::Pair] *)
+  pair_t = <| pair_x : 't1; pair_y : 't2; |>
+End
+
+Datatype:
+  (** [no_nested_borrows::List] *)
+  list_t = | ListCons 't list_t | ListNil
+End
+
+Datatype:
+  (** [no_nested_borrows::One] *)
+  one_t = | OneOne 't1
+End
+
+Datatype:
+  (** [no_nested_borrows::EmptyEnum] *)
+  empty_enum_t = | EmptyEnumEmpty
+End
+
+Datatype:
+  (** [no_nested_borrows::Enum] *)
+  enum_t = | EnumVariant1 | EnumVariant2
+End
+
+Type empty_struct_t = “: unit”
+
+Datatype:
+  (** [no_nested_borrows::Sum] *)
+  sum_t = | SumLeft 't1 | SumRight 't2
+End
+
+val neg_test_fwd_def = Define ‘
+  (** [no_nested_borrows::neg_test]: forward function *)
+  neg_test_fwd (x : i32) : i32 result =
+    i32_neg x
+’
+
+val add_test_fwd_def = Define ‘
+  (** [no_nested_borrows::add_test]: forward function *)
+  add_test_fwd (x : u32) (y : u32) : u32 result =
+    u32_add x y
+’
+
+val subs_test_fwd_def = Define ‘
+  (** [no_nested_borrows::subs_test]: forward function *)
+  subs_test_fwd (x : u32) (y : u32) : u32 result =
+    u32_sub x y
+’
+
+val div_test_fwd_def = Define ‘
+  (** [no_nested_borrows::div_test]: forward function *)
+  div_test_fwd (x : u32) (y : u32) : u32 result =
+    u32_div x y
+’
+
+val div_test1_fwd_def = Define ‘
+  (** [no_nested_borrows::div_test1]: forward function *)
+  div_test1_fwd (x : u32) : u32 result =
+    u32_div x (int_to_u32 2)
+’
+
+val rem_test_fwd_def = Define ‘
+  (** [no_nested_borrows::rem_test]: forward function *)
+  rem_test_fwd (x : u32) (y : u32) : u32 result =
+    u32_rem x y
+’
+
+val cast_test_fwd_def = Define ‘
+  (** [no_nested_borrows::cast_test]: forward function *)
+  cast_test_fwd (x : u32) : i32 result =
+    mk_i32 (u32_to_int x)
+’
+
+val test2_fwd_def = Define ‘
+  (** [no_nested_borrows::test2]: forward function *)
+  test2_fwd : unit result =
+    do
+    _ <- u32_add (int_to_u32 23) (int_to_u32 44);
+    Return ()
+    od
+’
+
+(** Unit test for [no_nested_borrows::test2] *)
+val _ = assert_return (“test2_fwd”)
+
+val get_max_fwd_def = Define ‘
+  (** [no_nested_borrows::get_max]: forward function *)
+  get_max_fwd (x : u32) (y : u32) : u32 result =
+    if u32_ge x y then Return x else Return y
+’
+
+val test3_fwd_def = Define ‘
+  (** [no_nested_borrows::test3]: forward function *)
+  test3_fwd : unit result =
+    do
+    x <- get_max_fwd (int_to_u32 4) (int_to_u32 3);
+    y <- get_max_fwd (int_to_u32 10) (int_to_u32 11);
+    z <- u32_add x y;
+    if ~ (z = int_to_u32 15) then Fail Failure else Return ()
+    od
+’
+
+(** Unit test for [no_nested_borrows::test3] *)
+val _ = assert_return (“test3_fwd”)
+
+val test_neg1_fwd_def = Define ‘
+  (** [no_nested_borrows::test_neg1]: forward function *)
+  test_neg1_fwd : unit result =
+    do
+    y <- i32_neg (int_to_i32 3);
+    if ~ (y = int_to_i32 (-3)) then Fail Failure else Return ()
+    od
+’
+
+(** Unit test for [no_nested_borrows::test_neg1] *)
+val _ = assert_return (“test_neg1_fwd”)
+
+val refs_test1_fwd_def = Define ‘
+  (** [no_nested_borrows::refs_test1]: forward function *)
+  refs_test1_fwd : unit result =
+    if ~ (int_to_i32 1 = int_to_i32 1) then Fail Failure else Return ()
+’
+
+(** Unit test for [no_nested_borrows::refs_test1] *)
+val _ = assert_return (“refs_test1_fwd”)
+
+val refs_test2_fwd_def = Define ‘
+  (** [no_nested_borrows::refs_test2]: forward function *)
+  refs_test2_fwd : unit result =
+    if ~ (int_to_i32 2 = int_to_i32 2)
+    then Fail Failure
+    else
+      if ~ (int_to_i32 0 = int_to_i32 0)
+      then Fail Failure
+      else
+        if ~ (int_to_i32 2 = int_to_i32 2)
+        then Fail Failure
+        else
+          if ~ (int_to_i32 2 = int_to_i32 2) then Fail Failure else Return ()
+’
+
+(** Unit test for [no_nested_borrows::refs_test2] *)
+val _ = assert_return (“refs_test2_fwd”)
+
+val test_list1_fwd_def = Define ‘
+  (** [no_nested_borrows::test_list1]: forward function *)
+  test_list1_fwd : unit result =
+    Return ()
+’
+
+(** Unit test for [no_nested_borrows::test_list1] *)
+val _ = assert_return (“test_list1_fwd”)
+
+val test_box1_fwd_def = Define ‘
+  (** [no_nested_borrows::test_box1]: forward function *)
+  test_box1_fwd : unit result =
+    let b = int_to_i32 1 in
+    let x = b in
+    if ~ (x = int_to_i32 1) then Fail Failure else Return ()
+’
+
+(** Unit test for [no_nested_borrows::test_box1] *)
+val _ = assert_return (“test_box1_fwd”)
+
+val copy_int_fwd_def = Define ‘
+  (** [no_nested_borrows::copy_int]: forward function *)
+  copy_int_fwd (x : i32) : i32 result =
+    Return x
+’
+
+val test_unreachable_fwd_def = Define ‘
+  (** [no_nested_borrows::test_unreachable]: forward function *)
+  test_unreachable_fwd (b : bool) : unit result =
+    if b then Fail Failure else Return ()
+’
+
+val test_panic_fwd_def = Define ‘
+  (** [no_nested_borrows::test_panic]: forward function *)
+  test_panic_fwd (b : bool) : unit result =
+    if b then Fail Failure else Return ()
+’
+
+val test_copy_int_fwd_def = Define ‘
+  (** [no_nested_borrows::test_copy_int]: forward function *)
+  test_copy_int_fwd : unit result =
+    do
+    y <- copy_int_fwd (int_to_i32 0);
+    if ~ (int_to_i32 0 = y) then Fail Failure else Return ()
+    od
+’
+
+(** Unit test for [no_nested_borrows::test_copy_int] *)
+val _ = assert_return (“test_copy_int_fwd”)
+
+val is_cons_fwd_def = Define ‘
+  (** [no_nested_borrows::is_cons]: forward function *)
+  is_cons_fwd (l : 't list_t) : bool result =
+    (case l of | ListCons t l0 => Return T | ListNil => Return F)
+’
+
+val test_is_cons_fwd_def = Define ‘
+  (** [no_nested_borrows::test_is_cons]: forward function *)
+  test_is_cons_fwd : unit result =
+    let l = ListNil in
+    do
+    b <- is_cons_fwd (ListCons (int_to_i32 0) l);
+    if ~ b then Fail Failure else Return ()
+    od
+’
+
+(** Unit test for [no_nested_borrows::test_is_cons] *)
+val _ = assert_return (“test_is_cons_fwd”)
+
+val split_list_fwd_def = Define ‘
+  (** [no_nested_borrows::split_list]: forward function *)
+  split_list_fwd (l : 't list_t) : ('t # 't list_t) result =
+    (case l of | ListCons hd tl => Return (hd, tl) | ListNil => Fail Failure)
+’
+
+val test_split_list_fwd_def = Define ‘
+  (** [no_nested_borrows::test_split_list]: forward function *)
+  test_split_list_fwd : unit result =
+    let l = ListNil in
+    do
+    p <- split_list_fwd (ListCons (int_to_i32 0) l);
+    let (hd, _) = p in
+    if ~ (hd = int_to_i32 0) then Fail Failure else Return ()
+    od
+’
+
+(** Unit test for [no_nested_borrows::test_split_list] *)
+val _ = assert_return (“test_split_list_fwd”)
+
+val choose_fwd_def = Define ‘
+  (** [no_nested_borrows::choose]: forward function *)
+  choose_fwd (b : bool) (x : 't) (y : 't) : 't result =
+    if b then Return x else Return y
+’
+
+val choose_back_def = Define ‘
+  (** [no_nested_borrows::choose]: backward function 0 *)
+  choose_back (b : bool) (x : 't) (y : 't) (ret : 't) : ('t # 't) result =
+    if b then Return (ret, y) else Return (x, ret)
+’
+
+val choose_test_fwd_def = Define ‘
+  (** [no_nested_borrows::choose_test]: forward function *)
+  choose_test_fwd : unit result =
+    do
+    z <- choose_fwd T (int_to_i32 0) (int_to_i32 0);
+    z0 <- i32_add z (int_to_i32 1);
+    if ~ (z0 = int_to_i32 1)
+    then Fail Failure
+    else (
+      do
+      (x, y) <- choose_back T (int_to_i32 0) (int_to_i32 0) z0;
+      if ~ (x = int_to_i32 1)
+      then Fail Failure
+      else if ~ (y = int_to_i32 0) then Fail Failure else Return ()
+      od)
+    od
+’
+
+(** Unit test for [no_nested_borrows::choose_test] *)
+val _ = assert_return (“choose_test_fwd”)
+
+val test_char_fwd_def = Define ‘
+  (** [no_nested_borrows::test_char]: forward function *)
+  test_char_fwd : char result =
+    Return #"a"
+’
+
+Datatype:
+  (** [no_nested_borrows::Tree] *)
+  tree_t = | TreeLeaf 't | TreeNode 't node_elem_t tree_t ;
+  
+  (** [no_nested_borrows::NodeElem] *)
+  node_elem_t = | NodeElemCons tree_t node_elem_t | NodeElemNil
+End
+
+val [list_length_fwd_def] = DefineDiv ‘
+  (** [no_nested_borrows::list_length]: forward function *)
+  list_length_fwd (l : 't list_t) : u32 result =
+    (case l of
+    | ListCons t l1 => do
+                       i <- list_length_fwd l1;
+                       u32_add (int_to_u32 1) i
+                       od
+    | ListNil => Return (int_to_u32 0))
+’
+
+val [list_nth_shared_fwd_def] = DefineDiv ‘
+  (** [no_nested_borrows::list_nth_shared]: forward function *)
+  list_nth_shared_fwd (l : 't list_t) (i : u32) : 't result =
+    (case l of
+    | ListCons x tl =>
+      if i = int_to_u32 0
+      then Return x
+      else (do
+            i0 <- u32_sub i (int_to_u32 1);
+            list_nth_shared_fwd tl i0
+            od)
+    | ListNil => Fail Failure)
+’
+
+val [list_nth_mut_fwd_def] = DefineDiv ‘
+  (** [no_nested_borrows::list_nth_mut]: forward function *)
+  list_nth_mut_fwd (l : 't list_t) (i : u32) : 't result =
+    (case l of
+    | ListCons x tl =>
+      if i = int_to_u32 0
+      then Return x
+      else (do
+            i0 <- u32_sub i (int_to_u32 1);
+            list_nth_mut_fwd tl i0
+            od)
+    | ListNil => Fail Failure)
+’
+
+val [list_nth_mut_back_def] = DefineDiv ‘
+  (** [no_nested_borrows::list_nth_mut]: backward function 0 *)
+  list_nth_mut_back (l : 't list_t) (i : u32) (ret : 't) : 't list_t result =
+    (case l of
+    | ListCons x tl =>
+      if i = int_to_u32 0
+      then Return (ListCons ret tl)
+      else (
+        do
+        i0 <- u32_sub i (int_to_u32 1);
+        tl0 <- list_nth_mut_back tl i0 ret;
+        Return (ListCons x tl0)
+        od)
+    | ListNil => Fail Failure)
+’
+
+val [list_rev_aux_fwd_def] = DefineDiv ‘
+  (** [no_nested_borrows::list_rev_aux]: forward function *)
+  list_rev_aux_fwd (li : 't list_t) (lo : 't list_t) : 't list_t result =
+    (case li of
+    | ListCons hd tl => list_rev_aux_fwd tl (ListCons hd lo)
+    | ListNil => Return lo)
+’
+
+val list_rev_fwd_back_def = Define ‘
+  (** [no_nested_borrows::list_rev]: merged forward/backward function
+      (there is a single backward function, and the forward function returns ()) *)
+  list_rev_fwd_back (l : 't list_t) : 't list_t result =
+    let li = mem_replace_fwd l ListNil in list_rev_aux_fwd li ListNil
+’
+
+val test_list_functions_fwd_def = Define ‘
+  (** [no_nested_borrows::test_list_functions]: forward function *)
+  test_list_functions_fwd : unit result =
+    let l = ListNil in
+    let l0 = ListCons (int_to_i32 2) l in
+    let l1 = ListCons (int_to_i32 1) l0 in
+    do
+    i <- list_length_fwd (ListCons (int_to_i32 0) l1);
+    if ~ (i = int_to_u32 3)
+    then Fail Failure
+    else (
+      do
+      i0 <- list_nth_shared_fwd (ListCons (int_to_i32 0) l1) (int_to_u32 0);
+      if ~ (i0 = int_to_i32 0)
+      then Fail Failure
+      else (
+        do
+        i1 <- list_nth_shared_fwd (ListCons (int_to_i32 0) l1) (int_to_u32 1);
+        if ~ (i1 = int_to_i32 1)
+        then Fail Failure
+        else (
+          do
+          i2 <-
+            list_nth_shared_fwd (ListCons (int_to_i32 0) l1) (int_to_u32 2);
+          if ~ (i2 = int_to_i32 2)
+          then Fail Failure
+          else (
+            do
+            ls <-
+              list_nth_mut_back (ListCons (int_to_i32 0) l1) (int_to_u32 1)
+                (int_to_i32 3);
+            i3 <- list_nth_shared_fwd ls (int_to_u32 0);
+            if ~ (i3 = int_to_i32 0)
+            then Fail Failure
+            else (
+              do
+              i4 <- list_nth_shared_fwd ls (int_to_u32 1);
+              if ~ (i4 = int_to_i32 3)
+              then Fail Failure
+              else (
+                do
+                i5 <- list_nth_shared_fwd ls (int_to_u32 2);
+                if ~ (i5 = int_to_i32 2) then Fail Failure else Return ()
+                od)
+              od)
+            od)
+          od)
+        od)
+      od)
+    od
+’
+
+(** Unit test for [no_nested_borrows::test_list_functions] *)
+val _ = assert_return (“test_list_functions_fwd”)
+
+val id_mut_pair1_fwd_def = Define ‘
+  (** [no_nested_borrows::id_mut_pair1]: forward function *)
+  id_mut_pair1_fwd (x : 't1) (y : 't2) : ('t1 # 't2) result =
+    Return (x, y)
+’
+
+val id_mut_pair1_back_def = Define ‘
+  (** [no_nested_borrows::id_mut_pair1]: backward function 0 *)
+  id_mut_pair1_back
+    (x : 't1) (y : 't2) (ret : ('t1 # 't2)) : ('t1 # 't2) result =
+    let (t, t0) = ret in Return (t, t0)
+’
+
+val id_mut_pair2_fwd_def = Define ‘
+  (** [no_nested_borrows::id_mut_pair2]: forward function *)
+  id_mut_pair2_fwd (p : ('t1 # 't2)) : ('t1 # 't2) result =
+    let (t, t0) = p in Return (t, t0)
+’
+
+val id_mut_pair2_back_def = Define ‘
+  (** [no_nested_borrows::id_mut_pair2]: backward function 0 *)
+  id_mut_pair2_back
+    (p : ('t1 # 't2)) (ret : ('t1 # 't2)) : ('t1 # 't2) result =
+    let (t, t0) = ret in Return (t, t0)
+’
+
+val id_mut_pair3_fwd_def = Define ‘
+  (** [no_nested_borrows::id_mut_pair3]: forward function *)
+  id_mut_pair3_fwd (x : 't1) (y : 't2) : ('t1 # 't2) result =
+    Return (x, y)
+’
+
+val id_mut_pair3_back'a_def = Define ‘
+  (** [no_nested_borrows::id_mut_pair3]: backward function 0 *)
+  id_mut_pair3_back'a (x : 't1) (y : 't2) (ret : 't1) : 't1 result =
+    Return ret
+’
+
+val id_mut_pair3_back'b_def = Define ‘
+  (** [no_nested_borrows::id_mut_pair3]: backward function 1 *)
+  id_mut_pair3_back'b (x : 't1) (y : 't2) (ret : 't2) : 't2 result =
+    Return ret
+’
+
+val id_mut_pair4_fwd_def = Define ‘
+  (** [no_nested_borrows::id_mut_pair4]: forward function *)
+  id_mut_pair4_fwd (p : ('t1 # 't2)) : ('t1 # 't2) result =
+    let (t, t0) = p in Return (t, t0)
+’
+
+val id_mut_pair4_back'a_def = Define ‘
+  (** [no_nested_borrows::id_mut_pair4]: backward function 0 *)
+  id_mut_pair4_back'a (p : ('t1 # 't2)) (ret : 't1) : 't1 result =
+    Return ret
+’
+
+val id_mut_pair4_back'b_def = Define ‘
+  (** [no_nested_borrows::id_mut_pair4]: backward function 1 *)
+  id_mut_pair4_back'b (p : ('t1 # 't2)) (ret : 't2) : 't2 result =
+    Return ret
+’
+
+Datatype:
+  (** [no_nested_borrows::StructWithTuple] *)
+  struct_with_tuple_t = <| struct_with_tuple_p : ('t1 # 't2); |>
+End
+
+val new_tuple1_fwd_def = Define ‘
+  (** [no_nested_borrows::new_tuple1]: forward function *)
+  new_tuple1_fwd : (u32, u32) struct_with_tuple_t result =
+    Return (<| struct_with_tuple_p := (int_to_u32 1, int_to_u32 2) |>)
+’
+
+val new_tuple2_fwd_def = Define ‘
+  (** [no_nested_borrows::new_tuple2]: forward function *)
+  new_tuple2_fwd : (i16, i16) struct_with_tuple_t result =
+    Return (<| struct_with_tuple_p := (int_to_i16 1, int_to_i16 2) |>)
+’
+
+val new_tuple3_fwd_def = Define ‘
+  (** [no_nested_borrows::new_tuple3]: forward function *)
+  new_tuple3_fwd : (u64, i64) struct_with_tuple_t result =
+    Return (<| struct_with_tuple_p := (int_to_u64 1, int_to_i64 2) |>)
+’
+
+Datatype:
+  (** [no_nested_borrows::StructWithPair] *)
+  struct_with_pair_t = <| struct_with_pair_p : ('t1, 't2) pair_t; |>
+End
+
+val new_pair1_fwd_def = Define ‘
+  (** [no_nested_borrows::new_pair1]: forward function *)
+  new_pair1_fwd : (u32, u32) struct_with_pair_t result =
+    Return
+    (<|
+       struct_with_pair_p :=
+         (<| pair_x := (int_to_u32 1); pair_y := (int_to_u32 2) |>)
+       |>)
+’
+
+val test_constants_fwd_def = Define ‘
+  (** [no_nested_borrows::test_constants]: forward function *)
+  test_constants_fwd : unit result =
+    do
+    swt <- new_tuple1_fwd;
+    let (i, _) = swt.struct_with_tuple_p in
+    if ~ (i = int_to_u32 1)
+    then Fail Failure
+    else (
+      do
+      swt0 <- new_tuple2_fwd;
+      let (i0, _) = swt0.struct_with_tuple_p in
+      if ~ (i0 = int_to_i16 1)
+      then Fail Failure
+      else (
+        do
+        swt1 <- new_tuple3_fwd;
+        let (i1, _) = swt1.struct_with_tuple_p in
+        if ~ (i1 = int_to_u64 1)
+        then Fail Failure
+        else (
+          do
+          swp <- new_pair1_fwd;
+          if ~ (swp.struct_with_pair_p.pair_x = int_to_u32 1)
+          then Fail Failure
+          else Return ()
+          od)
+        od)
+      od)
+    od
+’
+
+(** Unit test for [no_nested_borrows::test_constants] *)
+val _ = assert_return (“test_constants_fwd”)
+
+val test_weird_borrows1_fwd_def = Define ‘
+  (** [no_nested_borrows::test_weird_borrows1]: forward function *)
+  test_weird_borrows1_fwd : unit result =
+    Return ()
+’
+
+(** Unit test for [no_nested_borrows::test_weird_borrows1] *)
+val _ = assert_return (“test_weird_borrows1_fwd”)
+
+val test_mem_replace_fwd_back_def = Define ‘
+  (** [no_nested_borrows::test_mem_replace]: merged forward/backward function
+      (there is a single backward function, and the forward function returns ()) *)
+  test_mem_replace_fwd_back (px : u32) : u32 result =
+    let y = mem_replace_fwd px (int_to_u32 1) in
+    if ~ (y = int_to_u32 0) then Fail Failure else Return (int_to_u32 2)
+’
+
+val test_shared_borrow_bool1_fwd_def = Define ‘
+  (** [no_nested_borrows::test_shared_borrow_bool1]: forward function *)
+  test_shared_borrow_bool1_fwd (b : bool) : u32 result =
+    if b then Return (int_to_u32 0) else Return (int_to_u32 1)
+’
+
+val test_shared_borrow_bool2_fwd_def = Define ‘
+  (** [no_nested_borrows::test_shared_borrow_bool2]: forward function *)
+  test_shared_borrow_bool2_fwd : u32 result =
+    Return (int_to_u32 0)
+’
+
+val test_shared_borrow_enum1_fwd_def = Define ‘
+  (** [no_nested_borrows::test_shared_borrow_enum1]: forward function *)
+  test_shared_borrow_enum1_fwd (l : u32 list_t) : u32 result =
+    (case l of
+    | ListCons i l0 => Return (int_to_u32 1)
+    | ListNil => Return (int_to_u32 0))
+’
+
+val test_shared_borrow_enum2_fwd_def = Define ‘
+  (** [no_nested_borrows::test_shared_borrow_enum2]: forward function *)
+  test_shared_borrow_enum2_fwd : u32 result =
+    Return (int_to_u32 0)
+’
+
+val _ = export_theory ()
diff --git a/tests/hol4/no_nested_borrows/noNestedBorrowsTheory.sig b/tests/hol4/no_nested_borrows/noNestedBorrowsTheory.sig
new file mode 100644
index 00000000..67368e38
--- /dev/null
+++ b/tests/hol4/no_nested_borrows/noNestedBorrowsTheory.sig
@@ -0,0 +1,1598 @@
+signature noNestedBorrowsTheory =
+sig
+  type thm = Thm.thm
+  
+  (*  Definitions  *)
+    val add_test_fwd_def : thm
+    val cast_test_fwd_def : thm
+    val choose_back_def : thm
+    val choose_fwd_def : thm
+    val choose_test_fwd_def : thm
+    val copy_int_fwd_def : thm
+    val div_test1_fwd_def : thm
+    val div_test_fwd_def : thm
+    val empty_enum_t_BIJ : thm
+    val empty_enum_t_CASE : thm
+    val empty_enum_t_TY_DEF : thm
+    val empty_enum_t_size_def : thm
+    val enum_t_BIJ : thm
+    val enum_t_CASE : thm
+    val enum_t_TY_DEF : thm
+    val enum_t_size_def : thm
+    val get_max_fwd_def : thm
+    val id_mut_pair1_back_def : thm
+    val id_mut_pair1_fwd_def : thm
+    val id_mut_pair2_back_def : thm
+    val id_mut_pair2_fwd_def : thm
+    val id_mut_pair3_back'a_def : thm
+    val id_mut_pair3_back'b_def : thm
+    val id_mut_pair3_fwd_def : thm
+    val id_mut_pair4_back'a_def : thm
+    val id_mut_pair4_back'b_def : thm
+    val id_mut_pair4_fwd_def : thm
+    val is_cons_fwd_def : thm
+    val list_length_fwd_def : thm
+    val list_nth_mut_back_def : thm
+    val list_nth_mut_fwd_def : thm
+    val list_nth_shared_fwd_def : thm
+    val list_rev_aux_fwd_def : thm
+    val list_rev_fwd_back_def : thm
+    val list_t_TY_DEF : thm
+    val list_t_case_def : thm
+    val list_t_size_def : thm
+    val neg_test_fwd_def : thm
+    val new_pair1_fwd_def : thm
+    val new_tuple1_fwd_def : thm
+    val new_tuple2_fwd_def : thm
+    val new_tuple3_fwd_def : thm
+    val node_elem_t_TY_DEF : thm
+    val node_elem_t_case_def : thm
+    val one_t_TY_DEF : thm
+    val one_t_case_def : thm
+    val one_t_size_def : thm
+    val pair_t_TY_DEF : thm
+    val pair_t_case_def : thm
+    val pair_t_pair_x : thm
+    val pair_t_pair_x_fupd : thm
+    val pair_t_pair_y : thm
+    val pair_t_pair_y_fupd : thm
+    val pair_t_size_def : thm
+    val refs_test1_fwd_def : thm
+    val refs_test2_fwd_def : thm
+    val rem_test_fwd_def : thm
+    val split_list_fwd_def : thm
+    val struct_with_pair_t_TY_DEF : thm
+    val struct_with_pair_t_case_def : thm
+    val struct_with_pair_t_size_def : thm
+    val struct_with_pair_t_struct_with_pair_p : thm
+    val struct_with_pair_t_struct_with_pair_p_fupd : thm
+    val struct_with_tuple_t_TY_DEF : thm
+    val struct_with_tuple_t_case_def : thm
+    val struct_with_tuple_t_size_def : thm
+    val struct_with_tuple_t_struct_with_tuple_p : thm
+    val struct_with_tuple_t_struct_with_tuple_p_fupd : thm
+    val subs_test_fwd_def : thm
+    val sum_t_TY_DEF : thm
+    val sum_t_case_def : thm
+    val sum_t_size_def : thm
+    val test2_fwd_def : thm
+    val test3_fwd_def : thm
+    val test_box1_fwd_def : thm
+    val test_char_fwd_def : thm
+    val test_constants_fwd_def : thm
+    val test_copy_int_fwd_def : thm
+    val test_is_cons_fwd_def : thm
+    val test_list1_fwd_def : thm
+    val test_list_functions_fwd_def : thm
+    val test_mem_replace_fwd_back_def : thm
+    val test_neg1_fwd_def : thm
+    val test_panic_fwd_def : thm
+    val test_shared_borrow_bool1_fwd_def : thm
+    val test_shared_borrow_bool2_fwd_def : thm
+    val test_shared_borrow_enum1_fwd_def : thm
+    val test_shared_borrow_enum2_fwd_def : thm
+    val test_split_list_fwd_def : thm
+    val test_unreachable_fwd_def : thm
+    val test_weird_borrows1_fwd_def : thm
+    val tree_t_TY_DEF : thm
+    val tree_t_case_def : thm
+    val tree_t_size_def : thm
+  
+  (*  Theorems  *)
+    val EXISTS_pair_t : thm
+    val EXISTS_struct_with_pair_t : thm
+    val EXISTS_struct_with_tuple_t : thm
+    val FORALL_pair_t : thm
+    val FORALL_struct_with_pair_t : thm
+    val FORALL_struct_with_tuple_t : thm
+    val datatype_empty_enum_t : thm
+    val datatype_enum_t : thm
+    val datatype_list_t : thm
+    val datatype_one_t : thm
+    val datatype_pair_t : thm
+    val datatype_struct_with_pair_t : thm
+    val datatype_struct_with_tuple_t : thm
+    val datatype_sum_t : thm
+    val datatype_tree_t : thm
+    val empty_enum_t2num_11 : thm
+    val empty_enum_t2num_ONTO : thm
+    val empty_enum_t2num_num2empty_enum_t : thm
+    val empty_enum_t2num_thm : thm
+    val empty_enum_t_Axiom : thm
+    val empty_enum_t_EQ_empty_enum_t : thm
+    val empty_enum_t_case_cong : thm
+    val empty_enum_t_case_def : thm
+    val empty_enum_t_case_eq : thm
+    val empty_enum_t_induction : thm
+    val empty_enum_t_nchotomy : thm
+    val enum_t2num_11 : thm
+    val enum_t2num_ONTO : thm
+    val enum_t2num_num2enum_t : thm
+    val enum_t2num_thm : thm
+    val enum_t_Axiom : thm
+    val enum_t_EQ_enum_t : thm
+    val enum_t_case_cong : thm
+    val enum_t_case_def : thm
+    val enum_t_case_eq : thm
+    val enum_t_distinct : thm
+    val enum_t_induction : thm
+    val enum_t_nchotomy : thm
+    val list_t_11 : thm
+    val list_t_Axiom : thm
+    val list_t_case_cong : thm
+    val list_t_case_eq : thm
+    val list_t_distinct : thm
+    val list_t_induction : thm
+    val list_t_nchotomy : thm
+    val node_elem_t_11 : thm
+    val node_elem_t_Axiom : thm
+    val node_elem_t_case_cong : thm
+    val node_elem_t_case_eq : thm
+    val node_elem_t_distinct : thm
+    val node_elem_t_induction : thm
+    val node_elem_t_nchotomy : thm
+    val num2empty_enum_t_11 : thm
+    val num2empty_enum_t_ONTO : thm
+    val num2empty_enum_t_empty_enum_t2num : thm
+    val num2empty_enum_t_thm : thm
+    val num2enum_t_11 : thm
+    val num2enum_t_ONTO : thm
+    val num2enum_t_enum_t2num : thm
+    val num2enum_t_thm : thm
+    val one_t_11 : thm
+    val one_t_Axiom : thm
+    val one_t_case_cong : thm
+    val one_t_case_eq : thm
+    val one_t_induction : thm
+    val one_t_nchotomy : thm
+    val pair_t_11 : thm
+    val pair_t_Axiom : thm
+    val pair_t_accessors : thm
+    val pair_t_accfupds : thm
+    val pair_t_case_cong : thm
+    val pair_t_case_eq : thm
+    val pair_t_component_equality : thm
+    val pair_t_fn_updates : thm
+    val pair_t_fupdcanon : thm
+    val pair_t_fupdcanon_comp : thm
+    val pair_t_fupdfupds : thm
+    val pair_t_fupdfupds_comp : thm
+    val pair_t_induction : thm
+    val pair_t_literal_11 : thm
+    val pair_t_literal_nchotomy : thm
+    val pair_t_nchotomy : thm
+    val pair_t_updates_eq_literal : thm
+    val struct_with_pair_t_11 : thm
+    val struct_with_pair_t_Axiom : thm
+    val struct_with_pair_t_accessors : thm
+    val struct_with_pair_t_accfupds : thm
+    val struct_with_pair_t_case_cong : thm
+    val struct_with_pair_t_case_eq : thm
+    val struct_with_pair_t_component_equality : thm
+    val struct_with_pair_t_fn_updates : thm
+    val struct_with_pair_t_fupdfupds : thm
+    val struct_with_pair_t_fupdfupds_comp : thm
+    val struct_with_pair_t_induction : thm
+    val struct_with_pair_t_literal_11 : thm
+    val struct_with_pair_t_literal_nchotomy : thm
+    val struct_with_pair_t_nchotomy : thm
+    val struct_with_pair_t_updates_eq_literal : thm
+    val struct_with_tuple_t_11 : thm
+    val struct_with_tuple_t_Axiom : thm
+    val struct_with_tuple_t_accessors : thm
+    val struct_with_tuple_t_accfupds : thm
+    val struct_with_tuple_t_case_cong : thm
+    val struct_with_tuple_t_case_eq : thm
+    val struct_with_tuple_t_component_equality : thm
+    val struct_with_tuple_t_fn_updates : thm
+    val struct_with_tuple_t_fupdfupds : thm
+    val struct_with_tuple_t_fupdfupds_comp : thm
+    val struct_with_tuple_t_induction : thm
+    val struct_with_tuple_t_literal_11 : thm
+    val struct_with_tuple_t_literal_nchotomy : thm
+    val struct_with_tuple_t_nchotomy : thm
+    val struct_with_tuple_t_updates_eq_literal : thm
+    val sum_t_11 : thm
+    val sum_t_Axiom : thm
+    val sum_t_case_cong : thm
+    val sum_t_case_eq : thm
+    val sum_t_distinct : thm
+    val sum_t_induction : thm
+    val sum_t_nchotomy : thm
+    val tree_t_11 : thm
+    val tree_t_Axiom : thm
+    val tree_t_case_cong : thm
+    val tree_t_case_eq : thm
+    val tree_t_distinct : thm
+    val tree_t_induction : thm
+    val tree_t_nchotomy : thm
+  
+  val noNestedBorrows_grammars : type_grammar.grammar * term_grammar.grammar
+(*
+   [divDef] Parent theory of "noNestedBorrows"
+   
+   [add_test_fwd_def]  Definition
+      
+      ⊢ ∀x y. add_test_fwd x y = u32_add x y
+   
+   [cast_test_fwd_def]  Definition
+      
+      ⊢ ∀x. cast_test_fwd x = mk_i32 (u32_to_int x)
+   
+   [choose_back_def]  Definition
+      
+      ⊢ ∀b x y ret.
+          choose_back b x y ret =
+          if b then Return (ret,y) else Return (x,ret)
+   
+   [choose_fwd_def]  Definition
+      
+      ⊢ ∀b x y. choose_fwd b x y = if b then Return x else Return y
+   
+   [choose_test_fwd_def]  Definition
+      
+      ⊢ choose_test_fwd =
+        do
+          z <- choose_fwd T (int_to_i32 0) (int_to_i32 0);
+          z0 <- i32_add z (int_to_i32 1);
+          if z0 ≠ int_to_i32 1 then Fail Failure
+          else
+            do
+              (x,y) <- choose_back T (int_to_i32 0) (int_to_i32 0) z0;
+              if x ≠ int_to_i32 1 then Fail Failure
+              else if y ≠ int_to_i32 0 then Fail Failure
+              else Return ()
+            od
+        od
+   
+   [copy_int_fwd_def]  Definition
+      
+      ⊢ ∀x. copy_int_fwd x = Return x
+   
+   [div_test1_fwd_def]  Definition
+      
+      ⊢ ∀x. div_test1_fwd x = u32_div x (int_to_u32 2)
+   
+   [div_test_fwd_def]  Definition
+      
+      ⊢ ∀x y. div_test_fwd x y = u32_div x y
+   
+   [empty_enum_t_BIJ]  Definition
+      
+      ⊢ (∀a. num2empty_enum_t (empty_enum_t2num a) = a) ∧
+        ∀r. (λn. n < 1) r ⇔ empty_enum_t2num (num2empty_enum_t r) = r
+   
+   [empty_enum_t_CASE]  Definition
+      
+      ⊢ ∀x v0.
+          (case x of EmptyEnumEmpty => v0) = (λm. v0) (empty_enum_t2num x)
+   
+   [empty_enum_t_TY_DEF]  Definition
+      
+      ⊢ ∃rep. TYPE_DEFINITION (λn. n < 1) rep
+   
+   [empty_enum_t_size_def]  Definition
+      
+      ⊢ ∀x. empty_enum_t_size x = 0
+   
+   [enum_t_BIJ]  Definition
+      
+      ⊢ (∀a. num2enum_t (enum_t2num a) = a) ∧
+        ∀r. (λn. n < 2) r ⇔ enum_t2num (num2enum_t r) = r
+   
+   [enum_t_CASE]  Definition
+      
+      ⊢ ∀x v0 v1.
+          (case x of EnumVariant1 => v0 | EnumVariant2 => v1) =
+          (λm. if m = 0 then v0 else v1) (enum_t2num x)
+   
+   [enum_t_TY_DEF]  Definition
+      
+      ⊢ ∃rep. TYPE_DEFINITION (λn. n < 2) rep
+   
+   [enum_t_size_def]  Definition
+      
+      ⊢ ∀x. enum_t_size x = 0
+   
+   [get_max_fwd_def]  Definition
+      
+      ⊢ ∀x y. get_max_fwd x y = if u32_ge x y then Return x else Return y
+   
+   [id_mut_pair1_back_def]  Definition
+      
+      ⊢ ∀x y ret.
+          id_mut_pair1_back x y ret = (let (t,t0) = ret in Return (t,t0))
+   
+   [id_mut_pair1_fwd_def]  Definition
+      
+      ⊢ ∀x y. id_mut_pair1_fwd x y = Return (x,y)
+   
+   [id_mut_pair2_back_def]  Definition
+      
+      ⊢ ∀p ret.
+          id_mut_pair2_back p ret = (let (t,t0) = ret in Return (t,t0))
+   
+   [id_mut_pair2_fwd_def]  Definition
+      
+      ⊢ ∀p. id_mut_pair2_fwd p = (let (t,t0) = p in Return (t,t0))
+   
+   [id_mut_pair3_back'a_def]  Definition
+      
+      ⊢ ∀x y ret. id_mut_pair3_back'a x y ret = Return ret
+   
+   [id_mut_pair3_back'b_def]  Definition
+      
+      ⊢ ∀x y ret. id_mut_pair3_back'b x y ret = Return ret
+   
+   [id_mut_pair3_fwd_def]  Definition
+      
+      ⊢ ∀x y. id_mut_pair3_fwd x y = Return (x,y)
+   
+   [id_mut_pair4_back'a_def]  Definition
+      
+      ⊢ ∀p ret. id_mut_pair4_back'a p ret = Return ret
+   
+   [id_mut_pair4_back'b_def]  Definition
+      
+      ⊢ ∀p ret. id_mut_pair4_back'b p ret = Return ret
+   
+   [id_mut_pair4_fwd_def]  Definition
+      
+      ⊢ ∀p. id_mut_pair4_fwd p = (let (t,t0) = p in Return (t,t0))
+   
+   [is_cons_fwd_def]  Definition
+      
+      ⊢ ∀l. is_cons_fwd l =
+            case l of ListCons t l0 => Return T | ListNil => Return F
+   
+   [list_length_fwd_def]  Definition
+      
+      ⊢ ∀l. list_length_fwd l =
+            case l of
+              ListCons t l1 =>
+                do i <- list_length_fwd l1; u32_add (int_to_u32 1) i od
+            | ListNil => Return (int_to_u32 0)
+   
+   [list_nth_mut_back_def]  Definition
+      
+      ⊢ ∀l i ret.
+          list_nth_mut_back l i ret =
+          case l of
+            ListCons x tl =>
+              if i = int_to_u32 0 then Return (ListCons ret tl)
+              else
+                do
+                  i0 <- u32_sub i (int_to_u32 1);
+                  tl0 <- list_nth_mut_back tl i0 ret;
+                  Return (ListCons x tl0)
+                od
+          | ListNil => Fail Failure
+   
+   [list_nth_mut_fwd_def]  Definition
+      
+      ⊢ ∀l i.
+          list_nth_mut_fwd l i =
+          case l of
+            ListCons x tl =>
+              if i = int_to_u32 0 then Return x
+              else
+                do
+                  i0 <- u32_sub i (int_to_u32 1);
+                  list_nth_mut_fwd tl i0
+                od
+          | ListNil => Fail Failure
+   
+   [list_nth_shared_fwd_def]  Definition
+      
+      ⊢ ∀l i.
+          list_nth_shared_fwd l i =
+          case l of
+            ListCons x tl =>
+              if i = int_to_u32 0 then Return x
+              else
+                do
+                  i0 <- u32_sub i (int_to_u32 1);
+                  list_nth_shared_fwd tl i0
+                od
+          | ListNil => Fail Failure
+   
+   [list_rev_aux_fwd_def]  Definition
+      
+      ⊢ ∀li lo.
+          list_rev_aux_fwd li lo =
+          case li of
+            ListCons hd tl => list_rev_aux_fwd tl (ListCons hd lo)
+          | ListNil => Return lo
+   
+   [list_rev_fwd_back_def]  Definition
+      
+      ⊢ ∀l. list_rev_fwd_back l =
+            (let
+               li = mem_replace_fwd l ListNil
+             in
+               list_rev_aux_fwd li ListNil)
+   
+   [list_t_TY_DEF]  Definition
+      
+      ⊢ ∃rep.
+          TYPE_DEFINITION
+            (λa0'.
+                 ∀ $var$('list_t').
+                   (∀a0'.
+                      (∃a0 a1.
+                         a0' =
+                         (λa0 a1.
+                              ind_type$CONSTR 0 a0
+                                (ind_type$FCONS a1 (λn. ind_type$BOTTOM)))
+                           a0 a1 ∧ $var$('list_t') a1) ∨
+                      a0' =
+                      ind_type$CONSTR (SUC 0) ARB (λn. ind_type$BOTTOM) ⇒
+                      $var$('list_t') a0') ⇒
+                   $var$('list_t') a0') rep
+   
+   [list_t_case_def]  Definition
+      
+      ⊢ (∀a0 a1 f v. list_t_CASE (ListCons a0 a1) f v = f a0 a1) ∧
+        ∀f v. list_t_CASE ListNil f v = v
+   
+   [list_t_size_def]  Definition
+      
+      ⊢ (∀f a0 a1.
+           list_t_size f (ListCons a0 a1) = 1 + (f a0 + list_t_size f a1)) ∧
+        ∀f. list_t_size f ListNil = 0
+   
+   [neg_test_fwd_def]  Definition
+      
+      ⊢ ∀x. neg_test_fwd x = i32_neg x
+   
+   [new_pair1_fwd_def]  Definition
+      
+      ⊢ new_pair1_fwd =
+        Return
+          <|struct_with_pair_p :=
+              <|pair_x := int_to_u32 1; pair_y := int_to_u32 2|> |>
+   
+   [new_tuple1_fwd_def]  Definition
+      
+      ⊢ new_tuple1_fwd =
+        Return <|struct_with_tuple_p := (int_to_u32 1,int_to_u32 2)|>
+   
+   [new_tuple2_fwd_def]  Definition
+      
+      ⊢ new_tuple2_fwd =
+        Return <|struct_with_tuple_p := (int_to_i16 1,int_to_i16 2)|>
+   
+   [new_tuple3_fwd_def]  Definition
+      
+      ⊢ new_tuple3_fwd =
+        Return <|struct_with_tuple_p := (int_to_u64 1,int_to_i64 2)|>
+   
+   [node_elem_t_TY_DEF]  Definition
+      
+      ⊢ ∃rep.
+          TYPE_DEFINITION
+            (λa1'.
+                 ∀ $var$('tree_t') $var$('node_elem_t').
+                   (∀a0'.
+                      (∃a. a0' =
+                           (λa. ind_type$CONSTR 0 a (λn. ind_type$BOTTOM))
+                             a) ∨
+                      (∃a0 a1 a2.
+                         a0' =
+                         (λa0 a1 a2.
+                              ind_type$CONSTR (SUC 0) a0
+                                (ind_type$FCONS a1
+                                   (ind_type$FCONS a2 (λn. ind_type$BOTTOM))))
+                           a0 a1 a2 ∧ $var$('node_elem_t') a1 ∧
+                         $var$('tree_t') a2) ⇒
+                      $var$('tree_t') a0') ∧
+                   (∀a1'.
+                      (∃a0 a1.
+                         a1' =
+                         (λa0 a1.
+                              ind_type$CONSTR (SUC (SUC 0)) ARB
+                                (ind_type$FCONS a0
+                                   (ind_type$FCONS a1 (λn. ind_type$BOTTOM))))
+                           a0 a1 ∧ $var$('tree_t') a0 ∧
+                         $var$('node_elem_t') a1) ∨
+                      a1' =
+                      ind_type$CONSTR (SUC (SUC (SUC 0))) ARB
+                        (λn. ind_type$BOTTOM) ⇒
+                      $var$('node_elem_t') a1') ⇒
+                   $var$('node_elem_t') a1') rep
+   
+   [node_elem_t_case_def]  Definition
+      
+      ⊢ (∀a0 a1 f v. node_elem_t_CASE (NodeElemCons a0 a1) f v = f a0 a1) ∧
+        ∀f v. node_elem_t_CASE NodeElemNil f v = v
+   
+   [one_t_TY_DEF]  Definition
+      
+      ⊢ ∃rep.
+          TYPE_DEFINITION
+            (λa0.
+                 ∀ $var$('one_t').
+                   (∀a0.
+                      (∃a. a0 =
+                           (λa. ind_type$CONSTR 0 a (λn. ind_type$BOTTOM))
+                             a) ⇒
+                      $var$('one_t') a0) ⇒
+                   $var$('one_t') a0) rep
+   
+   [one_t_case_def]  Definition
+      
+      ⊢ ∀a f. one_t_CASE (OneOne a) f = f a
+   
+   [one_t_size_def]  Definition
+      
+      ⊢ ∀f a. one_t_size f (OneOne a) = 1 + f a
+   
+   [pair_t_TY_DEF]  Definition
+      
+      ⊢ ∃rep.
+          TYPE_DEFINITION
+            (λa0'.
+                 ∀ $var$('pair_t').
+                   (∀a0'.
+                      (∃a0 a1.
+                         a0' =
+                         (λa0 a1.
+                              ind_type$CONSTR 0 (a0,a1)
+                                (λn. ind_type$BOTTOM)) a0 a1) ⇒
+                      $var$('pair_t') a0') ⇒
+                   $var$('pair_t') a0') rep
+   
+   [pair_t_case_def]  Definition
+      
+      ⊢ ∀a0 a1 f. pair_t_CASE (pair_t a0 a1) f = f a0 a1
+   
+   [pair_t_pair_x]  Definition
+      
+      ⊢ ∀t t0. (pair_t t t0).pair_x = t
+   
+   [pair_t_pair_x_fupd]  Definition
+      
+      ⊢ ∀f t t0. pair_t t t0 with pair_x updated_by f = pair_t (f t) t0
+   
+   [pair_t_pair_y]  Definition
+      
+      ⊢ ∀t t0. (pair_t t t0).pair_y = t0
+   
+   [pair_t_pair_y_fupd]  Definition
+      
+      ⊢ ∀f t t0. pair_t t t0 with pair_y updated_by f = pair_t t (f t0)
+   
+   [pair_t_size_def]  Definition
+      
+      ⊢ ∀f f1 a0 a1. pair_t_size f f1 (pair_t a0 a1) = 1 + (f a0 + f1 a1)
+   
+   [refs_test1_fwd_def]  Definition
+      
+      ⊢ refs_test1_fwd =
+        if int_to_i32 1 ≠ int_to_i32 1 then Fail Failure else Return ()
+   
+   [refs_test2_fwd_def]  Definition
+      
+      ⊢ refs_test2_fwd =
+        if int_to_i32 2 ≠ int_to_i32 2 then Fail Failure
+        else if int_to_i32 0 ≠ int_to_i32 0 then Fail Failure
+        else if int_to_i32 2 ≠ int_to_i32 2 then Fail Failure
+        else if int_to_i32 2 ≠ int_to_i32 2 then Fail Failure
+        else Return ()
+   
+   [rem_test_fwd_def]  Definition
+      
+      ⊢ ∀x y. rem_test_fwd x y = u32_rem x y
+   
+   [split_list_fwd_def]  Definition
+      
+      ⊢ ∀l. split_list_fwd l =
+            case l of
+              ListCons hd tl => Return (hd,tl)
+            | ListNil => Fail Failure
+   
+   [struct_with_pair_t_TY_DEF]  Definition
+      
+      ⊢ ∃rep.
+          TYPE_DEFINITION
+            (λa0.
+                 ∀ $var$('struct_with_pair_t').
+                   (∀a0.
+                      (∃a. a0 =
+                           (λa. ind_type$CONSTR 0 a (λn. ind_type$BOTTOM))
+                             a) ⇒
+                      $var$('struct_with_pair_t') a0) ⇒
+                   $var$('struct_with_pair_t') a0) rep
+   
+   [struct_with_pair_t_case_def]  Definition
+      
+      ⊢ ∀a f. struct_with_pair_t_CASE (struct_with_pair_t a) f = f a
+   
+   [struct_with_pair_t_size_def]  Definition
+      
+      ⊢ ∀f f1 a.
+          struct_with_pair_t_size f f1 (struct_with_pair_t a) =
+          1 + pair_t_size f f1 a
+   
+   [struct_with_pair_t_struct_with_pair_p]  Definition
+      
+      ⊢ ∀p. (struct_with_pair_t p).struct_with_pair_p = p
+   
+   [struct_with_pair_t_struct_with_pair_p_fupd]  Definition
+      
+      ⊢ ∀f p.
+          struct_with_pair_t p with struct_with_pair_p updated_by f =
+          struct_with_pair_t (f p)
+   
+   [struct_with_tuple_t_TY_DEF]  Definition
+      
+      ⊢ ∃rep.
+          TYPE_DEFINITION
+            (λa0.
+                 ∀ $var$('struct_with_tuple_t').
+                   (∀a0.
+                      (∃a. a0 =
+                           (λa. ind_type$CONSTR 0 a (λn. ind_type$BOTTOM))
+                             a) ⇒
+                      $var$('struct_with_tuple_t') a0) ⇒
+                   $var$('struct_with_tuple_t') a0) rep
+   
+   [struct_with_tuple_t_case_def]  Definition
+      
+      ⊢ ∀a f. struct_with_tuple_t_CASE (struct_with_tuple_t a) f = f a
+   
+   [struct_with_tuple_t_size_def]  Definition
+      
+      ⊢ ∀f f1 a.
+          struct_with_tuple_t_size f f1 (struct_with_tuple_t a) =
+          1 + pair_size f f1 a
+   
+   [struct_with_tuple_t_struct_with_tuple_p]  Definition
+      
+      ⊢ ∀p. (struct_with_tuple_t p).struct_with_tuple_p = p
+   
+   [struct_with_tuple_t_struct_with_tuple_p_fupd]  Definition
+      
+      ⊢ ∀f p.
+          struct_with_tuple_t p with struct_with_tuple_p updated_by f =
+          struct_with_tuple_t (f p)
+   
+   [subs_test_fwd_def]  Definition
+      
+      ⊢ ∀x y. subs_test_fwd x y = u32_sub x y
+   
+   [sum_t_TY_DEF]  Definition
+      
+      ⊢ ∃rep.
+          TYPE_DEFINITION
+            (λa0.
+                 ∀ $var$('sum_t').
+                   (∀a0.
+                      (∃a. a0 =
+                           (λa.
+                                ind_type$CONSTR 0 (a,ARB)
+                                  (λn. ind_type$BOTTOM)) a) ∨
+                      (∃a. a0 =
+                           (λa.
+                                ind_type$CONSTR (SUC 0) (ARB,a)
+                                  (λn. ind_type$BOTTOM)) a) ⇒
+                      $var$('sum_t') a0) ⇒
+                   $var$('sum_t') a0) rep
+   
+   [sum_t_case_def]  Definition
+      
+      ⊢ (∀a f f1. sum_t_CASE (SumLeft a) f f1 = f a) ∧
+        ∀a f f1. sum_t_CASE (SumRight a) f f1 = f1 a
+   
+   [sum_t_size_def]  Definition
+      
+      ⊢ (∀f f1 a. sum_t_size f f1 (SumLeft a) = 1 + f a) ∧
+        ∀f f1 a. sum_t_size f f1 (SumRight a) = 1 + f1 a
+   
+   [test2_fwd_def]  Definition
+      
+      ⊢ test2_fwd =
+        monad_ignore_bind (u32_add (int_to_u32 23) (int_to_u32 44))
+          (Return ())
+   
+   [test3_fwd_def]  Definition
+      
+      ⊢ test3_fwd =
+        do
+          x <- get_max_fwd (int_to_u32 4) (int_to_u32 3);
+          y <- get_max_fwd (int_to_u32 10) (int_to_u32 11);
+          z <- u32_add x y;
+          if z ≠ int_to_u32 15 then Fail Failure else Return ()
+        od
+   
+   [test_box1_fwd_def]  Definition
+      
+      ⊢ test_box1_fwd =
+        (let
+           b = int_to_i32 1;
+           x = b
+         in
+           if x ≠ int_to_i32 1 then Fail Failure else Return ())
+   
+   [test_char_fwd_def]  Definition
+      
+      ⊢ test_char_fwd = Return #"a"
+   
+   [test_constants_fwd_def]  Definition
+      
+      ⊢ test_constants_fwd =
+        do
+          swt <- new_tuple1_fwd;
+          (i,_) <<- swt.struct_with_tuple_p;
+          if i ≠ int_to_u32 1 then Fail Failure
+          else
+            do
+              swt0 <- new_tuple2_fwd;
+              (i0,_) <<- swt0.struct_with_tuple_p;
+              if i0 ≠ int_to_i16 1 then Fail Failure
+              else
+                do
+                  swt1 <- new_tuple3_fwd;
+                  (i1,_) <<- swt1.struct_with_tuple_p;
+                  if i1 ≠ int_to_u64 1 then Fail Failure
+                  else
+                    do
+                      swp <- new_pair1_fwd;
+                      if swp.struct_with_pair_p.pair_x ≠ int_to_u32 1 then
+                        Fail Failure
+                      else Return ()
+                    od
+                od
+            od
+        od
+   
+   [test_copy_int_fwd_def]  Definition
+      
+      ⊢ test_copy_int_fwd =
+        do
+          y <- copy_int_fwd (int_to_i32 0);
+          if int_to_i32 0 ≠ y then Fail Failure else Return ()
+        od
+   
+   [test_is_cons_fwd_def]  Definition
+      
+      ⊢ test_is_cons_fwd =
+        (let
+           l = ListNil
+         in
+           do
+             b <- is_cons_fwd (ListCons (int_to_i32 0) l);
+             if ¬b then Fail Failure else Return ()
+           od)
+   
+   [test_list1_fwd_def]  Definition
+      
+      ⊢ test_list1_fwd = Return ()
+   
+   [test_list_functions_fwd_def]  Definition
+      
+      ⊢ test_list_functions_fwd =
+        (let
+           l = ListNil;
+           l0 = ListCons (int_to_i32 2) l;
+           l1 = ListCons (int_to_i32 1) l0
+         in
+           do
+             i <- list_length_fwd (ListCons (int_to_i32 0) l1);
+             if i ≠ int_to_u32 3 then Fail Failure
+             else
+               do
+                 i0 <-
+                   list_nth_shared_fwd (ListCons (int_to_i32 0) l1)
+                     (int_to_u32 0);
+                 if i0 ≠ int_to_i32 0 then Fail Failure
+                 else
+                   do
+                     i1 <-
+                       list_nth_shared_fwd (ListCons (int_to_i32 0) l1)
+                         (int_to_u32 1);
+                     if i1 ≠ int_to_i32 1 then Fail Failure
+                     else
+                       do
+                         i2 <-
+                           list_nth_shared_fwd (ListCons (int_to_i32 0) l1)
+                             (int_to_u32 2);
+                         if i2 ≠ int_to_i32 2 then Fail Failure
+                         else
+                           do
+                             ls <-
+                               list_nth_mut_back
+                                 (ListCons (int_to_i32 0) l1)
+                                 (int_to_u32 1) (int_to_i32 3);
+                             i3 <- list_nth_shared_fwd ls (int_to_u32 0);
+                             if i3 ≠ int_to_i32 0 then Fail Failure
+                             else
+                               do
+                                 i4 <-
+                                   list_nth_shared_fwd ls (int_to_u32 1);
+                                 if i4 ≠ int_to_i32 3 then Fail Failure
+                                 else
+                                   do
+                                     i5 <-
+                                       list_nth_shared_fwd ls
+                                         (int_to_u32 2);
+                                     if i5 ≠ int_to_i32 2 then Fail Failure
+                                     else Return ()
+                                   od
+                               od
+                           od
+                       od
+                   od
+               od
+           od)
+   
+   [test_mem_replace_fwd_back_def]  Definition
+      
+      ⊢ ∀px.
+          test_mem_replace_fwd_back px =
+          (let
+             y = mem_replace_fwd px (int_to_u32 1)
+           in
+             if y ≠ int_to_u32 0 then Fail Failure
+             else Return (int_to_u32 2))
+   
+   [test_neg1_fwd_def]  Definition
+      
+      ⊢ test_neg1_fwd =
+        do
+          y <- i32_neg (int_to_i32 3);
+          if y ≠ int_to_i32 (-3) then Fail Failure else Return ()
+        od
+   
+   [test_panic_fwd_def]  Definition
+      
+      ⊢ ∀b. test_panic_fwd b = if b then Fail Failure else Return ()
+   
+   [test_shared_borrow_bool1_fwd_def]  Definition
+      
+      ⊢ ∀b. test_shared_borrow_bool1_fwd b =
+            if b then Return (int_to_u32 0) else Return (int_to_u32 1)
+   
+   [test_shared_borrow_bool2_fwd_def]  Definition
+      
+      ⊢ test_shared_borrow_bool2_fwd = Return (int_to_u32 0)
+   
+   [test_shared_borrow_enum1_fwd_def]  Definition
+      
+      ⊢ ∀l. test_shared_borrow_enum1_fwd l =
+            case l of
+              ListCons i l0 => Return (int_to_u32 1)
+            | ListNil => Return (int_to_u32 0)
+   
+   [test_shared_borrow_enum2_fwd_def]  Definition
+      
+      ⊢ test_shared_borrow_enum2_fwd = Return (int_to_u32 0)
+   
+   [test_split_list_fwd_def]  Definition
+      
+      ⊢ test_split_list_fwd =
+        (let
+           l = ListNil
+         in
+           do
+             p <- split_list_fwd (ListCons (int_to_i32 0) l);
+             (hd,_) <<- p;
+             if hd ≠ int_to_i32 0 then Fail Failure else Return ()
+           od)
+   
+   [test_unreachable_fwd_def]  Definition
+      
+      ⊢ ∀b. test_unreachable_fwd b = if b then Fail Failure else Return ()
+   
+   [test_weird_borrows1_fwd_def]  Definition
+      
+      ⊢ test_weird_borrows1_fwd = Return ()
+   
+   [tree_t_TY_DEF]  Definition
+      
+      ⊢ ∃rep.
+          TYPE_DEFINITION
+            (λa0'.
+                 ∀ $var$('tree_t') $var$('node_elem_t').
+                   (∀a0'.
+                      (∃a. a0' =
+                           (λa. ind_type$CONSTR 0 a (λn. ind_type$BOTTOM))
+                             a) ∨
+                      (∃a0 a1 a2.
+                         a0' =
+                         (λa0 a1 a2.
+                              ind_type$CONSTR (SUC 0) a0
+                                (ind_type$FCONS a1
+                                   (ind_type$FCONS a2 (λn. ind_type$BOTTOM))))
+                           a0 a1 a2 ∧ $var$('node_elem_t') a1 ∧
+                         $var$('tree_t') a2) ⇒
+                      $var$('tree_t') a0') ∧
+                   (∀a1'.
+                      (∃a0 a1.
+                         a1' =
+                         (λa0 a1.
+                              ind_type$CONSTR (SUC (SUC 0)) ARB
+                                (ind_type$FCONS a0
+                                   (ind_type$FCONS a1 (λn. ind_type$BOTTOM))))
+                           a0 a1 ∧ $var$('tree_t') a0 ∧
+                         $var$('node_elem_t') a1) ∨
+                      a1' =
+                      ind_type$CONSTR (SUC (SUC (SUC 0))) ARB
+                        (λn. ind_type$BOTTOM) ⇒
+                      $var$('node_elem_t') a1') ⇒
+                   $var$('tree_t') a0') rep
+   
+   [tree_t_case_def]  Definition
+      
+      ⊢ (∀a f f1. tree_t_CASE (TreeLeaf a) f f1 = f a) ∧
+        ∀a0 a1 a2 f f1. tree_t_CASE (TreeNode a0 a1 a2) f f1 = f1 a0 a1 a2
+   
+   [tree_t_size_def]  Definition
+      
+      ⊢ (∀f a. tree_t_size f (TreeLeaf a) = 1 + f a) ∧
+        (∀f a0 a1 a2.
+           tree_t_size f (TreeNode a0 a1 a2) =
+           1 + (f a0 + (node_elem_t_size f a1 + tree_t_size f a2))) ∧
+        (∀f a0 a1.
+           node_elem_t_size f (NodeElemCons a0 a1) =
+           1 + (tree_t_size f a0 + node_elem_t_size f a1)) ∧
+        ∀f. node_elem_t_size f NodeElemNil = 0
+   
+   [EXISTS_pair_t]  Theorem
+      
+      ⊢ ∀P. (∃p. P p) ⇔ ∃t0 t. P <|pair_x := t0; pair_y := t|>
+   
+   [EXISTS_struct_with_pair_t]  Theorem
+      
+      ⊢ ∀P. (∃s. P s) ⇔ ∃p. P <|struct_with_pair_p := p|>
+   
+   [EXISTS_struct_with_tuple_t]  Theorem
+      
+      ⊢ ∀P. (∃s. P s) ⇔ ∃p. P <|struct_with_tuple_p := p|>
+   
+   [FORALL_pair_t]  Theorem
+      
+      ⊢ ∀P. (∀p. P p) ⇔ ∀t0 t. P <|pair_x := t0; pair_y := t|>
+   
+   [FORALL_struct_with_pair_t]  Theorem
+      
+      ⊢ ∀P. (∀s. P s) ⇔ ∀p. P <|struct_with_pair_p := p|>
+   
+   [FORALL_struct_with_tuple_t]  Theorem
+      
+      ⊢ ∀P. (∀s. P s) ⇔ ∀p. P <|struct_with_tuple_p := p|>
+   
+   [datatype_empty_enum_t]  Theorem
+      
+      ⊢ DATATYPE (empty_enum_t EmptyEnumEmpty)
+   
+   [datatype_enum_t]  Theorem
+      
+      ⊢ DATATYPE (enum_t EnumVariant1 EnumVariant2)
+   
+   [datatype_list_t]  Theorem
+      
+      ⊢ DATATYPE (list_t ListCons ListNil)
+   
+   [datatype_one_t]  Theorem
+      
+      ⊢ DATATYPE (one_t OneOne)
+   
+   [datatype_pair_t]  Theorem
+      
+      ⊢ DATATYPE (record pair_t pair_x pair_y)
+   
+   [datatype_struct_with_pair_t]  Theorem
+      
+      ⊢ DATATYPE (record struct_with_pair_t struct_with_pair_p)
+   
+   [datatype_struct_with_tuple_t]  Theorem
+      
+      ⊢ DATATYPE (record struct_with_tuple_t struct_with_tuple_p)
+   
+   [datatype_sum_t]  Theorem
+      
+      ⊢ DATATYPE (sum_t SumLeft SumRight)
+   
+   [datatype_tree_t]  Theorem
+      
+      ⊢ DATATYPE
+          (tree_t TreeLeaf TreeNode ∧ node_elem_t NodeElemCons NodeElemNil)
+   
+   [empty_enum_t2num_11]  Theorem
+      
+      ⊢ ∀a a'. empty_enum_t2num a = empty_enum_t2num a' ⇔ a = a'
+   
+   [empty_enum_t2num_ONTO]  Theorem
+      
+      ⊢ ∀r. r < 1 ⇔ ∃a. r = empty_enum_t2num a
+   
+   [empty_enum_t2num_num2empty_enum_t]  Theorem
+      
+      ⊢ ∀r. r < 1 ⇔ empty_enum_t2num (num2empty_enum_t r) = r
+   
+   [empty_enum_t2num_thm]  Theorem
+      
+      ⊢ empty_enum_t2num EmptyEnumEmpty = 0
+   
+   [empty_enum_t_Axiom]  Theorem
+      
+      ⊢ ∀x0. ∃f. f EmptyEnumEmpty = x0
+   
+   [empty_enum_t_EQ_empty_enum_t]  Theorem
+      
+      ⊢ ∀a a'. a = a' ⇔ empty_enum_t2num a = empty_enum_t2num a'
+   
+   [empty_enum_t_case_cong]  Theorem
+      
+      ⊢ ∀M M' v0.
+          M = M' ∧ (M' = EmptyEnumEmpty ⇒ v0 = v0') ⇒
+          (case M of EmptyEnumEmpty => v0) =
+          case M' of EmptyEnumEmpty => v0'
+   
+   [empty_enum_t_case_def]  Theorem
+      
+      ⊢ ∀v0. (case EmptyEnumEmpty of EmptyEnumEmpty => v0) = v0
+   
+   [empty_enum_t_case_eq]  Theorem
+      
+      ⊢ (case x of EmptyEnumEmpty => v0) = v ⇔ x = EmptyEnumEmpty ∧ v0 = v
+   
+   [empty_enum_t_induction]  Theorem
+      
+      ⊢ ∀P. P EmptyEnumEmpty ⇒ ∀a. P a
+   
+   [empty_enum_t_nchotomy]  Theorem
+      
+      ⊢ ∀a. a = EmptyEnumEmpty
+   
+   [enum_t2num_11]  Theorem
+      
+      ⊢ ∀a a'. enum_t2num a = enum_t2num a' ⇔ a = a'
+   
+   [enum_t2num_ONTO]  Theorem
+      
+      ⊢ ∀r. r < 2 ⇔ ∃a. r = enum_t2num a
+   
+   [enum_t2num_num2enum_t]  Theorem
+      
+      ⊢ ∀r. r < 2 ⇔ enum_t2num (num2enum_t r) = r
+   
+   [enum_t2num_thm]  Theorem
+      
+      ⊢ enum_t2num EnumVariant1 = 0 ∧ enum_t2num EnumVariant2 = 1
+   
+   [enum_t_Axiom]  Theorem
+      
+      ⊢ ∀x0 x1. ∃f. f EnumVariant1 = x0 ∧ f EnumVariant2 = x1
+   
+   [enum_t_EQ_enum_t]  Theorem
+      
+      ⊢ ∀a a'. a = a' ⇔ enum_t2num a = enum_t2num a'
+   
+   [enum_t_case_cong]  Theorem
+      
+      ⊢ ∀M M' v0 v1.
+          M = M' ∧ (M' = EnumVariant1 ⇒ v0 = v0') ∧
+          (M' = EnumVariant2 ⇒ v1 = v1') ⇒
+          (case M of EnumVariant1 => v0 | EnumVariant2 => v1) =
+          case M' of EnumVariant1 => v0' | EnumVariant2 => v1'
+   
+   [enum_t_case_def]  Theorem
+      
+      ⊢ (∀v0 v1.
+           (case EnumVariant1 of EnumVariant1 => v0 | EnumVariant2 => v1) =
+           v0) ∧
+        ∀v0 v1.
+          (case EnumVariant2 of EnumVariant1 => v0 | EnumVariant2 => v1) =
+          v1
+   
+   [enum_t_case_eq]  Theorem
+      
+      ⊢ (case x of EnumVariant1 => v0 | EnumVariant2 => v1) = v ⇔
+        x = EnumVariant1 ∧ v0 = v ∨ x = EnumVariant2 ∧ v1 = v
+   
+   [enum_t_distinct]  Theorem
+      
+      ⊢ EnumVariant1 ≠ EnumVariant2
+   
+   [enum_t_induction]  Theorem
+      
+      ⊢ ∀P. P EnumVariant1 ∧ P EnumVariant2 ⇒ ∀a. P a
+   
+   [enum_t_nchotomy]  Theorem
+      
+      ⊢ ∀a. a = EnumVariant1 ∨ a = EnumVariant2
+   
+   [list_t_11]  Theorem
+      
+      ⊢ ∀a0 a1 a0' a1'.
+          ListCons a0 a1 = ListCons a0' a1' ⇔ a0 = a0' ∧ a1 = a1'
+   
+   [list_t_Axiom]  Theorem
+      
+      ⊢ ∀f0 f1. ∃fn.
+          (∀a0 a1. fn (ListCons a0 a1) = f0 a0 a1 (fn a1)) ∧
+          fn ListNil = f1
+   
+   [list_t_case_cong]  Theorem
+      
+      ⊢ ∀M M' f v.
+          M = M' ∧ (∀a0 a1. M' = ListCons a0 a1 ⇒ f a0 a1 = f' a0 a1) ∧
+          (M' = ListNil ⇒ v = v') ⇒
+          list_t_CASE M f v = list_t_CASE M' f' v'
+   
+   [list_t_case_eq]  Theorem
+      
+      ⊢ list_t_CASE x f v = v' ⇔
+        (∃t l. x = ListCons t l ∧ f t l = v') ∨ x = ListNil ∧ v = v'
+   
+   [list_t_distinct]  Theorem
+      
+      ⊢ ∀a1 a0. ListCons a0 a1 ≠ ListNil
+   
+   [list_t_induction]  Theorem
+      
+      ⊢ ∀P. (∀l. P l ⇒ ∀t. P (ListCons t l)) ∧ P ListNil ⇒ ∀l. P l
+   
+   [list_t_nchotomy]  Theorem
+      
+      ⊢ ∀ll. (∃t l. ll = ListCons t l) ∨ ll = ListNil
+   
+   [node_elem_t_11]  Theorem
+      
+      ⊢ ∀a0 a1 a0' a1'.
+          NodeElemCons a0 a1 = NodeElemCons a0' a1' ⇔ a0 = a0' ∧ a1 = a1'
+   
+   [node_elem_t_Axiom]  Theorem
+      
+      ⊢ ∀f0 f1 f2 f3. ∃fn0 fn1.
+          (∀a. fn0 (TreeLeaf a) = f0 a) ∧
+          (∀a0 a1 a2.
+             fn0 (TreeNode a0 a1 a2) = f1 a0 a1 a2 (fn1 a1) (fn0 a2)) ∧
+          (∀a0 a1. fn1 (NodeElemCons a0 a1) = f2 a0 a1 (fn0 a0) (fn1 a1)) ∧
+          fn1 NodeElemNil = f3
+   
+   [node_elem_t_case_cong]  Theorem
+      
+      ⊢ ∀M M' f v.
+          M = M' ∧ (∀a0 a1. M' = NodeElemCons a0 a1 ⇒ f a0 a1 = f' a0 a1) ∧
+          (M' = NodeElemNil ⇒ v = v') ⇒
+          node_elem_t_CASE M f v = node_elem_t_CASE M' f' v'
+   
+   [node_elem_t_case_eq]  Theorem
+      
+      ⊢ node_elem_t_CASE x f v = v' ⇔
+        (∃t n. x = NodeElemCons t n ∧ f t n = v') ∨
+        x = NodeElemNil ∧ v = v'
+   
+   [node_elem_t_distinct]  Theorem
+      
+      ⊢ ∀a1 a0. NodeElemCons a0 a1 ≠ NodeElemNil
+   
+   [node_elem_t_induction]  Theorem
+      
+      ⊢ ∀P0 P1.
+          (∀t. P0 (TreeLeaf t)) ∧
+          (∀n t. P1 n ∧ P0 t ⇒ ∀t0. P0 (TreeNode t0 n t)) ∧
+          (∀t n. P0 t ∧ P1 n ⇒ P1 (NodeElemCons t n)) ∧ P1 NodeElemNil ⇒
+          (∀t. P0 t) ∧ ∀n. P1 n
+   
+   [node_elem_t_nchotomy]  Theorem
+      
+      ⊢ ∀nn. (∃t n. nn = NodeElemCons t n) ∨ nn = NodeElemNil
+   
+   [num2empty_enum_t_11]  Theorem
+      
+      ⊢ ∀r r'.
+          r < 1 ⇒
+          r' < 1 ⇒
+          (num2empty_enum_t r = num2empty_enum_t r' ⇔ r = r')
+   
+   [num2empty_enum_t_ONTO]  Theorem
+      
+      ⊢ ∀a. ∃r. a = num2empty_enum_t r ∧ r < 1
+   
+   [num2empty_enum_t_empty_enum_t2num]  Theorem
+      
+      ⊢ ∀a. num2empty_enum_t (empty_enum_t2num a) = a
+   
+   [num2empty_enum_t_thm]  Theorem
+      
+      ⊢ num2empty_enum_t 0 = EmptyEnumEmpty
+   
+   [num2enum_t_11]  Theorem
+      
+      ⊢ ∀r r'. r < 2 ⇒ r' < 2 ⇒ (num2enum_t r = num2enum_t r' ⇔ r = r')
+   
+   [num2enum_t_ONTO]  Theorem
+      
+      ⊢ ∀a. ∃r. a = num2enum_t r ∧ r < 2
+   
+   [num2enum_t_enum_t2num]  Theorem
+      
+      ⊢ ∀a. num2enum_t (enum_t2num a) = a
+   
+   [num2enum_t_thm]  Theorem
+      
+      ⊢ num2enum_t 0 = EnumVariant1 ∧ num2enum_t 1 = EnumVariant2
+   
+   [one_t_11]  Theorem
+      
+      ⊢ ∀a a'. OneOne a = OneOne a' ⇔ a = a'
+   
+   [one_t_Axiom]  Theorem
+      
+      ⊢ ∀f. ∃fn. ∀a. fn (OneOne a) = f a
+   
+   [one_t_case_cong]  Theorem
+      
+      ⊢ ∀M M' f.
+          M = M' ∧ (∀a. M' = OneOne a ⇒ f a = f' a) ⇒
+          one_t_CASE M f = one_t_CASE M' f'
+   
+   [one_t_case_eq]  Theorem
+      
+      ⊢ one_t_CASE x f = v ⇔ ∃t. x = OneOne t ∧ f t = v
+   
+   [one_t_induction]  Theorem
+      
+      ⊢ ∀P. (∀t. P (OneOne t)) ⇒ ∀ $o. P $o
+   
+   [one_t_nchotomy]  Theorem
+      
+      ⊢ ∀oo. ∃t. oo = OneOne t
+   
+   [pair_t_11]  Theorem
+      
+      ⊢ ∀a0 a1 a0' a1'. pair_t a0 a1 = pair_t a0' a1' ⇔ a0 = a0' ∧ a1 = a1'
+   
+   [pair_t_Axiom]  Theorem
+      
+      ⊢ ∀f. ∃fn. ∀a0 a1. fn (pair_t a0 a1) = f a0 a1
+   
+   [pair_t_accessors]  Theorem
+      
+      ⊢ (∀t t0. (pair_t t t0).pair_x = t) ∧
+        ∀t t0. (pair_t t t0).pair_y = t0
+   
+   [pair_t_accfupds]  Theorem
+      
+      ⊢ (∀p f. (p with pair_y updated_by f).pair_x = p.pair_x) ∧
+        (∀p f. (p with pair_x updated_by f).pair_y = p.pair_y) ∧
+        (∀p f. (p with pair_x updated_by f).pair_x = f p.pair_x) ∧
+        ∀p f. (p with pair_y updated_by f).pair_y = f p.pair_y
+   
+   [pair_t_case_cong]  Theorem
+      
+      ⊢ ∀M M' f.
+          M = M' ∧ (∀a0 a1. M' = pair_t a0 a1 ⇒ f a0 a1 = f' a0 a1) ⇒
+          pair_t_CASE M f = pair_t_CASE M' f'
+   
+   [pair_t_case_eq]  Theorem
+      
+      ⊢ pair_t_CASE x f = v ⇔ ∃t t0. x = pair_t t t0 ∧ f t t0 = v
+   
+   [pair_t_component_equality]  Theorem
+      
+      ⊢ ∀p1 p2. p1 = p2 ⇔ p1.pair_x = p2.pair_x ∧ p1.pair_y = p2.pair_y
+   
+   [pair_t_fn_updates]  Theorem
+      
+      ⊢ (∀f t t0. pair_t t t0 with pair_x updated_by f = pair_t (f t) t0) ∧
+        ∀f t t0. pair_t t t0 with pair_y updated_by f = pair_t t (f t0)
+   
+   [pair_t_fupdcanon]  Theorem
+      
+      ⊢ ∀p g f.
+          p with <|pair_y updated_by f; pair_x updated_by g|> =
+          p with <|pair_x updated_by g; pair_y updated_by f|>
+   
+   [pair_t_fupdcanon_comp]  Theorem
+      
+      ⊢ (∀g f.
+           pair_y_fupd f ∘ pair_x_fupd g = pair_x_fupd g ∘ pair_y_fupd f) ∧
+        ∀h g f.
+          pair_y_fupd f ∘ pair_x_fupd g ∘ h =
+          pair_x_fupd g ∘ pair_y_fupd f ∘ h
+   
+   [pair_t_fupdfupds]  Theorem
+      
+      ⊢ (∀p g f.
+           p with <|pair_x updated_by f; pair_x updated_by g|> =
+           p with pair_x updated_by f ∘ g) ∧
+        ∀p g f.
+          p with <|pair_y updated_by f; pair_y updated_by g|> =
+          p with pair_y updated_by f ∘ g
+   
+   [pair_t_fupdfupds_comp]  Theorem
+      
+      ⊢ ((∀g f. pair_x_fupd f ∘ pair_x_fupd g = pair_x_fupd (f ∘ g)) ∧
+         ∀h g f.
+           pair_x_fupd f ∘ pair_x_fupd g ∘ h = pair_x_fupd (f ∘ g) ∘ h) ∧
+        (∀g f. pair_y_fupd f ∘ pair_y_fupd g = pair_y_fupd (f ∘ g)) ∧
+        ∀h g f. pair_y_fupd f ∘ pair_y_fupd g ∘ h = pair_y_fupd (f ∘ g) ∘ h
+   
+   [pair_t_induction]  Theorem
+      
+      ⊢ ∀P. (∀t t0. P (pair_t t t0)) ⇒ ∀p. P p
+   
+   [pair_t_literal_11]  Theorem
+      
+      ⊢ ∀t01 t1 t02 t2.
+          <|pair_x := t01; pair_y := t1|> = <|pair_x := t02; pair_y := t2|> ⇔
+          t01 = t02 ∧ t1 = t2
+   
+   [pair_t_literal_nchotomy]  Theorem
+      
+      ⊢ ∀p. ∃t0 t. p = <|pair_x := t0; pair_y := t|>
+   
+   [pair_t_nchotomy]  Theorem
+      
+      ⊢ ∀pp. ∃t t0. pp = pair_t t t0
+   
+   [pair_t_updates_eq_literal]  Theorem
+      
+      ⊢ ∀p t0 t.
+          p with <|pair_x := t0; pair_y := t|> =
+          <|pair_x := t0; pair_y := t|>
+   
+   [struct_with_pair_t_11]  Theorem
+      
+      ⊢ ∀a a'. struct_with_pair_t a = struct_with_pair_t a' ⇔ a = a'
+   
+   [struct_with_pair_t_Axiom]  Theorem
+      
+      ⊢ ∀f. ∃fn. ∀a. fn (struct_with_pair_t a) = f a
+   
+   [struct_with_pair_t_accessors]  Theorem
+      
+      ⊢ ∀p. (struct_with_pair_t p).struct_with_pair_p = p
+   
+   [struct_with_pair_t_accfupds]  Theorem
+      
+      ⊢ ∀s f.
+          (s with struct_with_pair_p updated_by f).struct_with_pair_p =
+          f s.struct_with_pair_p
+   
+   [struct_with_pair_t_case_cong]  Theorem
+      
+      ⊢ ∀M M' f.
+          M = M' ∧ (∀a. M' = struct_with_pair_t a ⇒ f a = f' a) ⇒
+          struct_with_pair_t_CASE M f = struct_with_pair_t_CASE M' f'
+   
+   [struct_with_pair_t_case_eq]  Theorem
+      
+      ⊢ struct_with_pair_t_CASE x f = v ⇔
+        ∃p. x = struct_with_pair_t p ∧ f p = v
+   
+   [struct_with_pair_t_component_equality]  Theorem
+      
+      ⊢ ∀s1 s2. s1 = s2 ⇔ s1.struct_with_pair_p = s2.struct_with_pair_p
+   
+   [struct_with_pair_t_fn_updates]  Theorem
+      
+      ⊢ ∀f p.
+          struct_with_pair_t p with struct_with_pair_p updated_by f =
+          struct_with_pair_t (f p)
+   
+   [struct_with_pair_t_fupdfupds]  Theorem
+      
+      ⊢ ∀s g f.
+          s with
+          <|struct_with_pair_p updated_by f;
+            struct_with_pair_p updated_by g|> =
+          s with struct_with_pair_p updated_by f ∘ g
+   
+   [struct_with_pair_t_fupdfupds_comp]  Theorem
+      
+      ⊢ (∀g f.
+           struct_with_pair_p_fupd f ∘ struct_with_pair_p_fupd g =
+           struct_with_pair_p_fupd (f ∘ g)) ∧
+        ∀h g f.
+          struct_with_pair_p_fupd f ∘ struct_with_pair_p_fupd g ∘ h =
+          struct_with_pair_p_fupd (f ∘ g) ∘ h
+   
+   [struct_with_pair_t_induction]  Theorem
+      
+      ⊢ ∀P. (∀p. P (struct_with_pair_t p)) ⇒ ∀s. P s
+   
+   [struct_with_pair_t_literal_11]  Theorem
+      
+      ⊢ ∀p1 p2.
+          <|struct_with_pair_p := p1|> = <|struct_with_pair_p := p2|> ⇔
+          p1 = p2
+   
+   [struct_with_pair_t_literal_nchotomy]  Theorem
+      
+      ⊢ ∀s. ∃p. s = <|struct_with_pair_p := p|>
+   
+   [struct_with_pair_t_nchotomy]  Theorem
+      
+      ⊢ ∀ss. ∃p. ss = struct_with_pair_t p
+   
+   [struct_with_pair_t_updates_eq_literal]  Theorem
+      
+      ⊢ ∀s p. s with struct_with_pair_p := p = <|struct_with_pair_p := p|>
+   
+   [struct_with_tuple_t_11]  Theorem
+      
+      ⊢ ∀a a'. struct_with_tuple_t a = struct_with_tuple_t a' ⇔ a = a'
+   
+   [struct_with_tuple_t_Axiom]  Theorem
+      
+      ⊢ ∀f. ∃fn. ∀a. fn (struct_with_tuple_t a) = f a
+   
+   [struct_with_tuple_t_accessors]  Theorem
+      
+      ⊢ ∀p. (struct_with_tuple_t p).struct_with_tuple_p = p
+   
+   [struct_with_tuple_t_accfupds]  Theorem
+      
+      ⊢ ∀s f.
+          (s with struct_with_tuple_p updated_by f).struct_with_tuple_p =
+          f s.struct_with_tuple_p
+   
+   [struct_with_tuple_t_case_cong]  Theorem
+      
+      ⊢ ∀M M' f.
+          M = M' ∧ (∀a. M' = struct_with_tuple_t a ⇒ f a = f' a) ⇒
+          struct_with_tuple_t_CASE M f = struct_with_tuple_t_CASE M' f'
+   
+   [struct_with_tuple_t_case_eq]  Theorem
+      
+      ⊢ struct_with_tuple_t_CASE x f = v ⇔
+        ∃p. x = struct_with_tuple_t p ∧ f p = v
+   
+   [struct_with_tuple_t_component_equality]  Theorem
+      
+      ⊢ ∀s1 s2. s1 = s2 ⇔ s1.struct_with_tuple_p = s2.struct_with_tuple_p
+   
+   [struct_with_tuple_t_fn_updates]  Theorem
+      
+      ⊢ ∀f p.
+          struct_with_tuple_t p with struct_with_tuple_p updated_by f =
+          struct_with_tuple_t (f p)
+   
+   [struct_with_tuple_t_fupdfupds]  Theorem
+      
+      ⊢ ∀s g f.
+          s with
+          <|struct_with_tuple_p updated_by f;
+            struct_with_tuple_p updated_by g|> =
+          s with struct_with_tuple_p updated_by f ∘ g
+   
+   [struct_with_tuple_t_fupdfupds_comp]  Theorem
+      
+      ⊢ (∀g f.
+           struct_with_tuple_p_fupd f ∘ struct_with_tuple_p_fupd g =
+           struct_with_tuple_p_fupd (f ∘ g)) ∧
+        ∀h g f.
+          struct_with_tuple_p_fupd f ∘ struct_with_tuple_p_fupd g ∘ h =
+          struct_with_tuple_p_fupd (f ∘ g) ∘ h
+   
+   [struct_with_tuple_t_induction]  Theorem
+      
+      ⊢ ∀P. (∀p. P (struct_with_tuple_t p)) ⇒ ∀s. P s
+   
+   [struct_with_tuple_t_literal_11]  Theorem
+      
+      ⊢ ∀p1 p2.
+          <|struct_with_tuple_p := p1|> = <|struct_with_tuple_p := p2|> ⇔
+          p1 = p2
+   
+   [struct_with_tuple_t_literal_nchotomy]  Theorem
+      
+      ⊢ ∀s. ∃p. s = <|struct_with_tuple_p := p|>
+   
+   [struct_with_tuple_t_nchotomy]  Theorem
+      
+      ⊢ ∀ss. ∃p. ss = struct_with_tuple_t p
+   
+   [struct_with_tuple_t_updates_eq_literal]  Theorem
+      
+      ⊢ ∀s p.
+          s with struct_with_tuple_p := p = <|struct_with_tuple_p := p|>
+   
+   [sum_t_11]  Theorem
+      
+      ⊢ (∀a a'. SumLeft a = SumLeft a' ⇔ a = a') ∧
+        ∀a a'. SumRight a = SumRight a' ⇔ a = a'
+   
+   [sum_t_Axiom]  Theorem
+      
+      ⊢ ∀f0 f1. ∃fn.
+          (∀a. fn (SumLeft a) = f0 a) ∧ ∀a. fn (SumRight a) = f1 a
+   
+   [sum_t_case_cong]  Theorem
+      
+      ⊢ ∀M M' f f1.
+          M = M' ∧ (∀a. M' = SumLeft a ⇒ f a = f' a) ∧
+          (∀a. M' = SumRight a ⇒ f1 a = f1' a) ⇒
+          sum_t_CASE M f f1 = sum_t_CASE M' f' f1'
+   
+   [sum_t_case_eq]  Theorem
+      
+      ⊢ sum_t_CASE x f f1 = v ⇔
+        (∃t. x = SumLeft t ∧ f t = v) ∨ ∃t. x = SumRight t ∧ f1 t = v
+   
+   [sum_t_distinct]  Theorem
+      
+      ⊢ ∀a' a. SumLeft a ≠ SumRight a'
+   
+   [sum_t_induction]  Theorem
+      
+      ⊢ ∀P. (∀t. P (SumLeft t)) ∧ (∀t. P (SumRight t)) ⇒ ∀s. P s
+   
+   [sum_t_nchotomy]  Theorem
+      
+      ⊢ ∀ss. (∃t. ss = SumLeft t) ∨ ∃t. ss = SumRight t
+   
+   [tree_t_11]  Theorem
+      
+      ⊢ (∀a a'. TreeLeaf a = TreeLeaf a' ⇔ a = a') ∧
+        ∀a0 a1 a2 a0' a1' a2'.
+          TreeNode a0 a1 a2 = TreeNode a0' a1' a2' ⇔
+          a0 = a0' ∧ a1 = a1' ∧ a2 = a2'
+   
+   [tree_t_Axiom]  Theorem
+      
+      ⊢ ∀f0 f1 f2 f3. ∃fn0 fn1.
+          (∀a. fn0 (TreeLeaf a) = f0 a) ∧
+          (∀a0 a1 a2.
+             fn0 (TreeNode a0 a1 a2) = f1 a0 a1 a2 (fn1 a1) (fn0 a2)) ∧
+          (∀a0 a1. fn1 (NodeElemCons a0 a1) = f2 a0 a1 (fn0 a0) (fn1 a1)) ∧
+          fn1 NodeElemNil = f3
+   
+   [tree_t_case_cong]  Theorem
+      
+      ⊢ ∀M M' f f1.
+          M = M' ∧ (∀a. M' = TreeLeaf a ⇒ f a = f' a) ∧
+          (∀a0 a1 a2. M' = TreeNode a0 a1 a2 ⇒ f1 a0 a1 a2 = f1' a0 a1 a2) ⇒
+          tree_t_CASE M f f1 = tree_t_CASE M' f' f1'
+   
+   [tree_t_case_eq]  Theorem
+      
+      ⊢ tree_t_CASE x f f1 = v ⇔
+        (∃t. x = TreeLeaf t ∧ f t = v) ∨
+        ∃t0 n t. x = TreeNode t0 n t ∧ f1 t0 n t = v
+   
+   [tree_t_distinct]  Theorem
+      
+      ⊢ ∀a2 a1 a0 a. TreeLeaf a ≠ TreeNode a0 a1 a2
+   
+   [tree_t_induction]  Theorem
+      
+      ⊢ ∀P0 P1.
+          (∀t. P0 (TreeLeaf t)) ∧
+          (∀n t. P1 n ∧ P0 t ⇒ ∀t0. P0 (TreeNode t0 n t)) ∧
+          (∀t n. P0 t ∧ P1 n ⇒ P1 (NodeElemCons t n)) ∧ P1 NodeElemNil ⇒
+          (∀t. P0 t) ∧ ∀n. P1 n
+   
+   [tree_t_nchotomy]  Theorem
+      
+      ⊢ ∀tt. (∃t. tt = TreeLeaf t) ∨ ∃t0 n t. tt = TreeNode t0 n t
+   
+   
+*)
+end
diff --git a/tests/hol4/paper/Holmakefile b/tests/hol4/paper/Holmakefile
new file mode 100644
index 00000000..3c4b8973
--- /dev/null
+++ b/tests/hol4/paper/Holmakefile
@@ -0,0 +1,5 @@
+# This file was automatically generated - modify ../Holmakefile.template instead
+INCLUDES =  ../../../backends/hol4
+
+all: $(DEFAULT_TARGETS)
+.PHONY: all
diff --git a/tests/hol4/paper/paperScript.sml b/tests/hol4/paper/paperScript.sml
new file mode 100644
index 00000000..3ac5b6ca
--- /dev/null
+++ b/tests/hol4/paper/paperScript.sml
@@ -0,0 +1,136 @@
+(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
+(** [paper] *)
+open primitivesLib divDefLib
+
+val _ = new_theory "paper"
+
+
+val ref_incr_fwd_back_def = Define ‘
+  (** [paper::ref_incr]: merged forward/backward function
+      (there is a single backward function, and the forward function returns ()) *)
+  ref_incr_fwd_back (x : i32) : i32 result =
+    i32_add x (int_to_i32 1)
+’
+
+val test_incr_fwd_def = Define ‘
+  (** [paper::test_incr]: forward function *)
+  test_incr_fwd : unit result =
+    do
+    x <- ref_incr_fwd_back (int_to_i32 0);
+    if ~ (x = int_to_i32 1) then Fail Failure else Return ()
+    od
+’
+
+(** Unit test for [paper::test_incr] *)
+val _ = assert_return (“test_incr_fwd”)
+
+val choose_fwd_def = Define ‘
+  (** [paper::choose]: forward function *)
+  choose_fwd (b : bool) (x : 't) (y : 't) : 't result =
+    if b then Return x else Return y
+’
+
+val choose_back_def = Define ‘
+  (** [paper::choose]: backward function 0 *)
+  choose_back (b : bool) (x : 't) (y : 't) (ret : 't) : ('t # 't) result =
+    if b then Return (ret, y) else Return (x, ret)
+’
+
+val test_choose_fwd_def = Define ‘
+  (** [paper::test_choose]: forward function *)
+  test_choose_fwd : unit result =
+    do
+    z <- choose_fwd T (int_to_i32 0) (int_to_i32 0);
+    z0 <- i32_add z (int_to_i32 1);
+    if ~ (z0 = int_to_i32 1)
+    then Fail Failure
+    else (
+      do
+      (x, y) <- choose_back T (int_to_i32 0) (int_to_i32 0) z0;
+      if ~ (x = int_to_i32 1)
+      then Fail Failure
+      else if ~ (y = int_to_i32 0) then Fail Failure else Return ()
+      od)
+    od
+’
+
+(** Unit test for [paper::test_choose] *)
+val _ = assert_return (“test_choose_fwd”)
+
+Datatype:
+  (** [paper::List] *)
+  list_t = | ListCons 't list_t | ListNil
+End
+
+val [list_nth_mut_fwd_def] = DefineDiv ‘
+  (** [paper::list_nth_mut]: forward function *)
+  list_nth_mut_fwd (l : 't list_t) (i : u32) : 't result =
+    (case l of
+    | ListCons x tl =>
+      if i = int_to_u32 0
+      then Return x
+      else (do
+            i0 <- u32_sub i (int_to_u32 1);
+            list_nth_mut_fwd tl i0
+            od)
+    | ListNil => Fail Failure)
+’
+
+val [list_nth_mut_back_def] = DefineDiv ‘
+  (** [paper::list_nth_mut]: backward function 0 *)
+  list_nth_mut_back (l : 't list_t) (i : u32) (ret : 't) : 't list_t result =
+    (case l of
+    | ListCons x tl =>
+      if i = int_to_u32 0
+      then Return (ListCons ret tl)
+      else (
+        do
+        i0 <- u32_sub i (int_to_u32 1);
+        tl0 <- list_nth_mut_back tl i0 ret;
+        Return (ListCons x tl0)
+        od)
+    | ListNil => Fail Failure)
+’
+
+val [sum_fwd_def] = DefineDiv ‘
+  (** [paper::sum]: forward function *)
+  sum_fwd (l : i32 list_t) : i32 result =
+    (case l of
+    | ListCons x tl => do
+                       i <- sum_fwd tl;
+                       i32_add x i
+                       od
+    | ListNil => Return (int_to_i32 0))
+’
+
+val test_nth_fwd_def = Define ‘
+  (** [paper::test_nth]: forward function *)
+  test_nth_fwd : unit result =
+    let l = ListNil in
+    let l0 = ListCons (int_to_i32 3) l in
+    let l1 = ListCons (int_to_i32 2) l0 in
+    do
+    x <- list_nth_mut_fwd (ListCons (int_to_i32 1) l1) (int_to_u32 2);
+    x0 <- i32_add x (int_to_i32 1);
+    l2 <- list_nth_mut_back (ListCons (int_to_i32 1) l1) (int_to_u32 2) x0;
+    i <- sum_fwd l2;
+    if ~ (i = int_to_i32 7) then Fail Failure else Return ()
+    od
+’
+
+(** Unit test for [paper::test_nth] *)
+val _ = assert_return (“test_nth_fwd”)
+
+val call_choose_fwd_def = Define ‘
+  (** [paper::call_choose]: forward function *)
+  call_choose_fwd (p : (u32 # u32)) : u32 result =
+    let (px, py) = p in
+    do
+    pz <- choose_fwd T px py;
+    pz0 <- u32_add pz (int_to_u32 1);
+    (px0, _) <- choose_back T px py pz0;
+    Return px0
+    od
+’
+
+val _ = export_theory ()
diff --git a/tests/hol4/paper/paperTheory.sig b/tests/hol4/paper/paperTheory.sig
new file mode 100644
index 00000000..2da80da1
--- /dev/null
+++ b/tests/hol4/paper/paperTheory.sig
@@ -0,0 +1,210 @@
+signature paperTheory =
+sig
+  type thm = Thm.thm
+  
+  (*  Definitions  *)
+    val call_choose_fwd_def : thm
+    val choose_back_def : thm
+    val choose_fwd_def : thm
+    val list_nth_mut_back_def : thm
+    val list_nth_mut_fwd_def : thm
+    val list_t_TY_DEF : thm
+    val list_t_case_def : thm
+    val list_t_size_def : thm
+    val ref_incr_fwd_back_def : thm
+    val sum_fwd_def : thm
+    val test_choose_fwd_def : thm
+    val test_incr_fwd_def : thm
+    val test_nth_fwd_def : thm
+  
+  (*  Theorems  *)
+    val datatype_list_t : thm
+    val list_t_11 : thm
+    val list_t_Axiom : thm
+    val list_t_case_cong : thm
+    val list_t_case_eq : thm
+    val list_t_distinct : thm
+    val list_t_induction : thm
+    val list_t_nchotomy : thm
+  
+  val paper_grammars : type_grammar.grammar * term_grammar.grammar
+(*
+   [divDef] Parent theory of "paper"
+   
+   [call_choose_fwd_def]  Definition
+      
+      ⊢ ∀p. call_choose_fwd p =
+            (let
+               (px,py) = p
+             in
+               do
+                 pz <- choose_fwd T px py;
+                 pz0 <- u32_add pz (int_to_u32 1);
+                 (px0,_) <- choose_back T px py pz0;
+                 Return px0
+               od)
+   
+   [choose_back_def]  Definition
+      
+      ⊢ ∀b x y ret.
+          choose_back b x y ret =
+          if b then Return (ret,y) else Return (x,ret)
+   
+   [choose_fwd_def]  Definition
+      
+      ⊢ ∀b x y. choose_fwd b x y = if b then Return x else Return y
+   
+   [list_nth_mut_back_def]  Definition
+      
+      ⊢ ∀l i ret.
+          list_nth_mut_back l i ret =
+          case l of
+            ListCons x tl =>
+              if i = int_to_u32 0 then Return (ListCons ret tl)
+              else
+                do
+                  i0 <- u32_sub i (int_to_u32 1);
+                  tl0 <- list_nth_mut_back tl i0 ret;
+                  Return (ListCons x tl0)
+                od
+          | ListNil => Fail Failure
+   
+   [list_nth_mut_fwd_def]  Definition
+      
+      ⊢ ∀l i.
+          list_nth_mut_fwd l i =
+          case l of
+            ListCons x tl =>
+              if i = int_to_u32 0 then Return x
+              else
+                do
+                  i0 <- u32_sub i (int_to_u32 1);
+                  list_nth_mut_fwd tl i0
+                od
+          | ListNil => Fail Failure
+   
+   [list_t_TY_DEF]  Definition
+      
+      ⊢ ∃rep.
+          TYPE_DEFINITION
+            (λa0'.
+                 ∀ $var$('list_t').
+                   (∀a0'.
+                      (∃a0 a1.
+                         a0' =
+                         (λa0 a1.
+                              ind_type$CONSTR 0 a0
+                                (ind_type$FCONS a1 (λn. ind_type$BOTTOM)))
+                           a0 a1 ∧ $var$('list_t') a1) ∨
+                      a0' =
+                      ind_type$CONSTR (SUC 0) ARB (λn. ind_type$BOTTOM) ⇒
+                      $var$('list_t') a0') ⇒
+                   $var$('list_t') a0') rep
+   
+   [list_t_case_def]  Definition
+      
+      ⊢ (∀a0 a1 f v. list_t_CASE (ListCons a0 a1) f v = f a0 a1) ∧
+        ∀f v. list_t_CASE ListNil f v = v
+   
+   [list_t_size_def]  Definition
+      
+      ⊢ (∀f a0 a1.
+           list_t_size f (ListCons a0 a1) = 1 + (f a0 + list_t_size f a1)) ∧
+        ∀f. list_t_size f ListNil = 0
+   
+   [ref_incr_fwd_back_def]  Definition
+      
+      ⊢ ∀x. ref_incr_fwd_back x = i32_add x (int_to_i32 1)
+   
+   [sum_fwd_def]  Definition
+      
+      ⊢ ∀l. sum_fwd l =
+            case l of
+              ListCons x tl => do i <- sum_fwd tl; i32_add x i od
+            | ListNil => Return (int_to_i32 0)
+   
+   [test_choose_fwd_def]  Definition
+      
+      ⊢ test_choose_fwd =
+        do
+          z <- choose_fwd T (int_to_i32 0) (int_to_i32 0);
+          z0 <- i32_add z (int_to_i32 1);
+          if z0 ≠ int_to_i32 1 then Fail Failure
+          else
+            do
+              (x,y) <- choose_back T (int_to_i32 0) (int_to_i32 0) z0;
+              if x ≠ int_to_i32 1 then Fail Failure
+              else if y ≠ int_to_i32 0 then Fail Failure
+              else Return ()
+            od
+        od
+   
+   [test_incr_fwd_def]  Definition
+      
+      ⊢ test_incr_fwd =
+        do
+          x <- ref_incr_fwd_back (int_to_i32 0);
+          if x ≠ int_to_i32 1 then Fail Failure else Return ()
+        od
+   
+   [test_nth_fwd_def]  Definition
+      
+      ⊢ test_nth_fwd =
+        (let
+           l = ListNil;
+           l0 = ListCons (int_to_i32 3) l;
+           l1 = ListCons (int_to_i32 2) l0
+         in
+           do
+             x <-
+               list_nth_mut_fwd (ListCons (int_to_i32 1) l1) (int_to_u32 2);
+             x0 <- i32_add x (int_to_i32 1);
+             l2 <-
+               list_nth_mut_back (ListCons (int_to_i32 1) l1)
+                 (int_to_u32 2) x0;
+             i <- sum_fwd l2;
+             if i ≠ int_to_i32 7 then Fail Failure else Return ()
+           od)
+   
+   [datatype_list_t]  Theorem
+      
+      ⊢ DATATYPE (list_t ListCons ListNil)
+   
+   [list_t_11]  Theorem
+      
+      ⊢ ∀a0 a1 a0' a1'.
+          ListCons a0 a1 = ListCons a0' a1' ⇔ a0 = a0' ∧ a1 = a1'
+   
+   [list_t_Axiom]  Theorem
+      
+      ⊢ ∀f0 f1. ∃fn.
+          (∀a0 a1. fn (ListCons a0 a1) = f0 a0 a1 (fn a1)) ∧
+          fn ListNil = f1
+   
+   [list_t_case_cong]  Theorem
+      
+      ⊢ ∀M M' f v.
+          M = M' ∧ (∀a0 a1. M' = ListCons a0 a1 ⇒ f a0 a1 = f' a0 a1) ∧
+          (M' = ListNil ⇒ v = v') ⇒
+          list_t_CASE M f v = list_t_CASE M' f' v'
+   
+   [list_t_case_eq]  Theorem
+      
+      ⊢ list_t_CASE x f v = v' ⇔
+        (∃t l. x = ListCons t l ∧ f t l = v') ∨ x = ListNil ∧ v = v'
+   
+   [list_t_distinct]  Theorem
+      
+      ⊢ ∀a1 a0. ListCons a0 a1 ≠ ListNil
+   
+   [list_t_induction]  Theorem
+      
+      ⊢ ∀P. (∀l. P l ⇒ ∀t. P (ListCons t l)) ∧ P ListNil ⇒ ∀l. P l
+   
+   [list_t_nchotomy]  Theorem
+      
+      ⊢ ∀ll. (∃t l. ll = ListCons t l) ∨ ll = ListNil
+   
+   
+*)
+end
diff --git a/tests/hol4/polonius_list/Holmakefile b/tests/hol4/polonius_list/Holmakefile
new file mode 100644
index 00000000..3c4b8973
--- /dev/null
+++ b/tests/hol4/polonius_list/Holmakefile
@@ -0,0 +1,5 @@
+# This file was automatically generated - modify ../Holmakefile.template instead
+INCLUDES =  ../../../backends/hol4
+
+all: $(DEFAULT_TARGETS)
+.PHONY: all
diff --git a/tests/hol4/polonius_list/poloniusListScript.sml b/tests/hol4/polonius_list/poloniusListScript.sml
new file mode 100644
index 00000000..06876ed4
--- /dev/null
+++ b/tests/hol4/polonius_list/poloniusListScript.sml
@@ -0,0 +1,37 @@
+(** THIS FILE WAS AUTOMATICALLY GENERATED BY AENEAS *)
+(** [polonius_list] *)
+open primitivesLib divDefLib
+
+val _ = new_theory "poloniusList"
+
+
+Datatype:
+  (** [polonius_list::List] *)
+  list_t = | ListCons 't list_t | ListNil
+End
+
+val [get_list_at_x_fwd_def] = DefineDiv ‘
+  (** [polonius_list::get_list_at_x]: forward function *)
+  get_list_at_x_fwd (ls : u32 list_t) (x : u32) : u32 list_t result =
+    (case ls of
+    | ListCons hd tl =>
+      if hd = x then Return (ListCons hd tl) else get_list_at_x_fwd tl x
+    | ListNil => Return ListNil)
+’
+
+val [get_list_at_x_back_def] = DefineDiv ‘
+  (** [polonius_list::get_list_at_x]: backward function 0 *)
+  get_list_at_x_back
+    (ls : u32 list_t) (x : u32) (ret : u32 list_t) : u32 list_t result =
+    (case ls of
+    | ListCons hd tl =>
+      if hd = x
+      then Return ret
+      else (do
+            tl0 <- get_list_at_x_back tl x ret;
+            Return (ListCons hd tl0)
+            od)
+    | ListNil => Return ret)
+’
+
+val _ = export_theory ()
diff --git a/tests/hol4/polonius_list/poloniusListTheory.sig b/tests/hol4/polonius_list/poloniusListTheory.sig
new file mode 100644
index 00000000..41f21df7
--- /dev/null
+++ b/tests/hol4/polonius_list/poloniusListTheory.sig
@@ -0,0 +1,120 @@
+signature poloniusListTheory =
+sig
+  type thm = Thm.thm
+  
+  (*  Definitions  *)
+    val get_list_at_x_back_def : thm
+    val get_list_at_x_fwd_def : thm
+    val list_t_TY_DEF : thm
+    val list_t_case_def : thm
+    val list_t_size_def : thm
+  
+  (*  Theorems  *)
+    val datatype_list_t : thm
+    val list_t_11 : thm
+    val list_t_Axiom : thm
+    val list_t_case_cong : thm
+    val list_t_case_eq : thm
+    val list_t_distinct : thm
+    val list_t_induction : thm
+    val list_t_nchotomy : thm
+  
+  val poloniusList_grammars : type_grammar.grammar * term_grammar.grammar
+(*
+   [divDef] Parent theory of "poloniusList"
+   
+   [get_list_at_x_back_def]  Definition
+      
+      ⊢ ∀ls x ret.
+          get_list_at_x_back ls x ret =
+          case ls of
+            ListCons hd tl =>
+              if hd = x then Return ret
+              else
+                do
+                  tl0 <- get_list_at_x_back tl x ret;
+                  Return (ListCons hd tl0)
+                od
+          | ListNil => Return ret
+   
+   [get_list_at_x_fwd_def]  Definition
+      
+      ⊢ ∀ls x.
+          get_list_at_x_fwd ls x =
+          case ls of
+            ListCons hd tl =>
+              if hd = x then Return (ListCons hd tl)
+              else get_list_at_x_fwd tl x
+          | ListNil => Return ListNil
+   
+   [list_t_TY_DEF]  Definition
+      
+      ⊢ ∃rep.
+          TYPE_DEFINITION
+            (λa0'.
+                 ∀ $var$('list_t').
+                   (∀a0'.
+                      (∃a0 a1.
+                         a0' =
+                         (λa0 a1.
+                              ind_type$CONSTR 0 a0
+                                (ind_type$FCONS a1 (λn. ind_type$BOTTOM)))
+                           a0 a1 ∧ $var$('list_t') a1) ∨
+                      a0' =
+                      ind_type$CONSTR (SUC 0) ARB (λn. ind_type$BOTTOM) ⇒
+                      $var$('list_t') a0') ⇒
+                   $var$('list_t') a0') rep
+   
+   [list_t_case_def]  Definition
+      
+      ⊢ (∀a0 a1 f v. list_t_CASE (ListCons a0 a1) f v = f a0 a1) ∧
+        ∀f v. list_t_CASE ListNil f v = v
+   
+   [list_t_size_def]  Definition
+      
+      ⊢ (∀f a0 a1.
+           list_t_size f (ListCons a0 a1) = 1 + (f a0 + list_t_size f a1)) ∧
+        ∀f. list_t_size f ListNil = 0
+   
+   [datatype_list_t]  Theorem
+      
+      ⊢ DATATYPE (list_t ListCons ListNil)
+   
+   [list_t_11]  Theorem
+      
+      ⊢ ∀a0 a1 a0' a1'.
+          ListCons a0 a1 = ListCons a0' a1' ⇔ a0 = a0' ∧ a1 = a1'
+   
+   [list_t_Axiom]  Theorem
+      
+      ⊢ ∀f0 f1. ∃fn.
+          (∀a0 a1. fn (ListCons a0 a1) = f0 a0 a1 (fn a1)) ∧
+          fn ListNil = f1
+   
+   [list_t_case_cong]  Theorem
+      
+      ⊢ ∀M M' f v.
+          M = M' ∧ (∀a0 a1. M' = ListCons a0 a1 ⇒ f a0 a1 = f' a0 a1) ∧
+          (M' = ListNil ⇒ v = v') ⇒
+          list_t_CASE M f v = list_t_CASE M' f' v'
+   
+   [list_t_case_eq]  Theorem
+      
+      ⊢ list_t_CASE x f v = v' ⇔
+        (∃t l. x = ListCons t l ∧ f t l = v') ∨ x = ListNil ∧ v = v'
+   
+   [list_t_distinct]  Theorem
+      
+      ⊢ ∀a1 a0. ListCons a0 a1 ≠ ListNil
+   
+   [list_t_induction]  Theorem
+      
+      ⊢ ∀P. (∀l. P l ⇒ ∀t. P (ListCons t l)) ∧ P ListNil ⇒ ∀l. P l
+   
+   [list_t_nchotomy]  Theorem
+      
+      ⊢ ∀ll. (∃t l. ll = ListCons t l) ∨ ll = ListNil
+   
+   
+*)
+end
diff --git a/tests/test_runner/run_test.ml b/tests/test_runner/run_test.ml
index 8f356365..5d77bf9e 100644
--- a/tests/test_runner/run_test.ml
+++ b/tests/test_runner/run_test.ml
@@ -104,18 +104,6 @@ let charon_options_for_test test_name =
       [ "--polonius"; "--opaque=betree_utils"; "--crate"; "betree_main" ]
   | _ -> []
 
-(* The default subdirectory in which to store the outputs. *)
-(* This reproduces the file layout that was set by the old Makefile. FIXME: cleanup *)
-let test_subdir backend test_name =
-  match (backend, test_name) with
-  | Backend.Lean, _ -> "."
-  | _, "hashmap_main" -> "hashmap_on_disk"
-  | ( Backend.HOL4,
-      ( "constants" | "external" | "loops" | "no_nested_borrows" | "paper"
-      | "polonius_list" ) ) ->
-      "misc-" ^ test_name
-  | _ -> test_name
-
 (* The data for a specific test input *)
 module Input = struct
   type kind = SingleFile | Crate
@@ -131,6 +119,10 @@ module Input = struct
     subdirs : string BackendMap.t;
   }
 
+  (* The default subdirectory in which to store the outputs. *)
+  let default_subdir backend test_name =
+    match backend with Backend.Lean -> "." | _ -> test_name
+
   (* Parse lines that start `//@`. Each of them modifies the options we use for the test.
      Supported comments:
        - `skip`: don't process the file;
@@ -199,7 +191,9 @@ module Input = struct
     in
     let actions = BackendMap.make (fun _ -> Normal) in
     let charon_options = charon_options_for_test name in
-    let subdirs = BackendMap.make (fun backend -> test_subdir backend name) in
+    let subdirs =
+      BackendMap.make (fun backend -> default_subdir backend name)
+    in
     let aeneas_options =
       BackendMap.make (fun backend -> aeneas_options_for_test backend name)
     in
-- 
cgit v1.2.3