Library zoo_std.array__code

Require Import zoo.prelude.
Require Import zoo.language.typeclasses.
Require Import zoo.language.notations.
Require Import zoo.program_logic.assume.
Require Import zoo.program_logic.for_.
Require Import zoo.options.

Definition arrayู unsafe_alloc : val :=
  ๐—ณ๐˜‚๐—ป "sz" โ†’
    ๐—ฎ๐—น๐—น๐—ผ๐—ฐ 0 "sz".

Definition arrayู alloc : val :=
  ๐—ณ๐˜‚๐—ป "sz" โ†’
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "sz") โฎ
    arrayู unsafe_alloc "sz".

Definition arrayู create : val :=
  ๐—ณ๐˜‚๐—ป โŽฝ โ†’
    arrayู unsafe_alloc 0.

Definition arrayู size : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    ๐˜€๐—ถ๐˜‡๐—ฒ "t".

Definition arrayู unsafe_get : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" โ†’
    ๐—น๐—ผ๐—ฎ๐—ฑ "t" "i".

Definition arrayู get : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" โ†’
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "i") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ ("i" < arrayู size "t") โฎ
    arrayู unsafe_get "t" "i".

Definition arrayู unsafe_set : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" "v" โ†’
    ๐˜€๐˜๐—ผ๐—ฟ๐—ฒ "t" "i" "v".

Definition arrayู set : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" "v" โ†’
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "i") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ ("i" < arrayู size "t") โฎ
    arrayู unsafe_set "t" "i" "v".

Definition arrayู unsafe_swap : val :=
  ๐—ณ๐˜‚๐—ป "t" "i1" "i2" โ†’
    ๐—น๐—ฒ๐˜ "v1" = arrayู unsafe_get "t" "i1" ๐—ถ๐—ป
    ๐—น๐—ฒ๐˜ "v2" = arrayู unsafe_get "t" "i2" ๐—ถ๐—ป
    arrayู unsafe_set "t" "i1" "v2" โฎ
    arrayู unsafe_set "t" "i2" "v1".

Definition arrayู unsafe_fill_slice : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" "n" "v" โ†’
    ๐—ณ๐—ผ๐—ฟ "j" = 0 ๐˜๐—ผ "n" ๐—ฑ๐—ผ
      arrayู unsafe_set "t" ("i" + "j") "v"
    ๐—ฑ๐—ผ๐—ป๐—ฒ.

Definition arrayู fill_slice : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" "n" "v" โ†’
    ๐—น๐—ฒ๐˜ "sz" = arrayู size "t" ๐—ถ๐—ป
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "i") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "n") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ ("i" + "n" โ‰ค "sz") โฎ
    arrayู unsafe_fill_slice "t" "i" "n" "v".

Definition arrayู fill : val :=
  ๐—ณ๐˜‚๐—ป "t" "v" โ†’
    arrayู unsafe_fill_slice "t" 0 (arrayู size "t") "v".

Definition arrayู unsafe_make : val :=
  ๐—ณ๐˜‚๐—ป "sz" "v" โ†’
    ๐—น๐—ฒ๐˜ "t" = arrayู unsafe_alloc "sz" ๐—ถ๐—ป
    arrayู fill "t" "v" โฎ
    "t".

Definition arrayู make : val :=
  ๐—ณ๐˜‚๐—ป "sz" "v" โ†’
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "sz") โฎ
    arrayู unsafe_make "sz" "v".

Definition arrayู foldli_aux : val :=
  ๐—ฟ๐—ฒ๐—ฐ "foldli_aux" "fn" "t" "sz" "i" "acc" โ†’
    ๐—ถ๐—ณ "sz" โ‰ค "i" ๐˜๐—ต๐—ฒ๐—ป (
      "acc"
    ) ๐—ฒ๐—น๐˜€๐—ฒ (
      ๐—น๐—ฒ๐˜ "v" = arrayู unsafe_get "t" "i" ๐—ถ๐—ป
      "foldli_aux" "fn" "t" "sz" ("i" + 1) ("fn" "i" "acc" "v")
    ).

