% Copyright (c) 2004 Princeton University % $Id: logic.elf,v 1.17 2005/02/10 15:21:23 richards Exp $ tp : type. tm : tp -> type. form : tp. tform : type = tm form. arrow : tp -> tp -> tp. %infix right 14 arrow. pf : tform -> type. _lam : {T1 : tp} {T2 : tp} (tm T1 -> tm T2) -> tm (T1 arrow T2). _@ : {T1 : tp} {T2 : tp} tm (T1 arrow T2) -> tm T1 -> tm T2. _forall : {T : tp} (tm T -> tform) -> tform. imp : tform -> tform -> tform. %infix right 10 imp. _beta_e : {T1 : tp} {T2 : tp} {F : tm T1 -> tm T2} {X : tm T1} {P : tm T2 -> tform} pf (P (_@ T1 T2 (_lam T1 T2 F) X)) -> pf (P (F X)). _imp_i : {A : tform} {B : tform} (pf A -> pf B) -> pf (A imp B). _imp_e : {A : tform} {B : tform} pf (A imp B) -> pf A -> pf B. _forall_i:{T: tp} {A : tm T -> tform}({X : tm T} pf (A X)) -> pf (_forall T A). _forall_e:{T: tp} {A : tm T -> tform} pf (_forall T A) -> {X : tm T} pf (A X). pair : tp -> tp -> tp. _mkpair : {T1 : tp} {T2 : tp} tm (T1 arrow T2 arrow pair T1 T2). _fst : {T1 : tp} {T2 : tp} tm (pair T1 T2 arrow T1). _snd : {T1 : tp} {T2 : tp} tm (pair T1 T2 arrow T2). _fstpair : {T1 : tp} {T2 : tp} {X : tm T1} {Y : tm T2} pf (_forall (T1 arrow form) [f : tm (T1 arrow form)] (_@ T1 form f X) imp (_@ T1 form f (_@ (pair T1 T2) T1 (_fst T1 T2) (_@ T2 (pair T1 T2) (_@ T1 (T2 arrow pair T1 T2) (_mkpair T1 T2) X) Y)))). _sndpair : {T1 : tp} {T2 : tp} {X : tm T1} {Y : tm T2} pf (_forall (T2 arrow form) [f : tm (T2 arrow form)] (_@ T2 form f Y) imp (_@ T2 form f (_@ (pair T1 T2) T2 (_snd T1 T2) (_@ T2 (pair T1 T2) (_@ T1 (T2 arrow pair T1 T2) (_mkpair T1 T2) X) Y)))). % Copyright (c) 2004 Princeton University % $Id: coredefs.elf,v 1.49 2004/07/29 00:30:38 rsimmons Exp $ _frl_frm : (tform -> tform) -> tform = _forall form. _@_f : {T : tp} tm (T arrow form) -> tm T -> tform = [T : tp] _@ T form. _eq : {T : tp} tm T -> tm T -> tform = [T : tp][A : tm T][B : tm T] _forall (T arrow form) [P : tm (T arrow form)] _@_f T P B imp _@_f T P A. and : tform -> tform -> tform = [A : tform][B : tform] _frl_frm [C : tform] (A imp B imp C) imp C. %infix right 12 and. or : tform -> tform -> tform = [A : tform][B : tform] _frl_frm [C : tform] (A imp C) imp (B imp C) imp C. %infix right 11 or. false : tform = _frl_frm [A : tform] A. not : tform -> tform = [A : tform] A imp false. equiv : tform -> tform -> tform = [A : tform][B : tform] (A imp B) and (B imp A). %infix right 10 equiv. _lam2 = [T1 : tp][T2 : tp][T3 : tp][f : tm T1 -> tm T2 -> tm T3] _lam T1 (T2 arrow T3) [x : tm T1] _lam T2 T3 (f x). _lam3 = [T1 : tp][T2 : tp][T3 : tp][T4 : tp] [f : tm T1 -> tm T2 -> tm T3 -> tm T4] _lam T1 (T2 arrow T3 arrow T4) [x : tm T1] _lam2 T2 T3 T4 (f x). _lam4 = [T1 : tp] [T2 : tp] [T3 : tp] [T4 : tp] [T5 : tp] [f : tm T1 -> tm T2 -> tm T3 -> tm T4 -> tm T5] _lam T1 (T2 arrow T3 arrow T4 arrow T5) [x : tm T1] _lam3 T2 T3 T4 T5 (f x). _@2 = [T1 : tp][T2 : tp][T3 : tp][f : tm (T1 arrow T2 arrow T3)] [x1 : tm T1] _@ T2 T3 (_@ T1 (T2 arrow T3) f x1). _@3 = [T1 : tp][T2 : tp][T3 : tp][T4 : tp] [f : tm (T1 arrow T2 arrow T3 arrow T4)][x1 : tm T1] _@2 T2 T3 T4 (_@ T1 (T2 arrow T3 arrow T4) f x1). _@4 = [T1 : tp][T2 : tp][T3 : tp][T4 : tp][T5 : tp] [f : tm (T1 arrow T2 arrow T3 arrow T4 arrow T5)][x1 : tm T1] _@3 T2 T3 T4 T5 (_@ T1 (T2 arrow T3 arrow T4 arrow T5) f x1). _forall2 = [T1 : tp][T2 : tp][f : tm T1 -> tm T2 -> tform] _forall T1 [x : tm T1] _forall T2 (f x). _forall3 = [T1 : tp][T2 : tp][T3 : tp][f : tm T1 -> tm T2 -> tm T3 -> tform] _forall T1 [x : tm T1] _forall2 T2 T3 (f x). _forall4 = [T1 : tp][T2 : tp][T3 : tp][T4: tp] [f : tm T1 -> tm T2 -> tm T3 -> tm T4 -> tform] _forall T1 [x : tm T1] _forall3 T2 T3 T4 (f x). _forall5 = [T1 : tp][T2 : tp][T3 : tp][T4 : tp][T5 : tp] [f : tm T1 -> tm T2 -> tm T3 -> tm T4 -> tm T5 -> tform] _forall T1 [x : tm T1] _forall4 T2 T3 T4 T5 (f x). _forall6 = [T1 : tp][T2 : tp][T3 : tp][T4 : tp][T5 : tp][T6 : tp] [f : tm T1 -> tm T2 -> tm T3 -> tm T4 -> tm T5 -> tm T6 -> tform] _forall T1 [x : tm T1] _forall5 T2 T3 T4 T5 T6 (f x). _exists : {T : tp} (tm T -> tform) -> tform = [T : tp][F : tm T -> tform] _frl_frm [B : tform] (_forall T [X : tm T] F X imp B) imp B. _exists2 = [T1 : tp][T2 : tp][f : tm T1 -> tm T2 -> tform] _exists T1 [x : tm T1] _exists T2 (f x). _exists3 = [T1 : tp][T2 : tp][T3 : tp][f : tm T1 -> tm T2 -> tm T3 -> tform] _exists T1 [x : tm T1] _exists2 T2 T3 (f x). app1 = [T1 : tp][T2 : tp][f : tm T1 -> tm T2][x1 : tm T1] _@ T1 T2 (_lam T1 T2 f) x1. app2 = [T1 : tp][T2 : tp][T3 : tp][f : tm T1 -> tm T2 -> tm T3] _@2 T1 T2 T3 (_lam2 T1 T2 T3 f). app3 = [T1 : tp][T2 : tp][T3 : tp][T4 : tp] [f : tm T1 -> tm T2 -> tm T3 -> tm T4] _@3 T1 T2 T3 T4 (_lam3 T1 T2 T3 T4 f). app4 = [T1 : tp][T2 : tp][T3 : tp][T4 : tp][T5 : tp] [f : tm T1 -> tm T2 -> tm T3 -> tm T4 -> tm T5] _@4 T1 T2 T3 T4 T5 (_lam4 T1 T2 T3 T4 T5 f). app5 = [T1 : tp][T2 : tp][T3 : tp][T4 : tp][T5: tp][T6 : tp] [f : tm T1 -> tm T2 -> tm T3 -> tm T4 -> tm T5 -> tm T6][x1 : tm T1] _@4 T2 T3 T4 T5 T6 ((app1 T1 (T2 arrow T3 arrow T4 arrow T5 arrow T6) [x : tm T1] _lam4 T2 T3 T4 T5 T6 (f x)) x1). app6 = [T1 : tp][T2 : tp][T3 : tp][T4 : tp][T5: tp][T6 : tp][T7 : tp] [f : tm T1 -> tm T2 -> tm T3 -> tm T4 -> tm T5 -> tm T6 -> tm T7] [x1 : tm T1][x2 : tm T2] _@4 T3 T4 T5 T6 T7 ((app2 T1 T2 (T3 arrow T4 arrow T5 arrow T6 arrow T7) [x : tm T1][y : tm T2] _lam4 T3 T4 T5 T6 T7 (f x y)) x1 x2). if : tform -> tform -> tform -> tform = [E : tform][A : tform][B : tform] (E imp A) and (not E imp B). true : tform = not false. xor : tform -> tform -> tform = [A : tform][B : tform] (A and (not B)) or ((not A) and B). %infix right 11 xor. _kleene_star : {T : tp} (tm T -> tm T -> tform) -> tm T -> tm T -> tform = [T : tp][R : tm T -> tm T -> tform][V : tm T][W : tm T] _forall (T arrow T arrow form) [S : tm (T arrow T arrow form)] (_forall T [Z : tm T] _@2 T T form S Z Z) imp (_forall3 T T T [X : tm T][Y : tm T][Z : tm T] (app2 T T form R X Y) imp (_@2 T T form S Y Z) imp (_@2 T T form S X Z)) imp (_@2 T T form S V W). % Pairs out of pairs. % Object vs Meta logic. tuple2 : tp -> tp -> tp = pair. _mktuple2 : {T1 : tp}{T2 : tp} tm T1 -> tm T2 -> tm (tuple2 T1 T2) = [T1 : tp][T2 : tp][x1 : tm T1][x2 : tm T2] _@2 T1 T2 (pair T1 T2) (_mkpair T1 T2) x1 x2. _get1of2 = [T1 : tp][T2 : tp][p : tm (tuple2 T1 T2)] _@ (pair T1 T2) T1 (_fst T1 T2) p. _get2of2 = [T1 : tp][T2 : tp][p : tm (tuple2 T1 T2)] _@ (pair T1 T2) T2 (_snd T1 T2) p. % Quadruples out of pairs. tuple4 : tp -> tp -> tp -> tp -> tp = [T1 : tp][T2 : tp][T3 : tp ][T4 : tp] pair (pair T1 T2) (pair T3 T4). _mktuple4 : {T1 : tp}{T2 : tp}{T3 : tp}{T4 : tp} tm T1 -> tm T2 -> tm T3 -> tm T4 -> tm (tuple4 T1 T2 T3 T4) = [T1 : tp][T2 : tp][T3 : tp][T4 : tp][x1 : tm T1][x2 : tm T2][x3 : tm T3] [x4 : tm T4] _@2 (pair T1 T2) (pair T3 T4) (tuple4 T1 T2 T3 T4) (_mkpair (pair T1 T2) (pair T3 T4)) (_@2 T1 T2 (pair T1 T2) (_mkpair T1 T2) x1 x2) (_@2 T3 T4 (pair T3 T4) (_mkpair T3 T4) x3 x4). _get1of4 = [T1 : tp][T2 : tp][T3 : tp][T4 : tp][p : tm (tuple4 T1 T2 T3 T4)] _@ (pair T1 T2) T1 (_fst T1 T2) (_@ (tuple4 T1 T2 T3 T4) (pair T1 T2) (_fst (pair T1 T2) (pair T3 T4)) p). _get2of4 = [T1 : tp][T2 : tp][T3 : tp][T4 : tp][p : tm (tuple4 T1 T2 T3 T4)] _@ (pair T1 T2) T2 (_snd T1 T2) (_@ (tuple4 T1 T2 T3 T4) (pair T1 T2) (_fst (pair T1 T2) (pair T3 T4)) p). _get3of4 = [T1 : tp][T2 : tp][T3 : tp][T4 : tp][p : tm (tuple4 T1 T2 T3 T4)] _@ (pair T3 T4) T3 (_fst T3 T4) (_@ (tuple4 T1 T2 T3 T4) (pair T3 T4) (_snd (pair T1 T2) (pair T3 T4)) p). _get4of4 = [T1 : tp][T2 : tp][T3 : tp][T4 : tp][p : tm (tuple4 T1 T2 T3 T4)] _@ (pair T3 T4) T4 (_snd T3 T4) (_@ (tuple4 T1 T2 T3 T4) (pair T3 T4) (_snd (pair T1 T2) (pair T3 T4)) p). % Copyright (c) 2004 Princeton University % $Id: arith-fix-checker.elf,v 1.7 2004/04/22 10:47:38 appel Exp $ %use word32. rep_type = word32. rep_plus = +. rep_times = *. rep_div = /. % Copyright (c) 2004 Princeton University % $Id: arith.elf,v 1.16 2004/04/22 10:47:38 appel Exp $ % Author : Neophytos Michael % num : tp. tnum = tm num. const : rep_type -> tnum. isInt : tnum -> tform. zero = const 0. one = const 1. p_one : pf (isInt one). neg : tnum -> tnum. eqn : tnum -> tnum -> tform = _eq num. % % The existece of negatives is an axiom. % _neg_exists : {N : tnum} pf (isInt N) -> pf (isInt (neg N)). % % The integers with addition (Z, +) form an abelian group. % plus : tnum -> tnum -> tnum. _closure_add : {N : tnum}{M : tnum}pf (isInt N) -> pf (isInt M) -> pf (isInt (plus N M)). _assoc_add : {A : tnum}{B : tnum}{C : tnum} pf (eqn (plus (plus A B) C) (plus A (plus B C))). _comm_add : {A : tnum}{B : tnum} pf (eqn (plus A B) (plus B A)). _zero_add : {A : tnum} pf (eqn (plus A zero) A). _inv_add : {A : tnum} pf (eqn (plus A (neg A)) zero). % % The integers with multiplication (Z, *) form a monoid. % times : tnum -> tnum -> tnum. _closure_mult : {N : tnum}{M : tnum} pf (isInt N) -> pf (isInt M) -> pf (isInt (times N M)). _assoc_mult : {A : tnum}{B : tnum}{C : tnum} pf (eqn (times (times A B) C) (times A (times B C))). _zero_mult : {A : tnum} pf (eqn (times A one) A). _comm_mult : {A : tnum}{B : tnum} pf (eqn (times A B) (times B A)). % The 1 != 0 rule. This rules out the trivial structure of the single % element Ring. one_neq_zero : pf ((eqn one zero) imp false). % % The distributive law of multiplication over addition. % _distrib : {A : tnum}{B : tnum}{C : tnum} pf (eqn (times A (plus B C)) (plus (times A B) (times A C))).