atom : type. %name atom P. a : atom. b : atom. c : atom. d : atom. e : atom. prop : type. %name prop A. => : prop -> prop -> prop. %infix right 10 =>. \/ : prop -> prop -> prop. %infix right 11 \/. /\ : prop -> prop -> prop. %infix right 12 /\. ? : atom -> prop. %prefix 14 ?. ff : prop. tt : prop. proof : prop -> type. %name proof M. pair : proof A -> proof B -> proof (A /\ B). fst : proof (A /\ B) -> proof A. snd : proof (A /\ B) -> proof B. fn : {A:prop} (proof A -> proof B) -> proof (A => B). app : proof (A => B) -> proof A -> proof B. % intrinsic representation *doesn't* allow invalid proofs! % new type "proof A" combines old "proof" and "of" types.