%%% Proof terms for natural deduction %%% Synthesizing version %%% %%% Author: Frank Pfenning %%% October 2009 %%% %%% requires prop.elf %% Raw proof terms, allows invalid "proofs" proof : type. %name proof M. fn : prop -> (proof -> proof) -> proof. app : proof -> proof -> proof. pair : proof -> proof -> proof. fst : proof -> proof. snd : proof -> proof. inl : prop -> proof -> proof. inr : prop -> proof -> proof. case : proof -> (proof -> proof) -> (proof -> proof) -> proof. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Proof checking %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% M $ A - judgment that term M proves A $ : 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:proof} x $ A -> M(x) $ B). =>E : app M N $ B <- M $ A => B <- N $ A. \/IL : inl B M $ A \/ B <- M $ A. \/IR : inr A N $ A \/ B <- N $ B. \/E : case M ([x] N x) ([y] O y) $ C <- M $ A \/ B <- ({x:proof} x $ A -> N(x) $ C) <- ({y:proof} y $ B -> O(y) $ C). %% Sample queries performing proof checking % basic example %query 1 * (fn (? a) [x] x) $ ? a => ? a. % introducing propositional parameters A and B %query 1 * {A:prop}{B:prop} (fn (A /\ B) [u] pair (snd u) (fst u)) $ A /\ B => B /\ A. % letting Twelf synthesize the proposition %query 1 * (fn _ [u] pair (snd u) (fst u)) $ A. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Local reduction %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Relating two proofs ==>r : proof -> proof -> type. %infix none 8 ==>r. beta : app (fn _ [u] M(u)) N ==>r M(N). pi1 : fst (pair M N) ==>r M. pi2 : snd (pair M N) ==>r N. delta1 : case (inl _ M) ([x] N(x)) ([y] O(y)) ==>r N(M). delta2 : case (inr _ M) ([x] N(x)) ([y] O(y)) ==>r O(M). %% Sample reduction %query 1 * app (fn (A => A) [u] fn B [v] u) (fn A [w] w) ==>r M.