Definition arrayู foldli : val :=
  ๐—ณ๐˜‚๐—ป "fn" "acc" "t" โ†’
    arrayู foldli_aux "fn" "t" (arrayู size "t") 0 "acc".

Definition arrayู foldl : val :=
  ๐—ณ๐˜‚๐—ป "fn" โ†’
    arrayู foldli (๐—ณ๐˜‚๐—ป "_i" โ†’ "fn").

Definition arrayู foldri_aux : val :=
  ๐—ฟ๐—ฒ๐—ฐ "foldri_aux" "fn" "t" "i" "acc" โ†’
    ๐—ถ๐—ณ "i" โ‰ค 0 ๐˜๐—ต๐—ฒ๐—ป (
      "acc"
    ) ๐—ฒ๐—น๐˜€๐—ฒ (
      ๐—น๐—ฒ๐˜ "i" = "i" - 1 ๐—ถ๐—ป
      ๐—น๐—ฒ๐˜ "v" = arrayู unsafe_get "t" "i" ๐—ถ๐—ป
      "foldri_aux" "fn" "t" "i" ("fn" "i" "v" "acc")
    ).

Definition arrayู foldri : val :=
  ๐—ณ๐˜‚๐—ป "fn" "t" "acc" โ†’
    arrayู foldri_aux "fn" "t" (arrayู size "t") "acc".

Definition arrayู foldr : val :=
  ๐—ณ๐˜‚๐—ป "fn" โ†’
    arrayู foldri (๐—ณ๐˜‚๐—ป "_i" โ†’ "fn").

Definition arrayู sum : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    arrayู foldl (๐—ณ๐˜‚๐—ป "1" "2" โ†’ "1" + "2") 0 "t".

Definition arrayู unsafe_iteri_slice : val :=
  ๐—ณ๐˜‚๐—ป "fn" "t" "i" "n" โ†’
    ๐—ณ๐—ผ๐—ฟ "k" = 0 ๐˜๐—ผ "n" ๐—ฑ๐—ผ
      "fn" "k" (arrayู unsafe_get "t" ("i" + "k"))
    ๐—ฑ๐—ผ๐—ป๐—ฒ.

Definition arrayู iteri_slice : val :=
  ๐—ณ๐˜‚๐—ป "fn" "t" "i" "n" โ†’
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "i") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "n") โฎ
    ๐—น๐—ฒ๐˜ "sz" = arrayู size "t" ๐—ถ๐—ป
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ ("i" โ‰ค "sz") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ ("i" + "n" โ‰ค "sz") โฎ
    arrayู unsafe_iteri_slice "fn" "t" "i" "n".

Definition arrayู unsafe_iter_slice : val :=
  ๐—ณ๐˜‚๐—ป "fn" โ†’
    arrayู unsafe_iteri_slice (๐—ณ๐˜‚๐—ป "_i" โ†’ "fn").

Definition arrayู iter_slice : val :=
  ๐—ณ๐˜‚๐—ป "fn" "t" "i" "n" โ†’
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "i") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "n") โฎ
    ๐—น๐—ฒ๐˜ "sz" = arrayู size "t" ๐—ถ๐—ป
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ ("i" โ‰ค "sz") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ ("i" + "n" โ‰ค "sz") โฎ
    arrayู unsafe_iter_slice "fn" "t" "i" "n".

Definition arrayู iteri : val :=
  ๐—ณ๐˜‚๐—ป "fn" "t" โ†’
    arrayู unsafe_iteri_slice "fn" "t" 0 (arrayู size "t").

Definition arrayู iter : val :=
  ๐—ณ๐˜‚๐—ป "fn" โ†’
    arrayู iteri (๐—ณ๐˜‚๐—ป "_i" โ†’ "fn").

Definition arrayู unsafe_applyi_slice : val :=
  ๐—ณ๐˜‚๐—ป "fn" "t" "i" "n" โ†’
    arrayู unsafe_iteri_slice
      (๐—ณ๐˜‚๐—ป "k" "v" โ†’
         arrayู unsafe_set "t" ("i" + "k") ("fn" "k" "v"))
      "t"
      "i"
      "n".

