packages feed

caledon-2.0.0.0: examples/implicit.ncc

defn identity : prop -> prop
   | cons = {f : prop} f -> identity f

infix 1 =:=
defn =:= : {a : prop} a -> a -> prop
   | eq = {a : prop} a =:= a

defn getIdent : {f : prop} identity f -> f -> prop
  as ?\f : prop . \id : identity f . \v : f . (cons v) =:= id


-- this demonstrates three ways of doing this
defn getIdent' : {foo : prop} identity foo -> foo -> prop
   | getIdentity1 = {f}{V:f} getIdent' {foo = f} (cons V) V
   | getIdentity2 = {f}{V:f} getIdent' (cons V : identity f) V
   | getIdentity3 = {f}{V:f} (getIdent' : identity f -> f -> prop) (cons V) V