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 : type. %name proof M. pair : proof -> proof -> proof. fst : proof -> proof. snd : proof -> proof. fn : prop -> (proof -> proof) -> proof. app : proof -> proof -> proof. % above representation allows invalid proofs. % proof checking judgement M $ A picks out the valid ones. $ : proof -> prop -> type. %name $ D. %infix none 8 $. %mode $ +M -A. /\I : pair M N $ A /\ B <- M $ A <- N $ B. /\EL : fst M $ A <- M $ A /\ B. /\ER : snd M $ B <- M $ A /\ B. =>I : (fn A [x] M(x)) $ A => B <- ({x} x $ A -> M(x) $ B). =>E : app M N $ B <- M $ A => B <- N $ A.