Library sg_to_mlt
Parameter α : Atom.
Parameter λ : Letter.
Axiom τ_λ : τ λ = [α].
Reserved Notation " $ e " (at level 60, no associativity).
Fixpoint single_to_multi exp :=
match exp with
| vat a ⇒ ‹[a,α]›var λ
| e + f ⇒ ($ e) + $ f
| e · f ⇒ ($ e) · $ f
| e ^* ⇒ ($ e) ^*
| ν a e ⇒ ν a ( $ e )
| ω a e ⇒ ω a ( $ e )
| ‹ p ›e ⇒ ‹ p ›$ e
| _ ⇒ exp
end
where " $ e " := (single_to_multi e).
Lemma size_single_to_multi e : size ($ e) ≤ 2 × size e.
Lemma mlt_single_to_multi e : multi ($ e).
Lemma ut_ut_single_to_multi e :
untyped e → untyped ($ e).
Lemma ut_single_fresh_single_to_multi e :
untyped e → single e → ∀ a, a # e ↔ a # ($ e).
Lemma has_type_single_to_multi e A :
A ⊨ e → A ⊨ ($ e).
Lemma ty_ty_single_to_multi e :
typed e → typed ($ e).
Lemma poa_poa_single_to_multi e :
str_positive e → str_positive ($ e).
Lemma po_po_single_to_multi e :
positive e → positive ($ e).
Fixpoint image exp : Prop :=
match exp with
| vat _ ⇒ False
| var x ⇒ fst (proj1_sig x) = fst (proj1_sig λ)
| e · f | e + f ⇒ image e ∧ image f
| e ^* | ν _ e | ‹ _ › e | ω _ e ⇒ image e
| _ ⇒ True
end.
Lemma sg_image_single_to_multi e :
single e → image ($ e).
Lemma image_mlt e : image e → multi e.
Definition get_atom (n : Letter) :=
match n with
| exist _ (λ,[a]) _ ⇒ a
| _ ⇒ α
end.
Reserved Notation " £ e " (at level 60, no associativity).
Fixpoint multi_to_single exp :=
match exp with
| var x ⇒ vat (get_atom x)
| e + f ⇒ (£ e) + £ f
| e · f ⇒ (£ e) · £ f
| e ^* ⇒ (£ e) ^*
| ν a e ⇒ ν a ( £ e )
| ω a e ⇒ ω a ( £ e )
| ‹ p ›e ⇒ ‹ p ›£ e
| e ⇒ e
end
where " £ e " := (multi_to_single e).
Lemma ut_multi_to_single e :
untyped e → untyped (£ e).
Lemma img_sg_multi_to_single e :
image e → single (£ e).
Lemma img_ut_fresh_multi_to_single e :
image e → untyped e → ∀ a, a # e ↔ a # (£ e).
Lemma has_type_multi_to_single e A :
image e → A ⊨ e → A ⊨ (£ e).
Lemma ty_multi_to_single e :
image e → typed e → typed (£ e).
Lemma ka_eq_u_image :
Proper (ka_eq_u ==> iff) image.
Lemma ka_eq_t_image :
Proper (ka_eq_t ==> iff) image.
Lemma eq_ν_smpl_image :
Proper (eq_ν_smpl ==> iff) image.
Lemma eq_nom_untyped_image :
Proper (eq_nom_untyped ==> iff) image.
Lemma eq_nom_typed_image :
Proper (eq_nom_typed ==> iff) image.
Lemma eq_perm_image :
Proper (eq_perm ==> iff) image.
Lemma eq_perm_elim_image :
Proper (eq_perm_elim ==> iff) image.
Lemma eq_nom_untyped_p_image :
Proper (eq_nom_untyped_p ==> iff) image.
Lemma eq_nom_typed_p_image :
Proper (eq_nom_typed_p ==> iff) image.
Lemma NKA_θp_image :
Proper (NKA_θp ==> iff) image.
Lemma NKA_θtp_image :
Proper (NKA_θtp ==> iff) image.
Lemma eq_NKA_θp_image :
Proper (eq NKA_θp ==> iff) image.
Lemma eq_NKA_θtp_image :
Proper (eq NKA_θtp ==> iff) image.
Lemma NKA_θp_single :
Proper (NKA_θp ==> iff) single.
Lemma NKA_θtp_single :
Proper (NKA_θtp ==> iff) single.
Lemma eq_NKA_θp_single :
Proper (eq NKA_θp ==> iff) single.
Lemma eq_NKA_θtp_single :
Proper (eq NKA_θtp ==> iff) single.
Lemma NKA_θp_untyped :
Proper (NKA_θp ==> iff) untyped.
Lemma eq_NKA_θp_untyped :
Proper (eq NKA_θp ==> iff) untyped.
Lemma ut_multi_to_single_single_to_multi e :
untyped e → single e → NKA_θp ⊢ £ $ e ≡ e.
Lemma ty_multi_to_single_single_to_multi e :
typed e → single e → NKA_θtp ⊢ £ $ e ≡ e.
Lemma Proper_ut_sg_ax :
Proper ((ut∧sg∧NKA_θp) ==> eq NKA_θp) single_to_multi.
Lemma Proper_ut_sg_eq :
Proper ((ut ∧ sg ∧ eq NKA_θp) ==> eq NKA_θp) single_to_multi.
Lemma Proper_ty_sg_ax :
Proper ((ty∧sg∧NKA_θtp) ==> eq NKA_θtp) single_to_multi.
Lemma Proper_ty_sg_eq :
Proper ((ty ∧ sg ∧ eq NKA_θtp) ==> eq NKA_θtp) single_to_multi.
Definition Img A e f := (image e ∧ image f) ∧ A e f.
Lemma Proper_ut_img_ax :
Proper (Img (ut ∧ NKA_θp) ==> eq NKA_θp) multi_to_single.
Lemma Proper_ut_img_eq :
Proper (Img (ut ∧ (eq NKA_θp)) ==> eq NKA_θp) multi_to_single.
Lemma Proper_ty_img_ax :
Proper (Img (ty∧NKA_θtp) ==> eq NKA_θtp) multi_to_single.
Lemma Proper_ty_img_eq :
Proper (Img (ty ∧ (eq NKA_θtp)) ==> eq NKA_θtp) multi_to_single.