module Equality data Eq : {A : U} -> A -> A -> U where Refl : {A : U} {a : A} -> Eq a a -- Some magic is not happening here. sym : {A : U} {x y : A} -> Eq x y -> Eq y x sym Refl = Refl trans : {A : U} {x y z : A} -> Eq x y -> Eq y z -> Eq x z trans Refl Refl = Refl coerce : {A B : U} -> Eq A B -> A -> B coerce Refl a = a J : {A : U} -> {C : (x y : A) -> Eq x y -> U} -> (c : (x : _) -> C x x Refl) -> (x y : A) -> (p : Eq x y) -> C x y p -- this was failing until I constrained scrutinee to the constructor + args J c x y Refl = c x