Definition arrayู applyi_slice : val :=
  ๐—ณ๐˜‚๐—ป "fn" "t" "i" "n" โ†’
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "i") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "n") โฎ
    ๐—น๐—ฒ๐˜ "sz" = arrayู size "t" ๐—ถ๐—ป
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ ("i" โ‰ค "sz") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ ("i" + "n" โ‰ค "sz") โฎ
    arrayู unsafe_applyi_slice "fn" "t" "i" "n".

Definition arrayู unsafe_apply_slice : val :=
  ๐—ณ๐˜‚๐—ป "fn" โ†’
    arrayู unsafe_applyi_slice (๐—ณ๐˜‚๐—ป "_i" โ†’ "fn").

Definition arrayู apply_slice : val :=
  ๐—ณ๐˜‚๐—ป "fn" "t" "i" "n" โ†’
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "i") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "n") โฎ
    ๐—น๐—ฒ๐˜ "sz" = arrayู size "t" ๐—ถ๐—ป
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ ("i" โ‰ค "sz") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ ("i" + "n" โ‰ค "sz") โฎ
    arrayู unsafe_apply_slice "fn" "t" "i" "n".

Definition arrayู applyi : val :=
  ๐—ณ๐˜‚๐—ป "fn" "t" โ†’
    arrayู unsafe_applyi_slice "fn" "t" 0 (arrayู size "t").

Definition arrayู apply : val :=
  ๐—ณ๐˜‚๐—ป "fn" โ†’
    arrayู applyi (๐—ณ๐˜‚๐—ป "_i" โ†’ "fn").

Definition arrayู unsafe_initi : val :=
  ๐—ณ๐˜‚๐—ป "sz" "fn" โ†’
    ๐—น๐—ฒ๐˜ "t" = arrayู unsafe_alloc "sz" ๐—ถ๐—ป
    arrayู applyi (๐—ณ๐˜‚๐—ป "i" โŽฝ โ†’ "fn" "i") "t" โฎ
    "t".

Definition arrayู initi : val :=
  ๐—ณ๐˜‚๐—ป "sz" "fn" โ†’
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "sz") โฎ
    arrayู unsafe_initi "sz" "fn".

Definition arrayู unsafe_init : val :=
  ๐—ณ๐˜‚๐—ป "sz" "fn" โ†’
    arrayู unsafe_initi "sz" (๐—ณ๐˜‚๐—ป "_i" โ†’ "fn" ()).

Definition arrayู init : val :=
  ๐—ณ๐˜‚๐—ป "sz" "fn" โ†’
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "sz") โฎ
    arrayู unsafe_init "sz" "fn".

Definition arrayู mapi : val :=
  ๐—ณ๐˜‚๐—ป "fn" "t" โ†’
    arrayู unsafe_initi
      (arrayู size "t")
      (๐—ณ๐˜‚๐—ป "i" โ†’ "fn" "i" (arrayู unsafe_get "t" "i")).

Definition arrayู map : val :=
  ๐—ณ๐˜‚๐—ป "fn" โ†’
    arrayู mapi (๐—ณ๐˜‚๐—ป "_i" โ†’ "fn").

Definition arrayู unsafe_copy_slice : val :=
  ๐—ณ๐˜‚๐—ป "t1" "i1" "t2" "i2" "n" โ†’
    ๐—ณ๐—ผ๐—ฟ "k" = 0 ๐˜๐—ผ "n" ๐—ฑ๐—ผ
      ๐—น๐—ฒ๐˜ "v" = arrayู unsafe_get "t1" ("i1" + "k") ๐—ถ๐—ป
      arrayู unsafe_set "t2" ("i2" + "k") "v"
    ๐—ฑ๐—ผ๐—ป๐—ฒ.

Definition arrayู copy_slice : val :=
  ๐—ณ๐˜‚๐—ป "t1" "i1" "t2" "i2" "n" โ†’
    ๐—น๐—ฒ๐˜ "sz1" = arrayู size "t1" ๐—ถ๐—ป
    ๐—น๐—ฒ๐˜ "sz2" = arrayู size "t2" ๐—ถ๐—ป
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "i1") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "i2") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "n") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ ("i1" + "n" โ‰ค "sz1") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ ("i2" + "n" โ‰ค "sz2") โฎ
    arrayู unsafe_copy_slice "t1" "i1" "t2" "i2" "n".

