From 41b61472d2c475e0f69e3dfc85539da3ad2bac1e Mon Sep 17 00:00:00 2001 From: Ferruccio Guidi Date: Wed, 11 Jul 2018 12:54:33 +0200 Subject: [PATCH] update in static_2 and app_2 + advances on the support for models + tentative definition of shift (incomplete because unary binders are missing in terms) + minor updates and corrections --- .../lambdadelta/download/lambda_talk_1s.pdf | Bin 0 -> 68519 bytes matita/matita/contribs/lambdadelta/Makefile | 4 +- .../models/downspoon_3.etc} | 0 .../apps_2/etc/models/model_ext.etc | 78 ++++++++ .../model_gi.ma => etc/models/model_gi.etc} | 0 .../vdrop.ma => etc/models/model_valign.etc} | 33 +--- .../apps_2/etc/models/uparrow_3.etc | 27 +++ .../upspoon_3.ma => etc/models/upspoon_3.etc} | 0 .../lambdadelta/apps_2/etc/models/valign.etc | 22 +++ .../lambdadelta/apps_2/etc/models/vdrop.etc | 171 ++++-------------- .../apps_2/etc/models/vdrop_old.etc | 138 ++++++++++++++ .../models/vdrop_vlift.etc} | 0 .../veq_li.ma => etc/models/veq_li.etc} | 4 +- .../veq_vdrop.ma => etc/models/veq_vdrop.etc} | 2 +- .../contribs/lambdadelta/apps_2/models/deq.ma | 7 +- .../lambdadelta/apps_2/models/deq_cpr.ma | 69 +++---- .../contribs/lambdadelta/apps_2/models/li.ma | 124 +++++++++++++ .../lambdadelta/apps_2/models/model.ma | 15 +- .../lambdadelta/apps_2/models/model_li.ma | 95 ---------- .../lambdadelta/apps_2/models/model_props.ma | 56 ++++-- .../lambdadelta/apps_2/models/model_vlift.ma | 17 +- .../contribs/lambdadelta/apps_2/models/veq.ma | 77 ++++---- .../lambdadelta/apps_2/models/veq_lifts.ma | 59 +++--- .../lambdadelta/apps_2/models/vlifts.ma | 125 +++++++++++++ .../lambdadelta/apps_2/models/vlifts_shift.ma | 70 +++++++ .../apps_2/notation/models/roplus_5.ma | 27 +++ .../lambdadelta/apps_2/web/apps_2_src.tbl | 22 ++- .../lambdadelta/static_2/syntax/shift.ma | 38 ++++ .../lambdadelta/static_2/web/static_2_src.tbl | 1 + matita/matita/predefined_virtuals.ml | 2 +- 30 files changed, 873 insertions(+), 410 deletions(-) create mode 100644 helm/www/lambdadelta/download/lambda_talk_1s.pdf rename matita/matita/contribs/lambdadelta/apps_2/{notation/models/downspoon_3.ma => etc/models/downspoon_3.etc} (100%) create mode 100644 matita/matita/contribs/lambdadelta/apps_2/etc/models/model_ext.etc rename matita/matita/contribs/lambdadelta/apps_2/{models/model_gi.ma => etc/models/model_gi.etc} (100%) rename matita/matita/contribs/lambdadelta/apps_2/{models/vdrop.ma => etc/models/model_valign.etc} (55%) create mode 100644 matita/matita/contribs/lambdadelta/apps_2/etc/models/uparrow_3.etc rename matita/matita/contribs/lambdadelta/apps_2/{notation/models/upspoon_3.ma => etc/models/upspoon_3.etc} (100%) create mode 100644 matita/matita/contribs/lambdadelta/apps_2/etc/models/valign.etc create mode 100644 matita/matita/contribs/lambdadelta/apps_2/etc/models/vdrop_old.etc rename matita/matita/contribs/lambdadelta/apps_2/{models/vdrop_vlift.ma => etc/models/vdrop_vlift.etc} (100%) rename matita/matita/contribs/lambdadelta/apps_2/{models/veq_li.ma => etc/models/veq_li.etc} (94%) rename matita/matita/contribs/lambdadelta/apps_2/{models/veq_vdrop.ma => etc/models/veq_vdrop.etc} (96%) create mode 100644 matita/matita/contribs/lambdadelta/apps_2/models/li.ma delete mode 100644 matita/matita/contribs/lambdadelta/apps_2/models/model_li.ma create mode 100644 matita/matita/contribs/lambdadelta/apps_2/models/vlifts.ma create mode 100644 matita/matita/contribs/lambdadelta/apps_2/models/vlifts_shift.ma create mode 100644 matita/matita/contribs/lambdadelta/apps_2/notation/models/roplus_5.ma create mode 100644 matita/matita/contribs/lambdadelta/static_2/syntax/shift.ma diff --git a/helm/www/lambdadelta/download/lambda_talk_1s.pdf b/helm/www/lambdadelta/download/lambda_talk_1s.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5831950c50995c64ec7904513c567151f8fec4d6 GIT binary patch literal 68519 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 z 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 // >vlift_lt // +| >vlift_eq >vlift_eq // +| >vlift_gt // >vlift_gt // +] +qed. + +lemma vdrop_ext (M): ∀i. compatible_2 … (vdrop M i) (exteq …) (exteq …). +#M #i #lv1 #lv2 #Hlv12 #j elim (lt_or_ge j i) #Hji +[ >vdrop_lt // >vdrop_lt // +| >vdrop_ge // >vdrop_ge // +] +qed. + +lemma vlift_vdrop_eq (M): ∀lv,i. lv ≐{?,dd M} ⫯[i←lv i]⫰[i]lv. +#M #lv #i #j elim (lt_or_eq_or_gt j i) #Hji destruct +[ >vlift_lt // >vdrop_lt // +| >vlift_eq // +| >vlift_gt // >vdrop_ge /2 width=1 by monotonic_pred/ + <(lt_succ_pred … Hji) // +] +qed. + +axiom vdrop_vlift_eq: ∀M,lv,d,i. lv ≐{?,dd M} ⫰[i]⫯[i←d]lv. +(* +#M #lv #d #i #j elim (lt_or_eq_or_gt j i) #Hji destruct +*) + +lemma ext_inv_vlift_sn (M): ∀lv1,y,i,d. ⫯[i←d]lv1 ≐{?,dd M} y → + ∧∧ d = y i & lv1 ≐ ⫰[i]y. +#M #lv1 #y #i #d #H @conj +[ lapply (H i) -H >vlift_eq // +| @exteq_trans [2: @(vdrop_vlift_eq … d i) | skip ] + @vdrop_ext // +] +qed-. + +lemma ext_inv_vlift_sn (M): ∀lv1,y,i,d. ⫯[i←d]lv1 ≐{?,dd M} y → + ∃∃lv2. lv1 ≐ lv2 & ⫯[i←d]lv2 = y. + +lemma li_repl (M) (gv): ∀lv1,L. lv1 ϵ ⟦L⟧{M}[gv] → + ∀lv2. lv1 ≐ lv2 → lv2 ϵ ⟦L⟧{M}[gv]. +#M #gv #lv1 #L #H elim H -lv1 -L +[ // +| +| #lv1 #d #K #W #_ #IH #y #H + + + + +lemma ext_veq (M): is_model M → + ∀lv1,lv2. lv1 ≐ lv2 → lv1 ≗{M} lv2. +/2 width=1 by mr/ qed. + +lemma veq_repl_exteq (M): is_model M → + replace_2 … (veq M) (exteq …) (exteq …). +/2 width=5 by mq/ qed-. + +lemma exteq_veq_trans (M): ∀lv1,lv. lv1 ≐ lv → + ∀lv2. lv ≗{M} lv2 → lv1 ≗ lv2. +// qed-. + +lemma ti_ext_l (M): is_model M → + ∀T,gv,lv1,lv2. lv1 ≐ lv2 → + ⟦T⟧[gv, lv1] ≗{M} ⟦T⟧[gv, lv2]. +/3 width=1 by ti_comp_l, ext_veq/ qed. + +lemma valign_ext (M) (l): compatible_2 … (valign M l) (exteq …) (exteq …). +#M #l #lv1 #lv2 #HLv12 #i +>valign_rw >valign_rw // +qed. diff --git a/matita/matita/contribs/lambdadelta/apps_2/models/model_gi.ma b/matita/matita/contribs/lambdadelta/apps_2/etc/models/model_gi.etc similarity index 100% rename from matita/matita/contribs/lambdadelta/apps_2/models/model_gi.ma rename to matita/matita/contribs/lambdadelta/apps_2/etc/models/model_gi.etc diff --git a/matita/matita/contribs/lambdadelta/apps_2/models/vdrop.ma b/matita/matita/contribs/lambdadelta/apps_2/etc/models/model_valign.etc similarity index 55% rename from matita/matita/contribs/lambdadelta/apps_2/models/vdrop.ma rename to matita/matita/contribs/lambdadelta/apps_2/etc/models/model_valign.etc index f0d72d4e2..aafa0c097 100644 --- a/matita/matita/contribs/lambdadelta/apps_2/models/vdrop.ma +++ b/matita/matita/contribs/lambdadelta/apps_2/etc/models/model_valign.etc @@ -14,36 +14,17 @@ include "ground_2/lib/functions.ma". include "ground_2/lib/exteq.ma". -include "ground_2/notation/functions/downspoon_2.ma". -include "apps_2/notation/models/downspoon_3.ma". include "apps_2/models/model.ma". -(* EVALUATION DROP **********************************************************) +(* MODEL ********************************************************************) -definition vdrop (M): nat → evaluation M → evaluation M ≝ - λj,lv,i. tri … i j (lv i) (lv (↑i)) (lv (↑i)). +definition valign (M) (l): evaluation M → evaluation M ≝ + λlv,i. ⫯[l](lv i). -interpretation "generic drop (model evaluation)" - 'DownSpoon M i lv = (vdrop M i lv). - -interpretation "drop (model evaluation)" - 'DownSpoon M lv = (vdrop M O lv). +interpretation "alignment (model evaluation)" + 'UpSpoon M l lv = (valign M l lv). (* Basic properties *********************************************************) -lemma vdrop_lt (M): ∀lv,j,i. i < j → (⫰{M}[j] lv) i = lv i. -/2 width=1 by tri_lt/ qed-. - -lemma vdrop_ge (M): ∀lv,j,i. j ≤ i → (⫰{M}[j] lv) i = lv (↑i). -#M #lv #j #i #Hji elim (le_to_or_lt_eq … Hji) -Hji #Hji destruct -[ /2 width=1 by tri_gt/ -| /2 width=1 by tri_eq/ -] -qed-. - -lemma vdrop_ext (M): ∀i. compatible_2 … (vdrop M i) (exteq …) (exteq …). -#M #i #lv1 #lv2 #Hlv12 #j elim (lt_or_ge j i) #Hji -[ >vdrop_lt // >vdrop_lt // -| >vdrop_ge // >vdrop_ge // -] -qed. +lemma valign_rw (M) (l) (lv): ∀i. (⫯{M}[l]lv) i = ⫯[l](lv i). +// qed. diff --git a/matita/matita/contribs/lambdadelta/apps_2/etc/models/uparrow_3.etc b/matita/matita/contribs/lambdadelta/apps_2/etc/models/uparrow_3.etc new file mode 100644 index 000000000..2a953eb67 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/apps_2/etc/models/uparrow_3.etc @@ -0,0 +1,27 @@ +(**************************************************************************) +(* ___ *) +(* ||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 *) +(* *) +(**************************************************************************) + +(* NOTATION FOR THE "models" COMPONENT **************************************) + +notation < "hvbox( ↑[ term 46 f ] break term 70 d )" + non associative with precedence 70 + for @{ 'UpArrow $M $f $d }. + +notation > "hvbox( ↑[ term 46 f ] break term 70 d )" + non associative with precedence 70 + for @{ 'UpArrow ? $f $d }. + +notation > "hvbox( ↑{ term 46 M }[ break term 46 f ] break term 70 d )" + non associative with precedence 70 + for @{ 'UpArrow $M $f $d }. diff --git a/matita/matita/contribs/lambdadelta/apps_2/notation/models/upspoon_3.ma b/matita/matita/contribs/lambdadelta/apps_2/etc/models/upspoon_3.etc similarity index 100% rename from matita/matita/contribs/lambdadelta/apps_2/notation/models/upspoon_3.ma rename to matita/matita/contribs/lambdadelta/apps_2/etc/models/upspoon_3.etc diff --git a/matita/matita/contribs/lambdadelta/apps_2/etc/models/valign.etc b/matita/matita/contribs/lambdadelta/apps_2/etc/models/valign.etc new file mode 100644 index 000000000..c8b4df01a --- /dev/null +++ b/matita/matita/contribs/lambdadelta/apps_2/etc/models/valign.etc @@ -0,0 +1,22 @@ +include "apps_2/notation/models/upspoon_3.ma". + + al: nat → dd → dd; (* alignment *) + +interpretation "alignment (model)" + 'UpSpoon M i d = (al M i d). + +(* Note: lift: compatibility *) + mf: compatible_3 … (al M) (eq …) (sq M) (sq M); +(* Note: lift: swap *) + mw: ∀l1,l2,d. l2 ≤ l1 → ⫯[l2]⫯[l1]d ≗{M} ⫯[↑l1]⫯[l2]d; +(* Note: lift: sort evaluation *) + mv: ∀l,s. ⫯[l](sv M s) ≗ sv M s; + +theorem valign_swap (M): is_model M → + ∀l1,l2. l2 ≤ l1 → + ∀lv:evaluation …. ⫯[l2]⫯[l1]lv ≗{M} ⫯[↑l1]⫯[l2]lv. +/2 width=1 by mw/ qed. + +lemma valign_comp (M): is_model M → + ∀l. compatible_2 … (valign M l) (veq M) (veq M). +/2 width=1 by mf/ qed-. diff --git a/matita/matita/contribs/lambdadelta/apps_2/etc/models/vdrop.etc b/matita/matita/contribs/lambdadelta/apps_2/etc/models/vdrop.etc index 5a857fbb1..e15ac254a 100644 --- a/matita/matita/contribs/lambdadelta/apps_2/etc/models/vdrop.etc +++ b/matita/matita/contribs/lambdadelta/apps_2/etc/models/vdrop.etc @@ -1,138 +1,37 @@ - - -lemma vdrop_refl: ∀M,v,l. ↓[l, 0] v ≐⦋M⦌ v. -#M #v #l #i elim (lt_or_ge … i l) #Hil -[ >vdrop_lt // -| >vdrop_ge // -] -qed. - -(* Main properties **********************************************************) - -theorem vdrop_vdrop_le_sym: ∀M,v,l1,l2,m1,m2. l1 ≤ l2 → - ↓[l1, m1] ↓[l2+m1, m2] v ≐⦋M⦌ ↓[l2, m2] ↓[l1, m1] v. -#M #v #l1 #l2 #m1 #m2 #Hl12 #j elim (lt_or_ge … j l1) #Hjl1 -[ lapply (lt_to_le_to_lt … Hjl1 Hl12) -Hl12 #Hjl2 - >vdrop_lt // >vdrop_lt /2 width=3 by lt_to_le_to_lt/ - >vdrop_lt // >vdrop_lt // -| >vdrop_ge // elim (lt_or_ge … j l2) #Hjl2 -Hl12 - [ >vdrop_lt /2 width=1 by lt_minus_to_plus/ - >vdrop_lt // >vdrop_ge // - | >vdrop_ge /2 width=1 by monotonic_le_plus_l/ - >vdrop_ge // >vdrop_ge /2 width=1 by le_plus/ - ] -] -qed. - -lemma vdrop_vdrop_le: ∀M,v,l1,l2,m1,m2. l1 ≤ l2 → - ↓[l2, m2] ↓[l1, m1] v ≐⦋M⦌ ↓[l1, m1] ↓[l2+m1, m2] v. -/3 width=1 by vdrop_vdrop_le_sym, veq_sym/ qed-. - -(* Properties on raise ******************************************************) - -lemma vdrop_raise_lt: ∀M,v,d,l,m,i. i ≤ l → ↓[l+1, m] [i⬐d] v ≐⦋M⦌ [i⬐d] ↓[l, m] v. -#M #v #d #l #m #i #Hil #j elim (lt_or_eq_or_gt … j i) #Hij destruct -[ lapply (lt_to_le_to_lt … Hij Hil) -Hil #Hjl - >vdrop_lt /2 width=1 by le_S/ >raise_lt // >raise_lt // >vdrop_lt // -| >vdrop_lt /2 width=1 by le_S_S/ >raise_eq >raise_eq // -| lapply (ltn_to_ltO … Hij) #Hj - >raise_gt // elim (lt_or_ge … j (l+1)) #Hlj - [ -Hil >vdrop_lt // >vdrop_lt /2 width=2 by lt_plus_to_minus/ >raise_gt // - | >vdrop_ge // >vdrop_ge /2 width=1 by le_plus_to_minus_r/ - >raise_gt /2 width=1 by le_plus/ >plus_minus // - ] -] -qed. - -lemma raise_vdrop_lt: ∀M,v,d,l,m,i. i ≤ l → [i⬐d] ↓[l, m] v ≐⦋M⦌ ↓[l+1, m] [i⬐d] v. -/3 width=1 by vdrop_raise_lt, veq_sym/ qed. - -lemma vdrop_raise_be: ∀M,v,d,l,m,i. l ≤ i → i ≤ l + m → ↓[l, m+1] [i⬐d] v ≐⦋M⦌ ↓[l, m] v. -#M #v #d #l #m #i #Hli #Hilm #j elim (lt_or_ge … j l) #Hlj -[ lapply (lt_to_le_to_lt … Hlj Hli) -Hli -Hilm #Hij - >vdrop_lt // >vdrop_lt // >raise_lt // -| lapply (transitive_le … (j+m) Hilm ?) -Hli -Hilm /2 width=1 by monotonic_le_plus_l/ #Hijm - >vdrop_ge // >vdrop_ge // >raise_gt /2 width=1 by le_S_S/ -] -qed. - -lemma vdrop_raise_be_sym: ∀M,v,d,l,m,i. l ≤ i → i ≤ l + m → ↓[l, m] v ≐⦋M⦌ ↓[l, m+1] [i⬐d] v. -/3 width=1 by vdrop_raise_be, veq_sym/ qed. - -lemma vdrop_raise: ∀M,v,d,l. ↓[l, 1] [l⬐d] v ≐⦋M⦌ v. -/3 width=3 by vdrop_raise_be, veq_trans/ qed. - -lemma vdrop_raise_sym: ∀M,v,d,l. v ≐⦋M⦌ ↓[l, 1] [l⬐d] v. -/2 width=1 by veq_sym/ qed. - -lemma raise_vdrop: ∀M,v,i. [i⬐v i] ↓[i,1] v ≐⦋M⦌ v. -#M #V #i #j elim (lt_or_eq_or_gt j i) #Hij destruct -[ >raise_lt // >vdrop_lt // -| >raise_eq // -| >raise_gt // >vdrop_ge /2 width=1 by monotonic_pred/ - vdrop_lt // >raise_lt // >vdrop_lt // -| >vdrop_ge // >raise_eq // -| lapply (ltn_to_ltO … Hlj) #Hj - >vdrop_ge /2 width=1 by lt_to_le/ >raise_gt // - >vdrop_ge /4 width=1 by plus_minus, monotonic_pred, eq_f/ -] -qed. - -lemma raise_vdrop_be_sym: ∀M,v,l,m. [l⬐v (l+m)] ↓[l, m+1] v ≐⦋M⦌ ↓[l, m] v. -/3 width=1 by raise_vdrop_be, veq_sym/ qed. - -(* Forward lemmas on raise **************************************************) - -lemma vdrop_fwd_raise_be_S: ∀M,v1,v2,d,l,m. ↓[l, m] v1 ≐⦋M⦌ [l⬐d] v2 → - ↓[l, m+1] v1 ≐ v2. -#M #v1 #v2 #d #l #m #Hv12 #j elim (lt_or_ge j l) #Hlj -[ lapply (Hv12 j) -Hv12 - >vdrop_lt // >vdrop_lt // >raise_lt // -| lapply (Hv12 (j+1)) - >vdrop_ge /2 width=1 by le_S/ >vdrop_ge // >raise_gt /2 width=1 by le_S_S/ +(**************************************************************************) +(* ___ *) +(* ||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 "ground_2/lib/functions.ma". +include "apps_2/notation/models/downspoon_3.ma". +include "apps_2/models/model.ma". + +(* EVALUATION DROP **********************************************************) + +definition vdrop (M): nat → evaluation M → evaluation M ≝ + λj,lv,i. tri … i j (lv i) (lv (↑i)) (lv (↑i)). + +interpretation "drop (model evaluation)" + 'DownSpoon M i lv = (vdrop M i lv). + +(* Basic properties *********************************************************) + +lemma vdrop_lt (M): ∀lv,j,i. i < j → (⫰{M}[j] lv) i = lv i. +/2 width=1 by tri_lt/ qed-. + +lemma vdrop_ge (M): ∀lv,j,i. j ≤ i → (⫰{M}[j] lv) i = lv (↑i). +#M #lv #j #i #Hji elim (le_to_or_lt_eq … Hji) -Hji #Hji destruct +[ /2 width=1 by tri_gt/ +| /2 width=1 by tri_eq/ ] qed-. - -lemma raise_fwd_vdrop_be_S: ∀M,v1,v2,d,l,m. [l⬐d] v2 ≐⦋M⦌ ↓[l, m] v1 → - v2 ≐ ↓[l, m+1] v1. -/3 width=2 by vdrop_fwd_raise_be_S, veq_sym/ qed-. - -lemma vdrop_fwd_raise_be_O: ∀M,v1,v2,d,l,m. ↓[l, m] v1 ≐⦋M⦌ [l⬐d] v2 → v1 (l+m) = d. -#M #v1 #v2 #d #l #m #Hv12 lapply (Hv12 l) ->vdrop_ge // >raise_eq // -qed-. - -lemma raise_fwd_vdrop_be_O: ∀M,v1,v2,d,l,m. [l⬐d] v2 ≐⦋M⦌ ↓[l, m] v1 → d = v1 (l+m). -/4 width=7 by vdrop_fwd_raise_be_O, veq_sym, sym_eq/ qed-. - -(* Inversion lemmas on raise ************************************************) - -lemma raise_inv_vdrop_lt: ∀M,v1,v2,d,l,m,i. i ≤ l → [i⬐d] v1 ≐⦋M⦌ ↓[l+1, m] v2 → - ∃∃v. v1 ≐ ↓[l, m] v & v2 ≐ [i⬐d] v. -#M #v1 #v2 #d #l #m #i #Hil #Hv12 -lapply (Hv12 i) >raise_eq >vdrop_lt /2 width=1 by le_S_S/ #H destruct -@(ex2_intro … (↓[i, 1] v2)) // -@(veq_trans … (↓[i, 1] ↓[l+1, m] v2)) -/3 width=3 by vdrop_vdrop_le_sym, vdrop_veq, veq_trans/ -qed-. - -lemma vdrop_inv_raise_lt: ∀M,v1,v2,d,l,m,i. i ≤ l → ↓[l+1, m] v2 ≐⦋M⦌ [i⬐d] v1 → - ∃∃v. v1 ≐ ↓[l, m] v & v2 ≐ [i⬐d] v. -/3 width=1 by raise_inv_vdrop_lt, veq_sym/ qed-. - -lemma vdrop_inv_raise_be: ∀M,v1,v2,d,l,m. ↓[l, m] v1 ≐⦋M⦌ [l⬐d] v2 → - v1 (l+m) = d ∧ ↓[l, m+1] v1 ≐ v2. -/3 width=2 by vdrop_fwd_raise_be_O, vdrop_fwd_raise_be_S, conj/ qed-. - -lemma raise_inv_vdrop_be: ∀M,v1,v2,d,l,m. [l⬐d] v2 ≐⦋M⦌ ↓[l, m] v1 → - d = v1 (l+m) ∧ v2 ≐ ↓[l, m+1] v1. -/3 width=2 by raise_fwd_vdrop_be_O, raise_fwd_vdrop_be_S, conj/ qed-. diff --git a/matita/matita/contribs/lambdadelta/apps_2/etc/models/vdrop_old.etc b/matita/matita/contribs/lambdadelta/apps_2/etc/models/vdrop_old.etc new file mode 100644 index 000000000..5a857fbb1 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/apps_2/etc/models/vdrop_old.etc @@ -0,0 +1,138 @@ + + +lemma vdrop_refl: ∀M,v,l. ↓[l, 0] v ≐⦋M⦌ v. +#M #v #l #i elim (lt_or_ge … i l) #Hil +[ >vdrop_lt // +| >vdrop_ge // +] +qed. + +(* Main properties **********************************************************) + +theorem vdrop_vdrop_le_sym: ∀M,v,l1,l2,m1,m2. l1 ≤ l2 → + ↓[l1, m1] ↓[l2+m1, m2] v ≐⦋M⦌ ↓[l2, m2] ↓[l1, m1] v. +#M #v #l1 #l2 #m1 #m2 #Hl12 #j elim (lt_or_ge … j l1) #Hjl1 +[ lapply (lt_to_le_to_lt … Hjl1 Hl12) -Hl12 #Hjl2 + >vdrop_lt // >vdrop_lt /2 width=3 by lt_to_le_to_lt/ + >vdrop_lt // >vdrop_lt // +| >vdrop_ge // elim (lt_or_ge … j l2) #Hjl2 -Hl12 + [ >vdrop_lt /2 width=1 by lt_minus_to_plus/ + >vdrop_lt // >vdrop_ge // + | >vdrop_ge /2 width=1 by monotonic_le_plus_l/ + >vdrop_ge // >vdrop_ge /2 width=1 by le_plus/ + ] +] +qed. + +lemma vdrop_vdrop_le: ∀M,v,l1,l2,m1,m2. l1 ≤ l2 → + ↓[l2, m2] ↓[l1, m1] v ≐⦋M⦌ ↓[l1, m1] ↓[l2+m1, m2] v. +/3 width=1 by vdrop_vdrop_le_sym, veq_sym/ qed-. + +(* Properties on raise ******************************************************) + +lemma vdrop_raise_lt: ∀M,v,d,l,m,i. i ≤ l → ↓[l+1, m] [i⬐d] v ≐⦋M⦌ [i⬐d] ↓[l, m] v. +#M #v #d #l #m #i #Hil #j elim (lt_or_eq_or_gt … j i) #Hij destruct +[ lapply (lt_to_le_to_lt … Hij Hil) -Hil #Hjl + >vdrop_lt /2 width=1 by le_S/ >raise_lt // >raise_lt // >vdrop_lt // +| >vdrop_lt /2 width=1 by le_S_S/ >raise_eq >raise_eq // +| lapply (ltn_to_ltO … Hij) #Hj + >raise_gt // elim (lt_or_ge … j (l+1)) #Hlj + [ -Hil >vdrop_lt // >vdrop_lt /2 width=2 by lt_plus_to_minus/ >raise_gt // + | >vdrop_ge // >vdrop_ge /2 width=1 by le_plus_to_minus_r/ + >raise_gt /2 width=1 by le_plus/ >plus_minus // + ] +] +qed. + +lemma raise_vdrop_lt: ∀M,v,d,l,m,i. i ≤ l → [i⬐d] ↓[l, m] v ≐⦋M⦌ ↓[l+1, m] [i⬐d] v. +/3 width=1 by vdrop_raise_lt, veq_sym/ qed. + +lemma vdrop_raise_be: ∀M,v,d,l,m,i. l ≤ i → i ≤ l + m → ↓[l, m+1] [i⬐d] v ≐⦋M⦌ ↓[l, m] v. +#M #v #d #l #m #i #Hli #Hilm #j elim (lt_or_ge … j l) #Hlj +[ lapply (lt_to_le_to_lt … Hlj Hli) -Hli -Hilm #Hij + >vdrop_lt // >vdrop_lt // >raise_lt // +| lapply (transitive_le … (j+m) Hilm ?) -Hli -Hilm /2 width=1 by monotonic_le_plus_l/ #Hijm + >vdrop_ge // >vdrop_ge // >raise_gt /2 width=1 by le_S_S/ +] +qed. + +lemma vdrop_raise_be_sym: ∀M,v,d,l,m,i. l ≤ i → i ≤ l + m → ↓[l, m] v ≐⦋M⦌ ↓[l, m+1] [i⬐d] v. +/3 width=1 by vdrop_raise_be, veq_sym/ qed. + +lemma vdrop_raise: ∀M,v,d,l. ↓[l, 1] [l⬐d] v ≐⦋M⦌ v. +/3 width=3 by vdrop_raise_be, veq_trans/ qed. + +lemma vdrop_raise_sym: ∀M,v,d,l. v ≐⦋M⦌ ↓[l, 1] [l⬐d] v. +/2 width=1 by veq_sym/ qed. + +lemma raise_vdrop: ∀M,v,i. [i⬐v i] ↓[i,1] v ≐⦋M⦌ v. +#M #V #i #j elim (lt_or_eq_or_gt j i) #Hij destruct +[ >raise_lt // >vdrop_lt // +| >raise_eq // +| >raise_gt // >vdrop_ge /2 width=1 by monotonic_pred/ + vdrop_lt // >raise_lt // >vdrop_lt // +| >vdrop_ge // >raise_eq // +| lapply (ltn_to_ltO … Hlj) #Hj + >vdrop_ge /2 width=1 by lt_to_le/ >raise_gt // + >vdrop_ge /4 width=1 by plus_minus, monotonic_pred, eq_f/ +] +qed. + +lemma raise_vdrop_be_sym: ∀M,v,l,m. [l⬐v (l+m)] ↓[l, m+1] v ≐⦋M⦌ ↓[l, m] v. +/3 width=1 by raise_vdrop_be, veq_sym/ qed. + +(* Forward lemmas on raise **************************************************) + +lemma vdrop_fwd_raise_be_S: ∀M,v1,v2,d,l,m. ↓[l, m] v1 ≐⦋M⦌ [l⬐d] v2 → + ↓[l, m+1] v1 ≐ v2. +#M #v1 #v2 #d #l #m #Hv12 #j elim (lt_or_ge j l) #Hlj +[ lapply (Hv12 j) -Hv12 + >vdrop_lt // >vdrop_lt // >raise_lt // +| lapply (Hv12 (j+1)) + >vdrop_ge /2 width=1 by le_S/ >vdrop_ge // >raise_gt /2 width=1 by le_S_S/ +] +qed-. + +lemma raise_fwd_vdrop_be_S: ∀M,v1,v2,d,l,m. [l⬐d] v2 ≐⦋M⦌ ↓[l, m] v1 → + v2 ≐ ↓[l, m+1] v1. +/3 width=2 by vdrop_fwd_raise_be_S, veq_sym/ qed-. + +lemma vdrop_fwd_raise_be_O: ∀M,v1,v2,d,l,m. ↓[l, m] v1 ≐⦋M⦌ [l⬐d] v2 → v1 (l+m) = d. +#M #v1 #v2 #d #l #m #Hv12 lapply (Hv12 l) +>vdrop_ge // >raise_eq // +qed-. + +lemma raise_fwd_vdrop_be_O: ∀M,v1,v2,d,l,m. [l⬐d] v2 ≐⦋M⦌ ↓[l, m] v1 → d = v1 (l+m). +/4 width=7 by vdrop_fwd_raise_be_O, veq_sym, sym_eq/ qed-. + +(* Inversion lemmas on raise ************************************************) + +lemma raise_inv_vdrop_lt: ∀M,v1,v2,d,l,m,i. i ≤ l → [i⬐d] v1 ≐⦋M⦌ ↓[l+1, m] v2 → + ∃∃v. v1 ≐ ↓[l, m] v & v2 ≐ [i⬐d] v. +#M #v1 #v2 #d #l #m #i #Hil #Hv12 +lapply (Hv12 i) >raise_eq >vdrop_lt /2 width=1 by le_S_S/ #H destruct +@(ex2_intro … (↓[i, 1] v2)) // +@(veq_trans … (↓[i, 1] ↓[l+1, m] v2)) +/3 width=3 by vdrop_vdrop_le_sym, vdrop_veq, veq_trans/ +qed-. + +lemma vdrop_inv_raise_lt: ∀M,v1,v2,d,l,m,i. i ≤ l → ↓[l+1, m] v2 ≐⦋M⦌ [i⬐d] v1 → + ∃∃v. v1 ≐ ↓[l, m] v & v2 ≐ [i⬐d] v. +/3 width=1 by raise_inv_vdrop_lt, veq_sym/ qed-. + +lemma vdrop_inv_raise_be: ∀M,v1,v2,d,l,m. ↓[l, m] v1 ≐⦋M⦌ [l⬐d] v2 → + v1 (l+m) = d ∧ ↓[l, m+1] v1 ≐ v2. +/3 width=2 by vdrop_fwd_raise_be_O, vdrop_fwd_raise_be_S, conj/ qed-. + +lemma raise_inv_vdrop_be: ∀M,v1,v2,d,l,m. [l⬐d] v2 ≐⦋M⦌ ↓[l, m] v1 → + d = v1 (l+m) ∧ v2 ≐ ↓[l, m+1] v1. +/3 width=2 by raise_fwd_vdrop_be_O, raise_fwd_vdrop_be_S, conj/ qed-. diff --git a/matita/matita/contribs/lambdadelta/apps_2/models/vdrop_vlift.ma b/matita/matita/contribs/lambdadelta/apps_2/etc/models/vdrop_vlift.etc similarity index 100% rename from matita/matita/contribs/lambdadelta/apps_2/models/vdrop_vlift.ma rename to matita/matita/contribs/lambdadelta/apps_2/etc/models/vdrop_vlift.etc diff --git a/matita/matita/contribs/lambdadelta/apps_2/models/veq_li.ma b/matita/matita/contribs/lambdadelta/apps_2/etc/models/veq_li.etc similarity index 94% rename from matita/matita/contribs/lambdadelta/apps_2/models/veq_li.ma rename to matita/matita/contribs/lambdadelta/apps_2/etc/models/veq_li.etc index 8fa8d90d7..f696a44d3 100644 --- a/matita/matita/contribs/lambdadelta/apps_2/models/veq_li.ma +++ b/matita/matita/contribs/lambdadelta/apps_2/etc/models/veq_li.etc @@ -15,7 +15,7 @@ include "apps_2/models/model_li.ma". include "apps_2/models/veq_vdrop.ma". -(* EVALUATION EQUIVALENCE **************************************************) +(* EVALUATION EQUIVALENCE ***************************************************) (* Properties with local environment interpretation *************************) @@ -25,7 +25,7 @@ lemma li_repl_back (M) (gv): is_model M → #M #gv #HM #L #lv1 #H elim H -L -lv1 // [ #lv1 #d1 #K #V #_ #Hd #IH #y #H elim (veq_inv_vlift_sn … H) -H #lv2 #d2 #Hlv12 #Hd12 #Hy - /5 width=5 by li_repl, li_abbr, ti_comp_l, mr/ + /5 width=5 by li_repl, li_abbr, ti_comp_l, mq/ | #lv1 #d1 #K #W #_ #IH #y #H elim (veq_inv_vlift_sn … H) -H #lv2 #d2 #Hlv12 #_ #Hy /4 width=3 by li_repl, li_abst/ diff --git a/matita/matita/contribs/lambdadelta/apps_2/models/veq_vdrop.ma b/matita/matita/contribs/lambdadelta/apps_2/etc/models/veq_vdrop.etc similarity index 96% rename from matita/matita/contribs/lambdadelta/apps_2/models/veq_vdrop.ma rename to matita/matita/contribs/lambdadelta/apps_2/etc/models/veq_vdrop.etc index ae3175310..78b97950c 100644 --- a/matita/matita/contribs/lambdadelta/apps_2/models/veq_vdrop.ma +++ b/matita/matita/contribs/lambdadelta/apps_2/etc/models/veq_vdrop.etc @@ -15,7 +15,7 @@ include "apps_2/models/vdrop_vlift.ma". include "apps_2/models/veq.ma". -(* EVALUATION EQUIVALENCE **************************************************) +(* EVALUATION EQUIVALENCE ***************************************************) (* Properties with evaluation drop ******************************************) diff --git a/matita/matita/contribs/lambdadelta/apps_2/models/deq.ma b/matita/matita/contribs/lambdadelta/apps_2/models/deq.ma index 8de93a606..5d0f2d324 100644 --- a/matita/matita/contribs/lambdadelta/apps_2/models/deq.ma +++ b/matita/matita/contribs/lambdadelta/apps_2/models/deq.ma @@ -13,9 +13,8 @@ (**************************************************************************) include "apps_2/notation/models/ringeq_5.ma". -include "apps_2/models/model_gi.ma". -include "apps_2/models/model_li.ma". -include "apps_2/models/model_props.ma". +include "apps_2/models/li.ma". +include "static_2/syntax/genv.ma". (* DENOTATIONAL EQUIVALENCE ************************************************) @@ -29,7 +28,7 @@ interpretation "denotational equivalence (model)" lemma deq_refl (M): is_model M → ∀G,L. reflexive … (deq M G L). -/2 width=1 by mq/ qed. +/2 width=1 by mr/ qed. (* lemma veq_sym: ∀M. symmetric … (veq M). // qed-. diff --git a/matita/matita/contribs/lambdadelta/apps_2/models/deq_cpr.ma b/matita/matita/contribs/lambdadelta/apps_2/models/deq_cpr.ma index 74124719e..6acf720cb 100644 --- a/matita/matita/contribs/lambdadelta/apps_2/models/deq_cpr.ma +++ b/matita/matita/contribs/lambdadelta/apps_2/models/deq_cpr.ma @@ -25,50 +25,55 @@ lemma cpr_fwd_deq (h) (M): is_model M → is_extensional M → #h #M #H1M #H2M #G #L #T1 #T2 #H @(cpr_ind … H) -G -L -T1 -T2 [ /2 width=2 by deq_refl/ | #G #K #V1 #V2 #W2 #_ #IH #HVW2 #gv #v #H - elim (li_inv_abbr … H) -H #lv #d #HK #Hd #H - @(mr … H1M) [4,5: @(ti_ext_l … H1M … H) |1,2: skip ] -v - lapply (lifts_SO_fwd_vlift … gv H1M H2M … HVW2 lv d) -HVW2 #HVW2 - @(seq_trans … H1M … HVW2) -W2 - @(seq_trans … H1M) [3: @IH // | skip ] -G -K -V2 - @(seq_canc_dx … H1M … Hd) -V1 /2 width=1 by ti_lref_vlift_eq/ + elim (li_inv_abbr … H) -H // #lv #HK #H + @(mq … H1M) [4,5: @(ti_comp … H) /2 width=2 by veq_refl/ |1,2: skip ] -v + @(mq … H1M) + [4: /3 width=1 by seq_sym, ml/ | skip + |5: /2 width=2 by lifts_SO_fwd_vlift/ | skip ] -W2 + >vlift_eq /2 width=1 by/ | #I #G #K #T #U #i #_ #IH #HTU #gv #v #H - elim (li_fwd_bind … H) -H #lv #d #HK #H - @(mr … H1M) [4,5: @(ti_ext_l … H1M … H) |1,2: skip ] -v - lapply (lifts_SO_fwd_vlift … gv H1M H2M … HTU lv d) -HTU #HTU - @(seq_trans … H1M … HTU) -U - @(seq_trans … H1M) [3: @IH // | skip ] -G -K -T - /2 width=1 by ti_lref_vlift_gt/ + elim (li_fwd_bind … H) // -H #lv #d #HK #H + @(mq … H1M) [4,5: @(ti_comp … H) /2 width=2 by veq_refl/ |1,2: skip ] -v + @(mq … H1M) + [4: /3 width=1 by seq_sym, ml/ | skip + |5: /2 width=2 by lifts_SO_fwd_vlift/ | skip ] -U + >vlift_gt /3 width=5 by ml, mq, mr/ | #p * #G #L #V1 #V2 #T1 #T2 #_ #_ #IHV #IHT #gv #lv #Hlv - [ @(mr … H1M) [4,5: @(seq_sym … H1M) @(md … H1M) |1,2: skip ] -p - @(seq_trans … H1M) [3: @IHT /3 width=1 by li_abbr/ | skip ] -T2 - /4 width=1 by ti_comp_l, veq_refl, vlift_comp/ - | @(mx … H2M) /3 width=1 by li_abst/ + [ @(mq … H1M) [4,5: /3 width=2 by seq_sym, md/ |1,2: skip ] -p + @(seq_trans … H1M) [2: @IHT /2 width=1 by li_abbr/ | skip ] -T1 + /4 width=1 by ti_comp, vlift_comp, (* 2x *) veq_refl/ + | /4 width=1 by li_abst, mx/ ] | * #G #L #V1 #V2 #T1 #T2 #_ #_ #IHV #IHT #gv #lv #Hlv - [ @(mr … H1M) [4,5: @(seq_sym … H1M) @(ma … H1M) |1,2: skip ] - /3 width=1 by mc/ - | @(mr … H1M) [4,5: @(seq_sym … H1M) @(me … H1M) |1,2: skip ] + [ @(mq … H1M) [4,5: /3 width=2 by seq_sym, ma/ |1,2: skip ] + /3 width=1 by mp/ + | @(mq … H1M) [4,5: /3 width=2 by seq_sym, me/ |1,2: skip ] /2 width=1 by/ ] | #G #L #V #U1 #U2 #T2 #_ #IH #HTU2 #gv #lv #Hlv - @(seq_trans … H1M) [2: @(md … H1M) | skip ] - @(seq_trans … H1M) [2: @IH /3 width=1 by li_abbr, veq_refl/ | skip ] -G -L -U1 + @(mq … H1M) + [4: /3 width=2 by seq_sym, md/ | skip + |3: /3 width=1 by li_abbr/ | skip ] -L -U1 /3 width=1 by lifts_SO_fwd_vlift, seq_sym/ | #G #L #V #T1 #T2 #_ #IH #gv #lv #Hlv @(seq_trans … H1M) [2: @(me … H1M) | skip ] /2 width=1 by/ | #p #G #L #V1 #V2 #W1 #W2 #T1 #T2 #_ #_ #_ #IHV #_ #IHT #gv #lv #Hlv - @(mr … H1M) [4,5: @(seq_sym … H1M) [ @(ma … H1M) | @(md … H1M) ] |1,2: skip ] - @(seq_trans … H1M) [3: @IHT /2 width=1 by li_abst/ | skip ] -T2 - @(mr … H1M) [4,5: @(seq_sym … H1M) [ @(mb … H1M) | @(ti_comp_l … H1M) ] |1,2: skip ] - [2: @vlift_comp [2: @(me … H1M) |4: @(veq_refl … H1M) |1,3: skip ] | skip ] - /4 width=1 by ti_comp_l, veq_refl, vlift_comp/ + @(mq … H1M) [4,5: /3 width=2 by seq_sym, ma, md/ |1,2: skip ] + @(mq … H1M) + [4: /3 width=2 by seq_sym, mb/ | skip + |5: @IHT /2 width=1 by li_abst/ | skip ] -T2 + @ti_comp /2 width=1 by veq_refl/ + @vlift_comp /2 width=1 by veq_refl/ + @(mq … H1M) [4,5: /3 width=2 by seq_sym, me/ |1,2: skip ] -L -V1 + /2 width=1 by mr/ | #p #G #L #V1 #V #V2 #W1 #W2 #T1 #T2 #_ #_ #_ #IHV #IHW #IHT #HV2 #gv #lv #Hlv - @(mr … H1M) [4,5: @(seq_sym … H1M) [ @(ma … H1M) | @(md … H1M) ] |1,2: skip ] - @(mr … H1M) [4,5: @(seq_sym … H1M) [ @(mc … H1M) | @(ma … H1M) ] |1,2: skip ] - [2: @IHV // |4: @(md … H1M) |1,3: skip ] -p -V1 - @(mc … H1M) [ /2 width=1 by lifts_SO_fwd_vlift/ ] -V -V2 - @(seq_trans … H1M) [2: @IHT /3 width=1 by li_abbr, veq_refl/ | skip ] -T1 - /4 width=1 by ti_comp_l, veq_refl, vlift_comp/ + @(mq … H1M) [4,5: /3 width=2 by seq_sym, ma, md/ |1,2: skip ] + @(seq_trans … H1M) [3: /3 width=1 by seq_sym, ma/ | skip ] + @mp // [ @(seq_trans … H1M) /3 width=3 by lifts_SO_fwd_vlift/ ] -V1 -V -V2 + @(mq … H1M) + [4: /3 width=2 by seq_sym, md/ | skip + |3: @IHT /2 width=1 by li_abbr/ | skip ] -T1 + /4 width=1 by ti_comp, vlift_comp, (* 2x *) veq_refl/ ] qed-. 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 index 000000000..f0f2c0f63 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/apps_2/models/li.ma @@ -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. diff --git a/matita/matita/contribs/lambdadelta/apps_2/models/model.ma b/matita/matita/contribs/lambdadelta/apps_2/models/model.ma index 86c624e1b..290c3e4c6 100644 --- a/matita/matita/contribs/lambdadelta/apps_2/models/model.ma +++ b/matita/matita/contribs/lambdadelta/apps_2/models/model.ma @@ -20,11 +20,16 @@ include "static_2/syntax/term.ma". (* MODEL ********************************************************************) record model: Type[1] ≝ { - dd: Type[0]; (* denotations domain *) - sq: relation2 dd dd; (* structural equivalence *) - sv: nat → dd; (* sort evaluation *) - ap: dd → dd → dd; (* application *) - ti: (nat → dd) → (nat → dd) → term → dd (* term interperpretation *) +(* Note: denotations domain *) + dd: Type[0]; +(* Note: structural equivalence *) + sq: relation2 dd dd; +(* Note: sort evaluation *) + sv: nat → dd; +(* Note: application *) + ap: dd → dd → dd; +(* Note: term interperpretation *) + ti: (nat → dd) → (nat → dd) → term → dd }. interpretation "structural equivalence (model)" diff --git a/matita/matita/contribs/lambdadelta/apps_2/models/model_li.ma b/matita/matita/contribs/lambdadelta/apps_2/models/model_li.ma deleted file mode 100644 index 6be3c60c6..000000000 --- a/matita/matita/contribs/lambdadelta/apps_2/models/model_li.ma +++ /dev/null @@ -1,95 +0,0 @@ -(**************************************************************************) -(* ___ *) -(* ||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/model_vlift.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) (⫯[d]lv) -| li_abst: ∀lv,d,L,W. li M gv L lv → li M gv (L.ⓛW) (⫯[d]lv) -| li_unit: ∀lv,d,I,L. li M gv L lv → li M gv (L.ⓤ{I}) (⫯[d]lv) -| li_repl: ∀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): ∀v,Y. v ϵ ⟦Y⟧{M}[gv] → ∀L,V. Y = L.ⓓV → - ∃∃lv,d. lv ϵ ⟦L⟧{M}[gv] & ⟦V⟧{M}[gv, lv] ≗ d & ⫯{M}[d]lv ≐ v. -#M #gv #v #Y #H elim H -v -Y -[ #lv #K #W #H destruct -| #lv #d #L #V #HL #HV #_ #K #W #H destruct /2 width=5 by ex3_2_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 #d #HK #HW #Hlv - /3 width=5 by exteq_trans, ex3_2_intro/ -] -qed-. - -lemma li_inv_abbr (M) (gv): ∀v,L,V. v ϵ ⟦L.ⓓV⟧{M}[gv] → - ∃∃lv,d. lv ϵ ⟦L⟧{M}[gv] & ⟦V⟧{M}[gv, lv] ≗ d & ⫯{M}[d]lv ≐ v. -/2 width=3 by li_inv_abbr_aux/ qed-. - -fact li_inv_abst_aux (M) (gv): ∀v,Y. v ϵ ⟦Y⟧{M}[gv] → ∀L,W. Y = L.ⓛW → - ∃∃lv,d. lv ϵ ⟦L⟧{M}[gv] & ⫯{M}[d]lv ≐ v. -#M #gv #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 /2 width=4 by 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=4 by exteq_trans, ex2_2_intro/ -] -qed-. - -lemma li_inv_abst (M) (gv): ∀v,L,W. v ϵ ⟦L.ⓛW⟧{M}[gv] → - ∃∃lv,d. lv ϵ ⟦L⟧{M}[gv] & ⫯{M}[d]lv ≐ v. -/2 width=4 by li_inv_abst_aux/ qed-. - -fact li_inv_unit_aux (M) (gv): ∀v,Y. v ϵ ⟦Y⟧{M}[gv] → ∀I,L. Y = L.ⓤ{I} → - ∃∃lv,d. lv ϵ ⟦L⟧{M}[gv] & ⫯{M}[d]lv ≐ v. -#M #gv #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 /2 width=4 by ex2_2_intro/ -| #lv1 #lv2 #L #_ #Hlv12 #IH #J #K #H destruct - elim IH -IH [|*: // ] #lv #d #HK #Hlv - /3 width=4 by exteq_trans, ex2_2_intro/ -] -qed-. - -lemma li_inv_unit (M) (gv): ∀v,I,L. v ϵ ⟦L.ⓤ{I}⟧{M}[gv] → - ∃∃lv,d. lv ϵ ⟦L⟧{M}[gv] & ⫯{M}[d]lv ≐ v. -/2 width=4 by li_inv_unit_aux/ qed-. - -(* Advanced forward lemmas **************************************************) - -lemma li_fwd_bind (M) (gv): ∀v,I,L. v ϵ ⟦L.ⓘ{I}⟧{M}[gv] → - ∃∃lv,d. lv ϵ ⟦L⟧{M}[gv] & ⫯{M}[d]lv ≐ v. -#m #gv #v * [ #I | * #V ] #L #H -[ @(li_inv_unit … H) -| elim (li_inv_abbr … H) -H #lv #d #Hl #_ #Hv - /2 width=4 by ex2_2_intro/ -| @(li_inv_abst … H) -] -qed-. diff --git a/matita/matita/contribs/lambdadelta/apps_2/models/model_props.ma b/matita/matita/contribs/lambdadelta/apps_2/models/model_props.ma index 073d5db62..26a347832 100644 --- a/matita/matita/contribs/lambdadelta/apps_2/models/model_props.ma +++ b/matita/matita/contribs/lambdadelta/apps_2/models/model_props.ma @@ -17,34 +17,46 @@ include "apps_2/models/model_vlift.ma". (* MODEL ********************************************************************) record is_model (M): Prop ≝ { - mq: reflexive … (sq M); - mr: replace_2 … (sq M) (sq M) (sq M); - mc: compatible_3 … (ap M) (sq M) (sq M) (sq M); +(* Note: equivalence: reflexivity *) + mr: reflexive … (sq M); +(* Note: equivalence: compatibility *) + mq: replace_2 … (sq M) (sq M) (sq M); +(* Note: application: compatibility *) + mp: compatible_3 … (ap M) (sq M) (sq M) (sq M); +(* Note: interpretation: sort *) ms: ∀gv,lv,s. ⟦⋆s⟧{M}[gv, lv] ≗ sv M s; +(* Note: interpretation: local reference *) ml: ∀gv,lv,i. ⟦#i⟧{M}[gv, lv] ≗ lv i; +(* Note: interpretation: global reference *) mg: ∀gv,lv,l. ⟦§l⟧{M}[gv, lv] ≗ gv l; - md: ∀gv,lv,p,V,T. ⟦ⓓ{p}V.T⟧{M}[gv, lv] ≗ ⟦T⟧[gv, ⫯[⟦V⟧[gv, lv]]lv]; - mi: ∀gv,lv1,lv2,p,W,T. ⟦W⟧{M}[gv, lv1] ≗ ⟦W⟧{M}[gv, lv2] → - (∀d. ⟦T⟧{M}[gv, ⫯[d]lv1] ≗ ⟦T⟧{M}[gv, ⫯[d]lv2]) → - ⟦ⓛ{p}W.T⟧[gv, lv1] ≗ ⟦ⓛ{p}W.T⟧[gv, lv2]; +(* Note: interpretation: local δ-equivalence *) + md: ∀gv,lv,p,V,T. ⟦ⓓ{p}V.T⟧{M}[gv, lv] ≗ ⟦T⟧[gv, ⫯[0←⟦V⟧[gv, lv]]lv]; +(* Note: interpretation: intensional abstraction *) + mi: ∀gv1,gv2,lv1,lv2,p,W,T. ⟦W⟧{M}[gv1, lv1] ≗ ⟦W⟧{M}[gv2, lv2] → + (∀d. ⟦T⟧{M}[gv1, ⫯[0←d]lv1] ≗ ⟦T⟧{M}[gv2, ⫯[0←d]lv2]) → + ⟦ⓛ{p}W.T⟧[gv1, lv1] ≗ ⟦ⓛ{p}W.T⟧[gv2, lv2]; +(* Note: interpretation: application *) ma: ∀gv,lv,V,T. ⟦ⓐV.T⟧{M}[gv, lv] ≗ ⟦V⟧[gv, lv] @ ⟦T⟧[gv, lv]; +(* Note: interpretation: ϵ-equivalence *) me: ∀gv,lv,W,T. ⟦ⓝW.T⟧{M}[gv, lv] ≗ ⟦T⟧[gv, lv]; - mb: ∀gv,lv,d,p,W,T. d @ ⟦ⓛ{p}W.T⟧{M}[gv, lv] ≗ ⟦T⟧[gv, ⫯[d]lv] +(* Note: interpretation: β-requivalence *) + mb: ∀gv,lv,d,p,W,T. d @ ⟦ⓛ{p}W.T⟧{M}[gv, lv] ≗ ⟦T⟧[gv, ⫯[0←d]lv] }. record is_extensional (M): Prop ≝ { - mx: ∀gv,lv1,lv2,p,W1,W2,T1,T2. ⟦W1⟧{M}[gv, lv1] ≗ ⟦W2⟧{M}[gv, lv2] → - (∀d. ⟦T1⟧{M}[gv, ⫯[d]lv1] ≗ ⟦T2⟧{M}[gv, ⫯[d]lv2]) → - ⟦ⓛ{p}W1.T1⟧[gv, lv1] ≗ ⟦ⓛ{p}W2.T2⟧[gv, lv2] +(* Note: interpretation: extensional abstraction *) + mx: ∀gv1,gv2,lv1,lv2,p,W1,W2,T1,T2. ⟦W1⟧{M}[gv1, lv1] ≗ ⟦W2⟧{M}[gv2, lv2] → + (∀d. ⟦T1⟧{M}[gv1, ⫯[0←d]lv1] ≗ ⟦T2⟧{M}[gv2, ⫯[0←d]lv2]) → + ⟦ⓛ{p}W1.T1⟧[gv1, lv1] ≗ ⟦ⓛ{p}W2.T2⟧[gv2, lv2] }. (* Basic properties *********************************************************) lemma seq_sym (M): is_model M → symmetric … (sq M). -/3 width=5 by mr, mq/ qed-. +/3 width=5 by mq, mr/ qed-. lemma seq_trans (M): is_model M → Transitive … (sq M). -/3 width=5 by mr, mq/ qed-. +/3 width=5 by mq, mr/ qed-. lemma seq_canc_sn (M): is_model M → left_cancellable … (sq M). /3 width=3 by seq_trans, seq_sym/ qed-. @@ -56,12 +68,22 @@ lemma ti_lref_vlift_eq (M): is_model M → ∀gv,lv,d,i. ⟦#i⟧[gv,⫯[i←d]lv] ≗{M} d. #M #HM #gv #lv #d #i @(seq_trans … HM) [2: @ml // | skip ] ->vlift_eq /2 width=1 by mq/ +>vlift_eq /2 width=1 by mr/ qed. lemma ti_lref_vlift_gt (M): is_model M → - ∀gv,lv,d,i. ⟦#(↑i)⟧[gv,⫯[d]lv] ≗{M} ⟦#i⟧[gv,lv]. + ∀gv,lv,d,i. ⟦#(↑i)⟧[gv,⫯[0←d]lv] ≗{M} ⟦#i⟧[gv,lv]. #M #HM #gv #lv #d #i -@(mr … HM) [4,5: @(seq_sym … HM) @(ml … HM) |1,2: skip ] ->vlift_gt /2 width=1 by mq/ +@(mq … HM) [4,5: @(seq_sym … HM) /2 width=2 by ml/ |1,2: skip ] +>vlift_gt /2 width=1 by mr/ qed. + +(* Basic Forward lemmas *****************************************************) + +lemma ti_fwd_mx_dx (M): is_model M → + ∀gv1,gv2,lv1,lv2,p,W1,W2,T1,T2. + ⟦ⓛ{p}W1.T1⟧[gv1, lv1] ≗ ⟦ⓛ{p}W2.T2⟧[gv2, lv2] → + ∀d. ⟦T1⟧{M}[gv1, ⫯[0←d]lv1] ≗ ⟦T2⟧{M}[gv2, ⫯[0←d]lv2]. +#M #HM #gv1 #gv2 #lv1 #lv2 #p #W1 #W2 #T1 #T2 #H12 #d +@(mq … HM) /3 width=5 by mb, mp, mr/ +qed-. diff --git a/matita/matita/contribs/lambdadelta/apps_2/models/model_vlift.ma b/matita/matita/contribs/lambdadelta/apps_2/models/model_vlift.ma index 29bd2e67f..bb2d5c7c9 100644 --- a/matita/matita/contribs/lambdadelta/apps_2/models/model_vlift.ma +++ b/matita/matita/contribs/lambdadelta/apps_2/models/model_vlift.ma @@ -13,22 +13,16 @@ (**************************************************************************) include "ground_2/lib/functions.ma". -include "ground_2/lib/exteq.ma". include "apps_2/notation/models/upspoon_4.ma". -include "apps_2/notation/models/upspoon_3.ma". include "apps_2/models/model.ma". - (* MODEL ********************************************************************) definition vlift (M): nat → dd M → evaluation M → evaluation M ≝ λj,d,lv,i. tri … i j (lv i) d (lv (↓i)). -interpretation "generic lift (model evaluation)" - 'UpSpoon M i d lv = (vlift M i d lv). - interpretation "lift (model evaluation)" - 'UpSpoon M d lv = (vlift M O d lv). + 'UpSpoon M i d lv = (vlift M i d lv). (* Basic properties *********************************************************) @@ -40,12 +34,3 @@ lemma vlift_eq (M): ∀lv,d,i. (⫯{M}[i←d] lv) i = d. lemma vlift_gt (M): ∀lv,d,j,i. j < i → (⫯{M}[j←d] lv) i = lv (↓i). /2 width=1 by tri_gt/ qed-. - -lemma vlift_ext (M): ∀i. compatible_3 … (vlift M i) (eq …) (exteq …) (exteq …). -#m #i #d1 #d2 #Hd12 #lv1 #lv2 #HLv12 #j -elim (lt_or_eq_or_gt j i) #Hij destruct -[ >vlift_lt // >vlift_lt // -| >vlift_eq >vlift_eq // -| >vlift_gt // >vlift_gt // -] -qed. diff --git a/matita/matita/contribs/lambdadelta/apps_2/models/veq.ma b/matita/matita/contribs/lambdadelta/apps_2/models/veq.ma index e784d3b7a..7f6e8b789 100644 --- a/matita/matita/contribs/lambdadelta/apps_2/models/veq.ma +++ b/matita/matita/contribs/lambdadelta/apps_2/models/veq.ma @@ -14,7 +14,7 @@ include "apps_2/models/model_props.ma". -(* EVALUATION EQUIVALENCE **************************************************) +(* EVALUATION EQUIVALENCE ***************************************************) definition veq (M): relation (evaluation M) ≝ λv1,v2. ∀d. v1 d ≗ v2 d. @@ -26,11 +26,11 @@ interpretation "evaluation equivalence (model)" lemma veq_refl (M): is_model M → reflexive … (veq M). -/2 width=1 by mq/ qed. +/2 width=1 by mr/ qed. lemma veq_repl (M): is_model M → replace_2 … (veq M) (veq M) (veq M). -/2 width=5 by mr/ qed-. +/2 width=5 by mq/ qed-. lemma veq_sym (M): is_model M → symmetric … (veq M). /3 width=5 by veq_repl, veq_refl/ qed-. @@ -38,39 +38,39 @@ lemma veq_sym (M): is_model M → symmetric … (veq M). lemma veq_trans (M): is_model M → Transitive … (veq M). /3 width=5 by veq_repl, veq_refl/ qed-. -(* Properties with extebsional equivalence **********************************) +lemma veq_canc_sn (M): is_model M → left_cancellable … (veq M). +/3 width=3 by veq_trans, veq_sym/ qed-. -lemma ext_veq (M): is_model M → - ∀lv1,lv2. lv1 ≐ lv2 → lv1 ≗{M} lv2. -/2 width=1 by mq/ qed. +lemma veq_canc_dx (M): is_model M → right_cancellable … (veq M). +/3 width=3 by veq_trans, veq_sym/ qed-. -lemma veq_repl_exteq (M): is_model M → - replace_2 … (veq M) (exteq …) (exteq …). -/2 width=5 by mr/ qed-. +(* Properties with evaluation lift ******************************************) -lemma exteq_veq_trans (M): ∀lv1,lv. lv1 ≐ lv → - ∀lv2. lv ≗{M} lv2 → lv1 ≗ lv2. -// qed-. - -(* Properties with evaluation evaluation lift *******************************) - -theorem vlift_swap (M): ∀i1,i2. i1 ≤ i2 → - ∀lv,d1,d2. ⫯[i1←d1] ⫯[i2←d2] lv ≐{?,dd M} ⫯[↑i2←d2] ⫯[i1←d1] lv. -#M #i1 #i2 #Hi12 #lv #d1 #d2 #j +theorem vlift_swap (M): is_model M → + ∀i1,i2. i1 ≤ i2 → + ∀lv,d1,d2. ⫯[i1←d1] ⫯[i2←d2] lv ≗{M} ⫯[↑i2←d2] ⫯[i1←d1] lv. +#M #HM #i1 #i2 #Hi12 #lv #d1 #d2 #j elim (lt_or_eq_or_gt j i1) #Hji1 destruct -[ >vlift_lt // >vlift_lt /2 width=3 by lt_to_le_to_lt/ - >vlift_lt /3 width=3 by lt_S, lt_to_le_to_lt/ >vlift_lt // -| >vlift_eq >vlift_lt /2 width=1 by monotonic_le_plus_l/ >vlift_eq // +[ lapply (lt_to_le_to_lt … Hji1 Hi12) #Hji2 + >vlift_lt // >vlift_lt // >vlift_lt /2 width=1 by lt_S/ >vlift_lt // + /2 width=1 by veq_refl/ +| >vlift_eq >vlift_lt /2 width=1 by monotonic_le_plus_l/ >vlift_eq + /2 width=1 by mr/ | >vlift_gt // elim (lt_or_eq_or_gt (↓j) i2) #Hji2 destruct [ >vlift_lt // >vlift_lt /2 width=1 by lt_minus_to_plus/ >vlift_gt // - | >vlift_eq <(lt_succ_pred … Hji1) >vlift_eq // - | >vlift_gt // >vlift_gt /2 width=1 by lt_minus_to_plus_r/ >vlift_gt /2 width=3 by le_to_lt_to_lt/ + /2 width=1 by veq_refl/ + | >vlift_eq <(lt_succ_pred … Hji1) >vlift_eq + /2 width=1 by mr/ + | lapply (le_to_lt_to_lt … Hi12 Hji2) #Hi1j + >vlift_gt // >vlift_gt /2 width=1 by lt_minus_to_plus_r/ >vlift_gt // + /2 width=1 by veq_refl/ ] ] -qed-. +qed. -lemma vlift_comp (M): ∀i. compatible_3 … (vlift M i) (sq M) (veq M) (veq M). -#m #i #d1 #d2 #Hd12 #lv1 #lv2 #HLv12 #j +lemma vlift_comp (M): is_model M → + ∀i. compatible_3 … (vlift M i) (sq M) (veq M) (veq M). +#M #HM #i #d1 #d2 #Hd12 #lv1 #lv2 #HLv12 #j elim (lt_or_eq_or_gt j i) #Hij destruct [ >vlift_lt // >vlift_lt // | >vlift_eq >vlift_eq // @@ -80,21 +80,16 @@ qed-. (* Properies with term interpretation ***************************************) -lemma ti_comp_l (M): is_model M → - ∀T,gv,lv1,lv2. lv1 ≗{M} lv2 → - ⟦T⟧[gv, lv1] ≗ ⟦T⟧[gv, lv2]. +lemma ti_comp (M): is_model M → + ∀T,gv1,gv2. gv1 ≗ gv2 → ∀lv1,lv2. lv1 ≗ lv2 → + ⟦T⟧[gv1, lv1] ≗{M} ⟦T⟧[gv2, lv2]. #M #HM #T elim T -T * [||| #p * | * ] -[ /4 width=3 by seq_trans, seq_sym, ms/ -| /4 width=5 by seq_sym, ml, mr/ +[ /4 width=5 by seq_trans, seq_sym, ms/ +| /4 width=5 by seq_sym, ml, mq/ | /4 width=3 by seq_trans, seq_sym, mg/ -| /5 width=5 by vlift_comp, seq_sym, md, mr/ -| /5 width=1 by vlift_comp, mi, mq/ -| /4 width=5 by seq_sym, ma, mc, mr/ -| /4 width=5 by seq_sym, me, mr/ +| /5 width=5 by vlift_comp, seq_sym, md, mq/ +| /5 width=1 by vlift_comp, mi, mr/ +| /4 width=5 by seq_sym, ma, mp, mq/ +| /4 width=5 by seq_sym, me, mq/ ] qed. - -lemma ti_ext_l (M): is_model M → - ∀T,gv,lv1,lv2. lv1 ≐ lv2 → - ⟦T⟧[gv, lv1] ≗{M} ⟦T⟧[gv, lv2]. -/3 width=1 by ti_comp_l, ext_veq/ qed. diff --git a/matita/matita/contribs/lambdadelta/apps_2/models/veq_lifts.ma b/matita/matita/contribs/lambdadelta/apps_2/models/veq_lifts.ma index 905b1a336..dc83b79b1 100644 --- a/matita/matita/contribs/lambdadelta/apps_2/models/veq_lifts.ma +++ b/matita/matita/contribs/lambdadelta/apps_2/models/veq_lifts.ma @@ -20,42 +20,51 @@ include "apps_2/models/veq.ma". (* Forward lemmas with generic relocation ***********************************) -fact lifts_fwd_vlift_aux (M) (gv): is_model M → is_extensional M → - ∀f,T1,T2. ⬆*[f] T1 ≘ T2 → ∀m. 𝐁❴m,1❵ = f → - ∀lv,d. ⟦T1⟧[gv, lv] ≗{M} ⟦T2⟧[gv, ⫯[m←d]lv]. -#M #gv #H1M #H2M #f #T1 #T2 #H elim H -f -T1 -T2 -[ /4 width=3 by seq_trans, seq_sym, ms/ -| #f #i1 #i2 #Hi12 #m #Hm #lv #d destruct - @(mr … H1M) [4,5: @(seq_sym … H1M) @(ml … H1M) |1,2: skip ] +fact lifts_fwd_vlift_aux (M): is_model M → is_extensional M → + ∀f,T1,T2. ⬆*[f] T1 ≘ T2 → ∀m. 𝐁❴m,1❵ = f → + ∀gv,lv,d. ⟦T1⟧[gv, lv] ≗{M} ⟦T2⟧[gv, ⫯[m←d]lv]. +#M #H1M #H2M #f #T1 #T2 #H elim H -f -T1 -T2 +[ #f #s #m #Hf #gv #lv #d + @(mq … H1M) [4,5: /3 width=2 by seq_sym, ms/ |1,2: skip ] + /2 width=1 by mr/ +| #f #i1 #i2 #Hi12 #m #Hm #gv #lv #d destruct + @(mq … H1M) [4,5: /3 width=2 by seq_sym, ml/ |1,2: skip ] elim (lt_or_ge i1 m) #Hi1 [ lapply (at_basic_inv_lt … Hi12) -Hi12 // #H destruct - >vlift_lt /2 width=1 by mq/ + >vlift_lt /2 width=1 by mr/ | lapply (at_basic_inv_ge … Hi12) -Hi12 // #H destruct - >vlift_gt /2 width=1 by mq, le_S_S/ + >vlift_gt /2 width=1 by mr, le_S_S/ ] -| /4 width=3 by seq_trans, seq_sym, mg/ -| #f #p * #V1 #V2 #T1 #T2 #_ #_ #IHV #IHT #m #Hm #lv #d destruct - [ @(mr … H1M) [4,5: @(seq_sym … H1M) @(md … H1M) |1,2: skip ] +| #f #l #m #Hf #gv #lv #d + @(mq … H1M) [4,5: /3 width=2 by seq_sym, mg/ |1,2: skip ] + /2 width=1 by mr/ +| #f #p * #V1 #V2 #T1 #T2 #_ #_ #IHV #IHT #m #Hm #gv #lv #d destruct + [ @(mq … H1M) [4,5: /3 width=2 by seq_sym, md/ |1,2: skip ] @(seq_trans … H1M) - [2: @(ti_comp_l … H1M) | skip ] - [2: @(vlift_comp … lv lv) | skip ] - [3: /2 width=1 by veq_refl/ ] - [2: @(IHV … d) // | skip ] - @(seq_trans … H1M) [2: @(IHT (↑m) … d) // | skip ] - /4 width=1 by seq_sym, ti_ext_l, vlift_swap/ - | @mx /2 width=1 by/ #d0 @(seq_trans … H1M) - [3: @(seq_sym … H1M) @(ti_ext_l … H1M) | skip ] - [2: @vlift_swap // | skip ] + [3: @ti_comp // | skip ] + [1,2: /2 width=2 by veq_refl/ ] + [2: @(vlift_comp … H1M) | skip ] + [1,2: /2 width=2 by/ |3,4: /2 width=2 by veq_refl/ ] -IHV + @(seq_trans … H1M) + [3: @ti_comp // | skip ] + [1,2: /2 width=2 by veq_refl/ ] + [2: @veq_sym // @vlift_swap // | skip ] + /2 width=1 by/ + | @mx // [ /2 width=1 by/ ] -IHV #d0 + @(seq_trans … H1M) + [3: @ti_comp // | skip ] + [1,2: /2 width=2 by veq_refl/ ] + [2: @veq_sym // @vlift_swap // | skip ] /2 width=1 by/ ] -| #f * #V1 #v2 #T1 #T2 #_ #_ #IHV #IHT #m #Hm #lv #d - [ /4 width=5 by seq_sym, ma, mc, mr/ - | /4 width=5 by seq_sym, me, mr/ +| #f * #V1 #v2 #T1 #T2 #_ #_ #IHV #IHT #m #Hm #gv #lv #d + [ /4 width=5 by seq_sym, ma, mp, mq/ + | /4 width=5 by seq_sym, me, mq/ ] ] qed-. lemma lifts_SO_fwd_vlift (M) (gv): is_model M → is_extensional M → ∀T1,T2. ⬆*[1] T1 ≘ T2 → - ∀lv,d. ⟦T1⟧[gv, lv] ≗{M} ⟦T2⟧[gv, ⫯[d]lv]. + ∀lv,d. ⟦T1⟧[gv, lv] ≗{M} ⟦T2⟧[gv, ⫯[0←d]lv]. /2 width=3 by lifts_fwd_vlift_aux/ qed-. diff --git a/matita/matita/contribs/lambdadelta/apps_2/models/vlifts.ma b/matita/matita/contribs/lambdadelta/apps_2/models/vlifts.ma new file mode 100644 index 000000000..81321cdac --- /dev/null +++ b/matita/matita/contribs/lambdadelta/apps_2/models/vlifts.ma @@ -0,0 +1,125 @@ +(**************************************************************************) +(* ___ *) +(* ||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 "apps_2/notation/models/roplus_5.ma". +include "static_2/syntax/lenv.ma". +include "apps_2/models/veq.ma". + +(* MULTIPLE LIFT FOR MODEL EVALUATIONS **************************************) + +inductive vlifts (M) (gv) (lv): relation2 lenv (evaluation M) ≝ +| vlifts_atom: vlifts M gv lv (⋆) lv +| vlifts_abbr: ∀v,d,K,V. vlifts M gv lv K v → ⟦V⟧[gv, v] = d → vlifts M gv lv (K.ⓓV) (⫯[0←d]v) +| vlifts_abst: ∀v,d,K,V. vlifts M gv lv K v → vlifts M gv lv (K.ⓛV) (⫯[0←d]v) +| vlifts_unit: ∀v,d,I,K. vlifts M gv lv K v → vlifts M gv lv (K.ⓤ{I}) (⫯[0←d]v) +| vlifts_repl: ∀v1,v2,L. vlifts M gv lv L v1 → v1 ≗ v2 → vlifts M gv lv L v2 +. + +interpretation "multiple lift (model evaluation)" + 'ROPlus M gv L lv v = (vlifts M gv lv L v). + +(* Basic inversion lemmas ***************************************************) + +fact vlifts_inv_atom_aux (M) (gv) (lv): is_model M → + ∀v,L. L ⨁{M}[gv] lv ≘ v → + ⋆ = L → lv ≗ v. +#M #gv #lv #HM #v #L #H elim H -v -L +[ #_ /2 width=1 by veq_refl/ +| #v #d #K #V #_ #_ #_ #H destruct +| #v #d #K #V #_ #_ #H destruct +| #v #d #I #K #_ #_ #H destruct +| #v1 #v2 #L #_ #Hv12 #IH #H destruct + /3 width=3 by veq_trans/ +] +qed-. + +lemma vlifts_inv_atom (M) (gv) (lv): is_model M → + ∀v. ⋆ ⨁{M}[gv] lv ≘ v → lv ≗ v. +/2 width=4 by vlifts_inv_atom_aux/ qed-. + +fact vlifts_inv_abbr_aux (M) (gv) (lv): is_model M → + ∀y,L. L ⨁{M}[gv] lv ≘ y → + ∀K,V. K.ⓓV = L → + ∃∃v. K ⨁[gv] lv ≘ v & ⫯[0←⟦V⟧[gv, v]]v ≗ y. +#M #gv #lv #HM #y #L #H elim H -y -L +[ #Y #X #H destruct +| #v #d #K #V #Hv #Hd #_ #Y #X #H destruct + /3 width=3 by veq_refl, ex2_intro/ +| #v #d #K #V #_ #_ #Y #X #H destruct +| #v #d #I #K #_ #_ #Y #X #H destruct +| #v1 #v2 #L #_ #Hv12 #IH #Y #X #H destruct + elim IH -IH [|*: // ] #v #Hv #Hv1 + /3 width=5 by veq_trans, ex2_intro/ +] +qed-. + +lemma vlifts_inv_abbr (M) (gv) (lv): is_model M → + ∀y,K,V. K.ⓓV ⨁{M}[gv] lv ≘ y → + ∃∃v. K ⨁[gv] lv ≘ v & ⫯[0←⟦V⟧[gv, v]]v ≗ y. +/2 width=3 by vlifts_inv_abbr_aux/ qed-. + +fact vlifts_inv_abst_aux (M) (gv) (lv): is_model M → + ∀y,L. L ⨁{M}[gv] lv ≘ y → + ∀K,W. K.ⓛW = L → + ∃∃v,d. K ⨁[gv] lv ≘ v & ⫯[0←d]v ≗ y. +#M #gv #lv #HM #y #L #H elim H -y -L +[ #Y #X #H destruct +| #v #d #K #V #_ #_ #_ #Y #X #H destruct +| #v #d #K #V #Hv #_ #Y #X #H destruct + /3 width=4 by veq_refl, ex2_2_intro/ +| #v #d #I #K #_ #_ #Y #X #H destruct +| #v1 #v2 #L #_ #Hv12 #IH #Y #X #H destruct + elim IH -IH [|*: // ] #v #d #Hv #Hv1 + /3 width=6 by veq_trans, ex2_2_intro/ +] +qed-. + +lemma vlifts_inv_abst (M) (gv) (lv): is_model M → + ∀y,K,W. K.ⓛW ⨁{M}[gv] lv ≘ y → + ∃∃v,d. K ⨁[gv] lv ≘ v & ⫯[0←d]v ≗ y. +/2 width=4 by vlifts_inv_abst_aux/ qed-. + +fact vlifts_inv_unit_aux (M) (gv) (lv): is_model M → + ∀y,L. L ⨁{M}[gv] lv ≘ y → + ∀I,K. K.ⓤ{I} = L → + ∃∃v,d. K ⨁[gv] lv ≘ v & ⫯[0←d]v ≗ y. +#M #gv #lv #HM #y #L #H elim H -y -L +[ #Z #Y #H destruct +| #v #d #K #V #_ #_ #_ #Z #Y #H destruct +| #v #d #K #V #_ #_ #Z #Y #H destruct +| #v #d #I #K #Hv #_ #Z #Y #H destruct + /3 width=4 by veq_refl, ex2_2_intro/ +| #v1 #v2 #L #_ #Hv12 #IH #Z #Y #H destruct + elim IH -IH [|*: // ] #v #d #Hv #Hv1 + /3 width=6 by veq_trans, ex2_2_intro/ +] +qed-. + +lemma vlifts_inv_unit (M) (gv) (lv): is_model M → + ∀y,I,K. K.ⓤ{I} ⨁{M}[gv] lv ≘ y → + ∃∃v,d. K ⨁[gv] lv ≘ v & ⫯[0←d]v ≗ y. +/2 width=4 by vlifts_inv_unit_aux/ qed-. + +(* Basic forward lemmas *****************************************************) + +lemma vlifts_fwd_bind (M) (gv) (lv): is_model M → + ∀y,I,K. K.ⓘ{I} ⨁{M}[gv] lv ≘ y → + ∃∃v,d. K ⨁[gv] lv ≘ v & ⫯[0←d]v ≗ y. +#M #gv #lv #HM #y * [ #I | * #V ] #L #H +[ /2 width=2 by vlifts_inv_unit/ +| elim (vlifts_inv_abbr … H) // -H #v #HL #Hv + /2 width=4 by ex2_2_intro/ +| /2 width=2 by vlifts_inv_abst/ +] +qed-. diff --git a/matita/matita/contribs/lambdadelta/apps_2/models/vlifts_shift.ma b/matita/matita/contribs/lambdadelta/apps_2/models/vlifts_shift.ma new file mode 100644 index 000000000..a324d3cf4 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/apps_2/models/vlifts_shift.ma @@ -0,0 +1,70 @@ +(**************************************************************************) +(* ___ *) +(* ||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/shift.ma". +include "apps_2/models/vlifts.ma". + +(* MULTIPLE LIFT FOR MODEL EVALUATIONS **************************************) + +(* Properties with shift for restricted closures ****************************) + +lemma vlifts_shift (M): is_model M → is_extensional M → + ∀L,T1,T2,gv,lv. + (∀v. L ⨁[gv] lv ≘ v → ⟦T1⟧[gv, v] ≗ ⟦T2⟧[gv, v]) → + ⟦L+T1⟧[gv, lv] ≗{M} ⟦L+T2⟧[gv, lv]. +#M #H1M #H2M #L elim L -L [| #K * [| * ]] +[ #T1 #T2 #gv #lv #H12 + >shift_atom >shift_atom + /4 width=1 by vlifts_atom, veq_refl/ +| #I #IH #T1 #T2 #gv #lv #H12 + >shift_unit >shift_unit + /5 width=1 by vlifts_unit, mx, mr/ +| #V #IH #T1 #T2 #gv #lv #H12 + >shift_pair >shift_pair + @IH -IH #v #Hv + @(mq … H1M) [3:|*: /3 width=2 by seq_sym, md/ ] + /4 width=1 by vlifts_abbr, mr/ +| #W #IH #T1 #T2 #gv #lv #H12 + >shift_pair >shift_pair + /5 width=1 by vlifts_abst, mx, mr/ +] +qed. + +(* Inversion lemmas with shift for restricted closures **********************) + +lemma vlifts_inv_shift (M): is_model M → + ∀L,T1,T2,gv,lv. ⟦L+T1⟧[gv, lv] ≗{M} ⟦L+T2⟧[gv, lv] → + ∀v. L ⨁[gv] lv ≘ v → ⟦T1⟧[gv, v] ≗ ⟦T2⟧[gv, v]. +#M #HM #L elim L -L [| #K * [| * ]] +[ #T1 #T2 #gv #lv + >shift_atom >shift_atom #H12 #v #H + lapply (vlifts_inv_atom … H) -H // #Hv + /4 width=7 by ti_comp, veq_refl, mq/ +| #I #IH #T1 #T2 #gv #lv + >shift_unit >shift_unit #H12 #y #H + elim (vlifts_inv_unit … H) -H // #v #d #Hlv #Hv + lapply (IH … H12 … Hlv) -IH -H12 -Hlv #H12 + /4 width=7 by ti_comp, ti_fwd_mx_dx, veq_refl, mq/ +| #V #IH #T1 #T2 #gv #lv + >shift_pair >shift_pair #H12 #y #H + elim (vlifts_inv_abbr … H) -H // #v #Hlv #Hv + lapply (IH … H12 … Hlv) -IH -H12 -Hlv #H12 + /4 width=7 by ti_comp, veq_refl, md, mq/ +| #W #IH #T1 #T2 #gv #lv + >shift_pair >shift_pair #H12 #y #H + elim (vlifts_inv_abst … H) -H // #v #d #Hlv #Hv + lapply (IH … H12 … Hlv) -IH -H12 -Hlv #H12 + /4 width=7 by ti_comp, ti_fwd_mx_dx, veq_refl, mq/ +] +qed-. diff --git a/matita/matita/contribs/lambdadelta/apps_2/notation/models/roplus_5.ma b/matita/matita/contribs/lambdadelta/apps_2/notation/models/roplus_5.ma new file mode 100644 index 000000000..149ea8540 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/apps_2/notation/models/roplus_5.ma @@ -0,0 +1,27 @@ +(**************************************************************************) +(* ___ *) +(* ||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 *) +(* *) +(**************************************************************************) + +(* NOTATION FOR THE "models" COMPONENT **************************************) + +notation < "hvbox( L ⨁[ break term 46 gv ] break term 46 lv ≘ break term 46 v )" + non associative with precedence 45 + for @{ 'ROPlus $M $gv $L $lv $v }. + +notation > "hvbox( L ⨁[ break term 46 gv ] break term 46 lv ≘ break term 46 v )" + non associative with precedence 45 + for @{ 'ROPlus ? $gv $L $lv $v }. + +notation > "hvbox( L ⨁{ break term 46 M }[ break term 46 gv ] break term 46 lv ≘ break term 46 v )" + non associative with precedence 45 + for @{ 'ROPlus $M $gv $L $lv $v }. diff --git a/matita/matita/contribs/lambdadelta/apps_2/web/apps_2_src.tbl b/matita/matita/contribs/lambdadelta/apps_2/web/apps_2_src.tbl index 6f9d8a2e7..236ec0c5c 100644 --- a/matita/matita/contribs/lambdadelta/apps_2/web/apps_2_src.tbl +++ b/matita/matita/contribs/lambdadelta/apps_2/web/apps_2_src.tbl @@ -15,20 +15,22 @@ table { [ "deq" + "( ? ⊢ ? ≗{?} ? )" "deq_cpr" * ] } ] - [ { "evaluation equivalence" * } { - [ "veq" + "( ? ≗{?} ? )" "veq_vdrop" "veq_li" "veq_lifts" * ] + [ { "local environment interpretation" * } { + [ "li" + "( ? ϵ ⟦?⟧{?}[?] )" "li_vlifts" * ] } ] - [ { "evaluation drop" * } { - [ "vdrop" + "( ⫰{?}? )" + "( ⫰{?}[?]? )" "vdrop_vlift" * ] + [ { "multiple evaluation lift" * } { + [ "vlifts" + "( ?⨁{?}[?]? ≘ ? )" "vlifts_shift" * ] + } + ] + [ { "evaluation equivalence" * } { + [ "veq" + "( ? ≗{?} ? )" "veq_lifts" * ] } ] [ { "model declaration" * } { [ "model" + "( ? ≗{?} ? )" + "( ? @{?} ? )" + "( ⟦?⟧{?}[?,?] )" - "model_vlift" + "( ⫯{?}[?]? )" + "( ⫯{?}[?←?]? )" + "model_vlift" + "( ⫯{?}[?←?]? )" "model_props" - "model_li" + "( ? ϵ ⟦?⟧{?}[?] )" - "model_gi" * ] } ] @@ -71,3 +73,9 @@ class "top" { * } class "capitalize italic" { 0 } class "italic" { 1 } +(* + [ { "evaluation drop" * } { + [ "vdrop" + "( ⫰{?}? )" + "( ⫰{?}[?]? )" "vdrop_vlift" * ] + } + ] +*) diff --git a/matita/matita/contribs/lambdadelta/static_2/syntax/shift.ma b/matita/matita/contribs/lambdadelta/static_2/syntax/shift.ma new file mode 100644 index 000000000..0c40a310b --- /dev/null +++ b/matita/matita/contribs/lambdadelta/static_2/syntax/shift.ma @@ -0,0 +1,38 @@ +(**************************************************************************) +(* ___ *) +(* ||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". + +(* SHIFT FOR RESTRICTED CLOSURES ********************************************) + +rec definition shift L T on L ≝ match L with +[ LAtom ⇒ T +| LBind L I ⇒ match I with + [ BUnit _ ⇒ shift L (-ⓛ⋆0.T) + | BPair I V ⇒ shift L (-ⓑ{I}V.T) + ] +]. + +interpretation "shift (restricted closure)" 'plus L T = (shift L T). + +(* Basic properties *********************************************************) + +lemma shift_atom: ∀T. ⋆ + T = T. +// qed. + +lemma shift_unit: ∀I,L,T. L.ⓤ{I}+T = L+(-ⓛ⋆0.T). +// qed. + +lemma shift_pair: ∀I,L,V,T. (L.ⓑ{I}V)+T = L+(-ⓑ{I}V.T). +// qed. diff --git a/matita/matita/contribs/lambdadelta/static_2/web/static_2_src.tbl b/matita/matita/contribs/lambdadelta/static_2/web/static_2_src.tbl index 740b3482e..6a2e3859e 100644 --- a/matita/matita/contribs/lambdadelta/static_2/web/static_2_src.tbl +++ b/matita/matita/contribs/lambdadelta/static_2/web/static_2_src.tbl @@ -103,6 +103,7 @@ table { } ] [ { "append" * } { + [ [ "for restricted closures" ] "shift" + "( ? + ? )" "shift_append" * ] [ [ "for lenvs" ] "append" + "( ? + ? )" "append_length" * ] } ] diff --git a/matita/matita/predefined_virtuals.ml b/matita/matita/predefined_virtuals.ml index 02a5c2269..9c1715d39 100644 --- a/matita/matita/predefined_virtuals.ml +++ b/matita/matita/predefined_virtuals.ml @@ -1510,7 +1510,7 @@ let predefined_classes = [ [":"; "⁝"; ]; ["."; "•"; "◦"; ]; ["#"; "♯"; "⋕"; "⧣"; "⧤"; "⌘"; ]; - ["+"; "⨭"; "⨮"; "⊕"; "⊞"; ]; + ["+"; "⨭"; "⨮"; "⨁"; "⊕"; "⊞"; ]; ["-"; "÷"; "⊢"; "⊩"; "⧟"; "⊟"; ]; ["="; "≝"; "≡"; "≘"; "≗"; "≐"; "≑"; "≛"; "≚"; "≙"; "⌆"; "⧦"; "⊜"; "≋"; "⩳"; "≅"; "⩬"; "≂"; "≃"; "≈"; ]; ["→"; "↦"; "⇝"; "⤞"; "⇾"; "⤍"; "⤏"; "⤳"; ] ; -- 2.39.2