X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=matita%2Fmatita%2Flib%2Flambda%2Fsubst.ma;h=4f61ef5282fdcf6da367948d7c264526e7ebf87f;hb=d2b59bd89f761a16a2dbc663f446b4f95c767b83;hp=565432a9dfb3c29231e9272df2f7cbc67e8ed55f;hpb=c42ed8044c4bb9b8eadfd6930238ff5e700df656;p=helm.git diff --git a/matita/matita/lib/lambda/subst.ma b/matita/matita/lib/lambda/subst.ma index 565432a9d..4f61ef528 100644 --- a/matita/matita/lib/lambda/subst.ma +++ b/matita/matita/lib/lambda/subst.ma @@ -9,36 +9,7 @@ \ / V_______________________________________________________________ *) -include "arithmetics/nat.ma". - -inductive T : Type[0] ≝ - | Sort: nat → T (* starts from 0 *) - | Rel: nat → T (* starts from ... ? *) - | App: T → T → T (* function, argument *) - | Lambda: T → T → T (* type, body *) - | Prod: T → T → T (* type, body *) - | D: T → T (* dummifier *) -. - -(* arguments: k is the depth (starts from 0), p is the height (starts from 0) *) -let rec lift t k p ≝ - match t with - [ Sort n ⇒ Sort n - | Rel n ⇒ if_then_else T (leb (S n) k) (Rel n) (Rel (n+p)) - | App m n ⇒ App (lift m k p) (lift n k p) - | Lambda m n ⇒ Lambda (lift m k p) (lift n (k+1) p) - | Prod m n ⇒ Prod (lift m k p) (lift n (k+1) p) - | D n ⇒ D (lift n k p) - ]. - -(* -ndefinition lift ≝ λt.λp.lift_aux t 0 p. - -notation "↑ ^ n ( M )" non associative with precedence 40 for @{'Lift O $M}. -notation "↑ _ k ^ n ( M )" non associative with precedence 40 for @{'Lift $n $k $M}. -*) -(* interpretation "Lift" 'Lift n M = (lift M n). *) -interpretation "Lift" 'Lift n k M = (lift M k n). +include "lambda/lift.ma". let rec subst t k a ≝ match t with @@ -56,86 +27,10 @@ ndefinition subst ≝ λa.λt.subst_aux t 0 a. notation "M [ N ]" non associative with precedence 90 for @{'Subst $N $M}. *) -notation "M [ k := N ]" non associative with precedence 90 for @{'Subst $M $k $N}. - (* interpretation "Subst" 'Subst N M = (subst N M). *) -interpretation "Subst" 'Subst M k N = (subst M k N). - -(*** properties of lift and subst ***) - -lemma lift_0: ∀t:T.∀k. lift t k 0 = t. -#t (elim t) normalize // #n #k cases (leb (S n) k) normalize // -qed. - -(* nlemma lift_0: ∀t:T. lift t 0 = t. -#t; nelim t; nnormalize; //; nqed. *) - -lemma lift_sort: ∀i,k,n. lift (Sort i) k n = Sort i. -// qed. - -lemma lift_rel: ∀i,n. lift (Rel i) 0 n = Rel (i+n). -// qed. - -lemma lift_rel1: ∀i.lift (Rel i) 0 1 = Rel (S i). -#i (change with (lift (Rel i) 0 1 = Rel (1 + i))) // -qed. - -lemma lift_rel_lt : ∀n,k,i. i < k → lift (Rel i) k n = Rel i. -#n #k #i #ltik change with -(if_then_else ? (leb (S i) k) (Rel i) (Rel (i+n)) = Rel i) ->(le_to_leb_true … ltik) // -qed. - -lemma lift_rel_ge : ∀n,k,i. k ≤ i → lift (Rel i) k n = Rel (i+n). -#n #k #i #leki change with -(if_then_else ? (leb (S i) k) (Rel i) (Rel (i+n)) = Rel (i+n)) ->lt_to_leb_false // @le_S_S // -qed. - -lemma lift_lift: ∀t.∀m,j.j ≤ m → ∀n,k. - lift (lift t k m) (j+k) n = lift t k (m+n). -#t #i #j #h (elim t) normalize // #n #h #k -@(leb_elim (S n) k) #Hnk normalize - [>(le_to_leb_true (S n) (j+k) ?) normalize /2/ - |>(lt_to_leb_false (S n+i) (j+k) ?) - normalize // @le_S_S >(commutative_plus j k) - @le_plus // @not_lt_to_le /2/ - ] -qed. - -lemma lift_lift_up: ∀n,m,t,k,i. - lift (lift t i m) (m+k+i) n = lift (lift t (k+i) n) i m. -#n #m #N (elim N) - [1,3,4,5,6: normalize // - |#p #k #i @(leb_elim i p); - [#leip >lift_rel_ge // @(leb_elim (k+i) p); - [#lekip >lift_rel_ge; - [>lift_rel_ge // >lift_rel_ge // @(transitive_le … leip) // - |>associative_plus >commutative_plus @monotonic_le_plus_l // - ] - |#lefalse (cut (p < k+i)) [@not_le_to_lt //] #ltpki - >lift_rel_lt; [|>associative_plus >commutative_plus @monotonic_lt_plus_r //] - >lift_rel_lt // >lift_rel_ge // - ] - |#lefalse (cut (p < i)) [@not_le_to_lt //] #ltpi - >lift_rel_lt // >lift_rel_lt; [|@(lt_to_le_to_lt … ltpi) //] - >lift_rel_lt; [|@(lt_to_le_to_lt … ltpi) //] - >lift_rel_lt // - ] - ] -qed. - -lemma lift_lift1: ∀t.∀i,j,k. - lift(lift t k j) k i = lift t k (j+i). -/2/ qed. +interpretation "Subst" 'Subst1 M k N = (subst M k N). -lemma lift_lift2: ∀t.∀i,j,k. - lift (lift t k j) (j+k) i = lift t k (j+i). -/2/ qed. - -(* -nlemma lift_lift: ∀t.∀i,j. lift (lift t j) i = lift t (j+i). -nnormalize; //; nqed. *) +(*** properties of subst ***) lemma subst_lift_k: ∀A,B.∀k. (lift B k 1)[k ≝ A] = B. #A #B (elim B) normalize /2/ #n #k @@ -247,6 +142,9 @@ lemma lift_subst_up: ∀M,N,n,i,j. ] qed. +lemma lift_subst_up_O: ∀v,t,k,p. (lift t (k+1) p)[O≝lift v k p] = lift t[O≝v] k p. +// qed. + theorem delift : ∀A,B.∀i,j,k. i ≤ j → j ≤ i + k → (lift B i (S k)) [j ≝ A] = lift B i k. #A #B (elim B) normalize /2/ @@ -307,3 +205,8 @@ lemma subst_lemma: ∀A,B,C.∀k,i. ] ] qed. + +lemma subst_lemma_comm: ∀A,B,C.∀k,i. + (A [i ≝ B]) [i+k ≝ C] = (A [i+k+1 := C]) [i ≝ B [k ≝ C]]. +#A #B #C #k #i >commutative_plus >subst_lemma // +qed.