]> matita.cs.unibo.it Git - helm.git/blobdiff - matita/matita/contribs/lambdadelta/apps_2/models/li.ma
update in static_2 and app_2
[helm.git] / matita / matita / contribs / lambdadelta / apps_2 / models / li.ma
diff --git a/matita/matita/contribs/lambdadelta/apps_2/models/li.ma b/matita/matita/contribs/lambdadelta/apps_2/models/li.ma
new file mode 100644 (file)
index 0000000..f0f2c0f
--- /dev/null
@@ -0,0 +1,124 @@
+(**************************************************************************)
+(*       ___                                                              *)
+(*      ||M||                                                             *)
+(*      ||A||       A project by Andrea Asperti                           *)
+(*      ||T||                                                             *)
+(*      ||I||       Developers:                                           *)
+(*      ||T||         The HELM team.                                      *)
+(*      ||A||         http://helm.cs.unibo.it                             *)
+(*      \   /                                                             *)
+(*       \ /        This file is distributed under the terms of the       *)
+(*        v         GNU General Public License Version 2                  *)
+(*                                                                        *)
+(**************************************************************************)
+
+include "static_2/syntax/lenv.ma".
+include "apps_2/models/veq.ma".
+include "apps_2/notation/models/inwbrackets_4.ma".
+
+(* LOCAL ENVIRONMENT INTERPRETATION  ****************************************)
+
+inductive li (M) (gv): relation2 lenv (evaluation M) ≝
+| li_atom: ∀lv. li M gv (⋆) lv
+| li_abbr: ∀lv,d,L,V. li M gv L lv → ⟦V⟧[gv, lv] = d → li M gv (L.ⓓV) (⫯[0←d]lv)
+| li_abst: ∀lv,d,L,W. li M gv L lv → li M gv (L.ⓛW) (⫯[0←d]lv)
+| li_unit: ∀lv,d,I,L. li M gv L lv → li M gv (L.ⓤ{I}) (⫯[0←d]lv)
+| li_veq : ∀lv1,lv2,L. li M gv L lv1 → lv1 ≗ lv2 → li M gv L lv2
+.
+
+interpretation "local environment interpretation (model)"
+   'InWBrackets M gv L lv  = (li M gv L lv).
+
+(* Basic inversion lemmas ***************************************************)
+
+fact li_inv_abbr_aux (M) (gv): is_model M → 
+                               ∀v,Y. v ϵ ⟦Y⟧{M}[gv] → ∀L,V. Y = L.ⓓV →
+                               ∃∃lv. lv ϵ ⟦L⟧[gv] & ⫯[0←⟦V⟧[gv,lv]]lv ≗ v.
+#M #gv #HM #v #Y #H elim H -v -Y
+[ #lv #K #W #H destruct
+| #lv #d #L #V #HL #HV #_ #K #W #H destruct
+  /3 width=3 by veq_refl, ex2_intro/
+| #lv #d #L #V #_ #_ #K #W #H destruct
+| #lv #d #I #L #_ #_ #K #W #H destruct
+| #lv1 #lv2 #L #_ #Hlv12 #IH #K #W #H destruct
+  elim IH -IH [|*: // ] #lv #HK #HW
+  /3 width=5 by veq_trans, ex2_intro/
+]
+qed-.
+
+lemma li_inv_abbr (M) (gv): is_model M →
+                            ∀v,L,V. v ϵ ⟦L.ⓓV⟧{M}[gv] →
+                            ∃∃lv. lv ϵ ⟦L⟧[gv] & ⫯[0←⟦V⟧[gv,lv]]lv ≗ v.
+/2 width=3 by li_inv_abbr_aux/ qed-.
+
+fact li_inv_abst_aux (M) (gv): is_model M →
+                               ∀v,Y. v ϵ ⟦Y⟧{M}[gv] → ∀L,W. Y = L.ⓛW →
+                               ∃∃lv,d. lv ϵ ⟦L⟧[gv] & ⫯[0←d]lv ≗ v.
+#M #gv #HM #v #Y #H elim H -v -Y
+[ #lv #K #U #H destruct
+| #lv #d #L #V #_ #_ #_ #K #U #H destruct
+| #lv #d #L #V #HL #_ #K #U #H destruct
+  /3 width=4 by veq_refl, ex2_2_intro/
+| #lv #d #I #L #_ #_ #K #U #H destruct
+| #lv1 #lv2 #L #_ #Hlv12 #IH #K #U #H destruct
+  elim IH -IH [|*: // ] #lv #d #HK #Hlv
+  /3 width=6 by veq_trans, ex2_2_intro/
+]
+qed-.
+
+lemma li_inv_abst (M) (gv): is_model M →
+                            ∀v,L,W. v ϵ ⟦L.ⓛW⟧{M}[gv] →
+                            ∃∃lv,d. lv ϵ ⟦L⟧[gv] & ⫯[0←d]lv ≗ v.
+/2 width=4 by li_inv_abst_aux/ qed-.
+
+fact li_inv_unit_aux (M) (gv): is_model M →
+                               ∀v,Y. v ϵ ⟦Y⟧{M}[gv] → ∀I,L. Y = L.ⓤ{I} →
+                               ∃∃lv,d. lv ϵ ⟦L⟧[gv] & ⫯[0←d]lv ≗ v.
+#M #gv #HM #v #Y #H elim H -v -Y
+[ #lv #J #K #H destruct
+| #lv #d #L #V #_ #_ #_ #J #K #H destruct
+| #lv #d #L #V #_ #_ #J #K #H destruct
+| #lv #d #I #L #HL #_ #J #K #H destruct
+  /3 width=4 by veq_refl, ex2_2_intro/
+| #lv1 #lv2 #L #_ #Hlv12 #IH #J #K #H destruct
+  elim IH -IH [|*: // ] #lv #d #HK #Hlv
+  /3 width=6 by veq_trans, ex2_2_intro/
+]
+qed-.
+
+lemma li_inv_unit (M) (gv): is_model M →
+                            ∀v,I,L. v ϵ ⟦L.ⓤ{I}⟧{M}[gv] →
+                            ∃∃lv,d. lv ϵ ⟦L⟧[gv] & ⫯[0←d]lv ≗ v.
+/2 width=4 by li_inv_unit_aux/ qed-.
+
+(* Advanced forward lemmas **************************************************)
+
+lemma li_fwd_bind (M) (gv): is_model M →
+                            ∀v,I,L. v ϵ ⟦L.ⓘ{I}⟧{M}[gv] →
+                            ∃∃lv,d. lv ϵ ⟦L⟧[gv] & ⫯[0←d]lv ≗ v.
+#M #gv #HM #v * [ #I | * #V ] #L #H
+[ /2 width=2 by li_inv_unit/
+| elim (li_inv_abbr … H) // -H #lv #HL #Hv
+  /2 width=4 by ex2_2_intro/
+| /2 width=2 by li_inv_abst/
+]
+qed-.
+
+(* Basic_properties *********************************************************)
+
+lemma li_repl (M) (L): is_model M ->
+                       replace_2 … (λgv.li M gv L) (veq …) (veq …).
+#M #L #HM #gv1 #lv1 #H elim H -L -lv1
+[ #lv1 #gv2 #Hgv #lv2 #Hlv /2 width=1 by li_atom/
+| #lv1 #d #K #V #_ #Hd #IH #gv2 #Hgv #lv2 #Hlv destruct
+  @li_veq [2: /4 width=4 by li_abbr, veq_refl/ | skip ] -IH
+  @(veq_canc_sn … Hlv) -Hlv //
+  /4 width=1 by ti_comp, vlift_comp, (* 2x *) veq_refl/
+| #lv1 #d #K #W #_ #IH #gv2 #Hgv #lv2 #Hlv
+  @li_veq /4 width=3 by li_abst, veq_refl/
+| #lv1 #d #I #K #_ #IH #gv2 #Hgv #lv2 #Hlv
+  @li_veq /4 width=3 by li_unit, veq_refl/
+| #lv1 #lv #L #_ #Hlv1 #IH #gv2 #Hgv #lv2 #Hlv
+  /3 width=3 by veq_trans/
+]
+qed.