(** 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 ()