prim I
prim left
prim right
struct Path (A : I -> Type) (a : A left) (b : A right) : Type
| at (i : I) : A i {
| left => a
| right => b
}
def path {A : I -> Type} (p : Pi (i : I) -> A i)
=> new Path A (p left) (p right) { | at i => p i }
def `=` Eq {A : Type} (a b : A) : Type => Path (\ i => A) a b
def idp {A : Type} (a : A) : a = a => path (\ i => a)
bind = looser application
prim arcoe
def hfill2d {A : Type}
{a b c d : A}
(p : a = b)
(q : b = d)
(r : a = c)
(i j : I) : A
=> (arcoe (\ k => (r.at k) = (q.at k)) p i).at j
def hcomp2d {A : Type}
{a b c d : A}
(p : a = b)
(q : b = d)
(r : a = c) : c = d
=> path (hfill2d p q r right)
def sym {A : Type} {a b : A} (p : a = b) : b = a => hcomp2d (idp a) (idp a) p
def `~` trans {A : Type} {a b c : A} (p : a = b) (q : b = c) : a = c => hcomp2d p q (idp a)
def pmap {A B : Type} (f : A -> B) {a b : A} (p : a = b)
: f a = f b => path (\ i => f (p.at i))
-- def funext {A B : Type} (f g : A -> B) (p : Pi (a : A) -> f a = g a) : f = g
-- => path (\ i => \ x => (p x).at i)
def sq {A B C : Type} {a c : A} {b d : B} (f : A -> B -> C) (p : a = c) (q : b = d) : f a b = f c d
=> trans (pmap (f a) q) (pmap (\ x => f x d) p)
def isProp (A : Type) : Type => Pi (x : A) (y : A) -> x = y
def isSet (A : Type) : Type => Pi (x : A) (y : A) -> isProp (x = y)
data Bot : Type
open data Top : Type
| T
open data Nat : Type
| zero
| suc Nat
def `+` add (m n : Nat) : Nat
| zero, n => n
| n, zero => n
| suc m, n => suc (add m n)
| m, suc n => suc (add m n)
def `*` mul (m n : Nat) : Nat
| zero, n => zero
| m, zero => zero
| suc m, suc n => suc (m + n + m * n)
def `*'` mul' (m n : Nat) : Nat
| zero, n => zero
| m, zero => zero
| suc m, n => n + m *' n
def `*''` mul'' (m n : Nat) : Nat
| zero, n => zero
| m, zero => zero
| m, suc n => m + m *'' n
bind + tighter =
bind * tighter +
bind *' tighter +
bind *'' tighter +
def BiOp (A : Type) => A -> A -> A
def Associative {A : Type} (· : BiOp A) => Pi (x y z : A) -> (· x (· y z)) = (· (· x y) z)
def Commutative {A : Type} (· : BiOp A) => Pi (x y : A) -> (· x y) = (· y x)
def Identity {A : Type} (e : A) (· : BiOp A) => Pi (x : A) -> Sig ((· e x) = x) ** ((· x e) = x)
def +-comm (x y : Nat) : x + y = y + x
| zero, n => idp n
| suc n, m => pmap suc (+-comm n m)
def +-assoc (x y z : Nat) : x + (y + z) = (x + y) + z
| zero, y, z => idp _
| suc x, y, z => pmap suc (+-assoc x y z)
def +-identity (x : Nat) : Sig (x + zero = x) ** (zero + x = x)
| x => (idp x, idp x)
def *'-suc (m n : Nat) : m *' (suc n) = m + m *' n
| zero, n => idp _
| suc m, n => (pmap (\ x => suc (add n x)) (*'-suc m n))
~ (pmap suc (+-assoc n m (m *' n)))
~ (pmap (\ x => suc (x + m *' n)) (+-comm n m))
~ (pmap suc (sym (+-assoc m n (m *' n))))
def *'-suc-suc (m n : Nat) : (suc m) *' (suc n) = suc (m + n + m *' n)
=> (pmap (add (suc n)) (*'-suc m n))
~ (pmap suc (+-assoc n m (m *' n)))
~ (pmap (\ x => suc (x + m *' n)) (+-comm n m))
def *'-*''-iso (m n : Nat) : m *' n = m *'' n
| m, zero => idp _
| m, suc n => (*'-suc m n) ~ (pmap (add m) (*'-*''-iso m n))
def *-*'-iso (m n : Nat) : m *' n = m * n
| zero, n => idp _
| m, zero => idp _
| suc m, suc n => (*'-suc-suc m n) ~ (pmap (\ x => suc ((m + n) + x)) (*-*'-iso m n))
def sym-*'-suc-suc (m n : Nat) : suc (m + n + m *' n) = (suc m) *' (suc n) => sym (*'-suc-suc m n)
120 | | suc m, suc n => (*'-suc-suc m n) ~ (pmap (\ x => suc ((m + n) + x)) (*-*'-iso m n))
121 |
122 | def sym-*'-suc-suc (m n : Nat) : suc (m + n + m *' n) = (suc m) *' (suc n) => sym (*'-suc-suc m n)
^-----------------^
Error: Cannot check the expression of type
Path (λ _9 ⇒ Nat) (hfill2d {Nat} {suc (add n (mul' m (suc n)))} {suc (add
n (mul' m (suc n)))} {suc (add (add m n) (mul' m n))} {suc (add n (mul' m (suc
n)))} (idp {Nat} suc (add n (mul' m (suc n)))) (idp {Nat} suc (add n (mul'
m (suc n)))) (*'-suc-suc m n) right left) (hfill2d {Nat} {suc (add n (mul'
m (suc n)))} {suc (add n (mul' m (suc n)))} {suc (add (add m n) (mul' m n))}
{suc (add n (mul' m (suc n)))} (idp {Nat} suc (add n (mul' m (suc n)))) (idp
{Nat} suc (add n (mul' m (suc n)))) (*'-suc-suc m n) right right)
(Normalized: Path (λ _9 ⇒ Nat) (suc (add n (add m (mul' m n)))) (suc (add
n (mul' m (suc n)))))
against the type
Eq {Nat} (suc (add (add m n) (mul' m n))) (mul' (suc m) (suc n))
(Normalized: Path (λ i ⇒ Nat) (suc (add (add m n) (mul' m n))) (suc (add n
(mul' m (suc n)))))