\data I
| left
| right
\where {
\func squeeze (i j : I) : I
| left, j => left
| right, j => j
| i, left => left
| i, right => i
\func squeezeR (i j : I) : I
| left, j => j
| right, j => right
| i, left => i
| i, right => right
}
\data Path (A : I -> \Type) (a : A left) (a' : A right)
| path (\Pi (i : I) -> A i)
\func \infix 1 = {A : \Type} (a a' : A) => Path (\lam _ => A) a a'
\cons idp {A : \Type} {a : A} => path (\lam _ => a)
\func \infixl 9 @ {A : I -> \Type} {a : A left} {a' : A right} (p : Path A a a') (i : I) : A i \elim p, i
| path f, i => f i
| _, left => a
| _, right => a'
\func coe (A : I -> \Type) (a : A left) (i : I) : A i \elim i
| left => a
\func coe2 (A : I -> \Type) (i : I) (a : A i) (j : I) : A j \elim i, j
| left, j => coe A a j
| i, right => coe (\lam k => A (I.squeezeR i k)) a right
\func iso {A B : \Type} (f : A -> B) (g : B -> A) (p : \Pi (x : A) -> g (f x) = x) (q : \Pi (y : B) -> f (g y) = y) (i : I) : \Type \elim i
| left => A
| right => B
\data Nat
| zero
| suc Nat
\where {
\func \infixl 6 + (x y : Nat) : Nat \elim y
| 0 => x
| suc y => suc (x + y)
\func \infixl 7 * (x y : Nat) : Nat \elim y
| 0 => 0
| suc y => x * y + x
\func \infixl 6 - (n m : Nat) : Int
| 0, m => neg m
| n, 0 => pos n
| suc n, suc m => n - m
{- | divMod n m returns the pair (q,r) such that n = m * q + r and r < m if 0 < m.
- If m == 0, then divMod n m returns (n,n).
-}
\func divMod (n m : Nat) : \Sigma Nat Nat
\func \infixl 8 div (n m : Nat) => (divMod n m).1
\func \infixl 8 mod (n m : Nat) => (divMod n m).2
\lemma divModProp (n m : Nat) : m * n div m + n mod m = n
}
\data Fin (n : Nat)
\where {
\use \coerce fromNat {m : Nat} (n : Nat) : Fin (suc m)
=> n Nat.mod suc m
}
\data Int
| \coerce pos Nat
| neg Nat \with { zero => pos zero }
\data String
\record DArray {len : Nat} (A : Fin len -> \Type) (\coerce at : \Pi (j : Fin len) -> A j)
\where \func \infixl 9 !! (a : DArray) (i : Fin a.len) => a.at i
\func Array (A : \Type) => DArray { | A _ => A }
\cons nil {A : Fin 0 -> \Type} : DArray A \cowith
| at => \case __
\cons \infixr 5 :: {n : Nat} {A : Fin (suc n) -> \Type} (a : A 0) (l : DArray (\lam j => A (suc j))) : DArray A \cowith
| at => \case \elim __ \with {
| 0 => a
| suc j => l j
}