Definition arrayู unsafe_copy : val :=
  ๐—ณ๐˜‚๐—ป "t1" "t2" "i2" โ†’
    arrayู unsafe_copy_slice "t1" 0 "t2" "i2" (arrayู size "t1").

Definition arrayู copy : val :=
  ๐—ณ๐˜‚๐—ป "t1" "t2" "i2" โ†’
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "i2") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ ("i2" + arrayู size "t1" โ‰ค arrayู size "t2") โฎ
    arrayู unsafe_copy "t1" "t2" "i2".

Definition arrayู unsafe_grow : val :=
  ๐—ณ๐˜‚๐—ป "t" "sz'" "v'" โ†’
    ๐—น๐—ฒ๐˜ "sz" = arrayู size "t" ๐—ถ๐—ป
    ๐—น๐—ฒ๐˜ "t'" = arrayู unsafe_alloc "sz'" ๐—ถ๐—ป
    arrayู unsafe_copy "t" "t'" 0 โฎ
    arrayู unsafe_fill_slice "t'" "sz" ("sz'" - "sz") "v'" โฎ
    "t'".

Definition arrayู grow : val :=
  ๐—ณ๐˜‚๐—ป "t" "sz'" "v'" โ†’
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (arrayู size "t" โ‰ค "sz'") โฎ
    arrayู unsafe_grow "t" "sz'" "v'".

Definition arrayู unsafe_sub : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" "n" โ†’
    ๐—น๐—ฒ๐˜ "t'" = arrayู unsafe_alloc "n" ๐—ถ๐—ป
    arrayู unsafe_copy_slice "t" "i" "t'" 0 "n" โฎ
    "t'".

Definition arrayู sub : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" "n" โ†’
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "i") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "n") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ ("i" + "n" โ‰ค arrayู size "t") โฎ
    arrayู unsafe_sub "t" "i" "n".

Definition arrayู unsafe_shrink : val :=
  ๐—ณ๐˜‚๐—ป "t" "sz'" โ†’
    arrayู unsafe_sub "t" 0 "sz'".

Definition arrayู shrink : val :=
  ๐—ณ๐˜‚๐—ป "t" "sz'" โ†’
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "sz'") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ ("sz'" โ‰ค arrayู size "t") โฎ
    arrayู unsafe_shrink "t" "sz'".

Definition arrayู clone : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    arrayู unsafe_shrink "t" (arrayู size "t").

Definition arrayู unsafe_cget : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" โ†’
    arrayู unsafe_get "t" ("i" ๐—ฟ๐—ฒ๐—บ arrayู size "t").

Definition arrayู cget : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" โ†’
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "i") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 < arrayู size "t") โฎ
    arrayู unsafe_cget "t" "i".

Definition arrayู unsafe_cset : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" "v" โ†’
    arrayู unsafe_set "t" ("i" ๐—ฟ๐—ฒ๐—บ arrayู size "t") "v".

Definition arrayู cset : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" "v" โ†’
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "i") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 < arrayู size "t") โฎ
    arrayู unsafe_cset "t" "i" "v".

Definition arrayู unsafe_ccopy_sliceโ‚ : val :=
  ๐—ณ๐˜‚๐—ป "t1" "i1" "t2" "i2" "n" โ†’
    ๐—น๐—ฒ๐˜ "sz2" = arrayู size "t2" ๐—ถ๐—ป
    ๐—น๐—ฒ๐˜ "i2" = "i2" ๐—ฟ๐—ฒ๐—บ "sz2" ๐—ถ๐—ป
    ๐—ถ๐—ณ "i2" + "n" โ‰ค "sz2" ๐˜๐—ต๐—ฒ๐—ป (
      arrayู unsafe_copy_slice "t1" "i1" "t2" "i2" "n"
    ) ๐—ฒ๐—น๐˜€๐—ฒ (
      ๐—น๐—ฒ๐˜ "n1" = "sz2" - "i2" ๐—ถ๐—ป
      ๐—น๐—ฒ๐˜ "n2" = "n" - "n1" ๐—ถ๐—ป
      arrayู unsafe_copy_slice "t1" "i1" "t2" "i2" "n1" โฎ
      arrayู unsafe_copy_slice "t1" ("i1" + "n1") "t2" 0 "n2"
    ).

