From db10cfeda0b69d437d971d50cb4ccf982b51f7ac Mon Sep 17 00:00:00 2001 From: jihgfee <jihgfee@gmail.com> Date: Fri, 5 Jun 2020 13:29:58 +0200 Subject: [PATCH] Clean up, and polymorphism example --- theories/logrel/examples/mapper.v | 180 ++++++++++++++++++++++-------- 1 file changed, 135 insertions(+), 45 deletions(-) diff --git a/theories/logrel/examples/mapper.v b/theories/logrel/examples/mapper.v index 159417c..9497d30 100644 --- a/theories/logrel/examples/mapper.v +++ b/theories/logrel/examples/mapper.v @@ -1,32 +1,22 @@ From actris.channel Require Import proofmode proto channel. -From actris.logrel Require Import subtyping_rules term_typing_judgment term_typing_rules environments operators. +From actris.logrel Require Import subtyping_rules term_typing_judgment term_typing_rules environments operators subtyping_rules. From iris.proofmode Require Import tactics. Section with_Σ. Context `{heapG Σ, chanG Σ}. + (** Client typing *) Definition mapper_client_type_aux (rec : lsty Σ) : lsty Σ := <!!> TY (lty_int ⊸ lty_bool); <!!> TY lty_int; <??> TY lty_bool; rec. Definition mapper_client_type : lsty Σ := mapper_client_type_aux END. - Instance mapper_client_type_contractive : Contractive mapper_client_type_aux. Proof. solve_proto_contractive. Qed. - Definition mapper_client_rec_type : lsty Σ := lty_rec mapper_client_type_aux. - Definition mapper_service_type : lsty Σ := - <??> TY (lty_int ⊸ lty_bool); <??> TY lty_int; <!!> TY lty_bool; END. - Definition mapper_client : expr := λ: "c", - send "c" (λ: "x", #9000 < "x");; - send "c" #42;; recv "c". - - Definition mapper_service : expr := λ: "c", - let: "f" := recv "c" in - let: "v" := recv "c" in - send "c" ("f" "v");; "c". + send "c" (λ: "x", #9000 < "x");; send "c" #42;; recv "c". Lemma mapper_client_typed Γ : ⊢ Γ ⊨ mapper_client : (lty_chan (mapper_client_type) ⊸ lty_bool)%lty ⫤ Γ. @@ -50,36 +40,7 @@ Section with_Σ. rewrite insert_insert /=. iApply ltyped_recv. apply lookup_insert. Qed. - Lemma mapper_service_typed Γ : - ⊢ Γ ⊨ mapper_service : (lty_chan (mapper_service_type) ⊸ (lty_chan END))%lty ⫤ Γ. - Proof. - iApply (ltyped_frame _ _ _ _ Γ). - { iApply env_split_id_l. } - 2: { iApply env_split_id_l. } - iApply ltyped_lam. - iApply ltyped_let. - { iApply ltyped_recv. by rewrite lookup_insert. } - rewrite insert_insert /=. - iApply ltyped_let. - { iApply ltyped_recv. by rewrite insert_commute // lookup_insert. } - rewrite (insert_commute _ "c" "f") // insert_insert. - iApply ltyped_let=> /=; last first. - { iApply ltyped_var. apply lookup_insert. } - iApply ltyped_send. apply lookup_insert. - rewrite (insert_commute _ "f" "c") // (insert_commute _ "v" "c") //. - iApply (ltyped_frame _ _ _ _ {["c":=_]}). - { iApply env_split_right=> //. iApply env_split_id_r. } - { iApply ltyped_app. - - iApply ltyped_var. apply lookup_insert. - - rewrite insert_commute //. - iApply (ltyped_frame _ _ _ _ {["f":=_]}). - { iApply env_split_right=> //. iApply env_split_id_r. } - { iApply ltyped_var. apply lookup_insert. } - { iApply env_split_right=> //; last by iApply env_split_id_r. eauto. } - } - { iApply env_split_right=> //; last by iApply env_split_id_r. eauto. } - Qed. - + (** Recursion and Swapping *) Lemma lty_le_rec_unfold_l {k} (C : lty Σ k → lty Σ k) `{!Contractive C} : ⊢ lty_rec C <: C (lty_rec C). Proof. iApply lty_le_l. iApply lty_le_rec_unfold. iApply lty_le_refl. Qed. @@ -112,7 +73,7 @@ Section with_Σ. { iModIntro. iApply lty_le_rec_unfold_l. } iApply lty_le_trans. iApply lty_le_swap_recv_send. iModIntro. iApply lty_le_trans. iApply lty_le_swap_recv_send. iModIntro. - iModIntro. iModIntro. iApply lty_le_refl. + eauto. - iApply lty_le_refl. } iApply ltyped_lam. iApply ltyped_let. @@ -125,12 +86,88 @@ Section with_Σ. { iApply env_split_id_l. } } rewrite insert_insert /=. iApply ltyped_let. + { iApply ltyped_send. apply lookup_insert. iApply ltyped_int. } + rewrite insert_insert /=. + iApply ltyped_let. + { iApply ltyped_send. apply lookup_insert. + iApply (ltyped_frame _ _ _ _ (<["c":=_]>∅)). + { iApply env_split_id_l. } + { iApply ltyped_lam. iApply ltyped_bin_op. + - iApply ltyped_var. apply lookup_insert. + - iApply ltyped_int. } + { iApply env_split_id_l. } } + rewrite insert_insert /=. + iApply ltyped_let. { iApply ltyped_send. apply lookup_insert. iApply ltyped_int. } rewrite insert_insert /=. iApply ltyped_let. + { iApply ltyped_recv. apply lookup_insert. } + rewrite insert_insert /=. + iApply ltyped_let. + { iApply ltyped_recv=> //. } + iApply ltyped_pair. + - iApply ltyped_var. apply lookup_insert. + - rewrite (insert_commute _ "c" "x") //= (insert_commute _ "y" "x") //=. + rewrite insert_insert. + iApply (ltyped_frame _ _ _ _ {["x":=_]}). + { iApply env_split_right=> //=. iApply env_split_id_r. } + iApply ltyped_var. apply lookup_insert. + iApply env_split_right=> //; last by iApply env_split_id_r=> //=. eauto. + Qed. + + Definition mapper_client_type_poly_aux (rec : lsty Σ) : lsty Σ := + <!! X Y> TY (X ⊸ Y); <!!> TY X; <??> TY Y; rec. + + Instance mapper_client_type_poly_contractive : + Contractive mapper_client_type_poly_aux. + Proof. solve_proto_contractive. Qed. + + Definition mapper_client_rec_type_poly : lsty Σ := + lty_rec mapper_client_type_poly_aux. + + Definition mapper_client_type_poly_swap (rec : lsty Σ) : lsty Σ := + <!!> TY (lty_int ⊸ lty_bool); <!!> TY lty_int; + <!!> TY (lty_bool ⊸ lty_int); <!!> TY lty_bool; + <??> TY lty_bool; <??> TY lty_int; rec. + + Definition mapper_client_rec_poly : expr := λ: "c", + send "c" (λ: "x", #9000 < "x");; send "c" #42;; + send "c" (λ: "x", if: #true then #1 else #0);; send "c" #true;; + let: "x" := recv "c" in + let: "y" := recv "c" in + ("x","y"). + + Lemma mapper_client_rec_poly_typed Γ : + ⊢ Γ ⊨ mapper_client_rec_poly : + (lty_chan (mapper_client_rec_type_poly) ⊸ (lty_bool * lty_int))%lty ⫤ Γ. + Proof. + iApply (ltyped_frame _ _ _ _ Γ). + { iApply env_split_id_l. } + 2: { iApply env_split_id_l. } + iApply (ltyped_subsumption _ _ _ + ((lty_chan (mapper_client_type_poly_swap mapper_client_rec_type_poly)) ⊸ _)). + { iApply lty_le_arr. + - iNext. iApply lty_le_chan. iNext. + iApply lty_le_trans. iApply lty_le_rec_unfold_l. + rewrite /mapper_client_type_poly_aux. + rewrite /mapper_client_type_poly_swap. + iExists lty_int, lty_bool. + iModIntro. iModIntro. + iApply lty_le_trans. + { iModIntro. iApply lty_le_rec_unfold_l. } + iApply lty_le_trans; last first. + { iModIntro. iApply lty_le_swap_recv_send. } + iApply lty_le_trans; last first. + { iApply lty_le_swap_recv_send. } + iModIntro. + iExists lty_bool, lty_int. + iApply lty_le_refl. + - iApply lty_le_refl. } + iApply ltyped_lam. + iApply ltyped_let. { iApply ltyped_send. apply lookup_insert. - iApply (ltyped_frame _ _ _ _ (<["c":=_]>∅)). + iApply (ltyped_frame _ _ _ _ {["c":=_]}). { iApply env_split_id_l. } { iApply ltyped_lam. iApply ltyped_bin_op. - iApply ltyped_var. apply lookup_insert. @@ -142,6 +179,19 @@ Section with_Σ. iApply ltyped_int. } rewrite insert_insert /=. iApply ltyped_let. + { iApply ltyped_send. apply lookup_insert. + iApply (ltyped_frame _ _ _ _ (<["c":=_]>∅)). + { iApply env_split_id_l. } + { iApply ltyped_lam. iApply ltyped_if. + - iApply ltyped_bool. + - iApply ltyped_int. + - iApply ltyped_int. } + { iApply env_split_id_l. } } + rewrite insert_insert /=. + iApply ltyped_let. + { iApply ltyped_send. apply lookup_insert. iApply ltyped_bool. } + rewrite insert_insert /=. + iApply ltyped_let. { iApply ltyped_recv. apply lookup_insert. } rewrite insert_insert /=. iApply ltyped_let. @@ -156,4 +206,44 @@ Section with_Σ. iApply env_split_right=> //; last by iApply env_split_id_r=> //=. eauto. Qed. + (** Service typing *) + Definition mapper_service_type : lsty Σ := + <??> TY (lty_int ⊸ lty_bool); <??> TY lty_int; <!!> TY lty_bool; END. + + Definition mapper_service : expr := λ: "c", + let: "f" := recv "c" in + let: "v" := recv "c" in + send "c" ("f" "v");; "c". + + Lemma mapper_service_typed Γ : + ⊢ Γ ⊨ mapper_service : (lty_chan (mapper_service_type) ⊸ (lty_chan END))%lty ⫤ Γ. + Proof. + iApply (ltyped_frame _ _ _ _ Γ). + { iApply env_split_id_l. } + 2: { iApply env_split_id_l. } + iApply ltyped_lam. + iApply ltyped_let. + { iApply ltyped_recv. by rewrite lookup_insert. } + rewrite insert_insert /=. + iApply ltyped_let. + { iApply ltyped_recv. by rewrite insert_commute // lookup_insert. } + rewrite (insert_commute _ "c" "f") // insert_insert. + iApply ltyped_let=> /=; last first. + { iApply ltyped_var. apply lookup_insert. } + iApply ltyped_send. apply lookup_insert. + rewrite (insert_commute _ "f" "c") // (insert_commute _ "v" "c") //. + iApply (ltyped_frame _ _ _ _ {["c":=_]}). + { iApply env_split_right=> //. iApply env_split_id_r. } + { iApply ltyped_app. + - iApply ltyped_var. apply lookup_insert. + - rewrite insert_commute //. + iApply (ltyped_frame _ _ _ _ {["f":=_]}). + { iApply env_split_right=> //. iApply env_split_id_r. } + { iApply ltyped_var. apply lookup_insert. } + { iApply env_split_right=> //; last by iApply env_split_id_r. eauto. } + } + { iApply env_split_right=> //; last by iApply env_split_id_r. eauto. } + Qed. + + End with_Σ. -- GitLab