load "nat.quox"; namespace list { def0 Vec : 0.ℕ → 0.★ → ★ = λ n A ⇒ caseω n return ★ of { zero ⇒ {nil}; succ _, 0.Tail ⇒ A × Tail }; def0 List : 0.★ → ★ = λ A ⇒ (len : ℕ) × Vec len A; def nil : 0.(A : ★) → List A = λ A ⇒ (0, 'nil); def cons : 0.(A : ★) → 1.A → 1.(List A) → List A = λ A x xs ⇒ case1 xs return List A of { (len, elems) ⇒ (succ len, x, elems) }; def foldr' : 0.(A B : ★) → 1.B → ω.(1.A → 1.B → B) → 1.(n : ℕ) → 1.(Vec n A) → B = λ A B z c n ⇒ case1 n return n' ⇒ 1.(Vec n' A) → B of { zero ⇒ λ nil ⇒ case1 nil return B of { 'nil ⇒ z }; succ n, 1.ih ⇒ λ cons ⇒ case1 cons return B of { (first, rest) ⇒ c first (ih rest) } }; def foldr : 0.(A B : ★) → 1.B → ω.(1.A → 1.B → B) → 1.(List A) → B = λ A B z c xs ⇒ case1 xs return B of { (len, elems) ⇒ foldr' A B z c len elems }; def sum : 1.(List ℕ) → ℕ = foldr ℕ ℕ 0 nat.plus; def numbers : List ℕ = (5, (0, 1, 2, 3, 4, 'nil)); def number-sum : sum numbers ≡ 10 : ℕ = δ _ ⇒ 10; }