8
import Data.Nat.Properties
11
open Data.Nat hiding (_==_; _≡_)
12
open Data.Nat.Properties
15
module Foo (Var : Set) where
17
data _==_ : (x y : Var) -> Set where
18
cRefl : {x : Var} -> x == x
19
cSym : {x y : Var} -> y == x -> x == y
20
cTrans : {x y z : Var} -> x == z -> z == y -> x == y
21
cAxiom : {x y : Var} -> x == y
23
data Axioms {A : Set}(_≈_ : Rel A)([_] : Var -> A) : Set where
24
noAxioms : Axioms _≈_ [_]
25
anAxiom : (x y : Var) -> [ x ] ≈ [ y ] -> Axioms _≈_ [_]
26
manyAxioms : Axioms _≈_ [_] -> Axioms _≈_ [_] -> Axioms _≈_ [_]
28
refl : {x : Var} -> x == x
31
sym : {x y : Var} -> x == y -> y == x
32
sym (cRefl xy) = cRefl (Var.sym xy)
33
sym cAxiom = cSym cAxiom
35
sym (cTrans z p q) = cTrans z (sym q) (sym p)
37
trans : {x y z : Var} -> x == y -> y == z -> x == z
38
trans {x}{y}{z} (cRefl xy) q = Var.subst (\w -> w == z) (Var.sym xy) q
39
trans {x}{y}{z} p (cRefl yz) = Var.subst (\w -> x == w) yz p
40
trans {x}{y}{z} (cTrans w p q) r = cTrans w p (trans q r)
41
trans p q = cTrans _ p q