Library zoo_std.list__code

Require Import zoo.prelude.
Require Import zoo.language.typeclasses.
Require Import zoo.language.notations.
Require Import zoo.options.

Definition listู singleton : val :=
  ๐—ณ๐˜‚๐—ป "v" โ†’
    "v" :: [].

Definition listู head : val :=
  ๐—ณ๐˜‚๐—ป "param" โ†’
    ๐—บ๐—ฎ๐˜๐—ฐ๐—ต "param" ๐˜„๐—ถ๐˜๐—ต
    | [] โ†’
        ๐—ณ๐—ฎ๐—ถ๐—น
    | "v" :: โŽฝ โ†’
        "v"
    ๐—ฒ๐—ป๐—ฑ.

Definition listู tail : val :=
  ๐—ณ๐˜‚๐—ป "param" โ†’
    ๐—บ๐—ฎ๐˜๐—ฐ๐—ต "param" ๐˜„๐—ถ๐˜๐—ต
    | [] โ†’
        ๐—ณ๐—ฎ๐—ถ๐—น
    | โŽฝ :: "t" โ†’
        "t"
    ๐—ฒ๐—ป๐—ฑ.

Definition listู is_empty : val :=
  ๐—ณ๐˜‚๐—ป "param" โ†’
    ๐—บ๐—ฎ๐˜๐—ฐ๐—ต "param" ๐˜„๐—ถ๐˜๐—ต
    | [] โ†’
        true
    | โŽฝ :: โŽฝ โ†’
        false
    ๐—ฒ๐—ป๐—ฑ.

Definition listู get : val :=
  ๐—ฟ๐—ฒ๐—ฐ "get" "t" "i" โ†’
    ๐—ถ๐—ณ "i" โ‰ค 0 ๐˜๐—ต๐—ฒ๐—ป (
      listู head "t"
    ) ๐—ฒ๐—น๐˜€๐—ฒ (
      "get" (listู tail "t") ("i" - 1)
    ).

Definition listู initiโ‚ : val :=
  ๐—ฟ๐—ฒ๐—ฐ "initi" "sz" "fn" "i" โ†’
    ๐—ถ๐—ณ "sz" โ‰ค "i" ๐˜๐—ต๐—ฒ๐—ป (
      []
    ) ๐—ฒ๐—น๐˜€๐—ฒ (
      ๐—น๐—ฒ๐˜ "v" = "fn" "i" ๐—ถ๐—ป
      "v" :: "initi" "sz" "fn" ("i" + 1)
    ).

Definition listู initi : val :=
  ๐—ณ๐˜‚๐—ป "sz" "fn" โ†’
    listู initiโ‚ "sz" "fn" 0.

Definition listู init : val :=
  ๐—ณ๐˜‚๐—ป "sz" "fn" โ†’
    listู initi "sz" (๐—ณ๐˜‚๐—ป "_i" โ†’ "fn" ()).

Definition listู foldliโ‚ : val :=
  ๐—ฟ๐—ฒ๐—ฐ "foldli" "fn" "i" "acc" "t" โ†’
    ๐—บ๐—ฎ๐˜๐—ฐ๐—ต "t" ๐˜„๐—ถ๐˜๐—ต
    | [] โ†’
        "acc"
    | "v" :: "t" โ†’
        "foldli" "fn" ("i" + 1) ("fn" "i" "acc" "v") "t"
    ๐—ฒ๐—ป๐—ฑ.

Definition listู foldli : val :=
  ๐—ณ๐˜‚๐—ป "fn" โ†’
    listู foldliโ‚ "fn" 0.

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

Definition listู foldriโ‚ : val :=
  ๐—ฟ๐—ฒ๐—ฐ "foldri" "fn" "i" "t" "acc" โ†’
    ๐—บ๐—ฎ๐˜๐—ฐ๐—ต "t" ๐˜„๐—ถ๐˜๐—ต
    | [] โ†’
        "acc"
    | "v" :: "t" โ†’
        "fn" "i" "v" ("foldri" "fn" ("i" + 1) "t" "acc")
    ๐—ฒ๐—ป๐—ฑ.

Definition listู foldri : val :=
  ๐—ณ๐˜‚๐—ป "fn" โ†’
    listู foldriโ‚ "fn" 0.

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

Definition listู size : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    listู foldl (๐—ณ๐˜‚๐—ป "acc" โŽฝ โ†’ "acc" + 1) 0 "t".

Definition listู rev_app : val :=
  ๐—ณ๐˜‚๐—ป "t1" "t2" โ†’
    listู foldl (๐—ณ๐˜‚๐—ป "acc" "v" โ†’ "v" :: "acc") "t2" "t1".

Definition listู rev : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    listู rev_app "t" [].

Definition listู app : val :=
  ๐—ณ๐˜‚๐—ป "t1" "t2" โ†’
    listู foldr (๐—ณ๐˜‚๐—ป "v" "acc" โ†’ "v" :: "acc") "t1" "t2".

Definition listู snoc : val :=
  ๐—ณ๐˜‚๐—ป "t" "v" โ†’
    listู app "t" (listู singleton "v").

Definition listู iteri : val :=
  ๐—ณ๐˜‚๐—ป "fn" โ†’
    listู foldli (๐—ณ๐˜‚๐—ป "i" โŽฝ โ†’ "fn" "i") ().

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

Definition listู mapiโ‚ : val :=
  ๐—ฟ๐—ฒ๐—ฐ "mapi" "fn" "i" "t" โ†’
    ๐—บ๐—ฎ๐˜๐—ฐ๐—ต "t" ๐˜„๐—ถ๐˜๐—ต
    | [] โ†’
        []
    | "v" :: "t" โ†’
        ๐—น๐—ฒ๐˜ "v" = "fn" "i" "v" ๐—ถ๐—ป
        "v" :: "mapi" "fn" ("i" + 1) "t"
    ๐—ฒ๐—ป๐—ฑ.

Definition listู mapi : val :=
  ๐—ณ๐˜‚๐—ป "fn" โ†’
    listู mapiโ‚ "fn" 0.

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

Definition listู โˆ€ : val :=
  ๐—ฟ๐—ฒ๐—ฐ "forall" "pred" "param" โ†’
    ๐—บ๐—ฎ๐˜๐—ฐ๐—ต "param" ๐˜„๐—ถ๐˜๐—ต
    | [] โ†’
        true
    | "v" :: "t" โ†’
        "pred" "v" ๐—ฎ๐—ป๐—ฑ "forall" "pred" "t"
    ๐—ฒ๐—ป๐—ฑ.

Definition listู โˆƒ : val :=
  ๐—ฟ๐—ฒ๐—ฐ "exists" "pred" "param" โ†’
    ๐—บ๐—ฎ๐˜๐—ฐ๐—ต "param" ๐˜„๐—ถ๐˜๐—ต
    | [] โ†’
        false
    | "v" :: "t" โ†’
        "pred" "v" ๐—ผ๐—ฟ "exists" "pred" "t"
    ๐—ฒ๐—ป๐—ฑ.