Abella logo (small)

sess.thm

%% Type-preservation of session-typed proof terms for %% classical propositional MALL without additive units. %% This formalization is based on the following paper: %% %% Chuta Sano, Ryan Kavanagh, and Brigitte Pientka; %% "Mechanizing Session-Types Using a Structural View: %% Enforcing linearity without linearity"; %% OOPSLA 2023 %% %% (Note: the formulation and uses of lin() are slightly %% different in this paper.) %% The session-type system is derived from: %% %% Philip Wadler; "Propositions as Sessions"; ICFP 2012 Specification "sess". Close tp. Theorem dual_det : forall A B1 B2, {dual A B1} -> {dual A B2} -> B1 = B2. induction on 1. intros. case H1. case H2. search. case H2. search. case H2. apply IH to *H3 *H5. apply IH to *H4 *H6. search. case H2. apply IH to *H3 *H5. apply IH to *H4 *H6. search. case H2. apply IH to *H3 *H5. apply IH to *H4 *H6. search. case H2. apply IH to *H3 *H5. apply IH to *H4 *H6. search. Theorem dual_sym : forall A B, {dual A B} -> {dual B A}. induction on 1. intros. case H1. search. search. apply IH to *H2. apply IH to *H3. search. apply IH to *H2. apply IH to *H3. search. apply IH to *H2. apply IH to *H3. search. apply IH to *H2. apply IH to *H3. search. Define name : A -> prop by ; nabla x, name x. Define fresh : A -> B -> prop by ; nabla x, fresh x Z. Theorem member_prune[A]: forall (E: A -> o) L, nabla x, member (E x) L -> exists F, E = x\ F. induction on 1. intros. case H1. search. apply IH to *H2. search. Define ctx : olist -> prop by ; ctx nil ; nabla x, ctx (hyp x A :: G) := ctx G. Theorem ctx_mem : forall E G, ctx G -> member E G -> exists X A, E = hyp X A /\ fresh X A. induction on 1. intros. case H1. case H2. case H2. search. apply member_prune to H4. apply IH to *H3 *H4. search. Theorem hyp_same : forall G A B, nabla x, ctx G -> {G, hyp x A |- hyp x B} -> A = B. intros. case H2. case H4. case H3. search. apply member_prune to H5. apply ctx_mem to H1 H5. case H3. Theorem str_hyp : forall G C X A, nabla y, ctx G -> {G, hyp y C |- hyp X A} -> {G |- hyp X A}. induction on 2. intros. case H2. case H4. case H3. apply member_prune to H5. apply ctx_mem to H1 H5. case H3. search. Theorem str_dual : forall G A B, ctx G -> {G |- dual A B} -> {dual A B}. induction on 2. intros. case H2. search. search. apply IH to _ *H3. apply IH to _ *H4. search. apply IH to _ *H3. apply IH to _ *H4. search. apply IH to _ *H3. apply IH to _ *H4. search. apply IH to _ *H3. apply IH to _ *H4. search. apply ctx_mem to H1 H4. case H5. case H3. Theorem str_lin: forall G P, ctx G -> {G |- lin P} -> {lin P}. induction on 2. intros. case H2. search. search. search. search. apply IH to _ *H3. search. apply IH to _ *H3. apply IH to _ *H4. search. apply IH to _ *H3. search. apply IH to _ *H3. search. apply IH to _ *H3. apply IH to _ *H4. search. apply IH to _ *H3. search. apply IH to _ *H3. search. apply IH to _ *H3. search. apply IH to _ *H3. search. apply IH to _ *H3. search. apply IH to _ *H3. apply IH to _ *H4. search. apply IH to _ *H3. apply IH to _ *H4. search. apply IH to _ *H3. search. apply IH to _ *H3. search. apply ctx_mem to _ H4. case H3. %% The str_lin theorem is stronger than the following, which is the version %% that was proved in Beluga. Theorem str_lin_as_beluga : forall G A P, nabla y, ctx G -> {G, hyp y A |- lin P} -> {G |- lin P}. induction on 2. intros. case H2. search. search. search. search. apply IH to _ *H3. search. apply IH to _ *H3. apply IH to _ *H4. search. apply IH to _ *H3 with y = n1. search. apply IH to _ *H3 with y = n1. search. apply IH to _ *H3 with y = n1. apply IH to _ *H4 with y = n1. search. apply IH to _ *H3 with y = n1. search. apply IH to _ *H3. search. apply IH to _ *H3 with y = n1. search. apply IH to _ *H3. search. apply IH to _ *H3 with y = n1. search. apply IH to _ *H3. apply IH to _ *H4. search. apply IH to _ *H3 with y = n1. apply IH to _ *H4 with y = n1. search. apply IH to _ *H3 with y = n1. search. apply IH to _ *H3 with y = n1. search. apply ctx_mem to _ H4. case H3. Theorem str_wtp : forall G C P, nabla y, ctx G -> {G, hyp y C |- wtp P} -> {G |- wtp P}. induction on 2. intros. case H2. apply str_dual to _ *H3. apply str_hyp to _ *H4. apply str_hyp to _ *H5. search. apply str_hyp to _ *H3. search. apply str_hyp to _ *H3. apply IH to _ *H4. search. apply str_hyp to _ *H3. apply IH to _ *H4. apply IH to _ *H5. search. apply str_hyp to _ *H3. apply IH to _ *H4. search. apply str_hyp to _ *H3. apply IH to _ *H4. search. apply str_hyp to _ *H3. apply IH to _ *H4. search. apply str_hyp to _ *H3. apply IH to _ *H4. apply IH to _ *H5. search. apply str_dual to _ *H3. apply str_lin to _ *H4. apply str_lin to _ *H5. apply IH to _ *H6. apply IH to _ *H7. search. case H4. case H3. apply ctx_mem to _ *H5. case H3. Theorem str_cong1 : forall G C P Q, nabla y, ctx G -> {G, hyp y C |- cong1 P (Q y)} -> exists R, Q = y\ R /\ {G |- cong1 P R}. induction on 2. intros. case H2. apply str_dual to _ *H3. search. search. case H4. case H3. apply member_prune to H5. apply ctx_mem to _ H5. case H3. Theorem str_cong : forall G C P Q, nabla y, ctx G -> {G, hyp y C |- cong P (Q y)} -> exists R, Q = y\ R /\ {G |- cong P R}. induction on 2. intros. case H2. search. apply str_cong1 to _ *H3. apply IH to _ *H4. search. case H4. case H3. apply member_prune to H5. apply ctx_mem to _ H5. case H3. Theorem str_step : forall G C P Q, nabla y, ctx G -> {G, hyp y C |- step P (Q y)} -> exists R, Q = y\ R /\ {G |- step P R}. induction on 2. intros. case H2. search. search. search. search. search. search. search. search. search. search. search. search. search. apply IH to _ *H3. search. apply IH to _ *H3. search. apply str_cong to _ *H3. apply IH to _ *H4. apply str_cong to _ *H5. search. case H4. case H3. apply member_prune to H5. apply ctx_mem to _ H5. case H3. Theorem lin_relevant : forall G P, ctx G -> {G |- lin (x\ P)} -> false. induction on 2. intros. case H2. apply IH to _ *H3. apply IH to _ *H3. apply IH to _ *H3. apply IH to _ *H3. apply IH to _ *H3. apply IH to _ *H3. apply IH to _ *H3. apply IH to _ *H3. apply IH to _ *H3. apply ctx_mem to _ H4. case H3. Theorem lin_cong1 : forall G A P Q, nabla x, ctx G -> {G, hyp x A |- cong1 (P x) (Q x)} -> {G |- lin P} -> {G |- lin Q}. induction on 2. intros. case H2. apply str_dual to _ *H4. case H3. search. search. apply ctx_mem to _ H7. case H6. case H3. case H4. search. search. apply member_prune to H6. apply ctx_mem to _ H6. case H5. search. apply ctx_mem to _ H5. case H4. case H5. case H4. apply member_prune to H6. apply ctx_mem to _ H6. case H4. Theorem lin_cong : forall G A P Q, nabla x, ctx G -> {G, hyp x A |- cong (P x) (Q x)} -> {G |- lin P} -> {G |- lin Q}. induction on 2. intros. case H2. search. apply lin_cong1 to _ *H4 *H3. apply IH to _ *H5 *H6. search. case H5. case H4. apply member_prune to H6. apply ctx_mem to H1 H6. case H4. Theorem wtp_cong1 : forall G P Q, ctx G -> {G |- cong1 P Q} -> {G |- wtp P} -> {G |- wtp Q}. induction on 2. intros. case H2. case H3. apply str_dual to _ *H4. apply str_dual to _ *H5. apply dual_det to H10 H11. apply dual_sym to *H11. search. apply ctx_mem to _ H6. case H5. case H3. case H5. apply lin_relevant to _ *H9. case H7. apply str_dual to _ *H4. apply str_dual to _ *H10. apply str_wtp to _ *H13. apply str_lin to _ *H11. apply str_lin to _ *H12. search. case H11. case H10. apply member_prune to H12. apply ctx_mem to H1 H12. case H10. apply ctx_mem to H1 H10. case H9. apply ctx_mem to H1 H5. case H4. apply ctx_mem to H1 H5. case H4. Theorem wtp_cong : forall G P Q, ctx G -> {G |- cong P Q} -> {G |- wtp P} -> {G |- wtp Q}. induction on 2. intros. case H2. search. apply wtp_cong1 to _ *H4 *H3. apply IH to _ *H5 *H6. search. apply ctx_mem to H1 H5. case H4. Theorem lin_s : forall G A P Q, nabla x, ctx G -> {G, hyp x A |- step (P x) (Q x)} -> {G, hyp x A |- wtp (P x)} -> {G |- lin P} -> {G |- lin Q}. induction on 2. intros. case H2. case H4. case H5. case H3. apply str_lin to _ *H8. search. case H7. case H6. apply ctx_mem to H1 H8. case H6. apply ctx_mem to H1 H7. case H6. inst H5 with n1 = P2. search. apply ctx_mem to H1 H6. case H5. case H4. case H5. case H3. apply str_lin to _ *H8. search. case H7. case H6. apply ctx_mem to H1 H8. case H6. apply ctx_mem to H1 H7. case H6. inst H5 with n1 = P2. search. apply ctx_mem to H1 H6. case H5. case H4. apply lin_relevant to _ H5. case H5. search. apply ctx_mem to H1 H7. case H6. apply ctx_mem to H1 H6. case H5. case H4. case H5. search. search. apply ctx_mem to H1 H7. case H6. case H5. search. apply ctx_mem to H1 H7. case H6. apply ctx_mem to H1 H6. case H5. case H4. case H5. search. apply ctx_mem to H1 H7. case H6. case H5. search. apply ctx_mem to H1 H7. case H6. apply ctx_mem to H1 H6. case H5. case H4. case H5. search. apply ctx_mem to H1 H7. case H6. case H5. search. apply ctx_mem to H1 H7. case H6. apply ctx_mem to H1 H6. case H5. case H4. case H5. search. search. apply ctx_mem to H1 H7. case H6. search. apply ctx_mem to H1 H6. case H5. case H4. case H5. search. search. search. apply ctx_mem to H1 H7. case H6. search. apply ctx_mem to H1 H6. case H5. case H4. case H5. search. search. search. apply ctx_mem to H1 H7. case H6. search. apply ctx_mem to H1 H6. case H5. case H4. case H5. search. search. apply ctx_mem to H1 H7. case H6. search. apply ctx_mem to H1 H6. case H5. case H4. case H5. search. search. apply ctx_mem to H1 H7. case H6. search. apply ctx_mem to H1 H6. case H5. case H4. case H5. search. search. apply ctx_mem to H1 H7. case H6. search. apply ctx_mem to H1 H6. case H5. case H4. case H5. search. search. apply ctx_mem to H1 H7. case H6. search. apply ctx_mem to H1 H6. case H5. case H4. case H3. permute (n1 n2) H6. apply IH to _ *H5 *H10 *H6. apply str_lin to _ *H12. search. case H8. case H7. apply ctx_mem to H1 H9. case H7. apply str_step to _ H5. search. apply ctx_mem to H1 H7. case H6. case H4. apply str_step to _ *H5. search. case H3. permute (n1 n2) H6. apply IH to _ *H5 *H11 *H6. apply str_lin to _ *H12. search. case H8. case H7. apply ctx_mem to H1 H9. case H7. apply ctx_mem to H1 H7. case H6. apply lin_cong to _ H5 *H4. apply wtp_cong to _ *H5 *H3. apply IH to _ *H6 *H9 *H8. apply lin_cong to _ *H7 *H10. search. case H6. case H5. apply ctx_mem to H1 H7. case H5. Theorem wtp_s : forall G P Q, ctx G -> {G |- step P Q} -> {G |- wtp P} -> {G |- wtp Q}. induction on 2. intros. case H2. case H3. case H7. case H10. case H13. case H12. apply str_dual to _ *H9. apply str_dual to _ *H4. apply dual_det to H14 *H15. inst H8 with n1 = Y. cut H16 with H11. apply str_wtp to _ *H17. search. apply member_prune to H14. apply ctx_mem to H1 H14. case H12. case H10. case H9. apply member_prune to H11. apply ctx_mem to H1 H11. case H9. apply ctx_mem to H1 H5. case H4. case H3. case H7. apply hyp_same to _ *H11. apply str_dual to _ *H4. apply str_dual to _ *H9. apply dual_sym to *H13. apply dual_det to H12 *H14. inst H8 with n1 = X. cut H15 with H10. apply str_wtp to _ *H16. search. case H10. case H9. apply ctx_mem to H1 H11. case H9. apply ctx_mem to H1 H5. case H4. case H3. apply str_dual to _ *H4. case H9. case H8. apply str_wtp to _ *H11. search. case H11. case H10. apply ctx_mem to H1 H12. case H10. apply ctx_mem to H1 H5. case H4. case H3. apply str_dual to _ *H4. case H9. case H7. case H8. apply hyp_same to _ *H12. apply hyp_same to _ *H15. apply str_wtp to _ *H13. apply str_wtp to _ *H14. apply str_wtp to _ *H16. case H5. case H6. search. apply ctx_mem to H1 H23. case H22. apply ctx_mem to H1 H21. case H20. case H16. case H15. apply ctx_mem to H1 H17. case H15. case H13. case H12. apply ctx_mem to H1 H14. case H12. apply ctx_mem to H1 H5. case H4. case H3. apply str_dual to _ *H4. case H9. case H7. case H8. case H5. case H6. apply hyp_same to _ *H12. apply hyp_same to _ *H14. apply str_wtp to _ *H13. apply str_wtp to _ *H15. apply str_wtp to _ *H16. search. apply ctx_mem to H1 H19. case H18. apply ctx_mem to H1 H18. case H17. case H15. case H14. apply ctx_mem to H1 H16. case H14. case H13. case H12. apply ctx_mem to H1 H14. case H12. apply ctx_mem to H1 H5. case H4. case H3. apply str_dual to _ *H4. case H9. case H5. case H6. case H7. case H8. apply hyp_same to _ *H15. apply hyp_same to _ *H17. apply str_wtp to _ *H16. apply str_wtp to _ *H19. search. case H18. case H17. apply ctx_mem to H1 H19. case H17. case H16. case H15. apply ctx_mem to H1 H17. case H15. apply ctx_mem to H1 H14. case H13. apply ctx_mem to H1 H13. case H12. apply ctx_mem to H1 H5. case H4. case H3. apply str_dual to _ *H4. case H5. case H7. apply str_hyp to _ *H11. search. case H12. case H11. apply ctx_mem to H1 H13. case H11. apply ctx_mem to H1 H11. case H10. apply ctx_mem to H1 H5. case H4. case H3. apply str_dual to _ *H4. case H5. case H7. apply str_hyp to _ *H11. apply str_wtp to _ *H13. search. case H12. case H11. apply ctx_mem to H1 H13. case H11. apply lin_relevant to _ H10. apply ctx_mem to H1 H11. case H10. apply ctx_mem to H1 H5. case H4. case H3. apply str_dual to _ *H4. case H5. apply lin_relevant to _ H10. case H7. apply str_hyp to _ *H11. apply str_wtp to _ *H12. search. case H12. case H11. apply ctx_mem to H1 H13. case H11. apply ctx_mem to H1 H11. case H10. apply ctx_mem to H1 H5. case H4. case H3. apply str_dual to _ *H4. case H5. case H7. apply str_hyp to _ *H11. search. case H12. case H11. apply ctx_mem to H1 H13. case H11. apply ctx_mem to H1 H11. case H10. apply ctx_mem to H1 H5. case H4. case H3. apply str_dual to _ *H4. case H5. case H7. apply str_hyp to _ *H11. search. case H12. case H11. apply ctx_mem to H1 H13. case H11. apply ctx_mem to H1 H11. case H10. apply ctx_mem to H1 H5. case H4. case H3. apply str_dual to _ *H4. case H5. case H7. apply str_hyp to _ *H11. search. case H12. case H11. apply ctx_mem to H1 H13. case H11. apply ctx_mem to H1 H11. case H10. apply ctx_mem to H1 H5. case H4. case H3. apply str_dual to _ *H4. case H5. case H7. apply str_hyp to _ *H12. search. case H13. case H12. apply ctx_mem to H1 H14. case H12. apply ctx_mem to H1 H11. case H10. apply ctx_mem to H1 H5. case H4. case H3. apply IH to _ H4 H8. apply lin_s to _ H4 H8 H6 with G = G. search. apply ctx_mem to H1 H6. case H5. case H3. apply IH to _ H4 H9. apply lin_s to _ H4 H9 H7 with G = G. search. apply ctx_mem to H1 H6. case H5. apply wtp_cong to _ *H4 *H3. apply IH to _ *H5 *H7. apply wtp_cong to _ *H6 *H8. search. apply ctx_mem to H1 H5. case H4.