Definition arrayู unsafe_ccopy_slice : val :=
  ๐—ณ๐˜‚๐—ป "t1" "i1" "t2" "i2" "n" โ†’
    ๐—น๐—ฒ๐˜ "sz1" = arrayู size "t1" ๐—ถ๐—ป
    ๐—น๐—ฒ๐˜ "i1" = "i1" ๐—ฟ๐—ฒ๐—บ "sz1" ๐—ถ๐—ป
    ๐—ถ๐—ณ "i1" + "n" โ‰ค "sz1" ๐˜๐—ต๐—ฒ๐—ป (
      arrayู unsafe_ccopy_sliceโ‚ "t1" "i1" "t2" "i2" "n"
    ) ๐—ฒ๐—น๐˜€๐—ฒ (
      ๐—น๐—ฒ๐˜ "n1" = "sz1" - "i1" ๐—ถ๐—ป
      ๐—น๐—ฒ๐˜ "n2" = "n" - "n1" ๐—ถ๐—ป
      arrayู unsafe_ccopy_sliceโ‚ "t1" "i1" "t2" "i2" "n1" โฎ
      arrayู unsafe_ccopy_sliceโ‚ "t1" 0 "t2" ("i2" + "n1") "n2"
    ).

Definition arrayู ccopy_slice : val :=
  ๐—ณ๐˜‚๐—ป "t1" "i1" "t2" "i2" "n" โ†’
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "i1") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "i2") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "n") โฎ
    ๐—น๐—ฒ๐˜ "sz1" = arrayู size "t1" ๐—ถ๐—ป
    ๐—น๐—ฒ๐˜ "sz2" = arrayู size "t2" ๐—ถ๐—ป
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 < "sz1") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 < "sz2") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ ("n" โ‰ค "sz1") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ ("n" โ‰ค "sz2") โฎ
    arrayู unsafe_ccopy_slice "t1" "i1" "t2" "i2" "n".

Definition arrayู unsafe_ccopy : val :=
  ๐—ณ๐˜‚๐—ป "t1" "i1" "t2" "i2" โ†’
    arrayู unsafe_ccopy_slice "t1" "i1" "t2" "i2" (arrayู size "t1").

Definition arrayู ccopy : val :=
  ๐—ณ๐˜‚๐—ป "t1" "i1" "t2" "i2" โ†’
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "i1") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 โ‰ค "i2") โฎ
    ๐—น๐—ฒ๐˜ "sz1" = arrayู size "t1" ๐—ถ๐—ป
    ๐—น๐—ฒ๐˜ "sz2" = arrayู size "t2" ๐—ถ๐—ป
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ (0 < "sz1") โฎ
    ๐—ฎ๐˜€๐˜€๐˜‚๐—บ๐—ฒ ("sz1" โ‰ค "sz2") โฎ
    arrayู unsafe_ccopy "t1" "i1" "t2" "i2".

Definition arrayู unsafe_cgrow_slice : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" "n" "sz'" "v" โ†’
    ๐—น๐—ฒ๐˜ "t'" = arrayู unsafe_make "sz'" "v" ๐—ถ๐—ป
    arrayู unsafe_ccopy_slice "t" "i" "t'" "i" "n" โฎ
    "t'".

Definition arrayู unsafe_cgrow : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" "sz'" "v" โ†’
    arrayู unsafe_cgrow_slice "t" "i" (arrayู size "t") "sz'" "v".

Definition arrayู unsafe_cshrink_slice : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" "sz'" โ†’
    ๐—น๐—ฒ๐˜ "t'" = arrayู unsafe_alloc "sz'" ๐—ถ๐—ป
    arrayู unsafe_ccopy_slice "t" "i" "t'" "i" "sz'" โฎ
    "t'".