Abella logo (small)

fcurry.thm

%% Type-preservation of Curry-style System F %% %% Contributed by Ahn Ki Yung <kyagrd@gmail.com> Specification "fcurry". Close ty, tm. Theorem member_prune : forall (L:olist) E, nabla (x : tm), member (E x) L -> exists F, E = x\ F. % Proof: induction on 1. intros. case H1. search. apply IH to H2. search. % Q.E.D. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Define ctx : olist -> prop by ctx nil ; nabla x, ctx (of x T :: L) := ctx L. Define name : tm -> prop by nabla x, name x. Theorem of_name : forall L E, ctx L -> member E L -> exists X T, E = of X T /\ name X. % Proof: induction on 1. intros. case H1. case H2. case H2. search. apply member_prune to H4. apply IH to H3 H4. search. % Q.E.D. Theorem ctx_uniq : forall L E T1 T2, ctx L -> member (of E T1) L -> member (of E T2) L -> T1 = T2. % Proof: induction on 1. intros. case H1. case H2. case H2. case H3. search. apply member_prune to H5. case H3. apply member_prune to H5. apply IH to H4 H5 H6. search. % Q.E.D. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Theorem abs_ins_arr : forall L R N U T S, ctx L -> {L |- of (abs R) S} -> {L |- ins* S (arr U T)} -> {L |- of N U} -> {L |- of (R N) T}. % Proof: induction on 2. intros. case H2. % Subgoal 1 case H3. inst H5 with n1 = N. cut H6 with H4. search. % 1.1 case H6. apply of_name to _ H9. case H8. % 1.2 apply of_name to _ H7. case H6. % 1.3 % Subgoal 2 case H3. case H6. % 2.1 inst H5 with n1 = U2. apply IH to _ H8 H7 H4. search. % 2.1.1 apply of_name to _ H9. case H8. % 2.1.2 apply of_name to _ H7. case H6. % 2.2 % Subgoal 3 assert {L |- ins* (all T1) (arr U T)}. apply IH to _ H5 H6 H4. search. % Subgoal 4 apply of_name to _ H6. case H5. case H7. % Q.E.D. Theorem abs_arr : forall L R N U T, ctx L -> {L |- of (abs R) (arr U T)} -> {L |- of N U} -> {L |- of (R N) T}. % Proof: induction on 2. intros. case H2. % Subgoal 1 inst H4 with n1 = N. cut H5 with H3. search. % Subgoal 2 (abs_ins*_arr lemma used) case H4. % Subgoal 2.1 assert {L |- ins* (all (z1\arr (T2 z1) (T3 z1))) (arr (T2 U1) (T3 U1))}. apply abs_ins_arr to _ H5 H6 H3. search. % Subgoal 2.2 assert {L |- ins* (all (z1\z1)) (arr U T)}. apply abs_ins_arr to _ H5 H6 H3. search. % Subgoal 3 apply of_name to _ H5. case H6. case H4. % Q.E.D. Theorem step_preserves_of : forall L M N T, ctx L -> {L |- of M T} -> {step M N} -> {L |- of N T}. % Proof: induction on 2. intros. case H2. case H3. % Subgoal 1 apply IH to _ H4 H6. search. % 1.1 apply IH to _ H5 H6. search. % 1.2 apply abs_arr to _ H4 H5. search. % 1.3 (abs_arr lemma used) % Subgoal 2 case H3. apply IH to _ H4 H5. search. % Subgoal 3 apply IH to _ H4 H3. search. % Subgoal 4 apply IH to _ H4 H3. search. % Subgoal 5 apply of_name to _ H5. case H4. case H3. case H6. case H6. case H6. case H6. % Q.E.D.