From a454837a256907d2f83d42ced7be847e10361ea9 Mon Sep 17 00:00:00 2001 From: Ferruccio Guidi Date: Sat, 20 Jul 2019 22:13:45 +0200 Subject: [PATCH] more additions and corrections for the article + fqu_clear excluded from (fqu true) + some renaming and changes of notation (esp. lsubsx) + more comments and additions to etc + matitadep: -b show the recursive backward dependences of a file --- .../binaries/matitadep/matitadep.ml | 187 +++++++++-------- .../apps_2/examples/ex_fpbg_refl.ma | 2 +- .../lambdadelta/basic_2/dynamic/cnv_cpce.ma | 2 +- .../basic_2/dynamic/cnv_cpm_tdeq_conf.ma | 8 +- .../basic_2/dynamic/cnv_cpm_tdeq_trans.ma | 2 +- .../lambdadelta/basic_2/dynamic/cnv_fqus.ma | 10 +- .../lambdadelta/basic_2/etc/rdsx_csx.etc | 44 ++++ .../lambdadelta/basic_2/etc/sdsx/sdsx.etc | 145 +++++++++++++ .../lsubsx_rdsx.ma => etc/sdsx/sdsx_rdsx.etc} | 46 ++-- .../notation/relations/topredtysnstrong_5.ma | 19 ++ .../basic_2/rt_computation/cpms_fpbg.ma | 2 +- .../basic_2/rt_computation/cpxs_fqus.ma | 34 +-- .../basic_2/rt_computation/cpxs_lpx.ma | 8 +- .../basic_2/rt_computation/csx_fqus.ma | 8 +- .../basic_2/rt_computation/fpbg.ma | 2 +- .../basic_2/rt_computation/fpbg_fpbs.ma | 2 +- .../basic_2/rt_computation/fpbg_fqup.ma | 2 +- .../basic_2/rt_computation/fpbs_cpxs.ma | 4 +- .../basic_2/rt_computation/fpbs_fqup.ma | 6 +- .../basic_2/rt_computation/fpbs_fqus.ma | 6 +- .../basic_2/rt_computation/fpbs_lpxs.ma | 10 +- .../basic_2/rt_computation/fsb_csx.ma | 4 +- .../lambdadelta/basic_2/rt_computation/jsx.ma | 164 +++++++++++++++ .../{lsubsx_lsubsx.ma => jsx_jsx.ma} | 24 +-- .../basic_2/rt_computation/jsx_rsx.ma | 78 +++++++ .../basic_2/rt_computation/lsubsx.ma | 160 -------------- .../basic_2/rt_computation/rdsx_lpxs.ma | 154 -------------- .../rt_computation/{rdsx.ma => rsx.ma} | 63 +++--- .../{rdsx_csx.ma => rsx_csx.ma} | 41 ++-- .../{rdsx_drops.ma => rsx_drops.ma} | 34 +-- .../{rdsx_fqup.ma => rsx_fqup.ma} | 17 +- .../{rdsx_length.ma => rsx_length.ma} | 14 +- .../basic_2/rt_computation/rsx_lpxs.ma | 152 ++++++++++++++ .../{rdsx_rdsx.ma => rsx_rsx.ma} | 22 +- .../basic_2/rt_transition/cpx_fqus.ma | 34 +-- .../lambdadelta/basic_2/rt_transition/fpb.ma | 2 +- .../lambdadelta/basic_2/rt_transition/fpbq.ma | 2 +- .../basic_2/rt_transition/lpr_fquq.ma | 34 +-- .../basic_2/rt_transition/lpr_lpr.ma | 24 +-- .../basic_2/rt_transition/lpx_fquq.ma | 18 +- .../basic_2/rt_transition/rpx_fsle.ma | 2 +- .../lambdadelta/basic_2/web/basic_2_src.tbl | 4 +- .../etc/scl/clearsn_3.etc} | 4 +- .../lambdadelta/static_2/etc/scl/scl.etc | 110 ++++++++++ .../lambdadelta/static_2/etc/scl/scl_scl.etc | 36 ++++ .../{freestar_3.ma => freeplus_3.ma} | 4 +- .../static_2/notation/relations/lrsubeqf_4.ma | 2 +- .../static_2/notation/relations/supterm_6.ma | 2 +- .../static_2/notation/relations/supterm_7.ma | 2 +- .../notation/relations/suptermopt_6.ma | 2 +- .../notation/relations/suptermopt_7.ma | 2 +- .../notation/relations/suptermplus_6.ma | 2 +- .../notation/relations/suptermplus_7.ma | 2 +- .../notation/relations/suptermstar_6.ma | 2 +- .../notation/relations/suptermstar_7.ma | 2 +- .../static_2/s_computation/fqup.ma | 46 ++-- .../static_2/s_computation/fqup_drops.ma | 6 +- .../static_2/s_computation/fqup_weight.ma | 6 +- .../static_2/s_computation/fqus.ma | 88 ++++---- .../static_2/s_computation/fqus_drops.ma | 2 +- .../static_2/s_computation/fqus_fqup.ma | 26 +-- .../static_2/s_computation/fqus_weight.ma | 4 +- .../lambdadelta/static_2/s_transition/fqu.ma | 59 +++--- .../static_2/s_transition/fqu_length.ma | 6 +- .../static_2/s_transition/fqu_tdeq.ma | 4 +- .../static_2/s_transition/fqu_weight.ma | 4 +- .../lambdadelta/static_2/s_transition/fquq.ma | 2 +- .../static_2/s_transition/fquq_length.ma | 2 +- .../static_2/s_transition/fquq_weight.ma | 2 +- .../lambdadelta/static_2/static/aaa_fqus.ma | 10 +- .../lambdadelta/static_2/static/fdeq_fqus.ma | 4 +- .../lambdadelta/static_2/static/frees.ma | 70 ++++--- .../static_2/static/frees_append.ma | 9 +- .../static_2/static/frees_drops.ma | 89 ++++---- .../lambdadelta/static_2/static/frees_fqup.ma | 62 +++--- .../static_2/static/frees_frees.ma | 2 +- .../lambdadelta/static_2/static/fsle.ma | 2 +- .../lambdadelta/static_2/static/fsle_fsle.ma | 72 ++++--- .../lambdadelta/static_2/static/lsubf.ma | 197 ++++++++++-------- .../static_2/static/lsubf_frees.ma | 5 +- .../static_2/static/lsubf_lsubf.ma | 7 +- .../static_2/static/lsubf_lsubr.ma | 13 +- .../lambdadelta/static_2/static/rdeq.ma | 12 +- .../lambdadelta/static_2/static/rdeq_fqus.ma | 42 ++-- .../lambdadelta/static_2/static/req.ma | 4 +- .../lambdadelta/static_2/static/rex.ma | 162 +++++++------- .../lambdadelta/static_2/static/rex_drops.ma | 49 +++-- .../lambdadelta/static_2/static/rex_fqup.ma | 15 +- .../lambdadelta/static_2/static/rex_fsle.ma | 73 ++++--- .../lambdadelta/static_2/static/rex_length.ma | 20 +- .../lambdadelta/static_2/static/rex_lex.ma | 11 +- .../lambdadelta/static_2/static/rex_rex.ma | 47 +++-- .../lambdadelta/static_2/web/static_2_src.tbl | 12 +- matita/matita/predefined_virtuals.ml | 4 +- 94 files changed, 1785 insertions(+), 1233 deletions(-) create mode 100644 matita/matita/contribs/lambdadelta/basic_2/etc/rdsx_csx.etc create mode 100644 matita/matita/contribs/lambdadelta/basic_2/etc/sdsx/sdsx.etc rename matita/matita/contribs/lambdadelta/basic_2/{rt_computation/lsubsx_rdsx.ma => etc/sdsx/sdsx_rdsx.etc} (71%) create mode 100644 matita/matita/contribs/lambdadelta/basic_2/notation/relations/topredtysnstrong_5.ma create mode 100644 matita/matita/contribs/lambdadelta/basic_2/rt_computation/jsx.ma rename matita/matita/contribs/lambdadelta/basic_2/rt_computation/{lsubsx_lsubsx.ma => jsx_jsx.ma} (66%) create mode 100644 matita/matita/contribs/lambdadelta/basic_2/rt_computation/jsx_rsx.ma delete mode 100644 matita/matita/contribs/lambdadelta/basic_2/rt_computation/lsubsx.ma delete mode 100644 matita/matita/contribs/lambdadelta/basic_2/rt_computation/rdsx_lpxs.ma rename matita/matita/contribs/lambdadelta/basic_2/rt_computation/{rdsx.ma => rsx.ma} (62%) rename matita/matita/contribs/lambdadelta/basic_2/rt_computation/{rdsx_csx.ma => rsx_csx.ma} (63%) rename matita/matita/contribs/lambdadelta/basic_2/rt_computation/{rdsx_drops.ma => rsx_drops.ma} (67%) rename matita/matita/contribs/lambdadelta/basic_2/rt_computation/{rdsx_fqup.ma => rsx_fqup.ma} (84%) rename matita/matita/contribs/lambdadelta/basic_2/rt_computation/{rdsx_length.ma => rsx_length.ma} (82%) create mode 100644 matita/matita/contribs/lambdadelta/basic_2/rt_computation/rsx_lpxs.ma rename matita/matita/contribs/lambdadelta/basic_2/rt_computation/{rdsx_rdsx.ma => rsx_rsx.ma} (70%) rename matita/matita/contribs/lambdadelta/{basic_2/notation/relations/lsubeqx_5.ma => static_2/etc/scl/clearsn_3.etc} (88%) create mode 100644 matita/matita/contribs/lambdadelta/static_2/etc/scl/scl.etc create mode 100644 matita/matita/contribs/lambdadelta/static_2/etc/scl/scl_scl.etc rename matita/matita/contribs/lambdadelta/static_2/notation/relations/{freestar_3.ma => freeplus_3.ma} (92%) diff --git a/matita/components/binaries/matitadep/matitadep.ml b/matita/components/binaries/matitadep/matitadep.ml index 054f90f4a..d21af12a3 100644 --- a/matita/components/binaries/matitadep/matitadep.ml +++ b/matita/components/binaries/matitadep/matitadep.ml @@ -1,8 +1,8 @@ -module StringSet = Set.Make (String) +module StringSet = Set.Make (String) type file = { - ddeps: string list; (* direct dependences *) - rdeps: StringSet.t option (* recursive dependences *) + ddeps: string list; (* direct dependences *) + rdeps: StringSet.t option (* recursive dependences *) } let graph = Hashtbl.create 503 @@ -10,111 +10,124 @@ let graph = Hashtbl.create 503 let debug = ref 0 let rec purge dname vdeps = match vdeps with - | [] -> vdeps - | hd :: tl -> if hd = dname then tl else hd :: purge dname tl + | [] -> vdeps + | hd :: tl -> if hd = dname then tl else hd :: purge dname tl let add fname = - if fname = "" then () else - if Hashtbl.mem graph fname then () else - Hashtbl.add graph fname {ddeps = []; rdeps = None} + if fname = "" then () else + if Hashtbl.mem graph fname then () else + Hashtbl.add graph fname {ddeps = []; rdeps = None} let add_ddep fname dname = - if dname = "" then () else - let file = Hashtbl.find graph fname in - Hashtbl.replace graph fname {file with ddeps = dname :: file.ddeps} + if dname = "" then () else + let file = Hashtbl.find graph fname in + Hashtbl.replace graph fname {file with ddeps = dname :: file.ddeps} let init fname dname = - if !debug land 1 > 0 then Printf.eprintf "init: %s: %s.\n" fname dname; - add fname; add dname; add_ddep fname dname + if !debug land 1 > 0 then Printf.eprintf "init: %s: %s.\n" fname dname; + add fname; add dname; add_ddep fname dname (* vdeps: visited dependences for loop detection *) let rec compute_from_file vdeps fname file = match file.rdeps with - | Some rdeps -> rdeps - | None -> - if !debug land 2 > 0 then Printf.eprintf " compute file: %s\n" fname; - let vdeps = fname :: vdeps in - List.iter (redundant vdeps fname file.ddeps) file.ddeps; - let rdeps = compute_from_ddeps vdeps file.ddeps in - Hashtbl.replace graph fname {file with rdeps = Some rdeps}; - rdeps + | Some rdeps -> rdeps + | None -> + if !debug land 2 > 0 then Printf.eprintf " compute file: %s\n" fname; + let vdeps = fname :: vdeps in + List.iter (redundant vdeps fname file.ddeps) file.ddeps; + let rdeps = compute_from_ddeps vdeps file.ddeps in + Hashtbl.replace graph fname {file with rdeps = Some rdeps}; + rdeps and compute_from_dname vdeps rdeps dname = - if List.mem dname vdeps then begin - let loop = purge dname (List.rev vdeps) in - Printf.printf "circular: %s\n" (String.concat " " loop); - StringSet.add dname rdeps - end else - let file = Hashtbl.find graph dname in - StringSet.add dname (StringSet.union (compute_from_file vdeps dname file) rdeps) + if List.mem dname vdeps then begin + let loop = purge dname (List.rev vdeps) in + Printf.printf "circular: %s\n" (String.concat " " loop); + StringSet.add dname rdeps + end else + let file = Hashtbl.find graph dname in + StringSet.add dname (StringSet.union (compute_from_file vdeps dname file) rdeps) -and compute_from_ddeps vdeps ddeps = - List.fold_left (compute_from_dname vdeps) StringSet.empty ddeps +and compute_from_ddeps vdeps ddeps = + List.fold_left (compute_from_dname vdeps) StringSet.empty ddeps and redundant vdeps fname ddeps dname = - let rdeps = compute_from_ddeps vdeps (purge dname ddeps) in - if StringSet.mem dname rdeps then - Printf.printf "%s: redundant %s\n" fname dname + let rdeps = compute_from_ddeps vdeps (purge dname ddeps) in + if StringSet.mem dname rdeps then + Printf.printf "%s: redundant %s\n" fname dname -let check () = - let iter fname file = ignore (compute_from_file [] fname file) in - Hashtbl.iter iter graph +let check () = + let iter fname file = ignore (compute_from_file [] fname file) in + Hashtbl.iter iter graph let get_unions () = - let map1 ddeps dname = StringSet.add dname ddeps in - let map2 fname file (fnames, ddeps) = - StringSet.add fname fnames, List.fold_left map1 ddeps file.ddeps - in - Hashtbl.fold map2 graph (StringSet.empty, StringSet.empty) + let map1 ddeps dname = StringSet.add dname ddeps in + let map2 fname file (fnames, ddeps) = + StringSet.add fname fnames, List.fold_left map1 ddeps file.ddeps + in + Hashtbl.fold map2 graph (StringSet.empty, StringSet.empty) let get_leafs () = - let map fname file fnames = - if file.ddeps = [] then StringSet.add fname fnames else fnames - in - Hashtbl.fold map graph StringSet.empty + let map fname file fnames = + if file.ddeps = [] then StringSet.add fname fnames else fnames + in + Hashtbl.fold map graph StringSet.empty let top () = - let iter fname = Printf.printf "top: %s\n" fname in - let fnames, ddeps = get_unions () in - StringSet.iter iter (StringSet.diff fnames ddeps) + let iter fname = Printf.printf "top: %s\n" fname in + let fnames, ddeps = get_unions () in + StringSet.iter iter (StringSet.diff fnames ddeps) let leaf () = - let iter fname = Printf.printf "leaf: %s\n" fname in - let fnames = get_leafs () in - StringSet.iter iter fnames - -let rec read ich = - let line = input_line ich in - begin try Scanf.sscanf line "%s@:include \"%s@\"." init - with Scanf.Scan_failure _ -> - begin try Scanf.sscanf line "./%s@:include \"%s@\"." init - with Scanf.Scan_failure _ -> - begin try Scanf.sscanf line "%s@:(*%s@*)" (fun _ _ -> ()) - with Scanf.Scan_failure _ -> - Printf.eprintf "unknown line: %s.\n" line - end - end - end; - read ich - + let iter fname = Printf.printf "leaf: %s\n" fname in + let fnames = get_leafs () in + StringSet.iter iter fnames + +let back fname = + Printf.printf "backward: %s\n" fname; + try match (Hashtbl.find graph fname).rdeps with + | None -> () + | Some rdeps -> + let iter fname = Printf.printf "%s\n" fname in + StringSet.iter iter rdeps + with Not_found -> () + +let rec read ich = + let line = input_line ich in + begin try Scanf.sscanf line "%s@:include \"%s@\"." init + with Scanf.Scan_failure _ -> + begin try Scanf.sscanf line "./%s@:include \"%s@\"." init + with Scanf.Scan_failure _ -> + begin try Scanf.sscanf line "%s@:(*%s@*)" (fun _ _ -> ()) + with Scanf.Scan_failure _ -> + Printf.eprintf "unknown line: %s.\n" line + end + end + end; + read ich + let _ = - let show_check = ref false in - let show_top = ref false in - let show_leaf = ref false in - let process_file name = () in - let show () = - if !show_check then check (); - if !show_top then top (); - if !show_leaf then leaf () - in - let help = "matitadep [-clt | -d ] < " in - let help_c = " Print the redundant and looping arcs of the dependences graph" in - let help_d = " Set these debug options" in - let help_l = " Print the leaf nodes of the dependences graph" in - let help_t = " Print the top nodes of the dependences graph" in - Arg.parse [ - "-c", Arg.Set show_check, help_c; - "-d", Arg.Int (fun x -> debug := x), help_d; - "-l", Arg.Set show_leaf, help_l; - "-t", Arg.Set show_top, help_t; - ] process_file help; - try read stdin with End_of_file -> show () + let show_check = ref false in + let show_top = ref false in + let show_leaf = ref false in + let show_back = ref "" in + let process_file name = () in + let show () = + if !show_check then check (); + if !show_top then top (); + if !show_leaf then leaf (); + if !show_back <> "" then back !show_back + in + let help = "matitadep [-clt | -d | -b ] < " in + let help_b = " Print the backward dependences of this node" in + let help_c = " Print the redundant and looping arcs of the dependences graph" in + let help_d = " Set these debug options" in + let help_l = " Print the leaf nodes of the dependences graph" in + let help_t = " Print the top nodes of the dependences graph" in + Arg.parse [ + "-b", Arg.String ((:=) show_back), help_b; + "-c", Arg.Set show_check, help_c; + "-d", Arg.Int ((:=) debug), help_d; + "-l", Arg.Set show_leaf, help_l; + "-t", Arg.Set show_top, help_t; + ] process_file help; + try read stdin with End_of_file -> show () diff --git a/matita/matita/contribs/lambdadelta/apps_2/examples/ex_fpbg_refl.ma b/matita/matita/contribs/lambdadelta/apps_2/examples/ex_fpbg_refl.ma index f75a20a29..b41ddae8a 100644 --- a/matita/matita/contribs/lambdadelta/apps_2/examples/ex_fpbg_refl.ma +++ b/matita/matita/contribs/lambdadelta/apps_2/examples/ex_fpbg_refl.ma @@ -48,7 +48,7 @@ lemma cpr_ApplOmega_34 (h) (G) (L) (s0) (s): ⦃G,L⦄ ⊢ ApplOmega3 s0 s ➡[h lemma cpxs_ApplOmega_14 (h) (G) (L) (s0) (s): ⦃G,L⦄ ⊢ ApplOmega1 s0 s ⬈*[h] ApplOmega4 s0 s. /5 width=4 by cpxs_strap1, cpm_fwd_cpx/ qed. -lemma fqup_ApplOmega_41 (G) (L) (s0) (s): ⦃G,L,ApplOmega4 s0 s⦄ ⊐+ ⦃G,L,ApplOmega1 s0 s⦄. +lemma fqup_ApplOmega_41 (G) (L) (s0) (s): ⦃G,L,ApplOmega4 s0 s⦄ ⬂+ ⦃G,L,ApplOmega1 s0 s⦄. /2 width=1 by/ qed. (* Main properties **********************************************************) diff --git a/matita/matita/contribs/lambdadelta/basic_2/dynamic/cnv_cpce.ma b/matita/matita/contribs/lambdadelta/basic_2/dynamic/cnv_cpce.ma index faca3d631..472d81e84 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/dynamic/cnv_cpce.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/dynamic/cnv_cpce.ma @@ -57,7 +57,7 @@ generalize in match HT1; -HT1 | #p #I #V1 #T1 #_ #IH #H elim (cnv_inv_bind … H) -H #HV1 #HT1 elim (IH … HV1) [| /3 width=1 by fpb_fpbg, fpb_fqu, fqu_pair_sn/ ] #V2 #HV12 - elim (IH … HT1) [| /3 width=1 by fpb_fpbg, fpb_fqu, fqu_bind_dx/ ] #T2 #HT12 + elim (IH … HT1) [| /4 width=1 by fpb_fpbg, fpb_fqu, fqu_bind_dx/ ] #T2 #HT12 /3 width=2 by cpce_bind, ex_intro/ | #I #V1 #T1 #_ #IH #H elim (cnv_fwd_flat … H) -H #HV1 #HT1 diff --git a/matita/matita/contribs/lambdadelta/basic_2/dynamic/cnv_cpm_tdeq_conf.ma b/matita/matita/contribs/lambdadelta/basic_2/dynamic/cnv_cpm_tdeq_conf.ma index 752d02d11..43952ffcf 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/dynamic/cnv_cpm_tdeq_conf.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/dynamic/cnv_cpm_tdeq_conf.ma @@ -39,7 +39,7 @@ fact cnv_cpm_tdeq_conf_lpr_atom_ess_aux (h) (G0) (L1) (L2) (s): qed-. fact cnv_cpm_tdeq_conf_lpr_bind_bind_aux (a) (h) (p) (I) (G0) (L0) (V0) (T0): - (∀G,L,T. ⦃G0,L0,ⓑ{p,I}V0.T0⦄ ⊐+ ⦃G,L,T⦄ → IH_cnv_cpm_tdeq_conf_lpr a h G L T) → + (∀G,L,T. ⦃G0,L0,ⓑ{p,I}V0.T0⦄ ⬂+ ⦃G,L,T⦄ → IH_cnv_cpm_tdeq_conf_lpr a h G L T) → ⦃G0,L0⦄ ⊢ ⓑ{p,I}V0.T0 ![a,h] → ∀n1,T1. ⦃G0,L0.ⓑ{I}V0⦄ ⊢ T0 ➡[n1,h] T1 → T0 ≛ T1 → ∀n2,T2. ⦃G0,L0.ⓑ{I}V0⦄ ⊢ T0 ➡[n2,h] T2 → T0 ≛ T2 → @@ -55,7 +55,7 @@ elim (IH … H1T01 H2T01 … H1T02 H2T02 (L1.ⓑ{I}V0) … (L2.ⓑ{I}V0)) [|*: / qed-. fact cnv_cpm_tdeq_conf_lpr_appl_appl_aux (a) (h) (G0) (L0) (V0) (T0): - (∀G,L,T. ⦃G0,L0,ⓐV0.T0⦄ ⊐+ ⦃G,L,T⦄ → IH_cnv_cpm_tdeq_conf_lpr a h G L T) → + (∀G,L,T. ⦃G0,L0,ⓐV0.T0⦄ ⬂+ ⦃G,L,T⦄ → IH_cnv_cpm_tdeq_conf_lpr a h G L T) → ⦃G0,L0⦄ ⊢ ⓐV0.T0 ![a,h] → ∀n1,T1. ⦃G0,L0⦄ ⊢ T0 ➡[n1,h] T1 → T0 ≛ T1 → ∀n2,T2. ⦃G0,L0⦄ ⊢ T0 ➡[n2,h] T2 → T0 ≛ T2 → @@ -71,7 +71,7 @@ elim (IH … H1T01 H2T01 … H1T02 H2T02 … HL01 … HL02) [|*: /2 width=1 by f qed-. fact cnv_cpm_tdeq_conf_lpr_cast_cast_aux (a) (h) (G0) (L0) (V0) (T0): - (∀G,L,T. ⦃G0,L0,ⓝV0.T0⦄ ⊐+ ⦃G,L,T⦄ → IH_cnv_cpm_tdeq_conf_lpr a h G L T) → + (∀G,L,T. ⦃G0,L0,ⓝV0.T0⦄ ⬂+ ⦃G,L,T⦄ → IH_cnv_cpm_tdeq_conf_lpr a h G L T) → ⦃G0,L0⦄ ⊢ ⓝV0.T0 ![a,h] → ∀n1,V1. ⦃G0,L0⦄ ⊢ V0 ➡[n1,h] V1 → V0 ≛ V1 → ∀n2,V2. ⦃G0,L0⦄ ⊢ V0 ➡[n2,h] V2 → V0 ≛ V2 → @@ -90,7 +90,7 @@ elim (IH … H1T01 H2T01 … H1T02 H2T02 … HL01 … HL02) [|*: /2 width=1 by f qed-. fact cnv_cpm_tdeq_conf_lpr_aux (a) (h) (G0) (L0) (T0): - (∀G,L,T. ⦃G0,L0,T0⦄ ⊐+ ⦃G,L,T⦄ → IH_cnv_cpm_tdeq_conf_lpr a h G L T) → + (∀G,L,T. ⦃G0,L0,T0⦄ ⬂+ ⦃G,L,T⦄ → IH_cnv_cpm_tdeq_conf_lpr a h G L T) → ∀G,L,T. G0 = G → L0 = L → T0 = T → IH_cnv_cpm_tdeq_conf_lpr a h G L T. #a #h #G0 #L0 #T0 #IH1 #G #L * [| * [| * ]] [ #I #HG0 #HL0 #HT0 #HT #n1 #X1 #H1X1 #H2X1 #n2 #X2 #H1X2 #H2X2 #L1 #HL1 #L2 #HL2 destruct diff --git a/matita/matita/contribs/lambdadelta/basic_2/dynamic/cnv_cpm_tdeq_trans.ma b/matita/matita/contribs/lambdadelta/basic_2/dynamic/cnv_cpm_tdeq_trans.ma index 44b8fe219..fd77a19b2 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/dynamic/cnv_cpm_tdeq_trans.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/dynamic/cnv_cpm_tdeq_trans.ma @@ -27,7 +27,7 @@ definition IH_cnv_cpm_tdeq_cpm_trans (a) (h): relation3 genv lenv term ≝ fact cnv_cpm_tdeq_cpm_trans_sub (a) (h) (G0) (L0) (T0): (∀G,L,T. ⦃G0,L0,T0⦄ >[h] ⦃G,L,T⦄ → IH_cnv_cpm_trans_lpr a h G L T) → - (∀G,L,T. ⦃G0,L0,T0⦄ ⊐+ ⦃G,L,T⦄ → IH_cnv_cpm_tdeq_cpm_trans a h G L T) → + (∀G,L,T. ⦃G0,L0,T0⦄ ⬂+ ⦃G,L,T⦄ → IH_cnv_cpm_tdeq_cpm_trans a h G L T) → ∀G,L,T1. G0 = G → L0 = L → T0 = T1 → IH_cnv_cpm_tdeq_cpm_trans a h G L T1. #a #h #G0 #L0 #T0 #IH2 #IH1 #G #L * [| * [| * ]] [ #I #_ #_ #_ #_ #n1 #X1 #H1X #H2X #n2 #X2 #HX2 destruct -G0 -L0 -T0 diff --git a/matita/matita/contribs/lambdadelta/basic_2/dynamic/cnv_fqus.ma b/matita/matita/contribs/lambdadelta/basic_2/dynamic/cnv_fqus.ma index 678495b8e..fbac6d7f7 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/dynamic/cnv_fqus.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/dynamic/cnv_fqus.ma @@ -20,7 +20,7 @@ include "basic_2/dynamic/cnv_drops.ma". (* Properties with supclosure ***********************************************) (* Basic_2A1: uses: snv_fqu_conf *) -lemma cnv_fqu_conf (a) (h): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐ ⦃G2,L2,T2⦄ → +lemma cnv_fqu_conf (a) (h): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂ ⦃G2,L2,T2⦄ → ⦃G1,L1⦄ ⊢ T1 ![a,h] → ⦃G2,L2⦄ ⊢ T2 ![a,h]. #a #h #G1 #G2 #L1 #L2 #T1 #T2 #H elim H -G1 -G2 -L1 -L2 -T1 -T2 [ #I1 #G1 #L1 #V1 #H @@ -30,7 +30,7 @@ lemma cnv_fqu_conf (a) (h): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐ ⦃G2,L2,T2 | elim (cnv_inv_appl … H) -H // | elim (cnv_inv_cast … H) -H // ] -| #p #I1 #G1 #L1 #V1 #T1 #H +| #p #I1 #G1 #L1 #V1 #T1 #_ #H elim (cnv_inv_bind … H) -H // | #p #I1 #G1 #L1 #V1 #T1 #H destruct | * #G1 #L1 #V1 #T1 #H @@ -43,21 +43,21 @@ lemma cnv_fqu_conf (a) (h): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐ ⦃G2,L2,T2 qed-. (* Basic_2A1: uses: snv_fquq_conf *) -lemma cnv_fquq_conf (a) (h): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐⸮ ⦃G2,L2,T2⦄ → +lemma cnv_fquq_conf (a) (h): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂⸮ ⦃G2,L2,T2⦄ → ⦃G1,L1⦄ ⊢ T1 ![a,h] → ⦃G2,L2⦄ ⊢ T2 ![a,h]. #a #h #G1 #G2 #L1 #L2 #T1 #T2 #H elim H -H [|*] /2 width=5 by cnv_fqu_conf/ qed-. (* Basic_2A1: uses: snv_fqup_conf *) -lemma cnv_fqup_conf (a) (h): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐+ ⦃G2,L2,T2⦄ → +lemma cnv_fqup_conf (a) (h): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂+ ⦃G2,L2,T2⦄ → ⦃G1,L1⦄ ⊢ T1 ![a,h] → ⦃G2,L2⦄ ⊢ T2 ![a,h]. #a #h #G1 #G2 #L1 #L2 #T1 #T2 #H @(fqup_ind … H) -G2 -L2 -T2 /3 width=5 by fqup_strap1, cnv_fqu_conf/ qed-. (* Basic_2A1: uses: snv_fqus_conf *) -lemma cnv_fqus_conf (a) (h): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐* ⦃G2,L2,T2⦄ → +lemma cnv_fqus_conf (a) (h): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂* ⦃G2,L2,T2⦄ → ⦃G1,L1⦄ ⊢ T1 ![a,h] → ⦃G2,L2⦄ ⊢ T2 ![a,h]. #a #h #G1 #G2 #L1 #L2 #T1 #T2 #H elim (fqus_inv_fqup … H) -H [|*] /2 width=5 by cnv_fqup_conf/ diff --git a/matita/matita/contribs/lambdadelta/basic_2/etc/rdsx_csx.etc b/matita/matita/contribs/lambdadelta/basic_2/etc/rdsx_csx.etc new file mode 100644 index 000000000..cae721528 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/etc/rdsx_csx.etc @@ -0,0 +1,44 @@ +(**************************************************************************) +(* ___ *) +(* ||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 "basic_2/rt_computation/csx_lsubr.ma". +include "basic_2/rt_computation/csx_cpxs.ma". +include "basic_2/rt_computation/sdsx_rdsx.ma". + +(* STRONGLY NORMALIZING REFERRED LOCAL ENV.S FOR UNBOUND RT-TRANSITION ******) + +(* Advanced properties ******************************************************) + +lemma rdsx_pair_lpxs (h) (I) (G): + ∀K1,V1. G ⊢ ⬈*[h,V1] 𝐒⦃K1⦄ → + ∀V2. ⦃G,K1⦄ ⊢ ⬈*[h] 𝐒⦃V2⦄ → + (∀K. ⦃G,K1⦄ ⊢ ⬈*[h] K → ⦃G,K⦄ ⊢ V1 ⬈*[h] V2) → + G ⊢ ⬈*[h,#0] 𝐒⦃K1.ⓑ{I}V2⦄. +#h #I #G #K1 #V1 #H +@(rdsx_ind_lpxs … H) -K1 #K1 #_ #IHK #V2 #H +@(csx_ind_cpxs … H) -V2 #V2 #HV2 #IHV #HK +@rdsx_intro_lpxs #Y #HY #HnY +elim (lpxs_inv_pair_sn … HY) -HY #K3 #V3 #HK13 #HV23 #H destruct +elim (tdeq_dec V2 V3) +[ -IHV -HV23 #HV23 + @(rdsx_rdeq_trans … (K3.ⓑ{I}V2)) [| /2 width=1 by rdeq_pair_refl/ ] + @(IHK … HK13) -IHK + [ + | + | /3 width=3 by lpxs_trans/ + ] +| -IHK -HnY #HnV23 + @(rdsx_lpxs_trans … (K1.ⓑ{I}V3)) [| /2 width=1 by lpxs_bind_refl_dx/ ] + @(IHV … HV23 HnV23) -IHV -HnV23 + #K #HK diff --git a/matita/matita/contribs/lambdadelta/basic_2/etc/sdsx/sdsx.etc b/matita/matita/contribs/lambdadelta/basic_2/etc/sdsx/sdsx.etc new file mode 100644 index 000000000..c721bee8f --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/etc/sdsx/sdsx.etc @@ -0,0 +1,145 @@ +(**************************************************************************) +(* ___ *) +(* ||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 "basic_2/rt_computation/rdsx.ma". + +(* STRONGLY NORMALIZING SELECTED LOCAL ENV.S FOR UNBOUND RT-TRANSITION ******) + +(* Basic_2A1: uses: lcosx *) +inductive sdsx (h) (G): rtmap → predicate lenv ≝ +| sdsx_atom: ∀f. sdsx h G f (⋆) +| sdsx_push: ∀f,I,K. sdsx h G f K → sdsx h G (⫯f) (K.ⓘ{I}) +| sdsx_unit: ∀f,I,K. sdsx h G f K → sdsx h G (↑f) (K.ⓤ{I}) +| sdsx_pair: ∀f,I,K,V. G ⊢ ⬈*[h,V] 𝐒⦃K⦄ → + sdsx h G f K → sdsx h G (↑f) (K.ⓑ{I}V) +. + +interpretation + "strong normalization for unbound context-sensitive parallel rt-transition on selected entries (local environment)" + 'PRedTySNStrong h f G L = (sdsx h G f L). + +(* Basic inversion lemmas ***************************************************) + +fact sdsx_inv_push_aux (h) (G): + ∀g,L. G ⊢ ⬈*[h,g] 𝐒⦃L⦄ → + ∀f,I,K. g = ⫯f → L = K.ⓘ{I} → G ⊢ ⬈*[h,f] 𝐒⦃K⦄. +#h #G #g #L * -g -L +[ #f #g #J #L #_ #H destruct +| #f #I #K #HK #g #J #L #H1 #H2 destruct // +| #f #I #K #_ #g #J #L #H #_ + elim (discr_next_push … H) +| #f #I #K #V #_ #_ #g #J #L #H #_ + elim (discr_next_push … H) +] +qed-. + +lemma sdsx_inv_push (h) (G): + ∀f,I,K. G ⊢ ⬈*[h,⫯f] 𝐒⦃K.ⓘ{I}⦄ → G ⊢ ⬈*[h,f] 𝐒⦃K⦄. +/2 width=6 by sdsx_inv_push_aux/ qed-. + +fact sdsx_inv_unit_aux (h) (G): + ∀g,L. G ⊢ ⬈*[h,g] 𝐒⦃L⦄ → + ∀f,I,K. g = ↑f → L = K.ⓤ{I} → G ⊢ ⬈*[h,f] 𝐒⦃K⦄. +#h #G #g #L * -g -L +[ #f #g #J #L #_ #H destruct +| #f #I #K #_ #g #J #L #H #_ + elim (discr_push_next … H) +| #f #I #K #HK #g #J #L #H1 #H2 destruct // +| #f #I #K #V #_ #_ #g #J #L #_ #H destruct +] +qed-. + +lemma sdsx_inv_unit (h) (G): + ∀f,I,K. G ⊢ ⬈*[h,↑f] 𝐒⦃K.ⓤ{I}⦄ → G ⊢ ⬈*[h,f] 𝐒⦃K⦄. +/2 width=6 by sdsx_inv_unit_aux/ qed-. + +fact sdsx_inv_pair_aux (h) (G): + ∀g,L. G ⊢ ⬈*[h,g] 𝐒⦃L⦄ → + ∀f,I,K,V. g = ↑f → L = K.ⓑ{I}V → + ∧∧ G ⊢ ⬈*[h,V] 𝐒⦃K⦄ & G ⊢ ⬈*[h,f] 𝐒⦃K⦄. +#h #G #g #L * -g -L +[ #f #g #J #L #W #_ #H destruct +| #f #I #K #_ #g #J #L #W #H #_ + elim (discr_push_next … H) +| #f #I #K #_ #g #J #L #W #_ #H destruct +| #f #I #K #V #HV #HK #g #J #L #W #H1 #H2 destruct + /2 width=1 by conj/ +] +qed-. + +(* Basic_2A1: uses: lcosx_inv_pair *) +lemma sdsx_inv_pair (h) (G): + ∀f,I,K,V. G ⊢ ⬈*[h,↑f] 𝐒⦃K.ⓑ{I}V⦄ → + ∧∧ G ⊢ ⬈*[h,V] 𝐒⦃K⦄ & G ⊢ ⬈*[h,f] 𝐒⦃K⦄. +/2 width=6 by sdsx_inv_pair_aux/ qed-. + +(* Advanced inversion lemmas ************************************************) + +lemma sdsx_inv_pair_gen (h) (G): + ∀g,I,K,V. G ⊢ ⬈*[h,g] 𝐒⦃K.ⓑ{I}V⦄ → + ∨∨ ∃∃f. G ⊢ ⬈*[h,f] 𝐒⦃K⦄ & g = ⫯f + | ∃∃f. G ⊢ ⬈*[h,V] 𝐒⦃K⦄ & G ⊢ ⬈*[h,f] 𝐒⦃K⦄ & g = ↑f. +#h #G #g #I #K #V #H +elim (pn_split g) * #f #Hf destruct +[ lapply (sdsx_inv_push … H) -H /3 width=3 by ex2_intro, or_introl/ +| elim (sdsx_inv_pair … H) -H /3 width=3 by ex3_intro, or_intror/ +] +qed-. + +(* Advanced forward lemmas **************************************************) + +lemma sdsx_fwd_bind (h) (G): + ∀g,I,K. G ⊢ ⬈*[h,g] 𝐒⦃K.ⓘ{I}⦄ → G ⊢ ⬈*[h,⫱g] 𝐒⦃K⦄. +#h #G #g #I #K +elim (pn_split g) * #f #Hf destruct +[ #H lapply (sdsx_inv_push … H) -H // +| cases I -I #I + [ #H lapply (sdsx_inv_unit … H) -H // + | #V #H elim (sdsx_inv_pair … H) -H // + ] +] +qed-. + +(* Basic properties *********************************************************) + +lemma sdsx_eq_repl_back (h) (G): + ∀L. eq_repl_back … (λf. G ⊢ ⬈*[h,f] 𝐒⦃L⦄). +#h #G #L #f1 #H elim H -L -f1 +[ // +| #f1 #I #L #_ #IH #x2 #H + elim (eq_inv_px … H) -H /3 width=3 by sdsx_push/ +| #f1 #I #L #_ #IH #x2 #H + elim (eq_inv_nx … H) -H /3 width=3 by sdsx_unit/ +| #f1 #I #L #V #HV #_ #IH #x2 #H + elim (eq_inv_nx … H) -H /3 width=3 by sdsx_pair/ +] +qed-. + +lemma sdsx_eq_repl_fwd (h) (G): + ∀L. eq_repl_fwd … (λf. G ⊢ ⬈*[h,f] 𝐒⦃L⦄). +#h #G #L @eq_repl_sym /2 width=3 by sdsx_eq_repl_back/ +qed-. + +(* Advanced properties ******************************************************) + +(* Basic_2A1: uses: lcosx_O *) +lemma sdsx_isid (h) (G): + ∀f. 𝐈⦃f⦄ → ∀L. G ⊢ ⬈*[h,f] 𝐒⦃L⦄. +#h #G #f #Hf #L elim L -L +/3 width=3 by sdsx_eq_repl_back, sdsx_push, eq_push_inv_isid/ +qed. + +(* Basic_2A1: removed theorems 2: + lcosx_drop_trans_lt lcosx_inv_succ +*) diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/lsubsx_rdsx.ma b/matita/matita/contribs/lambdadelta/basic_2/etc/sdsx/sdsx_rdsx.etc similarity index 71% rename from matita/matita/contribs/lambdadelta/basic_2/rt_computation/lsubsx_rdsx.ma rename to matita/matita/contribs/lambdadelta/basic_2/etc/sdsx/sdsx_rdsx.etc index 7240fb3b6..9c2c7d596 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/lsubsx_rdsx.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/etc/sdsx/sdsx_rdsx.etc @@ -12,32 +12,49 @@ (* *) (**************************************************************************) +include "static_2/relocation/scl.ma". include "basic_2/rt_computation/rdsx_drops.ma". include "basic_2/rt_computation/rdsx_lpxs.ma". -include "basic_2/rt_computation/lsubsx.ma". +include "basic_2/rt_computation/sdsx.ma". -(* CLEAR OF STRONGLY NORMALIZING ENTRIES FOR UNBOUND RT-TRANSITION **********) +axiom pippo (h) (f) (G) (V:term): + ∀L1. G ⊢ ⬈*[h,V] 𝐒⦃L1⦄ → + ∀L2. L1 ⊐ⓧ[f] L2 → G ⊢ ⬈*[h,V] 𝐒⦃L2⦄. + + +(* STRONGLY NORMALIZING SELECTED LOCAL ENV.S FOR UNBOUND RT-TRANSITION ******) (* Properties with strongly normalizing referred local environments *********) (* Basic_2A1: uses: lsx_cpx_trans_lcosx *) -lemma rdsx_cpx_trans_lsubsx (h): +lemma rdsx_cpx_trans_sdsx (h): ∀G,L0,T1,T2. ⦃G,L0⦄ ⊢ T1 ⬈[h] T2 → - ∀f,L. G ⊢ L0 ⊆ⓧ[h,f] L → + ∀f. G ⊢ ⬈*[h,f] 𝐒⦃L0⦄ → ∀L. L0 ⊐ⓧ[f] L → G ⊢ ⬈*[h,T1] 𝐒⦃L⦄ → G ⊢ ⬈*[h,T2] 𝐒⦃L⦄. -#h #G #L0 #T1 #T2 #H @(cpx_ind … H) -G -L0 -T1 -T2 // -[ #I0 #G #K0 #V1 #V2 #W2 #_ #IH #HVW2 #g #L #HK0 #HL - elim (lsubsx_inv_pair_sn_gen … HK0) -HK0 * - [ #f #K #HK0 #H1 #H2 destruct +#h #G #L0 #T1 #T2 #H @(cpx_ind … H) -G -L0 -T1 -T2 +[ // +| // +| #I #G #K0 #V1 #V2 #W2 #_ #IH #HVW2 #g #H1 #Y #H2 #H3 + elim (sdsx_inv_pair_gen … H1) -H1 * + [ #f #HK0 #H destruct + elim (scl_inv_push_sn … H2) -H2 #K #HK #H destruct /4 width=8 by rdsx_lifts, rdsx_fwd_pair, drops_refl, drops_drop/ - | #f #K #HV1 #HK0 #H1 #H2 destruct - /4 width=8 by rdsx_lifts, drops_refl, drops_drop/ + | #f #HV1 #HK0 #H destruct + elim (scl_inv_next_sn … H2) -H2 #K #HK #H destruct + /4 width=8 by pippo, rdsx_lifts, drops_refl, drops_drop/ ] -| #I0 #G #K0 #T #U #i #_ #IH #HTU #g #L #HK0 #HL - elim (lsubsx_fwd_bind_sn … HK0) -HK0 #I #K #HK0 #H destruct +| #I0 #G #K0 #T #U #i #_ #IH #HTU #g #H1 #Y #H2 #H3 + lapply (sdsx_fwd_bind … H1) -H1 #HK0 + elim (scl_fwd_bind_sn … H2) -H2 #I #K #HK #H destruct /6 width=8 by rdsx_inv_lifts, rdsx_lifts, drops_refl, drops_drop/ -| #p #I0 #G #L0 #V1 #V2 #T1 #T2 #_ #_ #IHV12 #IHT12 #f #L #HL0 #HL - elim (rdsx_inv_bind … HL) -HL +| #p #I #G #L0 #V1 #V2 #T1 #T2 #_ #_ #IHV12 #IHT12 #f #H1 #L #H2 #H3 + elim (rdsx_inv_bind_void … H3) -H3 #HV1 #HT1 + @rdsx_bind_void + [ /2 width=3 by/ + | @(IHT12 (↑f) … HT1) + [ @(sdsx_pair … H1) + | /2 width=1 by scl_next/ + /4 width=2 by lsubsx_pair, rdsx_bind_void/ | #I0 #G #L0 #V1 #V2 #T1 #T2 #_ #_ #IHV12 #IHT12 #f #L #HL0 #HL elim (rdsx_inv_flat … HL) -HL /3 width=2 by rdsx_flat/ @@ -74,3 +91,4 @@ lemma rdsx_cpxs_trans (h): @(cpxs_ind_dx ???????? H) -T1 // /3 width=3 by rdsx_cpx_trans/ qed-. +*) diff --git a/matita/matita/contribs/lambdadelta/basic_2/notation/relations/topredtysnstrong_5.ma b/matita/matita/contribs/lambdadelta/basic_2/notation/relations/topredtysnstrong_5.ma new file mode 100644 index 000000000..a8ae47923 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/notation/relations/topredtysnstrong_5.ma @@ -0,0 +1,19 @@ +(**************************************************************************) +(* ___ *) +(* ||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 FORMAL SYSTEM λδ ****************************************) + +notation "hvbox( G ⊢ break term 46 L1 ⊒[ break term 46 h, break term 46 f ] break term 46 L2 )" + non associative with precedence 45 + for @{ 'ToPRedTySNStrong $h $f $G $L1 $L2 }. diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/cpms_fpbg.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/cpms_fpbg.ma index baa4aa7f9..5a0471b2a 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/cpms_fpbg.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/cpms_fpbg.ma @@ -36,7 +36,7 @@ lemma cpms_fpbg_trans (h) (n): /3 width=5 by fpbs_fpbg_trans, cpms_fwd_fpbs/ qed-. lemma fqup_cpms_fwd_fpbg (h): - ∀G1,G2,L1,L2,T1,T. ⦃G1,L1,T1⦄ ⊐+ ⦃G2,L2,T⦄ → + ∀G1,G2,L1,L2,T1,T. ⦃G1,L1,T1⦄ ⬂+ ⦃G2,L2,T⦄ → ∀n,T2. ⦃G2,L2⦄ ⊢ T ➡*[n,h] T2 → ⦃G1,L1,T1⦄ >[h] ⦃G2,L2,T2⦄. /3 width=5 by cpms_fwd_fpbs, fqup_fpbg, fpbg_fpbs_trans/ qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/cpxs_fqus.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/cpxs_fqus.ma index 5fc7879fe..eb8e6748a 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/cpxs_fqus.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/cpxs_fqus.ma @@ -22,32 +22,32 @@ include "basic_2/rt_computation/cpxs_cpxs.ma". (* Properties on supclosure *************************************************) lemma fqu_cpxs_trans: ∀h,b,G1,G2,L1,L2,T2,U2. ⦃G2,L2⦄ ⊢ T2 ⬈*[h] U2 → - ∀T1. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2⦄ → - ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈*[h] U1 & ⦃G1,L1,U1⦄ ⊐[b] ⦃G2,L2,U2⦄. + ∀T1. ⦃G1,L1,T1⦄ ⬂[b] ⦃G2,L2,T2⦄ → + ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈*[h] U1 & ⦃G1,L1,U1⦄ ⬂[b] ⦃G2,L2,U2⦄. #h #b #G1 #G2 #L1 #L2 #T2 #U2 #H @(cpxs_ind_dx … H) -T2 /2 width=3 by ex2_intro/ #T #T2 #HT2 #_ #IHTU2 #T1 #HT1 elim (fqu_cpx_trans … HT1 … HT2) -T #T #HT1 #HT2 elim (IHTU2 … HT2) -T2 /3 width=3 by cpxs_strap2, ex2_intro/ qed-. lemma fquq_cpxs_trans: ∀h,b,G1,G2,L1,L2,T2,U2. ⦃G2,L2⦄ ⊢ T2 ⬈*[h] U2 → - ∀T1. ⦃G1,L1,T1⦄ ⊐⸮[b] ⦃G2,L2,T2⦄ → - ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈*[h] U1 & ⦃G1,L1,U1⦄ ⊐⸮[b] ⦃G2,L2,U2⦄. + ∀T1. ⦃G1,L1,T1⦄ ⬂⸮[b] ⦃G2,L2,T2⦄ → + ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈*[h] U1 & ⦃G1,L1,U1⦄ ⬂⸮[b] ⦃G2,L2,U2⦄. #h #b #G1 #G2 #L1 #L2 #T2 #U2 #H @(cpxs_ind_dx … H) -T2 /2 width=3 by ex2_intro/ #T #T2 #HT2 #_ #IHTU2 #T1 #HT1 elim (fquq_cpx_trans … HT1 … HT2) -T #T #HT1 #HT2 elim (IHTU2 … HT2) -T2 /3 width=3 by cpxs_strap2, ex2_intro/ qed-. lemma fqup_cpxs_trans: ∀h,b,G1,G2,L1,L2,T2,U2. ⦃G2,L2⦄ ⊢ T2 ⬈*[h] U2 → - ∀T1. ⦃G1,L1,T1⦄ ⊐+[b] ⦃G2,L2,T2⦄ → - ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈*[h] U1 & ⦃G1,L1,U1⦄ ⊐+[b] ⦃G2,L2,U2⦄. + ∀T1. ⦃G1,L1,T1⦄ ⬂+[b] ⦃G2,L2,T2⦄ → + ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈*[h] U1 & ⦃G1,L1,U1⦄ ⬂+[b] ⦃G2,L2,U2⦄. #h #b #G1 #G2 #L1 #L2 #T2 #U2 #H @(cpxs_ind_dx … H) -T2 /2 width=3 by ex2_intro/ #T #T2 #HT2 #_ #IHTU2 #T1 #HT1 elim (fqup_cpx_trans … HT1 … HT2) -T #U1 #HTU1 #H2 elim (IHTU2 … H2) -T2 /3 width=3 by cpxs_strap2, ex2_intro/ qed-. lemma fqus_cpxs_trans: ∀h,b,G1,G2,L1,L2,T2,U2. ⦃G2,L2⦄ ⊢ T2 ⬈*[h] U2 → - ∀T1. ⦃G1,L1,T1⦄ ⊐*[b] ⦃G2,L2,T2⦄ → - ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈*[h] U1 & ⦃G1,L1,U1⦄ ⊐*[b] ⦃G2,L2,U2⦄. + ∀T1. ⦃G1,L1,T1⦄ ⬂*[b] ⦃G2,L2,T2⦄ → + ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈*[h] U1 & ⦃G1,L1,U1⦄ ⬂*[b] ⦃G2,L2,U2⦄. #h #b #G1 #G2 #L1 #L2 #T2 #U2 #H @(cpxs_ind_dx … H) -T2 /2 width=3 by ex2_intro/ #T #T2 #HT2 #_ #IHTU2 #T1 #HT1 elim (fqus_cpx_trans … HT1 … HT2) -T #U1 #HTU1 #H2 elim (IHTU2 … H2) -T2 /3 width=3 by cpxs_strap2, ex2_intro/ @@ -55,9 +55,9 @@ qed-. (* Note: a proof based on fqu_cpx_trans_tdneq might exist *) (* Basic_2A1: uses: fqu_cpxs_trans_neq *) -lemma fqu_cpxs_trans_tdneq: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2⦄ → +lemma fqu_cpxs_trans_tdneq: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂[b] ⦃G2,L2,T2⦄ → ∀U2. ⦃G2,L2⦄ ⊢ T2 ⬈*[h] U2 → (T2 ≛ U2 → ⊥) → - ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈*[h] U1 & T1 ≛ U1 → ⊥ & ⦃G1,L1,U1⦄ ⊐[b] ⦃G2,L2,U2⦄. + ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈*[h] U1 & T1 ≛ U1 → ⊥ & ⦃G1,L1,U1⦄ ⬂[b] ⦃G2,L2,U2⦄. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H elim H -G1 -G2 -L1 -L2 -T1 -T2 [ #I #G #L #V1 #V2 #HV12 #_ elim (lifts_total V2 𝐔❴1❵) #U2 #HVU2 @(ex3_intro … U2) @@ -69,7 +69,7 @@ lemma fqu_cpxs_trans_tdneq: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G [1,3: /2 width=4 by fqu_pair_sn, cpxs_pair_sn/ | #H elim (tdeq_inv_pair … H) -H /2 width=1 by/ ] -| #p #I #G #L #V #T1 #T2 #HT12 #H0 @(ex3_intro … (ⓑ{p,I}V.T2)) +| #p #I #G #L #V #T1 #Hb #T2 #HT12 #H0 @(ex3_intro … (ⓑ{p,I}V.T2)) [1,3: /2 width=4 by fqu_bind_dx, cpxs_bind/ | #H elim (tdeq_inv_pair … H) -H /2 width=1 by/ ] @@ -88,9 +88,9 @@ lemma fqu_cpxs_trans_tdneq: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G qed-. (* Basic_2A1: uses: fquq_cpxs_trans_neq *) -lemma fquq_cpxs_trans_tdneq: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐⸮[b] ⦃G2,L2,T2⦄ → +lemma fquq_cpxs_trans_tdneq: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂⸮[b] ⦃G2,L2,T2⦄ → ∀U2. ⦃G2,L2⦄ ⊢ T2 ⬈*[h] U2 → (T2 ≛ U2 → ⊥) → - ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈*[h] U1 & T1 ≛ U1 → ⊥ & ⦃G1,L1,U1⦄ ⊐⸮[b] ⦃G2,L2,U2⦄. + ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈*[h] U1 & T1 ≛ U1 → ⊥ & ⦃G1,L1,U1⦄ ⬂⸮[b] ⦃G2,L2,U2⦄. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H12 elim H12 -H12 [ #H12 #U2 #HTU2 #H elim (fqu_cpxs_trans_tdneq … H12 … HTU2 H) -T2 /3 width=4 by fqu_fquq, ex3_intro/ @@ -99,9 +99,9 @@ lemma fquq_cpxs_trans_tdneq: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐⸮[b] qed-. (* Basic_2A1: uses: fqup_cpxs_trans_neq *) -lemma fqup_cpxs_trans_tdneq: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐+[b] ⦃G2,L2,T2⦄ → +lemma fqup_cpxs_trans_tdneq: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂+[b] ⦃G2,L2,T2⦄ → ∀U2. ⦃G2,L2⦄ ⊢ T2 ⬈*[h] U2 → (T2 ≛ U2 → ⊥) → - ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈*[h] U1 & T1 ≛ U1 → ⊥ & ⦃G1,L1,U1⦄ ⊐+[b] ⦃G2,L2,U2⦄. + ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈*[h] U1 & T1 ≛ U1 → ⊥ & ⦃G1,L1,U1⦄ ⬂+[b] ⦃G2,L2,U2⦄. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H @(fqup_ind_dx … H) -G1 -L1 -T1 [ #G1 #L1 #T1 #H12 #U2 #HTU2 #H elim (fqu_cpxs_trans_tdneq … H12 … HTU2 H) -T2 /3 width=4 by fqu_fqup, ex3_intro/ @@ -112,9 +112,9 @@ lemma fqup_cpxs_trans_tdneq: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐+[b] qed-. (* Basic_2A1: uses: fqus_cpxs_trans_neq *) -lemma fqus_cpxs_trans_tdneq: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐*[b] ⦃G2,L2,T2⦄ → +lemma fqus_cpxs_trans_tdneq: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂*[b] ⦃G2,L2,T2⦄ → ∀U2. ⦃G2,L2⦄ ⊢ T2 ⬈*[h] U2 → (T2 ≛ U2 → ⊥) → - ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈*[h] U1 & T1 ≛ U1 → ⊥ & ⦃G1,L1,U1⦄ ⊐*[b] ⦃G2,L2,U2⦄. + ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈*[h] U1 & T1 ≛ U1 → ⊥ & ⦃G1,L1,U1⦄ ⬂*[b] ⦃G2,L2,U2⦄. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H12 #U2 #HTU2 #H elim (fqus_inv_fqup … H12) -H12 [ #H12 elim (fqup_cpxs_trans_tdneq … H12 … HTU2 H) -T2 /3 width=4 by fqup_fqus, ex3_intro/ diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/cpxs_lpx.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/cpxs_lpx.ma index dbefb4db5..599e41a20 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/cpxs_lpx.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/cpxs_lpx.ma @@ -57,9 +57,9 @@ lemma cpxs_bind2_dx: ∀h,G,L,V1,V2. ⦃G,L⦄ ⊢ V1 ⬈[h] V2 → (* Properties with plus-iterated structural successor for closures **********) (* Basic_2A1: uses: lpx_fqup_trans *) -lemma lpx_fqup_trans: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐+[b] ⦃G2,L2,T2⦄ → +lemma lpx_fqup_trans: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂+[b] ⦃G2,L2,T2⦄ → ∀K1. ⦃G1,K1⦄ ⊢ ⬈[h] L1 → - ∃∃K2,T. ⦃G1,K1⦄ ⊢ T1 ⬈*[h] T & ⦃G1,K1,T⦄ ⊐+[b] ⦃G2,K2,T2⦄ & ⦃G2,K2⦄ ⊢ ⬈[h] L2. + ∃∃K2,T. ⦃G1,K1⦄ ⊢ T1 ⬈*[h] T & ⦃G1,K1,T⦄ ⬂+[b] ⦃G2,K2,T2⦄ & ⦃G2,K2⦄ ⊢ ⬈[h] L2. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H @(fqup_ind … H) -G2 -L2 -T2 [ #G2 #L2 #T2 #H12 #K1 #HKL1 elim (lpx_fqu_trans … H12 … HKL1) -L1 /3 width=5 by cpx_cpxs, fqu_fqup, ex3_2_intro/ @@ -73,9 +73,9 @@ qed-. (* Properties with star-iterated structural successor for closures **********) (* Basic_2A1: uses: lpx_fqus_trans *) -lemma lpx_fqus_trans: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐*[b] ⦃G2,L2,T2⦄ → +lemma lpx_fqus_trans: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂*[b] ⦃G2,L2,T2⦄ → ∀K1. ⦃G1,K1⦄ ⊢ ⬈[h] L1 → - ∃∃K2,T. ⦃G1,K1⦄ ⊢ T1 ⬈*[h] T & ⦃G1,K1,T⦄ ⊐*[b] ⦃G2,K2,T2⦄ & ⦃G2,K2⦄ ⊢ ⬈[h] L2. + ∃∃K2,T. ⦃G1,K1⦄ ⊢ T1 ⬈*[h] T & ⦃G1,K1,T⦄ ⬂*[b] ⦃G2,K2,T2⦄ & ⦃G2,K2⦄ ⊢ ⬈[h] L2. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H #K1 #HKL1 elim (fqus_inv_fqup … H) -H [ #H12 elim (lpx_fqup_trans … H12 … HKL1) -L1 /3 width=5 by fqup_fqus, ex3_2_intro/ | * #H1 #H2 #H3 destruct /2 width=5 by ex3_2_intro/ diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/csx_fqus.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/csx_fqus.ma index 03ae7cc37..acef276fa 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/csx_fqus.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/csx_fqus.ma @@ -19,7 +19,7 @@ include "basic_2/rt_computation/csx_lsubr.ma". (* Properties with extended supclosure **************************************) -lemma csx_fqu_conf: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2⦄ → +lemma csx_fqu_conf: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂[b] ⦃G2,L2,T2⦄ → ⦃G1,L1⦄ ⊢ ⬈*[h] 𝐒⦃T1⦄ → ⦃G2,L2⦄ ⊢ ⬈*[h] 𝐒⦃T2⦄. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H elim H -G1 -G2 -L1 -L2 -T1 -T2 [ /3 width=5 by csx_inv_lref_pair, drops_refl/ @@ -31,19 +31,19 @@ lemma csx_fqu_conf: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2 ] qed-. -lemma csx_fquq_conf: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐⸮[b] ⦃G2,L2,T2⦄ → +lemma csx_fquq_conf: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂⸮[b] ⦃G2,L2,T2⦄ → ⦃G1,L1⦄ ⊢ ⬈*[h] 𝐒⦃T1⦄ → ⦃G2,L2⦄ ⊢ ⬈*[h] 𝐒⦃T2⦄. #h #b #G1 #G2 #L1 #L2 #T1 #T2 * /2 width=6 by csx_fqu_conf/ * #HG #HL #HT destruct // qed-. -lemma csx_fqup_conf: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐+[b] ⦃G2,L2,T2⦄ → +lemma csx_fqup_conf: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂+[b] ⦃G2,L2,T2⦄ → ⦃G1,L1⦄ ⊢ ⬈*[h] 𝐒⦃T1⦄ → ⦃G2,L2⦄ ⊢ ⬈*[h] 𝐒⦃T2⦄. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H @(fqup_ind … H) -G2 -L2 -T2 /3 width=6 by csx_fqu_conf/ qed-. -lemma csx_fqus_conf: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐*[b] ⦃G2,L2,T2⦄ → +lemma csx_fqus_conf: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂*[b] ⦃G2,L2,T2⦄ → ⦃G1,L1⦄ ⊢ ⬈*[h] 𝐒⦃T1⦄ → ⦃G2,L2⦄ ⊢ ⬈*[h] 𝐒⦃T2⦄. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H @(fqus_ind … H) -H /3 width=6 by csx_fquq_conf/ diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbg.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbg.ma index 2c2f375f2..b14847da0 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbg.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbg.ma @@ -39,7 +39,7 @@ lemma fpbg_fpbq_trans: ∀h,G1,G,G2,L1,L,L2,T1,T,T2. qed-. lemma fpbg_fqu_trans (h): ∀G1,G,G2,L1,L,L2,T1,T,T2. - ⦃G1,L1,T1⦄ >[h] ⦃G,L,T⦄ → ⦃G,L,T⦄ ⊐ ⦃G2,L2,T2⦄ → + ⦃G1,L1,T1⦄ >[h] ⦃G,L,T⦄ → ⦃G,L,T⦄ ⬂ ⦃G2,L2,T2⦄ → ⦃G1,L1,T1⦄ >[h] ⦃G2,L2,T2⦄. #h #G1 #G #G2 #L1 #L #L2 #T1 #T #T2 #H1 #H2 /4 width=5 by fpbg_fpbq_trans, fpbq_fquq, fqu_fquq/ diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbg_fpbs.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbg_fpbs.ma index 1eb2d110b..e80960d04 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbg_fpbs.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbg_fpbs.ma @@ -64,7 +64,7 @@ qed-. (* Advanced properties with plus-iterated structural successor for closures *) lemma fqup_fpbg_trans (h): - ∀G1,G,L1,L,T1,T. ⦃G1,L1,T1⦄ ⊐+ ⦃G,L,T⦄ → + ∀G1,G,L1,L,T1,T. ⦃G1,L1,T1⦄ ⬂+ ⦃G,L,T⦄ → ∀G2,L2,T2. ⦃G,L,T⦄ >[h] ⦃G2,L2,T2⦄ → ⦃G1,L1,T1⦄ >[h] ⦃G2,L2,T2⦄. /3 width=5 by fpbs_fpbg_trans, fqup_fpbs/ qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbg_fqup.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbg_fqup.ma index 9e40865af..746aa6953 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbg_fqup.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbg_fqup.ma @@ -26,7 +26,7 @@ lemma fpbg_tdeq_div: ∀h,G1,G2,L1,L2,T1,T. ⦃G1,L1,T1⦄ >[h] ⦃G2,L2,T⦄ (* Properties with plus-iterated structural successor for closures **********) (* Note: this is used in the closure proof *) -lemma fqup_fpbg: ∀h,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐+ ⦃G2,L2,T2⦄ → ⦃G1,L1,T1⦄ >[h] ⦃G2,L2,T2⦄. +lemma fqup_fpbg: ∀h,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂+ ⦃G2,L2,T2⦄ → ⦃G1,L1,T1⦄ >[h] ⦃G2,L2,T2⦄. #h #G1 #G2 #L1 #L2 #T1 #T2 #H elim (fqup_inv_step_sn … H) -H /3 width=5 by fqus_fpbs, fpb_fqu, ex2_3_intro/ qed. diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbs_cpxs.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbs_cpxs.ma index f995181c3..ec1d680a8 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbs_cpxs.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbs_cpxs.ma @@ -48,11 +48,11 @@ lemma cpxs_tdeq_fpbs: ∀h,G,L,T1,T. ⦃G,L⦄ ⊢ T1 ⬈*[h] T → (* Properties with star-iterated structural successor for closures **********) lemma cpxs_fqus_fpbs: ∀h,G1,L1,T1,T. ⦃G1,L1⦄ ⊢ T1 ⬈*[h] T → - ∀G2,L2,T2. ⦃G1,L1,T⦄ ⊐* ⦃G2,L2,T2⦄ → ⦃G1,L1,T1⦄ ≥[h] ⦃G2,L2,T2⦄. + ∀G2,L2,T2. ⦃G1,L1,T⦄ ⬂* ⦃G2,L2,T2⦄ → ⦃G1,L1,T1⦄ ≥[h] ⦃G2,L2,T2⦄. /3 width=5 by fpbs_fqus_trans, cpxs_fpbs/ qed. (* Properties with plus-iterated structural successor for closures **********) lemma cpxs_fqup_fpbs: ∀h,G1,L1,T1,T. ⦃G1,L1⦄ ⊢ T1 ⬈*[h] T → - ∀G2,L2,T2. ⦃G1,L1,T⦄ ⊐+ ⦃G2,L2,T2⦄ → ⦃G1,L1,T1⦄ ≥[h] ⦃G2,L2,T2⦄. + ∀G2,L2,T2. ⦃G1,L1,T⦄ ⬂+ ⦃G2,L2,T2⦄ → ⦃G1,L1,T1⦄ ≥[h] ⦃G2,L2,T2⦄. /3 width=5 by fpbs_fqup_trans, cpxs_fpbs/ qed. diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbs_fqup.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbs_fqup.ma index ccb50f624..4a970e58b 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbs_fqup.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbs_fqup.ma @@ -30,16 +30,16 @@ lemma fpbs_tdeq_trans: ∀h,G1,G2,L1,L2,T1,T. ⦃G1,L1,T1⦄ ≥[h] ⦃G2,L2,T (* Properties with plus-iterated structural successor for closures **********) -lemma fqup_fpbs: ∀h,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐+ ⦃G2,L2,T2⦄ → +lemma fqup_fpbs: ∀h,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂+ ⦃G2,L2,T2⦄ → ⦃G1,L1,T1⦄ ≥[h] ⦃G2,L2,T2⦄. #h #G1 #G2 #L1 #L2 #T1 #T2 #H @(fqup_ind … H) -G2 -L2 -T2 /4 width=5 by fqu_fquq, fpbq_fquq, tri_step/ qed. lemma fpbs_fqup_trans: ∀h,G1,G,L1,L,T1,T. ⦃G1,L1,T1⦄ ≥[h] ⦃G,L,T⦄ → - ∀G2,L2,T2. ⦃G,L,T⦄ ⊐+ ⦃G2,L2,T2⦄ → ⦃G1,L1,T1⦄ ≥[h] ⦃G2,L2,T2⦄. + ∀G2,L2,T2. ⦃G,L,T⦄ ⬂+ ⦃G2,L2,T2⦄ → ⦃G1,L1,T1⦄ ≥[h] ⦃G2,L2,T2⦄. /3 width=5 by fpbs_fqus_trans, fqup_fqus/ qed-. lemma fqup_fpbs_trans: ∀h,G,G2,L,L2,T,T2. ⦃G,L,T⦄ ≥[h] ⦃G2,L2,T2⦄ → - ∀G1,L1,T1. ⦃G1,L1,T1⦄ ⊐+ ⦃G,L,T⦄ → ⦃G1,L1,T1⦄ ≥[h] ⦃G2,L2,T2⦄. + ∀G1,L1,T1. ⦃G1,L1,T1⦄ ⬂+ ⦃G,L,T⦄ → ⦃G1,L1,T1⦄ ≥[h] ⦃G2,L2,T2⦄. /3 width=5 by fqus_fpbs_trans, fqup_fqus/ qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbs_fqus.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbs_fqus.ma index c869f3d9f..3f1e06fab 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbs_fqus.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbs_fqus.ma @@ -19,20 +19,20 @@ include "basic_2/rt_computation/fpbs.ma". (* Properties with star-iterated structural successor for closures **********) -lemma fqus_fpbs: ∀h,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐* ⦃G2,L2,T2⦄ → +lemma fqus_fpbs: ∀h,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂* ⦃G2,L2,T2⦄ → ⦃G1,L1,T1⦄ ≥[h] ⦃G2,L2,T2⦄. #h #G1 #G2 #L1 #L2 #T1 #T2 #H @(fqus_ind … H) -G2 -L2 -T2 /3 width=5 by fpbq_fquq, tri_step/ qed. lemma fpbs_fqus_trans: ∀h,G1,G,L1,L,T1,T. ⦃G1,L1,T1⦄ ≥[h] ⦃G,L,T⦄ → - ∀G2,L2,T2. ⦃G,L,T⦄ ⊐* ⦃G2,L2,T2⦄ → ⦃G1,L1,T1⦄ ≥[h] ⦃G2,L2,T2⦄. + ∀G2,L2,T2. ⦃G,L,T⦄ ⬂* ⦃G2,L2,T2⦄ → ⦃G1,L1,T1⦄ ≥[h] ⦃G2,L2,T2⦄. #h #G1 #G #L1 #L #T1 #T #H1 #G2 #L2 #T2 #H @(fqus_ind … H) -G2 -L2 -T2 /3 width=5 by fpbs_strap1, fpbq_fquq/ qed-. lemma fqus_fpbs_trans: ∀h,G,G2,L,L2,T,T2. ⦃G,L,T⦄ ≥[h] ⦃G2,L2,T2⦄ → - ∀G1,L1,T1. ⦃G1,L1,T1⦄ ⊐* ⦃G,L,T⦄ → ⦃G1,L1,T1⦄ ≥[h] ⦃G2,L2,T2⦄. + ∀G1,L1,T1. ⦃G1,L1,T1⦄ ⬂* ⦃G,L,T⦄ → ⦃G1,L1,T1⦄ ≥[h] ⦃G2,L2,T2⦄. #h #G #G2 #L #L2 #T #T2 #H1 #G1 #L1 #T1 #H @(fqus_ind_dx … H) -G1 -L1 -T1 /3 width=5 by fpbs_strap2, fpbq_fquq/ qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbs_lpxs.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbs_lpxs.ma index 07df0c624..d3b96eb96 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbs_lpxs.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fpbs_lpxs.ma @@ -51,20 +51,20 @@ lemma fpbs_lpx_trans: ∀h,G1,G2,L1,L,T1,T2. ⦃G1,L1,T1⦄ ≥[h] ⦃G2,L,T2⦄ (* Properties with star-iterated structural successor for closures **********) -lemma fqus_lpxs_fpbs: ∀h,G1,G2,L1,L,T1,T2. ⦃G1,L1,T1⦄ ⊐* ⦃G2,L,T2⦄ → +lemma fqus_lpxs_fpbs: ∀h,G1,G2,L1,L,T1,T2. ⦃G1,L1,T1⦄ ⬂* ⦃G2,L,T2⦄ → ∀L2. ⦃G2,L⦄ ⊢ ⬈*[h] L2 → ⦃G1,L1,T1⦄ ≥[h] ⦃G2,L2,T2⦄. /3 width=3 by fpbs_lpxs_trans, fqus_fpbs/ qed. (* Properties with unbound context-sensitive parallel rt-computation ********) lemma cpxs_fqus_lpxs_fpbs: ∀h,G1,L1,T1,T. ⦃G1,L1⦄ ⊢ T1 ⬈*[h] T → - ∀G2,L,T2. ⦃G1,L1,T⦄ ⊐* ⦃G2,L,T2⦄ → + ∀G2,L,T2. ⦃G1,L1,T⦄ ⬂* ⦃G2,L,T2⦄ → ∀L2.⦃G2,L⦄ ⊢ ⬈*[h] L2 → ⦃G1,L1,T1⦄ ≥[h] ⦃G2,L2,T2⦄. /3 width=5 by cpxs_fqus_fpbs, fpbs_lpxs_trans/ qed. lemma fpbs_cpxs_tdeq_fqup_lpx_trans: ∀h,G1,G3,L1,L3,T1,T3. ⦃G1,L1,T1⦄ ≥ [h] ⦃G3,L3,T3⦄ → ∀T4. ⦃G3,L3⦄ ⊢ T3 ⬈*[h] T4 → ∀T5. T4 ≛ T5 → - ∀G2,L4,T2. ⦃G3,L3,T5⦄ ⊐+ ⦃G2,L4,T2⦄ → + ∀G2,L4,T2. ⦃G3,L3,T5⦄ ⬂+ ⦃G2,L4,T2⦄ → ∀L2. ⦃G2,L4⦄ ⊢ ⬈[h] L2 → ⦃G1,L1,T1⦄ ≥ [h] ⦃G2,L2,T2⦄. #h #G1 #G3 #L1 #L3 #T1 #T3 #H13 #T4 #HT34 #T5 #HT45 #G2 #L4 #T2 #H34 #L2 #HL42 @(fpbs_lpx_trans … HL42) -L2 (**) (* full auto too slow *) @@ -76,7 +76,7 @@ qed-. (* Basic_2A1: uses: fpbs_intro_alt *) lemma fpbs_intro_star: ∀h,G1,L1,T1,T. ⦃G1,L1⦄ ⊢ T1 ⬈*[h] T → - ∀G,L,T0. ⦃G1,L1,T⦄ ⊐* ⦃G,L,T0⦄ → + ∀G,L,T0. ⦃G1,L1,T⦄ ⬂* ⦃G,L,T0⦄ → ∀L0. ⦃G,L⦄ ⊢ ⬈*[h] L0 → ∀G2,L2,T2. ⦃G,L0,T0⦄ ≛ ⦃G2,L2,T2⦄ → ⦃G1,L1,T1⦄ ≥[h] ⦃G2,L2,T2⦄ . /3 width=5 by cpxs_fqus_lpxs_fpbs, fpbs_strap1, fpbq_fdeq/ qed. @@ -85,7 +85,7 @@ lemma fpbs_intro_star: ∀h,G1,L1,T1,T. ⦃G1,L1⦄ ⊢ T1 ⬈*[h] T → (* Basic_2A1: uses: fpbs_inv_alt *) lemma fpbs_inv_star: ∀h,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ≥[h] ⦃G2,L2,T2⦄ → - ∃∃G,L,L0,T,T0. ⦃G1,L1⦄ ⊢ T1 ⬈*[h] T & ⦃G1,L1,T⦄ ⊐* ⦃G,L,T0⦄ + ∃∃G,L,L0,T,T0. ⦃G1,L1⦄ ⊢ T1 ⬈*[h] T & ⦃G1,L1,T⦄ ⬂* ⦃G,L,T0⦄ & ⦃G,L⦄ ⊢ ⬈*[h] L0 & ⦃G,L0,T0⦄ ≛ ⦃G2,L2,T2⦄. #h #G1 #G2 #L1 #L2 #T1 #T2 #H @(fpbs_ind_dx … H) -G1 -L1 -T1 [ /2 width=9 by ex4_5_intro/ diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fsb_csx.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fsb_csx.ma index 83d407f75..de36632c3 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fsb_csx.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/fsb_csx.ma @@ -12,7 +12,7 @@ (* *) (**************************************************************************) -include "basic_2/rt_computation/rdsx_csx.ma". +include "basic_2/rt_computation/rsx_csx.ma". include "basic_2/rt_computation/fpbs_cpx.ma". include "basic_2/rt_computation/fpbs_csx.ma". include "basic_2/rt_computation/fsb_fpbg.ma". @@ -34,7 +34,7 @@ lemma csx_fsb_fpbs: ∀h,G1,L1,T1. ⦃G1,L1⦄ ⊢ ⬈*[h] 𝐒⦃T1⦄ → #G0 #L0 #T0 #IHu #H10 lapply (fpbs_csx_conf … H10) // -HT1 #HT0 generalize in match IHu; -IHu generalize in match H10; -H10 -@(rdsx_ind … (csx_rdsx … HT0)) -L0 +@(rsx_ind … (csx_rsx … HT0)) -L0 #L0 #_ #IHd #H10 #IHu @fsb_intro #G2 #L2 #T2 * -G2 -L2 -T2 [ -IHd -IHc | -IHu -IHd | ] [ /4 width=5 by fpbs_fqup_trans, fqu_fqup/ diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/jsx.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/jsx.ma new file mode 100644 index 000000000..94a1ec855 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/jsx.ma @@ -0,0 +1,164 @@ +(**************************************************************************) +(* ___ *) +(* ||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 "basic_2/notation/relations/topredtysnstrong_5.ma". +include "basic_2/rt_computation/rsx.ma". + +(* COMPATIBILITY OF STRONG NORMALIZATION FOR UNBOUND RT-TRANSITION **********) + +(* Note: this should be an instance of a more general sex *) +(* Basic_2A1: uses: lcosx *) +inductive jsx (h) (G): rtmap → relation lenv ≝ +| jsx_atom: ∀f. jsx h G f (⋆) (⋆) +| jsx_push: ∀f,I,K1,K2. jsx h G f K1 K2 → + jsx h G (⫯f) (K1.ⓘ{I}) (K2.ⓘ{I}) +| jsx_unit: ∀f,I,K1,K2. jsx h G f K1 K2 → + jsx h G (↑f) (K1.ⓤ{I}) (K2.ⓧ) +| jsx_pair: ∀f,I,K1,K2,V. G ⊢ ⬈*[h,V] 𝐒⦃K2⦄ → + jsx h G f K1 K2 → jsx h G (↑f) (K1.ⓑ{I}V) (K2.ⓧ) +. + +interpretation + "strong normalization for unbound parallel rt-transition (compatibility)" + 'ToPRedTySNStrong h f G L1 L2 = (jsx h G f L1 L2). + +(* Basic inversion lemmas ***************************************************) + +fact jsx_inv_atom_sn_aux (h) (G): + ∀g,L1,L2. G ⊢ L1 ⊒[h,g] L2 → L1 = ⋆ → L2 = ⋆. +#h #G #g #L1 #L2 * -g -L1 -L2 // +[ #f #I #K1 #K2 #_ #H destruct +| #f #I #K1 #K2 #_ #H destruct +| #f #I #K1 #K2 #V #_ #_ #H destruct +] +qed-. + +lemma jsx_inv_atom_sn (h) (G): ∀g,L2. G ⊢ ⋆ ⊒[h,g] L2 → L2 = ⋆. +/2 width=7 by jsx_inv_atom_sn_aux/ qed-. + +fact jsx_inv_push_sn_aux (h) (G): + ∀g,L1,L2. G ⊢ L1 ⊒[h,g] L2 → + ∀f,I,K1. g = ⫯f → L1 = K1.ⓘ{I} → + ∃∃K2. G ⊢ K1 ⊒[h,f] K2 & L2 = K2.ⓘ{I}. +#h #G #g #L1 #L2 * -g -L1 -L2 +[ #f #g #J #L1 #_ #H destruct +| #f #I #K1 #K2 #HK12 #g #J #L1 #H1 #H2 destruct + <(injective_push … H1) -g /2 width=3 by ex2_intro/ +| #f #I #K1 #K2 #_ #g #J #L1 #H + elim (discr_next_push … H) +| #f #I #K1 #K2 #V #_ #_ #g #J #L1 #H + elim (discr_next_push … H) +] +qed-. + +lemma jsx_inv_push_sn (h) (G): + ∀f,I,K1,L2. G ⊢ K1.ⓘ{I} ⊒[h,⫯f] L2 → + ∃∃K2. G ⊢ K1 ⊒[h,f] K2 & L2 = K2.ⓘ{I}. +/2 width=5 by jsx_inv_push_sn_aux/ qed-. + +fact jsx_inv_unit_sn_aux (h) (G): + ∀g,L1,L2. G ⊢ L1 ⊒[h,g] L2 → + ∀f,I,K1. g = ↑f → L1 = K1.ⓤ{I} → + ∃∃K2. G ⊢ K1 ⊒[h,f] K2 & L2 = K2.ⓧ. +#h #G #g #L1 #L2 * -g -L1 -L2 +[ #f #g #J #L1 #_ #H destruct +| #f #I #K1 #K2 #_ #g #J #L1 #H + elim (discr_push_next … H) +| #f #I #K1 #K2 #HK12 #g #J #L1 #H1 #H2 destruct + <(injective_next … H1) -g /2 width=3 by ex2_intro/ +| #f #I #K1 #K2 #V #_ #_ #g #J #L1 #_ #H destruct +] +qed-. + +lemma jsx_inv_unit_sn (h) (G): + ∀f,I,K1,L2. G ⊢ K1.ⓤ{I} ⊒[h,↑f] L2 → + ∃∃K2. G ⊢ K1 ⊒[h,f] K2 & L2 = K2.ⓧ. +/2 width=6 by jsx_inv_unit_sn_aux/ qed-. + +fact jsx_inv_pair_sn_aux (h) (G): + ∀g,L1,L2. G ⊢ L1 ⊒[h,g] L2 → + ∀f,I,K1,V. g = ↑f → L1 = K1.ⓑ{I}V → + ∃∃K2. G ⊢ ⬈*[h,V] 𝐒⦃K2⦄ & G ⊢ K1 ⊒[h,f] K2 & L2 = K2.ⓧ. +#h #G #g #L1 #L2 * -g -L1 -L2 +[ #f #g #J #L1 #W #_ #H destruct +| #f #I #K1 #K2 #_ #g #J #L1 #W #H + elim (discr_push_next … H) +| #f #I #K1 #K2 #_ #g #J #L1 #W #_ #H destruct +| #f #I #K1 #K2 #V #HV #HK12 #g #J #L1 #W #H1 #H2 destruct + <(injective_next … H1) -g /2 width=4 by ex3_intro/ +] +qed-. + +(* Basic_2A1: uses: lcosx_inv_pair *) +lemma jsx_inv_pair_sn (h) (G): + ∀f,I,K1,L2,V. G ⊢ K1.ⓑ{I}V ⊒[h,↑f] L2 → + ∃∃K2. G ⊢ ⬈*[h,V] 𝐒⦃K2⦄ & G ⊢ K1 ⊒[h,f] K2 & L2 = K2.ⓧ. +/2 width=6 by jsx_inv_pair_sn_aux/ qed-. + +(* Advanced inversion lemmas ************************************************) + +lemma jsx_inv_pair_sn_gen (h) (G): ∀g,I,K1,L2,V. G ⊢ K1.ⓑ{I}V ⊒[h,g] L2 → + ∨∨ ∃∃f,K2. G ⊢ K1 ⊒[h,f] K2 & g = ⫯f & L2 = K2.ⓑ{I}V + | ∃∃f,K2. G ⊢ ⬈*[h,V] 𝐒⦃K2⦄ & G ⊢ K1 ⊒[h,f] K2 & g = ↑f & L2 = K2.ⓧ. +#h #G #g #I #K1 #L2 #V #H +elim (pn_split g) * #f #Hf destruct +[ elim (jsx_inv_push_sn … H) -H /3 width=5 by ex3_2_intro, or_introl/ +| elim (jsx_inv_pair_sn … H) -H /3 width=6 by ex4_2_intro, or_intror/ +] +qed-. + +(* Advanced forward lemmas **************************************************) + +lemma jsx_fwd_bind_sn (h) (G): + ∀g,I1,K1,L2. G ⊢ K1.ⓘ{I1} ⊒[h,g] L2 → + ∃∃I2,K2. G ⊢ K1 ⊒[h,⫱g] K2 & L2 = K2.ⓘ{I2}. +#h #G #g #I1 #K1 #L2 +elim (pn_split g) * #f #Hf destruct +[ #H elim (jsx_inv_push_sn … H) -H +| cases I1 -I1 #I1 + [ #H elim (jsx_inv_unit_sn … H) -H + | #V #H elim (jsx_inv_pair_sn … H) -H + ] +] +/2 width=4 by ex2_2_intro/ +qed-. + +(* Basic properties *********************************************************) + +lemma jsx_eq_repl_back (h) (G): ∀L1,L2. eq_repl_back … (λf. G ⊢ L1 ⊒[h,f] L2). +#h #G #L1 #L2 #f1 #H elim H -L1 -L2 -f1 // +[ #f #I #L1 #L2 #_ #IH #x #H + elim (eq_inv_px … H) -H /3 width=3 by jsx_push/ +| #f #I #L1 #L2 #_ #IH #x #H + elim (eq_inv_nx … H) -H /3 width=3 by jsx_unit/ +| #f #I #L1 #L2 #V #HV #_ #IH #x #H + elim (eq_inv_nx … H) -H /3 width=3 by jsx_pair/ +] +qed-. + +lemma jsx_eq_repl_fwd (h) (G): ∀L1,L2. eq_repl_fwd … (λf. G ⊢ L1 ⊒[h,f] L2). +#h #G #L1 #L2 @eq_repl_sym /2 width=3 by jsx_eq_repl_back/ +qed-. + +(* Advanced properties ******************************************************) + +(* Basic_2A1: uses: lcosx_O *) +lemma jsx_refl (h) (G): ∀f. 𝐈⦃f⦄ → reflexive … (jsx h G f). +#h #G #f #Hf #L elim L -L +/3 width=3 by jsx_eq_repl_back, jsx_push, eq_push_inv_isid/ +qed. + +(* Basic_2A1: removed theorems 2: + lcosx_drop_trans_lt lcosx_inv_succ +*) diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/lsubsx_lsubsx.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/jsx_jsx.ma similarity index 66% rename from matita/matita/contribs/lambdadelta/basic_2/rt_computation/lsubsx_lsubsx.ma rename to matita/matita/contribs/lambdadelta/basic_2/rt_computation/jsx_jsx.ma index 82038855e..7431ea44d 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/lsubsx_lsubsx.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/jsx_jsx.ma @@ -12,27 +12,27 @@ (* *) (**************************************************************************) -include "basic_2/rt_computation/lsubsx.ma". +include "basic_2/rt_computation/jsx.ma". -(* CLEAR OF STRONGLY NORMALIZING ENTRIES FOR UNBOUND RT-TRANSITION **********) +(* COMPATIBILITY OF STRONG NORMALIZATION FOR UNBOUND RT-TRANSITION **********) (* Main properties **********************************************************) -theorem lsubsx_fix: ∀h,f,G,L1,L. G ⊢ L1 ⊆ⓧ[h,f] L → - ∀L2. G ⊢ L ⊆ⓧ[h,f] L2 → L = L2. -#h #f #G #L1 #L #H elim H -f -L1 -L +theorem jsx_fix (h) (G): + ∀f,L1,L. G ⊢ L1 ⊒[h,f] L → ∀L2. G ⊢ L ⊒[h,f] L2 → L = L2. +#h #G #f #L1 #L #H elim H -f -L1 -L [ #f #L2 #H - >(lsubsx_inv_atom_sn … H) -L2 // + >(jsx_inv_atom_sn … H) -L2 // | #f #I #K1 #K2 #_ #IH #L2 #H - elim (lsubsx_inv_push_sn … H) -H /3 width=1 by eq_f2/ + elim (jsx_inv_push_sn … H) -H /3 width=1 by eq_f2/ | #f #I #K1 #K2 #_ #IH #L2 #H - elim (lsubsx_inv_unit_sn … H) -H /3 width=1 by eq_f2/ + elim (jsx_inv_unit_sn … H) -H /3 width=1 by eq_f2/ | #f #I #K1 #K2 #V #_ #_ #IH #L2 #H - elim (lsubsx_inv_unit_sn … H) -H /3 width=1 by eq_f2/ + elim (jsx_inv_unit_sn … H) -H /3 width=1 by eq_f2/ ] qed-. -theorem lsubsx_trans: ∀h,f,G. Transitive … (lsubsx h G f). -#h #f #G #L1 #L #H1 #L2 #H2 -<(lsubsx_fix … H1 … H2) -L2 // +theorem jsx_trans (h) (G): ∀f. Transitive … (jsx h G f). +#h #G #f #L1 #L #H1 #L2 #H2 +<(jsx_fix … H1 … H2) -L2 // qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/jsx_rsx.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/jsx_rsx.ma new file mode 100644 index 000000000..e5e662dc6 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/jsx_rsx.ma @@ -0,0 +1,78 @@ +(**************************************************************************) +(* ___ *) +(* ||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 "basic_2/rt_computation/rsx_drops.ma". +include "basic_2/rt_computation/rsx_lpxs.ma". +include "basic_2/rt_computation/jsx.ma". + +(* COMPATIBILITY OF STRONG NORMALIZATION FOR UNBOUND RT-TRANSITION **********) + +(* Properties with strongly normalizing referred local environments *********) + +(* Basic_2A1: uses: lsx_cpx_trans_lcosx *) +lemma rsx_cpx_trans_jsx (h) (G): + ∀L0,T1,T2. ⦃G,L0⦄ ⊢ T1 ⬈[h] T2 → + ∀f,L. G ⊢ L0 ⊒[h,f] L → + G ⊢ ⬈*[h,T1] 𝐒⦃L⦄ → G ⊢ ⬈*[h,T2] 𝐒⦃L⦄. +#h #G #L0 #T1 #T2 #H @(cpx_ind … H) -G -L0 -T1 -T2 +[ // +| // +| #I0 #G #K0 #V1 #V2 #W2 #_ #IH #HVW2 #g #L #HK0 #HL + elim (jsx_inv_pair_sn_gen … HK0) -HK0 * + [ #f #K #HK0 #H1 #H2 destruct + /4 width=8 by rsx_lifts, rsx_fwd_pair, drops_refl, drops_drop/ + | #f #K #HV1 #HK0 #H1 #H2 destruct + /4 width=8 by rsx_lifts, drops_refl, drops_drop/ + ] +| #I0 #G #K0 #T #U #i #_ #IH #HTU #g #L #HK0 #HL + elim (jsx_fwd_bind_sn … HK0) -HK0 #I #K #HK0 #H destruct + /6 width=8 by rsx_inv_lifts, rsx_lifts, drops_refl, drops_drop/ +| #p #I0 #G #L0 #V1 #V2 #T1 #T2 #_ #_ #IHV12 #IHT12 #f #L #HL0 #HL + elim (rsx_inv_bind_void … HL) -HL + /4 width=2 by jsx_pair, rsx_bind_void/ +| #I0 #G #L0 #V1 #V2 #T1 #T2 #_ #_ #IHV12 #IHT12 #f #L #HL0 #HL + elim (rsx_inv_flat … HL) -HL /3 width=2 by rsx_flat/ +| #G #L0 #V #U1 #T1 #T2 #HTU1 #_ #IHT12 #f #L #HL0 #HL + elim (rsx_inv_bind_void … HL) -HL #HV #HU1 + /5 width=8 by rsx_inv_lifts, drops_refl, drops_drop/ +| #G #L0 #V #T1 #T2 #_ #IHT12 #f #L #HL0 #HL + elim (rsx_inv_flat … HL) -HL /2 width=2 by/ +| #G #L0 #V1 #V2 #T #_ #IHV12 #f #L #HL0 #HL + elim (rsx_inv_flat … HL) -HL /2 width=2 by/ +| #p #G #L0 #V1 #V2 #W1 #W2 #T1 #T2 #_ #_ #_ #IHV12 #IHW12 #IHT12 #f #L #HL0 #HL + elim (rsx_inv_flat … HL) -HL #HV1 #HL + elim (rsx_inv_bind_void … HL) -HL #HW1 #HT1 + /4 width=2 by jsx_pair, rsx_bind_void, rsx_flat/ +| #p #G #L0 #V1 #V2 #U2 #W1 #W2 #T1 #T2 #_ #_ #_ #IHV12 #IHW12 #IHT12 #HVU2 #f #L #HL0 #HL + elim (rsx_inv_flat … HL) -HL #HV1 #HL + elim (rsx_inv_bind_void … HL) -HL #HW1 #HT1 + /6 width=8 by jsx_pair, rsx_lifts, rsx_bind_void, rsx_flat, drops_refl, drops_drop/ +] +qed-. + +(* Advanced properties of strongly normalizing referred local environments **) + +(* Basic_2A1: uses: lsx_cpx_trans_O *) +lemma rsx_cpx_trans (h) (G): + ∀L,T1,T2. ⦃G,L⦄ ⊢ T1 ⬈[h] T2 → + G ⊢ ⬈*[h,T1] 𝐒⦃L⦄ → G ⊢ ⬈*[h,T2] 𝐒⦃L⦄. +/3 width=6 by rsx_cpx_trans_jsx, jsx_refl/ qed-. + +lemma rsx_cpxs_trans (h) (G): + ∀L,T1,T2. ⦃G,L⦄ ⊢ T1 ⬈*[h] T2 → + G ⊢ ⬈*[h,T1] 𝐒⦃L⦄ → G ⊢ ⬈*[h,T2] 𝐒⦃L⦄. +#h #G #L #T1 #T2 #H +@(cpxs_ind_dx ???????? H) -T1 // +/3 width=3 by rsx_cpx_trans/ +qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/lsubsx.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/lsubsx.ma deleted file mode 100644 index e2fb36648..000000000 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/lsubsx.ma +++ /dev/null @@ -1,160 +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 "basic_2/notation/relations/lsubeqx_5.ma". -include "basic_2/rt_computation/rdsx.ma". - -(* CLEAR OF STRONGLY NORMALIZING ENTRIES FOR UNBOUND RT-TRANSITION **********) - -(* Note: this should be an instance of a more general sex *) -(* Basic_2A1: uses: lcosx *) -inductive lsubsx (h) (G): rtmap → relation lenv ≝ -| lsubsx_atom: ∀f. lsubsx h G f (⋆) (⋆) -| lsubsx_push: ∀f,I,K1,K2. lsubsx h G f K1 K2 → - lsubsx h G (⫯f) (K1.ⓘ{I}) (K2.ⓘ{I}) -| lsubsx_unit: ∀f,I,K1,K2. lsubsx h G f K1 K2 → - lsubsx h G (↑f) (K1.ⓤ{I}) (K2.ⓧ) -| lsubsx_pair: ∀f,I,K1,K2,V. G ⊢ ⬈*[h,V] 𝐒⦃K2⦄ → - lsubsx h G f K1 K2 → lsubsx h G (↑f) (K1.ⓑ{I}V) (K2.ⓧ) -. - -interpretation - "local environment refinement (clear)" - 'LSubEqX h f G L1 L2 = (lsubsx h G f L1 L2). - -(* Basic inversion lemmas ***************************************************) - -fact lsubsx_inv_atom_sn_aux: ∀h,g,G,L1,L2. G ⊢ L1 ⊆ⓧ[h,g] L2 → - L1 = ⋆ → L2 = ⋆. -#h #g #G #L1 #L2 * -g -L1 -L2 // -[ #f #I #K1 #K2 #_ #H destruct -| #f #I #K1 #K2 #_ #H destruct -| #f #I #K1 #K2 #V #_ #_ #H destruct -] -qed-. - -lemma lsubsx_inv_atom_sn: ∀h,g,G,L2. G ⊢ ⋆ ⊆ⓧ[h,g] L2 → L2 = ⋆. -/2 width=7 by lsubsx_inv_atom_sn_aux/ qed-. - -fact lsubsx_inv_push_sn_aux: ∀h,g,G,L1,L2. G ⊢ L1 ⊆ⓧ[h,g] L2 → - ∀f,I,K1. g = ⫯f → L1 = K1.ⓘ{I} → - ∃∃K2. G ⊢ K1 ⊆ⓧ[h,f] K2 & L2 = K2.ⓘ{I}. -#h #g #G #L1 #L2 * -g -L1 -L2 -[ #f #g #J #L1 #_ #H destruct -| #f #I #K1 #K2 #HK12 #g #J #L1 #H1 #H2 destruct - <(injective_push … H1) -g /2 width=3 by ex2_intro/ -| #f #I #K1 #K2 #_ #g #J #L1 #H - elim (discr_next_push … H) -| #f #I #K1 #K2 #V #_ #_ #g #J #L1 #H - elim (discr_next_push … H) -] -qed-. - -lemma lsubsx_inv_push_sn: ∀h,f,I,G,K1,L2. G ⊢ K1.ⓘ{I} ⊆ⓧ[h,⫯f] L2 → - ∃∃K2. G ⊢ K1 ⊆ⓧ[h,f] K2 & L2 = K2.ⓘ{I}. -/2 width=5 by lsubsx_inv_push_sn_aux/ qed-. - -fact lsubsx_inv_unit_sn_aux: ∀h,g,G,L1,L2. G ⊢ L1 ⊆ⓧ[h,g] L2 → - ∀f,I,K1. g = ↑f → L1 = K1.ⓤ{I} → - ∃∃K2. G ⊢ K1 ⊆ⓧ[h,f] K2 & L2 = K2.ⓧ. -#h #g #G #L1 #L2 * -g -L1 -L2 -[ #f #g #J #L1 #_ #H destruct -| #f #I #K1 #K2 #_ #g #J #L1 #H - elim (discr_push_next … H) -| #f #I #K1 #K2 #HK12 #g #J #L1 #H1 #H2 destruct - <(injective_next … H1) -g /2 width=3 by ex2_intro/ -| #f #I #K1 #K2 #V #_ #_ #g #J #L1 #_ #H destruct -] -qed-. - -lemma lsubsx_inv_unit_sn: ∀h,f,I,G,K1,L2. G ⊢ K1.ⓤ{I} ⊆ⓧ[h,↑f] L2 → - ∃∃K2. G ⊢ K1 ⊆ⓧ[h,f] K2 & L2 = K2.ⓧ. -/2 width=6 by lsubsx_inv_unit_sn_aux/ qed-. - -fact lsubsx_inv_pair_sn_aux: ∀h,g,G,L1,L2. G ⊢ L1 ⊆ⓧ[h,g] L2 → - ∀f,I,K1,V. g = ↑f → L1 = K1.ⓑ{I}V → - ∃∃K2. G ⊢ ⬈*[h,V] 𝐒⦃K2⦄ & - G ⊢ K1 ⊆ⓧ[h,f] K2 & L2 = K2.ⓧ. -#h #g #G #L1 #L2 * -g -L1 -L2 -[ #f #g #J #L1 #W #_ #H destruct -| #f #I #K1 #K2 #_ #g #J #L1 #W #H - elim (discr_push_next … H) -| #f #I #K1 #K2 #_ #g #J #L1 #W #_ #H destruct -| #f #I #K1 #K2 #V #HV #HK12 #g #J #L1 #W #H1 #H2 destruct - <(injective_next … H1) -g /2 width=4 by ex3_intro/ -] -qed-. - -(* Basic_2A1: uses: lcosx_inv_pair *) -lemma lsubsx_inv_pair_sn: ∀h,f,I,G,K1,L2,V. G ⊢ K1.ⓑ{I}V ⊆ⓧ[h,↑f] L2 → - ∃∃K2. G ⊢ ⬈*[h,V] 𝐒⦃K2⦄ & - G ⊢ K1 ⊆ⓧ[h,f] K2 & L2 = K2.ⓧ. -/2 width=6 by lsubsx_inv_pair_sn_aux/ qed-. - -(* Advanced inversion lemmas ************************************************) - -lemma lsubsx_inv_pair_sn_gen: ∀h,g,I,G,K1,L2,V. G ⊢ K1.ⓑ{I}V ⊆ⓧ[h,g] L2 → - ∨∨ ∃∃f,K2. G ⊢ K1 ⊆ⓧ[h,f] K2 & g = ⫯f & L2 = K2.ⓑ{I}V - | ∃∃f,K2. G ⊢ ⬈*[h,V] 𝐒⦃K2⦄ & - G ⊢ K1 ⊆ⓧ[h,f] K2 & g = ↑f & L2 = K2.ⓧ. -#h #g #I #G #K1 #L2 #V #H -elim (pn_split g) * #f #Hf destruct -[ elim (lsubsx_inv_push_sn … H) -H /3 width=5 by ex3_2_intro, or_introl/ -| elim (lsubsx_inv_pair_sn … H) -H /3 width=6 by ex4_2_intro, or_intror/ -] -qed-. - -(* Advanced forward lemmas **************************************************) - -lemma lsubsx_fwd_bind_sn: ∀h,g,I1,G,K1,L2. G ⊢ K1.ⓘ{I1} ⊆ⓧ[h,g] L2 → - ∃∃I2,K2. G ⊢ K1 ⊆ⓧ[h,⫱g] K2 & L2 = K2.ⓘ{I2}. -#h #g #I1 #G #K1 #L2 -elim (pn_split g) * #f #Hf destruct -[ #H elim (lsubsx_inv_push_sn … H) -H -| cases I1 -I1 #I1 - [ #H elim (lsubsx_inv_unit_sn … H) -H - | #V #H elim (lsubsx_inv_pair_sn … H) -H - ] -] -/2 width=4 by ex2_2_intro/ -qed-. - -(* Basic properties *********************************************************) - -lemma lsubsx_eq_repl_back: ∀h,G,L1,L2. eq_repl_back … (λf. G ⊢ L1 ⊆ⓧ[h,f] L2). -#h #G #L1 #L2 #f1 #H elim H -L1 -L2 -f1 // -[ #f #I #L1 #L2 #_ #IH #x #H - elim (eq_inv_px … H) -H /3 width=3 by lsubsx_push/ -| #f #I #L1 #L2 #_ #IH #x #H - elim (eq_inv_nx … H) -H /3 width=3 by lsubsx_unit/ -| #f #I #L1 #L2 #V #HV #_ #IH #x #H - elim (eq_inv_nx … H) -H /3 width=3 by lsubsx_pair/ -] -qed-. - -lemma lsubsx_eq_repl_fwd: ∀h,G,L1,L2. eq_repl_fwd … (λf. G ⊢ L1 ⊆ⓧ[h,f] L2). -#h #G #L1 #L2 @eq_repl_sym /2 width=3 by lsubsx_eq_repl_back/ -qed-. - -(* Advanced properties ******************************************************) - -(* Basic_2A1: uses: lcosx_O *) -lemma lsubsx_refl: ∀h,f,G. 𝐈⦃f⦄ → reflexive … (lsubsx h G f). -#h #f #G #Hf #L elim L -L -/3 width=3 by lsubsx_eq_repl_back, lsubsx_push, eq_push_inv_isid/ -qed. - -(* Basic_2A1: removed theorems 2: - lcosx_drop_trans_lt lcosx_inv_succ -*) diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rdsx_lpxs.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rdsx_lpxs.ma deleted file mode 100644 index 77867e07a..000000000 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rdsx_lpxs.ma +++ /dev/null @@ -1,154 +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 "basic_2/rt_computation/lpxs_rdeq.ma". -include "basic_2/rt_computation/lpxs_lpxs.ma". -include "basic_2/rt_computation/rdsx_rdsx.ma". - -(* STRONGLY NORMALIZING REFERRED LOCAL ENV.S FOR UNBOUND RT-TRANSITION ******) - -(* Properties with unbound rt-computation for full local environments *******) - -(* Basic_2A1: uses: lsx_intro_alt *) -lemma rdsx_intro_lpxs (h) (G): - ∀L1,T. (∀L2. ⦃G,L1⦄ ⊢ ⬈*[h] L2 → (L1 ≛[T] L2 → ⊥) → G ⊢ ⬈*[h,T] 𝐒⦃L2⦄) → - G ⊢ ⬈*[h,T] 𝐒⦃L1⦄. -/4 width=1 by lpx_lpxs, rdsx_intro/ qed-. - -(* Basic_2A1: uses: lsx_lpxs_trans *) -lemma rdsx_lpxs_trans (h) (G): - ∀L1,T. G ⊢ ⬈*[h,T] 𝐒⦃L1⦄ → - ∀L2. ⦃G,L1⦄ ⊢ ⬈*[h] L2 → G ⊢ ⬈*[h,T] 𝐒⦃L2⦄. -#h #G #L1 #T #HL1 #L2 #H @(lpxs_ind_dx … H) -L2 -/2 width=3 by rdsx_lpx_trans/ -qed-. - -(* Eliminators with unbound rt-computation for full local environments ******) - -lemma rdsx_ind_lpxs_rdeq (h) (G): - ∀T. ∀Q:predicate lenv. - (∀L1. G ⊢ ⬈*[h,T] 𝐒⦃L1⦄ → - (∀L2. ⦃G,L1⦄ ⊢ ⬈*[h] L2 → (L1 ≛[T] L2 → ⊥) → Q L2) → - Q L1 - ) → - ∀L1. G ⊢ ⬈*[h,T] 𝐒⦃L1⦄ → - ∀L0. ⦃G,L1⦄ ⊢ ⬈*[h] L0 → ∀L2. L0 ≛[T] L2 → Q L2. -#h #G #T #Q #IH #L1 #H @(rdsx_ind … H) -L1 -#L1 #HL1 #IH1 #L0 #HL10 #L2 #HL02 -@IH -IH /3 width=3 by rdsx_lpxs_trans, rdsx_rdeq_trans/ -HL1 #K2 #HLK2 #HnLK2 -lapply (rdeq_rdneq_trans … HL02 … HnLK2) -HnLK2 #H -elim (rdeq_lpxs_trans … HLK2 … HL02) -L2 #K0 #HLK0 #HK02 -lapply (rdneq_rdeq_canc_dx … H … HK02) -H #HnLK0 -elim (rdeq_dec L1 L0 T) #H -[ lapply (rdeq_rdneq_trans … H … HnLK0) -H -HnLK0 #Hn10 - lapply (lpxs_trans … HL10 … HLK0) -L0 #H10 - elim (lpxs_rdneq_inv_step_sn … H10 … Hn10) -H10 -Hn10 - /3 width=8 by rdeq_trans/ -| elim (lpxs_rdneq_inv_step_sn … HL10 … H) -HL10 -H #L #K #HL1 #HnL1 #HLK #HKL0 - elim (rdeq_lpxs_trans … HLK0 … HKL0) -L0 - /3 width=8 by lpxs_trans, rdeq_trans/ -] -qed-. - -(* Basic_2A1: uses: lsx_ind_alt *) -lemma rdsx_ind_lpxs (h) (G): - ∀T. ∀Q:predicate lenv. - (∀L1. G ⊢ ⬈*[h,T] 𝐒⦃L1⦄ → - (∀L2. ⦃G,L1⦄ ⊢ ⬈*[h] L2 → (L1 ≛[T] L2 → ⊥) → Q L2) → - Q L1 - ) → - ∀L. G ⊢ ⬈*[h,T] 𝐒⦃L⦄ → Q L. -#h #G #T #Q #IH #L #HL -@(rdsx_ind_lpxs_rdeq … IH … HL) -IH -HL // (**) (* full auto fails *) -qed-. - -(* Advanced properties ******************************************************) - -fact rdsx_bind_lpxs_aux (h) (G): - ∀p,I,L1,V. G ⊢ ⬈*[h,V] 𝐒⦃L1⦄ → - ∀Y,T. G ⊢ ⬈*[h,T] 𝐒⦃Y⦄ → - ∀L2. Y = L2.ⓑ{I}V → ⦃G,L1⦄ ⊢ ⬈*[h] L2 → - G ⊢ ⬈*[h,ⓑ{p,I}V.T] 𝐒⦃L2⦄. -#h #G #p #I #L1 #V #H @(rdsx_ind_lpxs … H) -L1 -#L1 #_ #IHL1 #Y #T #H @(rdsx_ind_lpxs … H) -Y -#Y #HY #IHY #L2 #H #HL12 destruct -@rdsx_intro_lpxs #L0 #HL20 -lapply (lpxs_trans … HL12 … HL20) #HL10 #H -elim (rdneq_inv_bind … H) -H [ -IHY | -HY -IHL1 -HL12 ] -[ #HnV elim (rdeq_dec L1 L2 V) - [ #HV @(IHL1 … HL10) -IHL1 -HL12 -HL10 - /3 width=4 by rdsx_lpxs_trans, lpxs_bind_refl_dx, rdeq_canc_sn/ (**) (* full auto too slow *) - | -HnV -HL10 /4 width=4 by rdsx_lpxs_trans, lpxs_bind_refl_dx/ - ] -| /3 width=4 by lpxs_bind_refl_dx/ -] -qed-. - -(* Basic_2A1: uses: lsx_bind *) -lemma rdsx_bind (h) (G): - ∀p,I,L,V. G ⊢ ⬈*[h,V] 𝐒⦃L⦄ → - ∀T. G ⊢ ⬈*[h,T] 𝐒⦃L.ⓑ{I}V⦄ → - G ⊢ ⬈*[h,ⓑ{p,I}V.T] 𝐒⦃L⦄. -/2 width=3 by rdsx_bind_lpxs_aux/ qed. - -(* Basic_2A1: uses: lsx_flat_lpxs *) -lemma rdsx_flat_lpxs (h) (G): - ∀I,L1,V. G ⊢ ⬈*[h,V] 𝐒⦃L1⦄ → - ∀L2,T. G ⊢ ⬈*[h,T] 𝐒⦃L2⦄ → ⦃G,L1⦄ ⊢ ⬈*[h] L2 → - G ⊢ ⬈*[h,ⓕ{I}V.T] 𝐒⦃L2⦄. -#h #G #I #L1 #V #H @(rdsx_ind_lpxs … H) -L1 -#L1 #HL1 #IHL1 #L2 #T #H @(rdsx_ind_lpxs … H) -L2 -#L2 #HL2 #IHL2 #HL12 @rdsx_intro_lpxs -#L0 #HL20 lapply (lpxs_trans … HL12 … HL20) -#HL10 #H elim (rdneq_inv_flat … H) -H [ -HL1 -IHL2 | -HL2 -IHL1 ] -[ #HnV elim (rdeq_dec L1 L2 V) - [ #HV @(IHL1 … HL10) -IHL1 -HL12 -HL10 - /3 width=5 by rdsx_lpxs_trans, rdeq_canc_sn/ (**) (* full auto too slow: 47s *) - | -HnV -HL10 /3 width=4 by rdsx_lpxs_trans/ - ] -| /3 width=3 by/ -] -qed-. - -(* Basic_2A1: uses: lsx_flat *) -lemma rdsx_flat (h) (G): - ∀I,L,V. G ⊢ ⬈*[h,V] 𝐒⦃L⦄ → - ∀T. G ⊢ ⬈*[h,T] 𝐒⦃L⦄ → G ⊢ ⬈*[h,ⓕ{I}V.T] 𝐒⦃L⦄. -/2 width=3 by rdsx_flat_lpxs/ qed. - -fact rdsx_bind_lpxs_void_aux (h) (G): - ∀p,I,L1,V. G ⊢ ⬈*[h,V] 𝐒⦃L1⦄ → - ∀Y,T. G ⊢ ⬈*[h,T] 𝐒⦃Y⦄ → - ∀L2. Y = L2.ⓧ → ⦃G,L1⦄ ⊢ ⬈*[h] L2 → - G ⊢ ⬈*[h,ⓑ{p,I}V.T] 𝐒⦃L2⦄. -#h #G #p #I #L1 #V #H @(rdsx_ind_lpxs … H) -L1 -#L1 #_ #IHL1 #Y #T #H @(rdsx_ind_lpxs … H) -Y -#Y #HY #IHY #L2 #H #HL12 destruct -@rdsx_intro_lpxs #L0 #HL20 -lapply (lpxs_trans … HL12 … HL20) #HL10 #H -elim (rdneq_inv_bind_void … H) -H [ -IHY | -HY -IHL1 -HL12 ] -[ #HnV elim (rdeq_dec L1 L2 V) - [ #HV @(IHL1 … HL10) -IHL1 -HL12 -HL10 - /3 width=6 by rdsx_lpxs_trans, lpxs_bind_refl_dx, rdeq_canc_sn/ (**) (* full auto too slow *) - | -HnV -HL10 /4 width=4 by rdsx_lpxs_trans, lpxs_bind_refl_dx/ - ] -| /3 width=4 by lpxs_bind_refl_dx/ -] -qed-. - -lemma rdsx_bind_void (h) (G): - ∀p,I,L,V. G ⊢ ⬈*[h,V] 𝐒⦃L⦄ → - ∀T. G ⊢ ⬈*[h,T] 𝐒⦃L.ⓧ⦄ → - G ⊢ ⬈*[h,ⓑ{p,I}V.T] 𝐒⦃L⦄. -/2 width=3 by rdsx_bind_lpxs_void_aux/ qed. diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rdsx.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rsx.ma similarity index 62% rename from matita/matita/contribs/lambdadelta/basic_2/rt_computation/rdsx.ma rename to matita/matita/contribs/lambdadelta/basic_2/rt_computation/rsx.ma index 46b287bb9..43e4b0461 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rdsx.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rsx.ma @@ -18,23 +18,22 @@ include "basic_2/rt_transition/lpx.ma". (* STRONGLY NORMALIZING REFERRED LOCAL ENV.S FOR UNBOUND RT-TRANSITION ******) -definition rdsx (h) (G) (T): predicate lenv ≝ - SN … (lpx h G) (rdeq T). +definition rsx (h) (G) (T): predicate lenv ≝ + SN … (lpx h G) (rdeq T). interpretation "strong normalization for unbound context-sensitive parallel rt-transition on referred entries (local environment)" - 'PRedTySNStrong h T G L = (rdsx h G T L). + 'PRedTySNStrong h T G L = (rsx h G T L). (* Basic eliminators ********************************************************) (* Basic_2A1: uses: lsx_ind *) -lemma rdsx_ind (h) (G) (T): - ∀Q:predicate lenv. - (∀L1. G ⊢ ⬈*[h,T] 𝐒⦃L1⦄ → - (∀L2. ⦃G,L1⦄ ⊢ ⬈[h] L2 → (L1 ≛[T] L2 → ⊥) → Q L2) → - Q L1 - ) → - ∀L. G ⊢ ⬈*[h,T] 𝐒⦃L⦄ → Q L. +lemma rsx_ind (h) (G) (T) (Q:predicate lenv): + (∀L1. G ⊢ ⬈*[h,T] 𝐒⦃L1⦄ → + (∀L2. ⦃G,L1⦄ ⊢ ⬈[h] L2 → (L1 ≛[T] L2 → ⊥) → Q L2) → + Q L1 + ) → + ∀L. G ⊢ ⬈*[h,T] 𝐒⦃L⦄ → Q L. #h #G #T #Q #H0 #L1 #H elim H -L1 /5 width=1 by SN_intro/ qed-. @@ -42,53 +41,53 @@ qed-. (* Basic properties *********************************************************) (* Basic_2A1: uses: lsx_intro *) -lemma rdsx_intro (h) (G) (T): - ∀L1. - (∀L2. ⦃G,L1⦄ ⊢ ⬈[h] L2 → (L1 ≛[T] L2 → ⊥) → G ⊢ ⬈*[h,T] 𝐒⦃L2⦄) → - G ⊢ ⬈*[h,T] 𝐒⦃L1⦄. +lemma rsx_intro (h) (G) (T): + ∀L1. + (∀L2. ⦃G,L1⦄ ⊢ ⬈[h] L2 → (L1 ≛[T] L2 → ⊥) → G ⊢ ⬈*[h,T] 𝐒⦃L2⦄) → + G ⊢ ⬈*[h,T] 𝐒⦃L1⦄. /5 width=1 by SN_intro/ qed. (* Basic forward lemmas *****************************************************) (* Basic_2A1: uses: lsx_fwd_pair_sn lsx_fwd_bind_sn lsx_fwd_flat_sn *) -lemma rdsx_fwd_pair_sn (h) (G): - ∀I,L,V,T. G ⊢ ⬈*[h,②{I}V.T] 𝐒⦃L⦄ → - G ⊢ ⬈*[h,V] 𝐒⦃L⦄. +lemma rsx_fwd_pair_sn (h) (G): + ∀I,L,V,T. G ⊢ ⬈*[h,②{I}V.T] 𝐒⦃L⦄ → + G ⊢ ⬈*[h,V] 𝐒⦃L⦄. #h #G #I #L #V #T #H -@(rdsx_ind … H) -L #L1 #_ #IHL1 -@rdsx_intro #L2 #HL12 #HnL12 +@(rsx_ind … H) -L #L1 #_ #IHL1 +@rsx_intro #L2 #HL12 #HnL12 /4 width=3 by rdeq_fwd_pair_sn/ qed-. (* Basic_2A1: uses: lsx_fwd_flat_dx *) -lemma rdsx_fwd_flat_dx (h) (G): - ∀I,L,V,T. G ⊢ ⬈*[h,ⓕ{I}V.T] 𝐒⦃L⦄ → - G ⊢ ⬈*[h,T] 𝐒⦃L⦄. +lemma rsx_fwd_flat_dx (h) (G): + ∀I,L,V,T. G ⊢ ⬈*[h,ⓕ{I}V.T] 𝐒⦃L⦄ → + G ⊢ ⬈*[h,T] 𝐒⦃L⦄. #h #G #I #L #V #T #H -@(rdsx_ind … H) -L #L1 #_ #IHL1 -@rdsx_intro #L2 #HL12 #HnL12 +@(rsx_ind … H) -L #L1 #_ #IHL1 +@rsx_intro #L2 #HL12 #HnL12 /4 width=3 by rdeq_fwd_flat_dx/ qed-. -fact rdsx_fwd_pair_aux (h) (G): +fact rsx_fwd_pair_aux (h) (G): ∀L. G ⊢ ⬈*[h,#0] 𝐒⦃L⦄ → ∀I,K,V. L = K.ⓑ{I}V → G ⊢ ⬈*[h,V] 𝐒⦃K⦄. #h #G #L #H -@(rdsx_ind … H) -L #L1 #_ #IH #I #K1 #V #H destruct -/5 width=5 by lpx_pair, rdsx_intro, rdeq_fwd_zero_pair/ +@(rsx_ind … H) -L #L1 #_ #IH #I #K1 #V #H destruct +/5 width=5 by lpx_pair, rsx_intro, rdeq_fwd_zero_pair/ qed-. -lemma rdsx_fwd_pair (h) (G): - ∀I,K,V. G ⊢ ⬈*[h,#0] 𝐒⦃K.ⓑ{I}V⦄ → G ⊢ ⬈*[h,V] 𝐒⦃K⦄. -/2 width=4 by rdsx_fwd_pair_aux/ qed-. +lemma rsx_fwd_pair (h) (G): + ∀I,K,V. G ⊢ ⬈*[h,#0] 𝐒⦃K.ⓑ{I}V⦄ → G ⊢ ⬈*[h,V] 𝐒⦃K⦄. +/2 width=4 by rsx_fwd_pair_aux/ qed-. (* Basic inversion lemmas ***************************************************) (* Basic_2A1: uses: lsx_inv_flat *) -lemma rdsx_inv_flat (h) (G): +lemma rsx_inv_flat (h) (G): ∀I,L,V,T. G ⊢ ⬈*[h,ⓕ{I}V.T] 𝐒⦃L⦄ → ∧∧ G ⊢ ⬈*[h,V] 𝐒⦃L⦄ & G ⊢ ⬈*[h,T] 𝐒⦃L⦄. -/3 width=3 by rdsx_fwd_pair_sn, rdsx_fwd_flat_dx, conj/ qed-. +/3 width=3 by rsx_fwd_pair_sn, rsx_fwd_flat_dx, conj/ qed-. (* Basic_2A1: removed theorems 9: lsx_ge_up lsx_ge diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rdsx_csx.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rsx_csx.ma similarity index 63% rename from matita/matita/contribs/lambdadelta/basic_2/rt_computation/rdsx_csx.ma rename to matita/matita/contribs/lambdadelta/basic_2/rt_computation/rsx_csx.ma index f6c85a089..64eeba55e 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rdsx_csx.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rsx_csx.ma @@ -14,59 +14,60 @@ include "basic_2/rt_computation/csx_lsubr.ma". include "basic_2/rt_computation/csx_cpxs.ma". -include "basic_2/rt_computation/lsubsx_rdsx.ma". +include "basic_2/rt_computation/jsx_rsx.ma". (* STRONGLY NORMALIZING REFERRED LOCAL ENV.S FOR UNBOUND RT-TRANSITION ******) (* Advanced properties ******************************************************) +(* Note: swapping the eliminations to avoid rsx_cpx_trans: no solution found *) (* Basic_2A1: uses: lsx_lref_be_lpxs *) -lemma rdsx_pair_lpxs (h) (G): - ∀K1,V. ⦃G,K1⦄ ⊢ ⬈*[h] 𝐒⦃V⦄ → - ∀K2. G ⊢ ⬈*[h,V] 𝐒⦃K2⦄ → ⦃G,K1⦄ ⊢ ⬈*[h] K2 → - ∀I. G ⊢ ⬈*[h,#0] 𝐒⦃K2.ⓑ{I}V⦄. +lemma rsx_pair_lpxs (h) (G): + ∀K1,V. ⦃G,K1⦄ ⊢ ⬈*[h] 𝐒⦃V⦄ → + ∀K2. G ⊢ ⬈*[h,V] 𝐒⦃K2⦄ → ⦃G,K1⦄ ⊢ ⬈*[h] K2 → + ∀I. G ⊢ ⬈*[h,#0] 𝐒⦃K2.ⓑ{I}V⦄. #h #G #K1 #V #H @(csx_ind_cpxs … H) -V #V0 #_ #IHV0 #K2 #H -@(rdsx_ind … H) -K2 #K0 #HK0 #IHK0 #HK10 #I -@rdsx_intro #Y #HY #HnY +@(rsx_ind … H) -K2 #K0 #HK0 #IHK0 #HK10 #I +@rsx_intro #Y #HY #HnY elim (lpx_inv_pair_sn … HY) -HY #K2 #V2 #HK02 #HV02 #H destruct elim (tdeq_dec V0 V2) #HnV02 destruct [ -IHV0 -HV02 -HK0 | -IHK0 -HnY ] -[ /5 width=5 by rdsx_rdeq_trans, lpxs_step_dx, rdeq_pair/ +[ /5 width=5 by rsx_rdeq_trans, lpxs_step_dx, rdeq_pair/ | @(IHV0 … HnV02) -IHV0 -HnV02 [ /2 width=3 by lpxs_cpx_trans/ - | /3 width=3 by rdsx_lpx_trans, rdsx_cpx_trans/ + | /3 width=3 by rsx_lpx_trans, rsx_cpx_trans/ | /2 width=3 by lpxs_step_dx/ ] ] qed. (* Basic_2A1: uses: lsx_lref_be *) -lemma rdsx_lref_pair_drops (h) (G): - ∀K,V. ⦃G,K⦄ ⊢ ⬈*[h] 𝐒⦃V⦄ → G ⊢ ⬈*[h,V] 𝐒⦃K⦄ → - ∀I,i,L. ⬇*[i] L ≘ K.ⓑ{I}V → G ⊢ ⬈*[h,#i] 𝐒⦃L⦄. +lemma rsx_lref_pair_drops (h) (G): + ∀K,V. ⦃G,K⦄ ⊢ ⬈*[h] 𝐒⦃V⦄ → G ⊢ ⬈*[h,V] 𝐒⦃K⦄ → + ∀I,i,L. ⬇*[i] L ≘ K.ⓑ{I}V → G ⊢ ⬈*[h,#i] 𝐒⦃L⦄. #h #G #K #V #HV #HK #I #i elim i -i -[ #L #H >(drops_fwd_isid … H) -H /2 width=3 by rdsx_pair_lpxs/ +[ #L #H >(drops_fwd_isid … H) -H /2 width=3 by rsx_pair_lpxs/ | #i #IH #L #H elim (drops_inv_bind2_isuni_next … H) -H // #J #Y #HY #H destruct - @(rdsx_lifts … (𝐔❴1❵)) /3 width=6 by drops_refl, drops_drop/ (**) (* full auto fails *) + @(rsx_lifts … (𝐔❴1❵)) /3 width=6 by drops_refl, drops_drop/ (**) (* full auto fails *) ] qed. (* Main properties **********************************************************) (* Basic_2A1: uses: csx_lsx *) -theorem csx_rdsx (h): ∀G,L,T. ⦃G,L⦄ ⊢ ⬈*[h] 𝐒⦃T⦄ → G ⊢ ⬈*[h,T] 𝐒⦃L⦄. +theorem csx_rsx (h): ∀G,L,T. ⦃G,L⦄ ⊢ ⬈*[h] 𝐒⦃T⦄ → G ⊢ ⬈*[h,T] 𝐒⦃L⦄. #h #G #L #T @(fqup_wf_ind_eq (Ⓕ) … G L T) -G -L -T #Z #Y #X #IH #G #L * * // [ #i #HG #HL #HT #H destruct elim (csx_inv_lref … H) -H [ |*: * ] - [ /2 width=1 by rdsx_lref_atom/ - | /2 width=3 by rdsx_lref_unit/ - | /4 width=6 by rdsx_lref_pair_drops, fqup_lref/ + [ /2 width=1 by rsx_lref_atom/ + | /2 width=3 by rsx_lref_unit/ + | /4 width=6 by rsx_lref_pair_drops, fqup_lref/ ] | #p #I #V #T #HG #HL #HT #H destruct - elim (csx_fwd_bind_unit … H Void) -H /3 width=1 by rdsx_bind_void/ + elim (csx_fwd_bind_unit … H Void) -H /3 width=1 by rsx_bind_void/ | #I #V #T #HG #HL #HT #H destruct - elim (csx_fwd_flat … H) -H /3 width=1 by rdsx_flat/ + elim (csx_fwd_flat … H) -H /3 width=1 by rsx_flat/ ] qed. diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rdsx_drops.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rsx_drops.ma similarity index 67% rename from matita/matita/contribs/lambdadelta/basic_2/rt_computation/rdsx_drops.ma rename to matita/matita/contribs/lambdadelta/basic_2/rt_computation/rsx_drops.ma index 3c1c6ac7e..80cc2f1f7 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rdsx_drops.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rsx_drops.ma @@ -14,8 +14,8 @@ include "static_2/static/rdeq_drops.ma". include "basic_2/rt_transition/lpx_drops.ma". -include "basic_2/rt_computation/rdsx_length.ma". -include "basic_2/rt_computation/rdsx_fqup.ma". +include "basic_2/rt_computation/rsx_length.ma". +include "basic_2/rt_computation/rsx_fqup.ma". (* STRONGLY NORMALIZING REFERRED LOCAL ENV.S FOR UNBOUND RT-TRANSITION ******) @@ -23,9 +23,9 @@ include "basic_2/rt_computation/rdsx_fqup.ma". (* Note: this uses length *) (* Basic_2A1: uses: lsx_lift_le lsx_lift_ge *) -lemma rdsx_lifts (h) (G): d_liftable1_isuni … (λL,T. G ⊢ ⬈*[h,T] 𝐒⦃L⦄). -#h #G #K #T #H @(rdsx_ind … H) -K -#K1 #_ #IH #b #f #L1 #HLK1 #Hf #U #HTU @rdsx_intro +lemma rsx_lifts (h) (G): d_liftable1_isuni … (λL,T. G ⊢ ⬈*[h,T] 𝐒⦃L⦄). +#h #G #K #T #H @(rsx_ind … H) -K +#K1 #_ #IH #b #f #L1 #HLK1 #Hf #U #HTU @rsx_intro #L2 #HL12 #HnL12 elim (lpx_drops_conf … HLK1 … HL12) /5 width=9 by rdeq_lifts_bi, lpx_fwd_length/ qed-. @@ -33,9 +33,9 @@ qed-. (* Inversion lemmas on relocation *******************************************) (* Basic_2A1: uses: lsx_inv_lift_le lsx_inv_lift_be lsx_inv_lift_ge *) -lemma rdsx_inv_lifts (h) (G): d_deliftable1_isuni … (λL,T. G ⊢ ⬈*[h,T] 𝐒⦃L⦄). -#h #G #L #U #H @(rdsx_ind … H) -L -#L1 #_ #IH #b #f #K1 #HLK1 #Hf #T #HTU @rdsx_intro +lemma rsx_inv_lifts (h) (G): d_deliftable1_isuni … (λL,T. G ⊢ ⬈*[h,T] 𝐒⦃L⦄). +#h #G #L #U #H @(rsx_ind … H) -L +#L1 #_ #IH #b #f #K1 #HLK1 #Hf #T #HTU @rsx_intro #K2 #HK12 #HnK12 elim (drops_lpx_trans … HLK1 … HK12) -HK12 /4 width=10 by rdeq_inv_lifts_bi/ qed-. @@ -43,24 +43,24 @@ qed-. (* Advanced properties ******************************************************) (* Basic_2A1: uses: lsx_lref_free *) -lemma rdsx_lref_atom (h) (G): ∀L,i. ⬇*[Ⓕ,𝐔❴i❵] L ≘ ⋆ → G ⊢ ⬈*[h,#i] 𝐒⦃L⦄. +lemma rsx_lref_atom (h) (G): ∀L,i. ⬇*[Ⓕ,𝐔❴i❵] L ≘ ⋆ → G ⊢ ⬈*[h,#i] 𝐒⦃L⦄. #h #G #L1 #i #HL1 -@(rdsx_lifts … (#0) … HL1) -HL1 // +@(rsx_lifts … (#0) … HL1) -HL1 // qed. (* Basic_2A1: uses: lsx_lref_skip *) -lemma rdsx_lref_unit (h) (G): ∀I,L,K,i. ⬇*[i] L ≘ K.ⓤ{I} → G ⊢ ⬈*[h,#i] 𝐒⦃L⦄. +lemma rsx_lref_unit (h) (G): ∀I,L,K,i. ⬇*[i] L ≘ K.ⓤ{I} → G ⊢ ⬈*[h,#i] 𝐒⦃L⦄. #h #G #I #L1 #K1 #i #HL1 -@(rdsx_lifts … (#0) … HL1) -HL1 // +@(rsx_lifts … (#0) … HL1) -HL1 // qed. (* Advanced forward lemmas **************************************************) (* Basic_2A1: uses: lsx_fwd_lref_be *) -lemma rdsx_fwd_lref_pair (h) (G): - ∀L,i. G ⊢ ⬈*[h,#i] 𝐒⦃L⦄ → - ∀I,K,V. ⬇*[i] L ≘ K.ⓑ{I}V → G ⊢ ⬈*[h,V] 𝐒⦃K⦄. +lemma rsx_fwd_lref_pair (h) (G): + ∀L,i. G ⊢ ⬈*[h,#i] 𝐒⦃L⦄ → + ∀I,K,V. ⬇*[i] L ≘ K.ⓑ{I}V → G ⊢ ⬈*[h,V] 𝐒⦃K⦄. #h #G #L #i #HL #I #K #V #HLK -lapply (rdsx_inv_lifts … HL … HLK … (#0) ?) -L -/2 width=2 by rdsx_fwd_pair/ +lapply (rsx_inv_lifts … HL … HLK … (#0) ?) -L +/2 width=2 by rsx_fwd_pair/ qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rdsx_fqup.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rsx_fqup.ma similarity index 84% rename from matita/matita/contribs/lambdadelta/basic_2/rt_computation/rdsx_fqup.ma rename to matita/matita/contribs/lambdadelta/basic_2/rt_computation/rsx_fqup.ma index 38293606c..b41e150fe 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rdsx_fqup.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rsx_fqup.ma @@ -13,7 +13,7 @@ (**************************************************************************) include "static_2/static/rdeq_fqup.ma". -include "basic_2/rt_computation/rdsx.ma". +include "basic_2/rt_computation/rsx.ma". (* STRONGLY NORMALIZING REFERRED LOCAL ENV.S FOR UNBOUND RT-TRANSITION ******) @@ -22,7 +22,7 @@ include "basic_2/rt_computation/rdsx.ma". (* Basic_2A1: uses: lsx_atom *) lemma lfsx_atom (h) (G) (T): G ⊢ ⬈*[h,T] 𝐒⦃⋆⦄. #h #G #T -@rdsx_intro #Y #H #HnT +@rsx_intro #Y #H #HnT lapply (lpx_inv_atom_sn … H) -H #H destruct elim HnT -HnT // qed. @@ -32,12 +32,11 @@ qed. (* Basic_2A1: uses: lsx_fwd_bind_dx *) (* Note: the exclusion binder (ⓧ) makes this more elegant and much simpler *) (* Note: the old proof without the exclusion binder requires lreq *) -lemma rdsx_fwd_bind_dx (h) (G): - ∀p,I,L,V,T. G ⊢ ⬈*[h,ⓑ{p,I}V.T] 𝐒⦃L⦄ → - G ⊢ ⬈*[h,T] 𝐒⦃L.ⓧ⦄. +lemma rsx_fwd_bind_dx_void (h) (G): + ∀p,I,L,V,T. G ⊢ ⬈*[h,ⓑ{p,I}V.T] 𝐒⦃L⦄ → G ⊢ ⬈*[h,T] 𝐒⦃L.ⓧ⦄. #h #G #p #I #L #V #T #H -@(rdsx_ind … H) -L #L1 #_ #IH -@rdsx_intro #Y #H #HT +@(rsx_ind … H) -L #L1 #_ #IH +@rsx_intro #Y #H #HT elim (lpx_inv_unit_sn … H) -H #L2 #HL12 #H destruct /4 width=4 by rdeq_fwd_bind_dx_void/ qed-. @@ -45,7 +44,7 @@ qed-. (* Advanced inversion lemmas ************************************************) (* Basic_2A1: uses: lsx_inv_bind *) -lemma rdsx_inv_bind (h) (G): +lemma rsx_inv_bind_void (h) (G): ∀p,I,L,V,T. G ⊢ ⬈*[h,ⓑ{p,I}V.T] 𝐒⦃L⦄ → ∧∧ G ⊢ ⬈*[h,V] 𝐒⦃L⦄ & G ⊢ ⬈*[h,T] 𝐒⦃L.ⓧ⦄. -/3 width=4 by rdsx_fwd_pair_sn, rdsx_fwd_bind_dx, conj/ qed-. +/3 width=4 by rsx_fwd_pair_sn, rsx_fwd_bind_dx_void, conj/ qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rdsx_length.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rsx_length.ma similarity index 82% rename from matita/matita/contribs/lambdadelta/basic_2/rt_computation/rdsx_length.ma rename to matita/matita/contribs/lambdadelta/basic_2/rt_computation/rsx_length.ma index 75177be45..ae3d76915 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rdsx_length.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rsx_length.ma @@ -14,26 +14,26 @@ include "static_2/static/rdeq_length.ma". include "basic_2/rt_transition/lpx_length.ma". -include "basic_2/rt_computation/rdsx.ma". +include "basic_2/rt_computation/rsx.ma". (* STRONGLY NORMALIZING REFERRED LOCAL ENV.S FOR UNBOUND RT-TRANSITION ******) (* Advanced properties ******************************************************) (* Basic_2A1: uses: lsx_sort *) -lemma rdsx_sort (h) (G): ∀L,s. G ⊢ ⬈*[h,⋆s] 𝐒⦃L⦄. -#h #G #L1 #s @rdsx_intro #L2 #H #Hs +lemma rsx_sort (h) (G): ∀L,s. G ⊢ ⬈*[h,⋆s] 𝐒⦃L⦄. +#h #G #L1 #s @rsx_intro #L2 #H #Hs elim Hs -Hs /3 width=3 by lpx_fwd_length, rdeq_sort_length/ qed. (* Basic_2A1: uses: lsx_gref *) -lemma rdsx_gref (h) (G): ∀L,l. G ⊢ ⬈*[h,§l] 𝐒⦃L⦄. -#h #G #L1 #s @rdsx_intro #L2 #H #Hs +lemma rsx_gref (h) (G): ∀L,l. G ⊢ ⬈*[h,§l] 𝐒⦃L⦄. +#h #G #L1 #s @rsx_intro #L2 #H #Hs elim Hs -Hs /3 width=3 by lpx_fwd_length, rdeq_gref_length/ qed. -lemma rdsx_unit (h) (G): ∀I,L. G ⊢ ⬈*[h,#0] 𝐒⦃L.ⓤ{I}⦄. -#h #G #I #L1 @rdsx_intro +lemma rsx_unit (h) (G): ∀I,L. G ⊢ ⬈*[h,#0] 𝐒⦃L.ⓤ{I}⦄. +#h #G #I #L1 @rsx_intro #Y #HY #HnY elim HnY -HnY elim (lpx_inv_unit_sn … HY) -HY #L2 #HL12 #H destruct /3 width=3 by lpx_fwd_length, rdeq_unit_length/ diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rsx_lpxs.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rsx_lpxs.ma new file mode 100644 index 000000000..9598d49d0 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rsx_lpxs.ma @@ -0,0 +1,152 @@ +(**************************************************************************) +(* ___ *) +(* ||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 "basic_2/rt_computation/lpxs_rdeq.ma". +include "basic_2/rt_computation/lpxs_lpxs.ma". +include "basic_2/rt_computation/rsx_rsx.ma". + +(* STRONGLY NORMALIZING REFERRED LOCAL ENV.S FOR UNBOUND RT-TRANSITION ******) + +(* Properties with unbound rt-computation for full local environments *******) + +(* Basic_2A1: uses: lsx_intro_alt *) +lemma rsx_intro_lpxs (h) (G): + ∀L1,T. (∀L2. ⦃G,L1⦄ ⊢ ⬈*[h] L2 → (L1 ≛[T] L2 → ⊥) → G ⊢ ⬈*[h,T] 𝐒⦃L2⦄) → + G ⊢ ⬈*[h,T] 𝐒⦃L1⦄. +/4 width=1 by lpx_lpxs, rsx_intro/ qed-. + +(* Basic_2A1: uses: lsx_lpxs_trans *) +lemma rsx_lpxs_trans (h) (G): + ∀L1,T. G ⊢ ⬈*[h,T] 𝐒⦃L1⦄ → + ∀L2. ⦃G,L1⦄ ⊢ ⬈*[h] L2 → G ⊢ ⬈*[h,T] 𝐒⦃L2⦄. +#h #G #L1 #T #HL1 #L2 #H @(lpxs_ind_dx … H) -L2 +/2 width=3 by rsx_lpx_trans/ +qed-. + +(* Eliminators with unbound rt-computation for full local environments ******) + +lemma rsx_ind_lpxs_rdeq (h) (G) (T) (Q:predicate lenv): + (∀L1. G ⊢ ⬈*[h,T] 𝐒⦃L1⦄ → + (∀L2. ⦃G,L1⦄ ⊢ ⬈*[h] L2 → (L1 ≛[T] L2 → ⊥) → Q L2) → + Q L1 + ) → + ∀L1. G ⊢ ⬈*[h,T] 𝐒⦃L1⦄ → + ∀L0. ⦃G,L1⦄ ⊢ ⬈*[h] L0 → ∀L2. L0 ≛[T] L2 → Q L2. +#h #G #T #Q #IH #L1 #H @(rsx_ind … H) -L1 +#L1 #HL1 #IH1 #L0 #HL10 #L2 #HL02 +@IH -IH /3 width=3 by rsx_lpxs_trans, rsx_rdeq_trans/ -HL1 #K2 #HLK2 #HnLK2 +lapply (rdeq_rdneq_trans … HL02 … HnLK2) -HnLK2 #H +elim (rdeq_lpxs_trans … HLK2 … HL02) -L2 #K0 #HLK0 #HK02 +lapply (rdneq_rdeq_canc_dx … H … HK02) -H #HnLK0 +elim (rdeq_dec L1 L0 T) #H +[ lapply (rdeq_rdneq_trans … H … HnLK0) -H -HnLK0 #Hn10 + lapply (lpxs_trans … HL10 … HLK0) -L0 #H10 + elim (lpxs_rdneq_inv_step_sn … H10 … Hn10) -H10 -Hn10 + /3 width=8 by rdeq_trans/ +| elim (lpxs_rdneq_inv_step_sn … HL10 … H) -HL10 -H #L #K #HL1 #HnL1 #HLK #HKL0 + elim (rdeq_lpxs_trans … HLK0 … HKL0) -L0 + /3 width=8 by lpxs_trans, rdeq_trans/ +] +qed-. + +(* Basic_2A1: uses: lsx_ind_alt *) +lemma rsx_ind_lpxs (h) (G) (T) (Q:predicate lenv): + (∀L1. G ⊢ ⬈*[h,T] 𝐒⦃L1⦄ → + (∀L2. ⦃G,L1⦄ ⊢ ⬈*[h] L2 → (L1 ≛[T] L2 → ⊥) → Q L2) → + Q L1 + ) → + ∀L. G ⊢ ⬈*[h,T] 𝐒⦃L⦄ → Q L. +#h #G #T #Q #IH #L #HL +@(rsx_ind_lpxs_rdeq … IH … HL) -IH -HL // (**) (* full auto fails *) +qed-. + +(* Advanced properties ******************************************************) + +fact rsx_bind_lpxs_aux (h) (G): + ∀p,I,L1,V. G ⊢ ⬈*[h,V] 𝐒⦃L1⦄ → + ∀Y,T. G ⊢ ⬈*[h,T] 𝐒⦃Y⦄ → + ∀L2. Y = L2.ⓑ{I}V → ⦃G,L1⦄ ⊢ ⬈*[h] L2 → + G ⊢ ⬈*[h,ⓑ{p,I}V.T] 𝐒⦃L2⦄. +#h #G #p #I #L1 #V #H @(rsx_ind_lpxs … H) -L1 +#L1 #_ #IHL1 #Y #T #H @(rsx_ind_lpxs … H) -Y +#Y #HY #IHY #L2 #H #HL12 destruct +@rsx_intro_lpxs #L0 #HL20 +lapply (lpxs_trans … HL12 … HL20) #HL10 #H +elim (rdneq_inv_bind … H) -H [ -IHY | -HY -IHL1 -HL12 ] +[ #HnV elim (rdeq_dec L1 L2 V) + [ #HV @(IHL1 … HL10) -IHL1 -HL12 -HL10 + /3 width=4 by rsx_lpxs_trans, lpxs_bind_refl_dx, rdeq_canc_sn/ (**) (* full auto too slow *) + | -HnV -HL10 /4 width=4 by rsx_lpxs_trans, lpxs_bind_refl_dx/ + ] +| /3 width=4 by lpxs_bind_refl_dx/ +] +qed-. + +(* Basic_2A1: uses: lsx_bind *) +lemma rsx_bind (h) (G): + ∀p,I,L,V. G ⊢ ⬈*[h,V] 𝐒⦃L⦄ → + ∀T. G ⊢ ⬈*[h,T] 𝐒⦃L.ⓑ{I}V⦄ → + G ⊢ ⬈*[h,ⓑ{p,I}V.T] 𝐒⦃L⦄. +/2 width=3 by rsx_bind_lpxs_aux/ qed. + +(* Basic_2A1: uses: lsx_flat_lpxs *) +lemma rsx_flat_lpxs (h) (G): + ∀I,L1,V. G ⊢ ⬈*[h,V] 𝐒⦃L1⦄ → + ∀L2,T. G ⊢ ⬈*[h,T] 𝐒⦃L2⦄ → ⦃G,L1⦄ ⊢ ⬈*[h] L2 → + G ⊢ ⬈*[h,ⓕ{I}V.T] 𝐒⦃L2⦄. +#h #G #I #L1 #V #H @(rsx_ind_lpxs … H) -L1 +#L1 #HL1 #IHL1 #L2 #T #H @(rsx_ind_lpxs … H) -L2 +#L2 #HL2 #IHL2 #HL12 @rsx_intro_lpxs +#L0 #HL20 lapply (lpxs_trans … HL12 … HL20) +#HL10 #H elim (rdneq_inv_flat … H) -H [ -HL1 -IHL2 | -HL2 -IHL1 ] +[ #HnV elim (rdeq_dec L1 L2 V) + [ #HV @(IHL1 … HL10) -IHL1 -HL12 -HL10 + /3 width=5 by rsx_lpxs_trans, rdeq_canc_sn/ (**) (* full auto too slow: 47s *) + | -HnV -HL10 /3 width=4 by rsx_lpxs_trans/ + ] +| /3 width=3 by/ +] +qed-. + +(* Basic_2A1: uses: lsx_flat *) +lemma rsx_flat (h) (G): + ∀I,L,V. G ⊢ ⬈*[h,V] 𝐒⦃L⦄ → + ∀T. G ⊢ ⬈*[h,T] 𝐒⦃L⦄ → G ⊢ ⬈*[h,ⓕ{I}V.T] 𝐒⦃L⦄. +/2 width=3 by rsx_flat_lpxs/ qed. + +fact rsx_bind_lpxs_void_aux (h) (G): + ∀p,I,L1,V. G ⊢ ⬈*[h,V] 𝐒⦃L1⦄ → + ∀Y,T. G ⊢ ⬈*[h,T] 𝐒⦃Y⦄ → + ∀L2. Y = L2.ⓧ → ⦃G,L1⦄ ⊢ ⬈*[h] L2 → + G ⊢ ⬈*[h,ⓑ{p,I}V.T] 𝐒⦃L2⦄. +#h #G #p #I #L1 #V #H @(rsx_ind_lpxs … H) -L1 +#L1 #_ #IHL1 #Y #T #H @(rsx_ind_lpxs … H) -Y +#Y #HY #IHY #L2 #H #HL12 destruct +@rsx_intro_lpxs #L0 #HL20 +lapply (lpxs_trans … HL12 … HL20) #HL10 #H +elim (rdneq_inv_bind_void … H) -H [ -IHY | -HY -IHL1 -HL12 ] +[ #HnV elim (rdeq_dec L1 L2 V) + [ #HV @(IHL1 … HL10) -IHL1 -HL12 -HL10 + /3 width=6 by rsx_lpxs_trans, lpxs_bind_refl_dx, rdeq_canc_sn/ (**) (* full auto too slow *) + | -HnV -HL10 /4 width=4 by rsx_lpxs_trans, lpxs_bind_refl_dx/ + ] +| /3 width=4 by lpxs_bind_refl_dx/ +] +qed-. + +lemma rsx_bind_void (h) (G): + ∀p,I,L,V. G ⊢ ⬈*[h,V] 𝐒⦃L⦄ → + ∀T. G ⊢ ⬈*[h,T] 𝐒⦃L.ⓧ⦄ → + G ⊢ ⬈*[h,ⓑ{p,I}V.T] 𝐒⦃L⦄. +/2 width=3 by rsx_bind_lpxs_void_aux/ qed. diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rdsx_rdsx.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rsx_rsx.ma similarity index 70% rename from matita/matita/contribs/lambdadelta/basic_2/rt_computation/rdsx_rdsx.ma rename to matita/matita/contribs/lambdadelta/basic_2/rt_computation/rsx_rsx.ma index 861fe1f45..f801c96b7 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rdsx_rdsx.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_computation/rsx_rsx.ma @@ -13,26 +13,26 @@ (**************************************************************************) include "basic_2/rt_transition/lpx_rdeq.ma". -include "basic_2/rt_computation/rdsx.ma". +include "basic_2/rt_computation/rsx.ma". (* STRONGLY NORMALIZING REFERRED LOCAL ENV.S FOR UNBOUND RT-TRANSITION ******) (* Advanced properties ******************************************************) (* Basic_2A1: uses: lsx_lleq_trans *) -lemma rdsx_rdeq_trans (h) (G): - ∀L1,T. G ⊢ ⬈*[h,T] 𝐒⦃L1⦄ → - ∀L2. L1 ≛[T] L2 → G ⊢ ⬈*[h,T] 𝐒⦃L2⦄. -#h #G #L1 #T #H @(rdsx_ind … H) -L1 -#L1 #_ #IHL1 #L2 #HL12 @rdsx_intro +lemma rsx_rdeq_trans (h) (G): + ∀L1,T. G ⊢ ⬈*[h,T] 𝐒⦃L1⦄ → + ∀L2. L1 ≛[T] L2 → G ⊢ ⬈*[h,T] 𝐒⦃L2⦄. +#h #G #L1 #T #H @(rsx_ind … H) -L1 +#L1 #_ #IHL1 #L2 #HL12 @rsx_intro #L #HL2 #HnL2 elim (rdeq_lpx_trans … HL2 … HL12) -HL2 /4 width=5 by rdeq_repl/ qed-. (* Basic_2A1: uses: lsx_lpx_trans *) -lemma rdsx_lpx_trans (h) (G): - ∀L1,T. G ⊢ ⬈*[h,T] 𝐒⦃L1⦄ → - ∀L2. ⦃G,L1⦄ ⊢ ⬈[h] L2 → G ⊢ ⬈*[h,T] 𝐒⦃L2⦄. -#h #G #L1 #T #H @(rdsx_ind … H) -L1 #L1 #HL1 #IHL1 #L2 #HL12 -elim (rdeq_dec L1 L2 T) /3 width=4 by rdsx_rdeq_trans/ +lemma rsx_lpx_trans (h) (G): + ∀L1,T. G ⊢ ⬈*[h,T] 𝐒⦃L1⦄ → + ∀L2. ⦃G,L1⦄ ⊢ ⬈[h] L2 → G ⊢ ⬈*[h,T] 𝐒⦃L2⦄. +#h #G #L1 #T #H @(rsx_ind … H) -L1 #L1 #HL1 #IHL1 #L2 #HL12 +elim (rdeq_dec L1 L2 T) /3 width=4 by rsx_rdeq_trans/ qed-. diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_transition/cpx_fqus.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_transition/cpx_fqus.ma index ca625dd1b..7cddd25cd 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_transition/cpx_fqus.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_transition/cpx_fqus.ma @@ -21,9 +21,9 @@ include "basic_2/rt_transition/cpx_lsubr.ma". (* Properties on supclosure *************************************************) -lemma fqu_cpx_trans: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2⦄ → +lemma fqu_cpx_trans: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂[b] ⦃G2,L2,T2⦄ → ∀U2. ⦃G2,L2⦄ ⊢ T2 ⬈[h] U2 → - ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈[h] U1 & ⦃G1,L1,U1⦄ ⊐[b] ⦃G2,L2,U2⦄. + ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈[h] U1 & ⦃G1,L1,U1⦄ ⬂[b] ⦃G2,L2,U2⦄. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H elim H -G1 -G2 -L1 -L2 -T1 -T2 /3 width=3 by cpx_pair_sn, cpx_bind, cpx_flat, fqu_pair_sn, fqu_bind_dx, fqu_flat_dx, ex2_intro/ [ #I #G #L2 #V2 #X2 #HVX2 @@ -36,18 +36,18 @@ lemma fqu_cpx_trans: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2 ] qed-. -lemma fquq_cpx_trans: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐⸮[b] ⦃G2,L2,T2⦄ → +lemma fquq_cpx_trans: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂⸮[b] ⦃G2,L2,T2⦄ → ∀U2. ⦃G2,L2⦄ ⊢ T2 ⬈[h] U2 → - ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈[h] U1 & ⦃G1,L1,U1⦄ ⊐⸮[b] ⦃G2,L2,U2⦄. + ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈[h] U1 & ⦃G1,L1,U1⦄ ⬂⸮[b] ⦃G2,L2,U2⦄. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H elim H -H [ #HT12 #U2 #HTU2 elim (fqu_cpx_trans … HT12 … HTU2) /3 width=3 by fqu_fquq, ex2_intro/ | * #H1 #H2 #H3 destruct /2 width=3 by ex2_intro/ ] qed-. -lemma fqup_cpx_trans: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐+[b] ⦃G2,L2,T2⦄ → +lemma fqup_cpx_trans: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂+[b] ⦃G2,L2,T2⦄ → ∀U2. ⦃G2,L2⦄ ⊢ T2 ⬈[h] U2 → - ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈[h] U1 & ⦃G1,L1,U1⦄ ⊐+[b] ⦃G2,L2,U2⦄. + ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈[h] U1 & ⦃G1,L1,U1⦄ ⬂+[b] ⦃G2,L2,U2⦄. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H @(fqup_ind … H) -G2 -L2 -T2 [ #G2 #L2 #T2 #H12 #U2 #HTU2 elim (fqu_cpx_trans … H12 … HTU2) -T2 /3 width=3 by fqu_fqup, ex2_intro/ @@ -57,18 +57,18 @@ lemma fqup_cpx_trans: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐+[b] ⦃G2,L2, ] qed-. -lemma fqus_cpx_trans: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐*[b] ⦃G2,L2,T2⦄ → +lemma fqus_cpx_trans: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂*[b] ⦃G2,L2,T2⦄ → ∀U2. ⦃G2,L2⦄ ⊢ T2 ⬈[h] U2 → - ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈[h] U1 & ⦃G1,L1,U1⦄ ⊐*[b] ⦃G2,L2,U2⦄. + ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈[h] U1 & ⦃G1,L1,U1⦄ ⬂*[b] ⦃G2,L2,U2⦄. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H elim (fqus_inv_fqup … H) -H [ #HT12 #U2 #HTU2 elim (fqup_cpx_trans … HT12 … HTU2) /3 width=3 by fqup_fqus, ex2_intro/ | * #H1 #H2 #H3 destruct /2 width=3 by ex2_intro/ ] qed-. -lemma fqu_cpx_trans_tdneq: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2⦄ → +lemma fqu_cpx_trans_tdneq: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂[b] ⦃G2,L2,T2⦄ → ∀U2. ⦃G2,L2⦄ ⊢ T2 ⬈[h] U2 → (T2 ≛ U2 → ⊥) → - ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈[h] U1 & T1 ≛ U1 → ⊥ & ⦃G1,L1,U1⦄ ⊐[b] ⦃G2,L2,U2⦄. + ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈[h] U1 & T1 ≛ U1 → ⊥ & ⦃G1,L1,U1⦄ ⬂[b] ⦃G2,L2,U2⦄. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H elim H -G1 -G2 -L1 -L2 -T1 -T2 [ #I #G #L #V1 #V2 #HV12 #_ elim (lifts_total V2 𝐔❴1❵) #U2 #HVU2 @(ex3_intro … U2) @@ -80,7 +80,7 @@ lemma fqu_cpx_trans_tdneq: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2 [1,3: /2 width=4 by fqu_pair_sn, cpx_pair_sn/ | #H elim (tdeq_inv_pair … H) -H /2 width=1 by/ ] -| #p #I #G #L #V #T1 #T2 #HT12 #H0 @(ex3_intro … (ⓑ{p,I}V.T2)) +| #p #I #G #L #V #T1 #Hb #T2 #HT12 #H0 @(ex3_intro … (ⓑ{p,I}V.T2)) [1,3: /2 width=4 by fqu_bind_dx, cpx_bind/ | #H elim (tdeq_inv_pair … H) -H /2 width=1 by/ ] @@ -98,9 +98,9 @@ lemma fqu_cpx_trans_tdneq: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2 ] qed-. -lemma fquq_cpx_trans_tdneq: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐⸮[b] ⦃G2,L2,T2⦄ → +lemma fquq_cpx_trans_tdneq: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂⸮[b] ⦃G2,L2,T2⦄ → ∀U2. ⦃G2,L2⦄ ⊢ T2 ⬈[h] U2 → (T2 ≛ U2 → ⊥) → - ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈[h] U1 & T1 ≛ U1 → ⊥ & ⦃G1,L1,U1⦄ ⊐⸮[b] ⦃G2,L2,U2⦄. + ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈[h] U1 & T1 ≛ U1 → ⊥ & ⦃G1,L1,U1⦄ ⬂⸮[b] ⦃G2,L2,U2⦄. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H12 elim H12 -H12 [ #H12 #U2 #HTU2 #H elim (fqu_cpx_trans_tdneq … H12 … HTU2 H) -T2 /3 width=4 by fqu_fquq, ex3_intro/ @@ -108,9 +108,9 @@ lemma fquq_cpx_trans_tdneq: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐⸮[b] ] qed-. -lemma fqup_cpx_trans_tdneq: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐+[b] ⦃G2,L2,T2⦄ → +lemma fqup_cpx_trans_tdneq: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂+[b] ⦃G2,L2,T2⦄ → ∀U2. ⦃G2,L2⦄ ⊢ T2 ⬈[h] U2 → (T2 ≛ U2 → ⊥) → - ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈[h] U1 & T1 ≛ U1 → ⊥ & ⦃G1,L1,U1⦄ ⊐+[b] ⦃G2,L2,U2⦄. + ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈[h] U1 & T1 ≛ U1 → ⊥ & ⦃G1,L1,U1⦄ ⬂+[b] ⦃G2,L2,U2⦄. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H @(fqup_ind_dx … H) -G1 -L1 -T1 [ #G1 #L1 #T1 #H12 #U2 #HTU2 #H elim (fqu_cpx_trans_tdneq … H12 … HTU2 H) -T2 /3 width=4 by fqu_fqup, ex3_intro/ @@ -120,9 +120,9 @@ lemma fqup_cpx_trans_tdneq: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐+[b] ⦃ ] qed-. -lemma fqus_cpx_trans_tdneq: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐*[b] ⦃G2,L2,T2⦄ → +lemma fqus_cpx_trans_tdneq: ∀h,b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂*[b] ⦃G2,L2,T2⦄ → ∀U2. ⦃G2,L2⦄ ⊢ T2 ⬈[h] U2 → (T2 ≛ U2 → ⊥) → - ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈[h] U1 & T1 ≛ U1 → ⊥ & ⦃G1,L1,U1⦄ ⊐*[b] ⦃G2,L2,U2⦄. + ∃∃U1. ⦃G1,L1⦄ ⊢ T1 ⬈[h] U1 & T1 ≛ U1 → ⊥ & ⦃G1,L1,U1⦄ ⬂*[b] ⦃G2,L2,U2⦄. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H12 #U2 #HTU2 #H elim (fqus_inv_fqup … H12) -H12 [ #H12 elim (fqup_cpx_trans_tdneq … H12 … HTU2 H) -T2 /3 width=4 by fqup_fqus, ex3_intro/ diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_transition/fpb.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_transition/fpb.ma index 5cfee0413..8c0702056 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_transition/fpb.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_transition/fpb.ma @@ -20,7 +20,7 @@ include "basic_2/rt_transition/lpr_lpx.ma". (* PROPER PARALLEL RST-TRANSITION FOR CLOSURES ******************************) inductive fpb (h) (G1) (L1) (T1): relation3 genv lenv term ≝ -| fpb_fqu: ∀G2,L2,T2. ⦃G1,L1,T1⦄ ⊐ ⦃G2,L2,T2⦄ → fpb h G1 L1 T1 G2 L2 T2 +| fpb_fqu: ∀G2,L2,T2. ⦃G1,L1,T1⦄ ⬂ ⦃G2,L2,T2⦄ → fpb h G1 L1 T1 G2 L2 T2 | fpb_cpx: ∀T2. ⦃G1,L1⦄ ⊢ T1 ⬈[h] T2 → (T1 ≛ T2 → ⊥) → fpb h G1 L1 T1 G1 L1 T2 | fpb_lpx: ∀L2. ⦃G1,L1⦄ ⊢ ⬈[h] L2 → (L1 ≛[T1] L2 → ⊥) → fpb h G1 L1 T1 G1 L2 T1 . diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_transition/fpbq.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_transition/fpbq.ma index c50a6b2b4..690e8ff32 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_transition/fpbq.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_transition/fpbq.ma @@ -21,7 +21,7 @@ include "basic_2/rt_transition/lpr_lpx.ma". (* Basic_2A1: includes: fleq_fpbq fpbq_lleq *) inductive fpbq (h) (G1) (L1) (T1): relation3 genv lenv term ≝ -| fpbq_fquq: ∀G2,L2,T2. ⦃G1,L1,T1⦄ ⊐⸮ ⦃G2,L2,T2⦄ → fpbq h G1 L1 T1 G2 L2 T2 +| fpbq_fquq: ∀G2,L2,T2. ⦃G1,L1,T1⦄ ⬂⸮ ⦃G2,L2,T2⦄ → fpbq h G1 L1 T1 G2 L2 T2 | fpbq_cpx : ∀T2. ⦃G1,L1⦄ ⊢ T1 ⬈[h] T2 → fpbq h G1 L1 T1 G1 L1 T2 | fpbq_lpx : ∀L2. ⦃G1,L1⦄ ⊢ ⬈[h] L2 → fpbq h G1 L1 T1 G1 L2 T1 | fpbq_fdeq: ∀G2,L2,T2. ⦃G1,L1,T1⦄ ≛ ⦃G2,L2,T2⦄ → fpbq h G1 L1 T1 G2 L2 T2 diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_transition/lpr_fquq.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_transition/lpr_fquq.ma index 031de39f8..c31e2d0ab 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_transition/lpr_fquq.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_transition/lpr_fquq.ma @@ -22,9 +22,9 @@ include "basic_2/rt_transition/lpr.ma". (* Properties with extended structural successor for closures ***************) -lemma fqu_cpr_trans_sn (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2⦄ → +lemma fqu_cpr_trans_sn (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂[b] ⦃G2,L2,T2⦄ → ∀U2. ⦃G2,L2⦄ ⊢ T2 ➡[h] U2 → - ∃∃L,U1. ⦃G1,L1⦄ ⊢ ➡[h] L & ⦃G1,L1⦄ ⊢ T1 ➡[h] U1 & ⦃G1,L,U1⦄ ⊐[b] ⦃G2,L2,U2⦄. + ∃∃L,U1. ⦃G1,L1⦄ ⊢ ➡[h] L & ⦃G1,L1⦄ ⊢ T1 ➡[h] U1 & ⦃G1,L,U1⦄ ⬂[b] ⦃G2,L2,U2⦄. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H elim H -G1 -G2 -L1 -L2 -T1 -T2 [ /3 width=5 by lpr_pair, fqu_lref_O, ex3_2_intro/ | /3 width=5 by cpr_pair_sn, fqu_pair_sn, ex3_2_intro/ @@ -37,9 +37,9 @@ lemma fqu_cpr_trans_sn (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G ] qed-. -lemma fqu_cpr_trans_dx (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2⦄ → +lemma fqu_cpr_trans_dx (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂[b] ⦃G2,L2,T2⦄ → ∀U2. ⦃G2,L2⦄ ⊢ T2 ➡[h] U2 → - ∃∃L,U1. ⦃G1,L1⦄ ⊢ ➡[h] L & ⦃G1,L⦄ ⊢ T1 ➡[h] U1 & ⦃G1,L,U1⦄ ⊐[b] ⦃G2,L2,U2⦄. + ∃∃L,U1. ⦃G1,L1⦄ ⊢ ➡[h] L & ⦃G1,L⦄ ⊢ T1 ➡[h] U1 & ⦃G1,L,U1⦄ ⬂[b] ⦃G2,L2,U2⦄. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H elim H -G1 -G2 -L1 -L2 -T1 -T2 [ /3 width=5 by lpr_pair, fqu_lref_O, ex3_2_intro/ | /3 width=5 by cpr_pair_sn, fqu_pair_sn, ex3_2_intro/ @@ -52,13 +52,13 @@ lemma fqu_cpr_trans_dx (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G ] qed-. -lemma fqu_lpr_trans (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2⦄ → +lemma fqu_lpr_trans (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂[b] ⦃G2,L2,T2⦄ → ∀K2. ⦃G2,L2⦄ ⊢ ➡[h] K2 → - ∃∃K1,T. ⦃G1,L1⦄ ⊢ ➡[h] K1 & ⦃G1,L1⦄ ⊢ T1 ➡[h] T & ⦃G1,K1,T⦄ ⊐[b] ⦃G2,K2,T2⦄. + ∃∃K1,T. ⦃G1,L1⦄ ⊢ ➡[h] K1 & ⦃G1,L1⦄ ⊢ T1 ➡[h] T & ⦃G1,K1,T⦄ ⬂[b] ⦃G2,K2,T2⦄. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H elim H -G1 -G2 -L1 -L2 -T1 -T2 [ /3 width=5 by lpr_bind_refl_dx, fqu_lref_O, ex3_2_intro/ | /3 width=5 by cpr_pair_sn, fqu_pair_sn, ex3_2_intro/ -| #p #I #G2 #L2 #V2 #T2 #X #H +| #p #I #G2 #L2 #V2 #T2 #Hb #X #H elim (lpr_inv_pair_sn … H) -H #K2 #W2 #HLK2 #HVW2 #H destruct /3 width=5 by cpr_pair_sn, fqu_bind_dx, ex3_2_intro/ | #p #I #G2 #L2 #V2 #T2 #Hb #X #H @@ -71,9 +71,9 @@ qed-. (* Note: does not hold in Basic_2A1 because it requires cpm *) (* Note: L1 = K0.ⓛV0 and T1 = #0 require n = 1 *) -lemma lpr_fqu_trans (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2⦄ → +lemma lpr_fqu_trans (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂[b] ⦃G2,L2,T2⦄ → ∀K1. ⦃G1,K1⦄ ⊢ ➡[h] L1 → - ∃∃n,K2,T. ⦃G1,K1⦄ ⊢ T1 ➡[n,h] T & ⦃G1,K1,T⦄ ⊐[b] ⦃G2,K2,T2⦄ & ⦃G2,K2⦄ ⊢ ➡[h] L2 & n ≤ 1. + ∃∃n,K2,T. ⦃G1,K1⦄ ⊢ T1 ➡[n,h] T & ⦃G1,K1,T⦄ ⬂[b] ⦃G2,K2,T2⦄ & ⦃G2,K2⦄ ⊢ ➡[h] L2 & n ≤ 1. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H elim H -G1 -G2 -L1 -L2 -T1 -T2 [ * #G #K #V #K1 #H elim (lpr_inv_pair_dx … H) -H #K0 #V0 #HK0 #HV0 #H destruct @@ -91,36 +91,36 @@ qed-. (* Properties with extended optional structural successor for closures ******) -lemma fquq_cpr_trans_sn (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐⸮[b] ⦃G2,L2,T2⦄ → +lemma fquq_cpr_trans_sn (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂⸮[b] ⦃G2,L2,T2⦄ → ∀U2. ⦃G2,L2⦄ ⊢ T2 ➡[h] U2 → - ∃∃L,U1. ⦃G1,L1⦄ ⊢ ➡[h] L & ⦃G1,L1⦄ ⊢ T1 ➡[h] U1 & ⦃G1,L,U1⦄ ⊐⸮[b] ⦃G2,L2,U2⦄. + ∃∃L,U1. ⦃G1,L1⦄ ⊢ ➡[h] L & ⦃G1,L1⦄ ⊢ T1 ➡[h] U1 & ⦃G1,L,U1⦄ ⬂⸮[b] ⦃G2,L2,U2⦄. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H #U2 #HTU2 cases H -H [ #HT12 elim (fqu_cpr_trans_sn … HT12 … HTU2) /3 width=5 by fqu_fquq, ex3_2_intro/ | * #H1 #H2 #H3 destruct /2 width=5 by ex3_2_intro/ ] qed-. -lemma fquq_cpr_trans_dx (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐⸮[b] ⦃G2,L2,T2⦄ → +lemma fquq_cpr_trans_dx (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂⸮[b] ⦃G2,L2,T2⦄ → ∀U2. ⦃G2,L2⦄ ⊢ T2 ➡[h] U2 → - ∃∃L,U1. ⦃G1,L1⦄ ⊢ ➡[h] L & ⦃G1,L⦄ ⊢ T1 ➡[h] U1 & ⦃G1,L,U1⦄ ⊐⸮[b] ⦃G2,L2,U2⦄. + ∃∃L,U1. ⦃G1,L1⦄ ⊢ ➡[h] L & ⦃G1,L⦄ ⊢ T1 ➡[h] U1 & ⦃G1,L,U1⦄ ⬂⸮[b] ⦃G2,L2,U2⦄. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H #U2 #HTU2 cases H -H [ #HT12 elim (fqu_cpr_trans_dx … HT12 … HTU2) /3 width=5 by fqu_fquq, ex3_2_intro/ | * #H1 #H2 #H3 destruct /2 width=5 by ex3_2_intro/ ] qed-. -lemma fquq_lpr_trans (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐⸮[b] ⦃G2,L2,T2⦄ → +lemma fquq_lpr_trans (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂⸮[b] ⦃G2,L2,T2⦄ → ∀K2. ⦃G2,L2⦄ ⊢ ➡[h] K2 → - ∃∃K1,T. ⦃G1,L1⦄ ⊢ ➡[h] K1 & ⦃G1,L1⦄ ⊢ T1 ➡[h] T & ⦃G1,K1,T⦄ ⊐⸮[b] ⦃G2,K2,T2⦄. + ∃∃K1,T. ⦃G1,L1⦄ ⊢ ➡[h] K1 & ⦃G1,L1⦄ ⊢ T1 ➡[h] T & ⦃G1,K1,T⦄ ⬂⸮[b] ⦃G2,K2,T2⦄. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H #K2 #HLK2 cases H -H [ #H12 elim (fqu_lpr_trans … H12 … HLK2) /3 width=5 by fqu_fquq, ex3_2_intro/ | * #H1 #H2 #H3 destruct /2 width=5 by ex3_2_intro/ ] qed-. -lemma lpr_fquq_trans (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐⸮[b] ⦃G2,L2,T2⦄ → +lemma lpr_fquq_trans (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂⸮[b] ⦃G2,L2,T2⦄ → ∀K1. ⦃G1,K1⦄ ⊢ ➡[h] L1 → - ∃∃n,K2,T. ⦃G1,K1⦄ ⊢ T1 ➡[n,h] T & ⦃G1,K1,T⦄ ⊐⸮[b] ⦃G2,K2,T2⦄ & ⦃G2,K2⦄ ⊢ ➡[h] L2 & n ≤ 1. + ∃∃n,K2,T. ⦃G1,K1⦄ ⊢ T1 ➡[n,h] T & ⦃G1,K1,T⦄ ⬂⸮[b] ⦃G2,K2,T2⦄ & ⦃G2,K2⦄ ⊢ ➡[h] L2 & n ≤ 1. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H #K1 #HKL1 cases H -H [ #H12 elim (lpr_fqu_trans … H12 … HKL1) -L1 /3 width=7 by fqu_fquq, ex4_3_intro/ | * #H1 #H2 #H3 destruct /2 width=7 by ex4_3_intro/ diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_transition/lpr_lpr.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_transition/lpr_lpr.ma index 312265d54..54d5d3bc8 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_transition/lpr_lpr.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_transition/lpr_lpr.ma @@ -33,7 +33,7 @@ fact cpr_conf_lpr_atom_atom (h): fact cpr_conf_lpr_atom_delta (h): ∀G0,L0,i. ( - ∀G,L,T. ⦃G0,L0,#i⦄ ⊐+ ⦃G,L,T⦄ → IH_cpr_conf_lpr h G L T + ∀G,L,T. ⦃G0,L0,#i⦄ ⬂+ ⦃G,L,T⦄ → IH_cpr_conf_lpr h G L T ) → ∀K0,V0. ⬇*[i] L0 ≘ K0.ⓓV0 → ∀V2. ⦃G0,K0⦄ ⊢ V0 ➡[h] V2 → ∀T2. ⬆*[↑i] V2 ≘ T2 → @@ -54,7 +54,7 @@ qed-. (* Basic_1: includes: pr0_delta_delta pr2_delta_delta *) fact cpr_conf_lpr_delta_delta (h): ∀G0,L0,i. ( - ∀G,L,T. ⦃G0,L0,#i⦄ ⊐+ ⦃G,L,T⦄ → IH_cpr_conf_lpr h G L T + ∀G,L,T. ⦃G0,L0,#i⦄ ⬂+ ⦃G,L,T⦄ → IH_cpr_conf_lpr h G L T ) → ∀K0,V0. ⬇*[i] L0 ≘ K0.ⓓV0 → ∀V1. ⦃G0,K0⦄ ⊢ V0 ➡[h] V1 → ∀T1. ⬆*[↑i] V1 ≘ T1 → @@ -79,7 +79,7 @@ qed-. fact cpr_conf_lpr_bind_bind (h): ∀p,I,G0,L0,V0,T0. ( - ∀G,L,T. ⦃G0,L0,ⓑ{p,I}V0.T0⦄ ⊐+ ⦃G,L,T⦄ → IH_cpr_conf_lpr h G L T + ∀G,L,T. ⦃G0,L0,ⓑ{p,I}V0.T0⦄ ⬂+ ⦃G,L,T⦄ → IH_cpr_conf_lpr h G L T ) → ∀V1. ⦃G0,L0⦄ ⊢ V0 ➡[h] V1 → ∀T1. ⦃G0,L0.ⓑ{I}V0⦄ ⊢ T0 ➡[h] T1 → ∀V2. ⦃G0,L0⦄ ⊢ V0 ➡[h] V2 → ∀T2. ⦃G0,L0.ⓑ{I}V0⦄ ⊢ T0 ➡[h] T2 → @@ -94,7 +94,7 @@ qed-. fact cpr_conf_lpr_bind_zeta (h): ∀G0,L0,V0,T0. ( - ∀G,L,T. ⦃G0,L0,+ⓓV0.T0⦄ ⊐+ ⦃G,L,T⦄ → IH_cpr_conf_lpr h G L T + ∀G,L,T. ⦃G0,L0,+ⓓV0.T0⦄ ⬂+ ⦃G,L,T⦄ → IH_cpr_conf_lpr h G L T ) → ∀V1. ⦃G0,L0⦄ ⊢ V0 ➡[h] V1 → ∀T1. ⦃G0,L0.ⓓV0⦄ ⊢ T0 ➡[h] T1 → ∀T2. ⬆*[1]T2 ≘ T0 → ∀X2. ⦃G0,L0⦄ ⊢ T2 ➡[h] X2 → @@ -109,7 +109,7 @@ qed-. fact cpr_conf_lpr_zeta_zeta (h): ∀G0,L0,V0,T0. ( - ∀G,L,T. ⦃G0,L0,+ⓓV0.T0⦄ ⊐+ ⦃G,L,T⦄ → IH_cpr_conf_lpr h G L T + ∀G,L,T. ⦃G0,L0,+ⓓV0.T0⦄ ⬂+ ⦃G,L,T⦄ → IH_cpr_conf_lpr h G L T ) → ∀T1. ⬆*[1] T1 ≘ T0 → ∀X1. ⦃G0,L0⦄ ⊢ T1 ➡[h] X1 → ∀T2. ⬆*[1] T2 ≘ T0 → ∀X2. ⦃G0,L0⦄ ⊢ T2 ➡[h] X2 → @@ -124,7 +124,7 @@ qed-. fact cpr_conf_lpr_flat_flat (h): ∀I,G0,L0,V0,T0. ( - ∀G,L,T. ⦃G0,L0,ⓕ{I}V0.T0⦄ ⊐+ ⦃G,L,T⦄ → IH_cpr_conf_lpr h G L T + ∀G,L,T. ⦃G0,L0,ⓕ{I}V0.T0⦄ ⬂+ ⦃G,L,T⦄ → IH_cpr_conf_lpr h G L T ) → ∀V1. ⦃G0,L0⦄ ⊢ V0 ➡[h] V1 → ∀T1. ⦃G0,L0⦄ ⊢ T0 ➡[h] T1 → ∀V2. ⦃G0,L0⦄ ⊢ V0 ➡[h] V2 → ∀T2. ⦃G0,L0⦄ ⊢ T0 ➡[h] T2 → @@ -139,7 +139,7 @@ qed-. fact cpr_conf_lpr_flat_eps (h): ∀G0,L0,V0,T0. ( - ∀G,L,T. ⦃G0,L0,ⓝV0.T0⦄ ⊐+ ⦃G,L,T⦄ → IH_cpr_conf_lpr h G L T + ∀G,L,T. ⦃G0,L0,ⓝV0.T0⦄ ⬂+ ⦃G,L,T⦄ → IH_cpr_conf_lpr h G L T ) → ∀V1,T1. ⦃G0,L0⦄ ⊢ T0 ➡[h] T1 → ∀T2. ⦃G0,L0⦄ ⊢ T0 ➡[h] T2 → ∀L1. ⦃G0,L0⦄ ⊢ ➡[h] L1 → ∀L2. ⦃G0,L0⦄ ⊢ ➡[h] L2 → @@ -152,7 +152,7 @@ qed-. fact cpr_conf_lpr_eps_eps (h): ∀G0,L0,V0,T0. ( - ∀G,L,T. ⦃G0,L0,ⓝV0.T0⦄ ⊐+ ⦃G,L,T⦄ → IH_cpr_conf_lpr h G L T + ∀G,L,T. ⦃G0,L0,ⓝV0.T0⦄ ⬂+ ⦃G,L,T⦄ → IH_cpr_conf_lpr h G L T ) → ∀T1. ⦃G0,L0⦄ ⊢ T0 ➡[h] T1 → ∀T2. ⦃G0,L0⦄ ⊢ T0 ➡[h] T2 → ∀L1. ⦃G0,L0⦄ ⊢ ➡[h] L1 → ∀L2. ⦃G0,L0⦄ ⊢ ➡[h] L2 → @@ -165,7 +165,7 @@ qed-. fact cpr_conf_lpr_flat_beta (h): ∀p,G0,L0,V0,W0,T0. ( - ∀G,L,T. ⦃G0,L0,ⓐV0.ⓛ{p}W0.T0⦄ ⊐+ ⦃G,L,T⦄ → IH_cpr_conf_lpr h G L T + ∀G,L,T. ⦃G0,L0,ⓐV0.ⓛ{p}W0.T0⦄ ⬂+ ⦃G,L,T⦄ → IH_cpr_conf_lpr h G L T ) → ∀V1. ⦃G0,L0⦄ ⊢ V0 ➡[h] V1 → ∀T1. ⦃G0,L0⦄ ⊢ ⓛ{p}W0.T0 ➡[h] T1 → ∀V2. ⦃G0,L0⦄ ⊢ V0 ➡[h] V2 → ∀W2. ⦃G0,L0⦄ ⊢ W0 ➡[h] W2 → ∀T2. ⦃G0,L0.ⓛW0⦄ ⊢ T0 ➡[h] T2 → @@ -187,7 +187,7 @@ qed-. *) fact cpr_conf_lpr_flat_theta (h): ∀p,G0,L0,V0,W0,T0. ( - ∀G,L,T. ⦃G0,L0,ⓐV0.ⓓ{p}W0.T0⦄ ⊐+ ⦃G,L,T⦄ → IH_cpr_conf_lpr h G L T + ∀G,L,T. ⦃G0,L0,ⓐV0.ⓓ{p}W0.T0⦄ ⬂+ ⦃G,L,T⦄ → IH_cpr_conf_lpr h G L T ) → ∀V1. ⦃G0,L0⦄ ⊢ V0 ➡[h] V1 → ∀T1. ⦃G0,L0⦄ ⊢ ⓓ{p}W0.T0 ➡[h] T1 → ∀V2. ⦃G0,L0⦄ ⊢ V0 ➡[h] V2 → ∀U2. ⬆*[1] V2 ≘ U2 → @@ -212,7 +212,7 @@ qed-. fact cpr_conf_lpr_beta_beta (h): ∀p,G0,L0,V0,W0,T0. ( - ∀G,L,T. ⦃G0,L0,ⓐV0.ⓛ{p}W0.T0⦄ ⊐+ ⦃G,L,T⦄ → IH_cpr_conf_lpr h G L T + ∀G,L,T. ⦃G0,L0,ⓐV0.ⓛ{p}W0.T0⦄ ⬂+ ⦃G,L,T⦄ → IH_cpr_conf_lpr h G L T ) → ∀V1. ⦃G0,L0⦄ ⊢ V0 ➡[h] V1 → ∀W1. ⦃G0,L0⦄ ⊢ W0 ➡[h] W1 → ∀T1. ⦃G0,L0.ⓛW0⦄ ⊢ T0 ➡[h] T1 → ∀V2. ⦃G0,L0⦄ ⊢ V0 ➡[h] V2 → ∀W2. ⦃G0,L0⦄ ⊢ W0 ➡[h] W2 → ∀T2. ⦃G0,L0.ⓛW0⦄ ⊢ T0 ➡[h] T2 → @@ -231,7 +231,7 @@ qed-. (* Basic_1: was: pr0_upsilon_upsilon *) fact cpr_conf_lpr_theta_theta (h): ∀p,G0,L0,V0,W0,T0. ( - ∀G,L,T. ⦃G0,L0,ⓐV0.ⓓ{p}W0.T0⦄ ⊐+ ⦃G,L,T⦄ → IH_cpr_conf_lpr h G L T + ∀G,L,T. ⦃G0,L0,ⓐV0.ⓓ{p}W0.T0⦄ ⬂+ ⦃G,L,T⦄ → IH_cpr_conf_lpr h G L T ) → ∀V1. ⦃G0,L0⦄ ⊢ V0 ➡[h] V1 → ∀U1. ⬆*[1] V1 ≘ U1 → ∀W1. ⦃G0,L0⦄ ⊢ W0 ➡[h] W1 → ∀T1. ⦃G0,L0.ⓓW0⦄ ⊢ T0 ➡[h] T1 → diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_transition/lpx_fquq.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_transition/lpx_fquq.ma index e6393d4ae..b73fe99b5 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_transition/lpx_fquq.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_transition/lpx_fquq.ma @@ -19,9 +19,9 @@ include "basic_2/rt_transition/lpx.ma". (* Properties with extended structural successor for closures ***************) -lemma lpx_fqu_trans (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2⦄ → +lemma lpx_fqu_trans (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂[b] ⦃G2,L2,T2⦄ → ∀K1. ⦃G1,K1⦄ ⊢ ⬈[h] L1 → - ∃∃K2,T. ⦃G1,K1⦄ ⊢ T1 ⬈[h] T & ⦃G1,K1,T⦄ ⊐[b] ⦃G2,K2,T2⦄ & ⦃G2,K2⦄ ⊢ ⬈[h] L2. + ∃∃K2,T. ⦃G1,K1⦄ ⊢ T1 ⬈[h] T & ⦃G1,K1,T⦄ ⬂[b] ⦃G2,K2,T2⦄ & ⦃G2,K2⦄ ⊢ ⬈[h] L2. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H elim H -G1 -G2 -L1 -L2 -T1 -T2 [ #I #G #K #V #K1 #H elim (lpx_inv_pair_dx … H) -H #K0 #V0 #HK0 #HV0 #H destruct @@ -37,13 +37,13 @@ lemma lpx_fqu_trans (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L ] qed-. -lemma fqu_lpx_trans (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2⦄ → +lemma fqu_lpx_trans (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂[b] ⦃G2,L2,T2⦄ → ∀K2. ⦃G2,L2⦄ ⊢ ⬈[h] K2 → - ∃∃K1,T. ⦃G1,L1⦄ ⊢ ⬈[h] K1 & ⦃G1,L1⦄ ⊢ T1 ⬈[h] T & ⦃G1,K1,T⦄ ⊐[b] ⦃G2,K2,T2⦄. + ∃∃K1,T. ⦃G1,L1⦄ ⊢ ⬈[h] K1 & ⦃G1,L1⦄ ⊢ T1 ⬈[h] T & ⦃G1,K1,T⦄ ⬂[b] ⦃G2,K2,T2⦄. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H elim H -G1 -G2 -L1 -L2 -T1 -T2 [ /3 width=5 by lpx_bind_refl_dx, fqu_lref_O, ex3_2_intro/ | /3 width=5 by cpx_pair_sn, fqu_pair_sn, ex3_2_intro/ -| #p #I #G2 #L2 #V2 #T2 #X #H +| #p #I #G2 #L2 #V2 #T2 #Hb #X #H elim (lpx_inv_pair_sn … H) -H #K2 #W2 #HLK2 #HVW2 #H destruct /3 width=5 by cpx_pair_sn, fqu_bind_dx, ex3_2_intro/ | #p #I #G2 #L2 #V2 #T2 #Hb #X #H @@ -56,18 +56,18 @@ qed-. (* Properties with extended optional structural successor for closures ******) -lemma lpx_fquq_trans (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐⸮[b] ⦃G2,L2,T2⦄ → +lemma lpx_fquq_trans (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂⸮[b] ⦃G2,L2,T2⦄ → ∀K1. ⦃G1,K1⦄ ⊢ ⬈[h] L1 → - ∃∃K2,T. ⦃G1,K1⦄ ⊢ T1 ⬈[h] T & ⦃G1,K1,T⦄ ⊐⸮[b] ⦃G2,K2,T2⦄ & ⦃G2,K2⦄ ⊢ ⬈[h] L2. + ∃∃K2,T. ⦃G1,K1⦄ ⊢ T1 ⬈[h] T & ⦃G1,K1,T⦄ ⬂⸮[b] ⦃G2,K2,T2⦄ & ⦃G2,K2⦄ ⊢ ⬈[h] L2. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H #K1 #HKL1 cases H -H [ #H12 elim (lpx_fqu_trans … H12 … HKL1) -L1 /3 width=5 by fqu_fquq, ex3_2_intro/ | * #H1 #H2 #H3 destruct /2 width=5 by ex3_2_intro/ ] qed-. -lemma fquq_lpx_trans (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐⸮[b] ⦃G2,L2,T2⦄ → +lemma fquq_lpx_trans (h) (b): ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂⸮[b] ⦃G2,L2,T2⦄ → ∀K2. ⦃G2,L2⦄ ⊢ ⬈[h] K2 → - ∃∃K1,T. ⦃G1,L1⦄ ⊢ ⬈[h] K1 & ⦃G1,L1⦄ ⊢ T1 ⬈[h] T & ⦃G1,K1,T⦄ ⊐⸮[b] ⦃G2,K2,T2⦄. + ∃∃K1,T. ⦃G1,L1⦄ ⊢ ⬈[h] K1 & ⦃G1,L1⦄ ⊢ T1 ⬈[h] T & ⦃G1,K1,T⦄ ⬂⸮[b] ⦃G2,K2,T2⦄. #h #b #G1 #G2 #L1 #L2 #T1 #T2 #H #K2 #HLK2 cases H -H [ #H12 elim (fqu_lpx_trans … H12 … HLK2) /3 width=5 by fqu_fquq, ex3_2_intro/ | * #H1 #H2 #H3 destruct /2 width=5 by ex3_2_intro/ diff --git a/matita/matita/contribs/lambdadelta/basic_2/rt_transition/rpx_fsle.ma b/matita/matita/contribs/lambdadelta/basic_2/rt_transition/rpx_fsle.ma index 6d9db8b65..b610f0958 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/rt_transition/rpx_fsle.ma +++ b/matita/matita/contribs/lambdadelta/basic_2/rt_transition/rpx_fsle.ma @@ -27,7 +27,7 @@ include "basic_2/rt_transition/rpx_fqup.ma". (* Note: This invalidates rpxs_cpx_conf: "∀h, G. s_r_confluent1 … (cpx h G) (rpxs h G)" *) lemma rpx_cpx_conf_fsge (h) (G): ∀L0,T0,T1. ⦃G,L0⦄ ⊢ T0 ⬈[h] T1 → ∀L2. ⦃G,L0⦄ ⊢⬈[h,T0] L2 → ⦃L2,T1⦄ ⊆ ⦃L0,T0⦄. -#h #G0 #L0 #T0 @(fqup_wf_ind_eq (Ⓕ) … G0 L0 T0) -G0 -L0 -T0 +#h #G0 #L0 #T0 @(fqup_wf_ind_eq (Ⓣ) … G0 L0 T0) -G0 -L0 -T0 #G #L #T #IH #G0 #L0 * * [ #s #HG #HL #HT #X #HX #Y #HY destruct -IH elim (cpx_inv_sort1 … HX) -HX #H destruct diff --git a/matita/matita/contribs/lambdadelta/basic_2/web/basic_2_src.tbl b/matita/matita/contribs/lambdadelta/basic_2/web/basic_2_src.tbl index ae22b5b3c..39cf1ed8b 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/web/basic_2_src.tbl +++ b/matita/matita/contribs/lambdadelta/basic_2/web/basic_2_src.tbl @@ -81,8 +81,8 @@ table { } ] [ { "unbound context-sensitive parallel rt-computation" * } { - [ [ "refinement for lenvs on selected entries" ] "lsubsx" + "( ? ⊢ ? ⊆ⓧ[?,?] ? )" "lsubsx_lfsx" + "lsubsx_lsubsx" * ] - [ [ "strongly normalizing for lenvs on referred entries" ] "rdsx" + "( ? ⊢ ⬈*[?,?] 𝐒⦃?⦄ )" "rdsx_length" + "rdsx_drops" + "rdsx_fqup" + "rdsx_cpxs" + "rdsx_csx" + "rdsx_rdsx" * ] + [ [ "compatibility for lenvs on selected entries" ] "jsx" + "( ? ⊢ ? ⊒[?,?] ? )" "jsx_rsx" + "jsx_jsx" * ] + [ [ "strongly normalizing for lenvs on referred entries" ] "rsx" + "( ? ⊢ ⬈*[?,?] 𝐒⦃?⦄ )" "rsx_length" + "rsx_drops" + "rsx_fqup" + "rsx_cpxs" + "rsx_csx" + "rsx_rsx" * ] [ [ "strongly normalizing for term vectors" ] "csx_vector" + "( ⦃?,?⦄ ⊢ ⬈*[?] 𝐒⦃?⦄ )" "csx_cnx_vector" + "csx_csx_vector" * ] [ [ "strongly normalizing for terms" ] "csx" + "( ⦃?,?⦄ ⊢ ⬈*[?] 𝐒⦃?⦄ )" "csx_simple" + "csx_simple_theq" + "csx_drops" + "csx_fqus" + "csx_lsubr" + "csx_rdeq" + "csx_fdeq" + "csx_aaa" + "csx_gcp" + "csx_gcr" + "csx_lpx" + "csx_cnx" + "csx_fpbq" + "csx_cpxs" + "csx_lpxs" + "csx_csx" * ] [ [ "for lenvs on all entries" ] "lpxs" + "( ⦃?,?⦄ ⊢ ⬈*[?] ? )" "lpxs_length" + "lpxs_drops" + "lpxs_rdeq" + "lpxs_fdeq" + "lpxs_aaa" + "lpxs_lpx" + "lpxs_cpxs" + "lpxs_lpxs" * ] diff --git a/matita/matita/contribs/lambdadelta/basic_2/notation/relations/lsubeqx_5.ma b/matita/matita/contribs/lambdadelta/static_2/etc/scl/clearsn_3.etc similarity index 88% rename from matita/matita/contribs/lambdadelta/basic_2/notation/relations/lsubeqx_5.ma rename to matita/matita/contribs/lambdadelta/static_2/etc/scl/clearsn_3.etc index 958ca60f7..d430b8d14 100644 --- a/matita/matita/contribs/lambdadelta/basic_2/notation/relations/lsubeqx_5.ma +++ b/matita/matita/contribs/lambdadelta/static_2/etc/scl/clearsn_3.etc @@ -14,6 +14,6 @@ (* NOTATION FOR THE FORMAL SYSTEM λδ ****************************************) -notation "hvbox( G ⊢ break term 46 L1 ⊆ⓧ [ break term 46 h, break term 46 f ] break term 46 L2 )" +notation "hvbox( L1 ⊐ⓧ [ break term 46 f ] break term 46 L2 )" non associative with precedence 45 - for @{ 'LSubEqX $h $f $G $L1 $L2 }. + for @{ 'ClearSn $f $L1 $L2 }. diff --git a/matita/matita/contribs/lambdadelta/static_2/etc/scl/scl.etc b/matita/matita/contribs/lambdadelta/static_2/etc/scl/scl.etc new file mode 100644 index 000000000..9d7e924f0 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/static_2/etc/scl/scl.etc @@ -0,0 +1,110 @@ +(**************************************************************************) +(* ___ *) +(* ||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/notation/relations/clearsn_3.ma". +include "static_2/syntax/cext2.ma". +include "static_2/relocation/sex.ma". + +(* CLEAR FOR LOCAL ENVIRONMENTS ON SELECTED ENTRIES *************************) + +definition ccl: relation3 lenv bind bind ≝ λL,I1,I2. BUnit Void = I2. + +definition scl: rtmap → relation lenv ≝ sex ccl (cext2 ceq). + +interpretation + "clear (local environment)" + 'ClearSn f L1 L2 = (scl f L1 L2). + +(* Basic eliminators ********************************************************) + +lemma scl_ind (Q:rtmap→relation lenv): + (∀f. Q f (⋆) (⋆)) → + (∀f,I,K1,K2. K1 ⊐ⓧ[f] K2 → Q f K1 K2 → Q (⫯f) (K1.ⓘ{I}) (K2.ⓘ{I})) → + (∀f,I,K1,K2. K1 ⊐ⓧ[f] K2 → Q f K1 K2 → Q (↑f) (K1.ⓘ{I}) (K2.ⓧ)) → + ∀f,L1,L2. L1 ⊐ⓧ[f] L2 → Q f L1 L2. +#Q #IH1 #IH2 #IH3 #f #L1 #L2 #H elim H -f -L1 -L2 +[ // +| #f #I1 #I2 #K1 #K2 #HK #H #IH destruct /2 by/ +| #f #I1 #I2 #K1 #K2 #HK * #I [| #V1 #V2 #H ] #IH destruct /2 by/ +] +qed-. + +(* Basic inversion lemmas ***************************************************) + +lemma scl_inv_atom_sn: ∀g,L2. ⋆ ⊐ⓧ[g] L2 → L2 = ⋆. +/2 width=4 by sex_inv_atom1/ qed-. + +lemma scl_inv_push_sn: ∀f,I,K1,L2. K1.ⓘ{I} ⊐ⓧ[⫯f] L2 → + ∃∃K2. K1 ⊐ⓧ[f] K2 & L2 = K2.ⓘ{I}. +#f #I #K1 #L2 #H +elim (sex_inv_push1 … H) -H #J #K2 #HK12 * +/2 width=3 by ex2_intro/ +qed-. + +lemma scl_inv_next_sn: ∀f,I,K1,L2. K1.ⓘ{I} ⊐ⓧ[↑f] L2 → + ∃∃K2. K1 ⊐ⓧ[f] K2 & L2 = K2.ⓧ. +#f #I #K1 #L2 #H +elim (sex_inv_next1 … H) -H +/2 width=3 by ex2_intro/ +qed-. + +(* Advanced inversion lemmas ************************************************) + +lemma scl_inv_bind_sn_gen: ∀g,I,K1,L2. K1.ⓘ{I} ⊐ⓧ[g] L2 → + ∨∨ ∃∃f,K2. K1 ⊐ⓧ[f] K2 & g = ⫯f & L2 = K2.ⓘ{I} + | ∃∃f,K2. K1 ⊐ⓧ[f] K2 & g = ↑f & L2 = K2.ⓧ. +#g #I #K1 #L2 #H +elim (pn_split g) * #f #Hf destruct +[ elim (scl_inv_push_sn … H) -H +| elim (scl_inv_next_sn … H) -H +] +/3 width=5 by ex3_2_intro, or_intror, or_introl/ +qed-. + +(* Advanced forward lemmas **************************************************) + +lemma scl_fwd_bind_sn: ∀g,I1,K1,L2. K1.ⓘ{I1} ⊐ⓧ[g] L2 → + ∃∃I2,K2. K1 ⊐ⓧ[⫱g] K2 & L2 = K2.ⓘ{I2}. +#g #I1 #K1 #L2 +elim (pn_split g) * #f #Hf destruct #H +[ elim (scl_inv_push_sn … H) -H +| elim (scl_inv_next_sn … H) -H +] +/2 width=4 by ex2_2_intro/ +qed-. + +(* Basic properties *********************************************************) + +lemma scl_atom: ∀f. ⋆ ⊐ⓧ[f] ⋆. +/by sex_atom/ qed. + +lemma scl_push: ∀f,K1,K2. K1 ⊐ⓧ[f] K2 → ∀I. K1.ⓘ{I} ⊐ⓧ[⫯f] K2.ⓘ{I}. +#f #K1 #K2 #H * /3 width=1 by sex_push, ext2_unit, ext2_pair/ +qed. + +lemma scl_next: ∀f,K1,K2. K1 ⊐ⓧ[f] K2 → ∀I. K1.ⓘ{I} ⊐ⓧ[↑f] K2.ⓧ. +/2 width=1 by sex_next/ qed. + +lemma scl_eq_repl_back: ∀L1,L2. eq_repl_back … (λf. L1 ⊐ⓧ[f] L2). +/2 width=3 by sex_eq_repl_back/ qed-. + +lemma scl_eq_repl_fwd: ∀L1,L2. eq_repl_fwd … (λf. L1 ⊐ⓧ[f] L2). +/2 width=3 by sex_eq_repl_fwd/ qed-. + +(* Advanced properties ******************************************************) + +lemma scl_refl: ∀f. 𝐈⦃f⦄ → reflexive … (scl f). +#f #Hf #L elim L -L +/3 width=3 by scl_eq_repl_back, scl_push, eq_push_inv_isid/ +qed. diff --git a/matita/matita/contribs/lambdadelta/static_2/etc/scl/scl_scl.etc b/matita/matita/contribs/lambdadelta/static_2/etc/scl/scl_scl.etc new file mode 100644 index 000000000..6ca737bf2 --- /dev/null +++ b/matita/matita/contribs/lambdadelta/static_2/etc/scl/scl_scl.etc @@ -0,0 +1,36 @@ +(**************************************************************************) +(* ___ *) +(* ||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/relocation/scl.ma". + +(* CLEAR FOR LOCAL ENVIRONMENTS ON SELECTED ENTRIES *************************) + +(* Main properties **********************************************************) + +theorem scl_fix: ∀f,L1,L. L1 ⊐ⓧ[f] L → + ∀L2. L ⊐ⓧ[f] L2 → L = L2. +#f #L1 #L #H @(scl_ind … H) -f -L1 -L +[ #f #L2 #H + >(scl_inv_atom_sn … H) -L2 // +| #f #I #K1 #K2 #_ #IH #L2 #H + elim (scl_inv_push_sn … H) -H /3 width=1 by eq_f2/ +| #f #I #K1 #K2 #_ #IH #L2 #H + elim (scl_inv_next_sn … H) -H /3 width=1 by eq_f2/ +] +qed-. + +theorem scl_trans: ∀f. Transitive … (scl f). +#f #L1 #L #H1 #L2 #H2 +<(scl_fix … H1 … H2) -L2 // +qed-. diff --git a/matita/matita/contribs/lambdadelta/static_2/notation/relations/freestar_3.ma b/matita/matita/contribs/lambdadelta/static_2/notation/relations/freeplus_3.ma similarity index 92% rename from matita/matita/contribs/lambdadelta/static_2/notation/relations/freestar_3.ma rename to matita/matita/contribs/lambdadelta/static_2/notation/relations/freeplus_3.ma index 02c33853c..19dc43e01 100644 --- a/matita/matita/contribs/lambdadelta/static_2/notation/relations/freestar_3.ma +++ b/matita/matita/contribs/lambdadelta/static_2/notation/relations/freeplus_3.ma @@ -14,6 +14,6 @@ (* NOTATION FOR THE FORMAL SYSTEM λδ ****************************************) -notation "hvbox( L ⊢ 𝐅 * ⦃ break term 46 T ⦄ ≘ break term 46 f )" +notation "hvbox( L ⊢ 𝐅 + ⦃ break term 46 T ⦄ ≘ break term 46 f )" non associative with precedence 45 - for @{ 'FreeStar $L $T $f }. + for @{ 'FreePlus $L $T $f }. diff --git a/matita/matita/contribs/lambdadelta/static_2/notation/relations/lrsubeqf_4.ma b/matita/matita/contribs/lambdadelta/static_2/notation/relations/lrsubeqf_4.ma index 413553ccd..9847c8531 100644 --- a/matita/matita/contribs/lambdadelta/static_2/notation/relations/lrsubeqf_4.ma +++ b/matita/matita/contribs/lambdadelta/static_2/notation/relations/lrsubeqf_4.ma @@ -14,6 +14,6 @@ (* NOTATION FOR THE FORMAL SYSTEM λδ ****************************************) -notation "hvbox( ⦃ term 46 L1, break term 46 f1 ⦄ ⫃ 𝐅* ⦃ break term 46 L2, break term 46 f2 ⦄ )" +notation "hvbox( ⦃ term 46 L1, break term 46 f1 ⦄ ⫃ 𝐅+ ⦃ break term 46 L2, break term 46 f2 ⦄ )" non associative with precedence 45 for @{ 'LRSubEqF $L1 $f1 $L2 $f2 }. diff --git a/matita/matita/contribs/lambdadelta/static_2/notation/relations/supterm_6.ma b/matita/matita/contribs/lambdadelta/static_2/notation/relations/supterm_6.ma index 72533dc3c..a8dfc7e72 100644 --- a/matita/matita/contribs/lambdadelta/static_2/notation/relations/supterm_6.ma +++ b/matita/matita/contribs/lambdadelta/static_2/notation/relations/supterm_6.ma @@ -14,6 +14,6 @@ (* NOTATION FOR THE FORMAL SYSTEM λδ ****************************************) -notation "hvbox( ⦃ term 46 G1, break term 46 L1, break term 46 T1 ⦄ ⊐ ⦃ break term 46 G2, break term 46 L2, break term 46 T2 ⦄ )" +notation "hvbox( ⦃ term 46 G1, break term 46 L1, break term 46 T1 ⦄ ⬂ ⦃ break term 46 G2, break term 46 L2, break term 46 T2 ⦄ )" non associative with precedence 45 for @{ 'SupTerm $G1 $L1 $T1 $G2 $L2 $T2 }. diff --git a/matita/matita/contribs/lambdadelta/static_2/notation/relations/supterm_7.ma b/matita/matita/contribs/lambdadelta/static_2/notation/relations/supterm_7.ma index 2e12296b4..011caa06b 100644 --- a/matita/matita/contribs/lambdadelta/static_2/notation/relations/supterm_7.ma +++ b/matita/matita/contribs/lambdadelta/static_2/notation/relations/supterm_7.ma @@ -14,6 +14,6 @@ (* NOTATION FOR THE FORMAL SYSTEM λδ ****************************************) -notation "hvbox( ⦃ term 46 G1, break term 46 L1, break term 46 T1 ⦄ ⊐ [ break term 46 b ] ⦃ break term 46 G2, break term 46 L2, break term 46 T2 ⦄ )" +notation "hvbox( ⦃ term 46 G1, break term 46 L1, break term 46 T1 ⦄ ⬂ [ break term 46 b ] ⦃ break term 46 G2, break term 46 L2, break term 46 T2 ⦄ )" non associative with precedence 45 for @{ 'SupTerm $b $G1 $L1 $T1 $G2 $L2 $T2 }. diff --git a/matita/matita/contribs/lambdadelta/static_2/notation/relations/suptermopt_6.ma b/matita/matita/contribs/lambdadelta/static_2/notation/relations/suptermopt_6.ma index 62a8cbb0b..f52c205c3 100644 --- a/matita/matita/contribs/lambdadelta/static_2/notation/relations/suptermopt_6.ma +++ b/matita/matita/contribs/lambdadelta/static_2/notation/relations/suptermopt_6.ma @@ -14,6 +14,6 @@ (* NOTATION FOR THE FORMAL SYSTEM λδ ****************************************) -notation "hvbox( ⦃ term 46 G1, break term 46 L1, break term 46 T1 ⦄ ⊐⸮ ⦃ break term 46 G2, break term 46 L2, break term 46 T2 ⦄ )" +notation "hvbox( ⦃ term 46 G1, break term 46 L1, break term 46 T1 ⦄ ⬂⸮ ⦃ break term 46 G2, break term 46 L2, break term 46 T2 ⦄ )" non associative with precedence 45 for @{ 'SupTermOpt $G1 $L1 $T1 $G2 $L2 $T2 }. diff --git a/matita/matita/contribs/lambdadelta/static_2/notation/relations/suptermopt_7.ma b/matita/matita/contribs/lambdadelta/static_2/notation/relations/suptermopt_7.ma index dd6db78c2..60b22c90d 100644 --- a/matita/matita/contribs/lambdadelta/static_2/notation/relations/suptermopt_7.ma +++ b/matita/matita/contribs/lambdadelta/static_2/notation/relations/suptermopt_7.ma @@ -14,6 +14,6 @@ (* NOTATION FOR THE FORMAL SYSTEM λδ ****************************************) -notation "hvbox( ⦃ term 46 G1, break term 46 L1, break term 46 T1 ⦄ ⊐⸮ [ break term 46 b ] ⦃ break term 46 G2, break term 46 L2, break term 46 T2 ⦄ )" +notation "hvbox( ⦃ term 46 G1, break term 46 L1, break term 46 T1 ⦄ ⬂⸮ [ break term 46 b ] ⦃ break term 46 G2, break term 46 L2, break term 46 T2 ⦄ )" non associative with precedence 45 for @{ 'SupTermOpt $b $G1 $L1 $T1 $G2 $L2 $T2 }. diff --git a/matita/matita/contribs/lambdadelta/static_2/notation/relations/suptermplus_6.ma b/matita/matita/contribs/lambdadelta/static_2/notation/relations/suptermplus_6.ma index 8a8a95876..5b60a957d 100644 --- a/matita/matita/contribs/lambdadelta/static_2/notation/relations/suptermplus_6.ma +++ b/matita/matita/contribs/lambdadelta/static_2/notation/relations/suptermplus_6.ma @@ -14,6 +14,6 @@ (* NOTATION FOR THE FORMAL SYSTEM λδ ****************************************) -notation "hvbox( ⦃ term 46 G1, break term 46 L1, break term 46 T1 ⦄ ⊐ + ⦃ break term 46 G2, break term 46 L2, break term 46 T2 ⦄ )" +notation "hvbox( ⦃ term 46 G1, break term 46 L1, break term 46 T1 ⦄ ⬂ + ⦃ break term 46 G2, break term 46 L2, break term 46 T2 ⦄ )" non associative with precedence 45 for @{ 'SupTermPlus $G1 $L1 $T1 $G2 $L2 $T2 }. diff --git a/matita/matita/contribs/lambdadelta/static_2/notation/relations/suptermplus_7.ma b/matita/matita/contribs/lambdadelta/static_2/notation/relations/suptermplus_7.ma index 49b6472fe..d4b9a8669 100644 --- a/matita/matita/contribs/lambdadelta/static_2/notation/relations/suptermplus_7.ma +++ b/matita/matita/contribs/lambdadelta/static_2/notation/relations/suptermplus_7.ma @@ -14,6 +14,6 @@ (* NOTATION FOR THE FORMAL SYSTEM λδ ****************************************) -notation "hvbox( ⦃ term 46 G1, break term 46 L1, break term 46 T1 ⦄ ⊐ + [ break term 46 b ] ⦃ break term 46 G2, break term 46 L2, break term 46 T2 ⦄ )" +notation "hvbox( ⦃ term 46 G1, break term 46 L1, break term 46 T1 ⦄ ⬂ + [ break term 46 b ] ⦃ break term 46 G2, break term 46 L2, break term 46 T2 ⦄ )" non associative with precedence 45 for @{ 'SupTermPlus $b $G1 $L1 $T1 $G2 $L2 $T2 }. diff --git a/matita/matita/contribs/lambdadelta/static_2/notation/relations/suptermstar_6.ma b/matita/matita/contribs/lambdadelta/static_2/notation/relations/suptermstar_6.ma index 279b363e7..1a9c2442b 100644 --- a/matita/matita/contribs/lambdadelta/static_2/notation/relations/suptermstar_6.ma +++ b/matita/matita/contribs/lambdadelta/static_2/notation/relations/suptermstar_6.ma @@ -14,6 +14,6 @@ (* NOTATION FOR THE FORMAL SYSTEM λδ ****************************************) -notation "hvbox( ⦃ term 46 G1, break term 46 L1, break term 46 T1 ⦄ ⊐ * ⦃ break term 46 G2, break term 46 L2, break term 46 T2 ⦄ )" +notation "hvbox( ⦃ term 46 G1, break term 46 L1, break term 46 T1 ⦄ ⬂ * ⦃ break term 46 G2, break term 46 L2, break term 46 T2 ⦄ )" non associative with precedence 45 for @{ 'SupTermStar $G1 $L1 $T1 $G2 $L2 $T2 }. diff --git a/matita/matita/contribs/lambdadelta/static_2/notation/relations/suptermstar_7.ma b/matita/matita/contribs/lambdadelta/static_2/notation/relations/suptermstar_7.ma index 8b0ac452c..3d137035c 100644 --- a/matita/matita/contribs/lambdadelta/static_2/notation/relations/suptermstar_7.ma +++ b/matita/matita/contribs/lambdadelta/static_2/notation/relations/suptermstar_7.ma @@ -14,6 +14,6 @@ (* NOTATION FOR THE FORMAL SYSTEM λδ ****************************************) -notation "hvbox( ⦃ term 46 G1, break term 46 L1, break term 46 T1 ⦄ ⊐ * [ break term 46 b ] ⦃ break term 46 G2, break term 46 L2, break term 46 T2 ⦄ )" +notation "hvbox( ⦃ term 46 G1, break term 46 L1, break term 46 T1 ⦄ ⬂ * [ break term 46 b ] ⦃ break term 46 G2, break term 46 L2, break term 46 T2 ⦄ )" non associative with precedence 45 for @{ 'SupTermStar $b $G1 $L1 $T1 $G2 $L2 $T2 }. diff --git a/matita/matita/contribs/lambdadelta/static_2/s_computation/fqup.ma b/matita/matita/contribs/lambdadelta/static_2/s_computation/fqup.ma index df964c8e9..28cfb9ce0 100644 --- a/matita/matita/contribs/lambdadelta/static_2/s_computation/fqup.ma +++ b/matita/matita/contribs/lambdadelta/static_2/s_computation/fqup.ma @@ -30,55 +30,55 @@ interpretation "plus-iterated structural successor (closure)" (* Basic properties *********************************************************) -lemma fqu_fqup: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2⦄ → - ⦃G1,L1,T1⦄ ⊐+[b] ⦃G2,L2,T2⦄. +lemma fqu_fqup: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂[b] ⦃G2,L2,T2⦄ → + ⦃G1,L1,T1⦄ ⬂+[b] ⦃G2,L2,T2⦄. /2 width=1 by tri_inj/ qed. lemma fqup_strap1: ∀b,G1,G,G2,L1,L,L2,T1,T,T2. - ⦃G1,L1,T1⦄ ⊐+[b] ⦃G,L,T⦄ → ⦃G,L,T⦄ ⊐[b] ⦃G2,L2,T2⦄ → - ⦃G1,L1,T1⦄ ⊐+[b] ⦃G2,L2,T2⦄. + ⦃G1,L1,T1⦄ ⬂+[b] ⦃G,L,T⦄ → ⦃G,L,T⦄ ⬂[b] ⦃G2,L2,T2⦄ → + ⦃G1,L1,T1⦄ ⬂+[b] ⦃G2,L2,T2⦄. /2 width=5 by tri_step/ qed. lemma fqup_strap2: ∀b,G1,G,G2,L1,L,L2,T1,T,T2. - ⦃G1,L1,T1⦄ ⊐[b] ⦃G,L,T⦄ → ⦃G,L,T⦄ ⊐+[b] ⦃G2,L2,T2⦄ → - ⦃G1,L1,T1⦄ ⊐+[b] ⦃G2,L2,T2⦄. + ⦃G1,L1,T1⦄ ⬂[b] ⦃G,L,T⦄ → ⦃G,L,T⦄ ⬂+[b] ⦃G2,L2,T2⦄ → + ⦃G1,L1,T1⦄ ⬂+[b] ⦃G2,L2,T2⦄. /2 width=5 by tri_TC_strap/ qed. -lemma fqup_pair_sn: ∀b,I,G,L,V,T. ⦃G,L,②{I}V.T⦄ ⊐+[b] ⦃G,L,V⦄. +lemma fqup_pair_sn: ∀b,I,G,L,V,T. ⦃G,L,②{I}V.T⦄ ⬂+[b] ⦃G,L,V⦄. /2 width=1 by fqu_pair_sn, fqu_fqup/ qed. -lemma fqup_bind_dx: ∀b,p,I,G,L,V,T. ⦃G,L,ⓑ{p,I}V.T⦄ ⊐+[b] ⦃G,L.ⓑ{I}V,T⦄. -/2 width=1 by fqu_bind_dx, fqu_fqup/ qed. +lemma fqup_bind_dx: ∀p,I,G,L,V,T. ⦃G,L,ⓑ{p,I}V.T⦄ ⬂+[Ⓣ] ⦃G,L.ⓑ{I}V,T⦄. +/3 width=1 by fqu_bind_dx, fqu_fqup/ qed. -lemma fqup_clear: ∀p,I,G,L,V,T. ⦃G,L,ⓑ{p,I}V.T⦄ ⊐+[Ⓕ] ⦃G,L.ⓧ,T⦄. +lemma fqup_clear: ∀p,I,G,L,V,T. ⦃G,L,ⓑ{p,I}V.T⦄ ⬂+[Ⓕ] ⦃G,L.ⓧ,T⦄. /3 width=1 by fqu_clear, fqu_fqup/ qed. -lemma fqup_flat_dx: ∀b,I,G,L,V,T. ⦃G,L,ⓕ{I}V.T⦄ ⊐+[b] ⦃G,L,T⦄. +lemma fqup_flat_dx: ∀b,I,G,L,V,T. ⦃G,L,ⓕ{I}V.T⦄ ⬂+[b] ⦃G,L,T⦄. /2 width=1 by fqu_flat_dx, fqu_fqup/ qed. -lemma fqup_flat_dx_pair_sn: ∀b,I1,I2,G,L,V1,V2,T. ⦃G,L,ⓕ{I1}V1.②{I2}V2.T⦄ ⊐+[b] ⦃G,L,V2⦄. +lemma fqup_flat_dx_pair_sn: ∀b,I1,I2,G,L,V1,V2,T. ⦃G,L,ⓕ{I1}V1.②{I2}V2.T⦄ ⬂+[b] ⦃G,L,V2⦄. /2 width=5 by fqu_pair_sn, fqup_strap1/ qed. -lemma fqup_bind_dx_flat_dx: ∀b,p,G,I1,I2,L,V1,V2,T. ⦃G,L,ⓑ{p,I1}V1.ⓕ{I2}V2.T⦄ ⊐+[b] ⦃G,L.ⓑ{I1}V1,T⦄. +lemma fqup_bind_dx_flat_dx: ∀p,G,I1,I2,L,V1,V2,T. ⦃G,L,ⓑ{p,I1}V1.ⓕ{I2}V2.T⦄ ⬂+[Ⓣ] ⦃G,L.ⓑ{I1}V1,T⦄. /2 width=5 by fqu_flat_dx, fqup_strap1/ qed. -lemma fqup_flat_dx_bind_dx: ∀b,p,I1,I2,G,L,V1,V2,T. ⦃G,L,ⓕ{I1}V1.ⓑ{p,I2}V2.T⦄ ⊐+[b] ⦃G,L.ⓑ{I2}V2,T⦄. -/2 width=5 by fqu_bind_dx, fqup_strap1/ qed. +lemma fqup_flat_dx_bind_dx: ∀p,I1,I2,G,L,V1,V2,T. ⦃G,L,ⓕ{I1}V1.ⓑ{p,I2}V2.T⦄ ⬂+[Ⓣ] ⦃G,L.ⓑ{I2}V2,T⦄. +/3 width=5 by fqu_bind_dx, fqup_strap1/ qed. (* Basic eliminators ********************************************************) lemma fqup_ind: ∀b,G1,L1,T1. ∀Q:relation3 …. - (∀G2,L2,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2⦄ → Q G2 L2 T2) → - (∀G,G2,L,L2,T,T2. ⦃G1,L1,T1⦄ ⊐+[b] ⦃G,L,T⦄ → ⦃G,L,T⦄ ⊐[b] ⦃G2,L2,T2⦄ → Q G L T → Q G2 L2 T2) → - ∀G2,L2,T2. ⦃G1,L1,T1⦄ ⊐+[b] ⦃G2,L2,T2⦄ → Q G2 L2 T2. + (∀G2,L2,T2. ⦃G1,L1,T1⦄ ⬂[b] ⦃G2,L2,T2⦄ → Q G2 L2 T2) → + (∀G,G2,L,L2,T,T2. ⦃G1,L1,T1⦄ ⬂+[b] ⦃G,L,T⦄ → ⦃G,L,T⦄ ⬂[b] ⦃G2,L2,T2⦄ → Q G L T → Q G2 L2 T2) → + ∀G2,L2,T2. ⦃G1,L1,T1⦄ ⬂+[b] ⦃G2,L2,T2⦄ → Q G2 L2 T2. #b #G1 #L1 #T1 #Q #IH1 #IH2 #G2 #L2 #T2 #H @(tri_TC_ind … IH1 IH2 G2 L2 T2 H) qed-. lemma fqup_ind_dx: ∀b,G2,L2,T2. ∀Q:relation3 …. - (∀G1,L1,T1. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2⦄ → Q G1 L1 T1) → - (∀G1,G,L1,L,T1,T. ⦃G1,L1,T1⦄ ⊐[b] ⦃G,L,T⦄ → ⦃G,L,T⦄ ⊐+[b] ⦃G2,L2,T2⦄ → Q G L T → Q G1 L1 T1) → - ∀G1,L1,T1. ⦃G1,L1,T1⦄ ⊐+[b] ⦃G2,L2,T2⦄ → Q G1 L1 T1. + (∀G1,L1,T1. ⦃G1,L1,T1⦄ ⬂[b] ⦃G2,L2,T2⦄ → Q G1 L1 T1) → + (∀G1,G,L1,L,T1,T. ⦃G1,L1,T1⦄ ⬂[b] ⦃G,L,T⦄ → ⦃G,L,T⦄ ⬂+[b] ⦃G2,L2,T2⦄ → Q G L T → Q G1 L1 T1) → + ∀G1,L1,T1. ⦃G1,L1,T1⦄ ⬂+[b] ⦃G2,L2,T2⦄ → Q G1 L1 T1. #b #G2 #L2 #T2 #Q #IH1 #IH2 #G1 #L1 #T1 #H @(tri_TC_ind_dx … IH1 IH2 G1 L1 T1 H) qed-. @@ -86,7 +86,7 @@ qed-. (* Advanced properties ******************************************************) lemma fqup_zeta (b) (p) (I) (G) (K) (V): - ∀T1,T2. ⬆*[1]T2 ≘ T1 → ⦃G,K,ⓑ{p,I}V.T1⦄ ⊐+[b] ⦃G,K,T2⦄. -/4 width=5 by fqup_strap2, fqu_fqup, fqu_drop/ qed. + ∀T1,T2. ⬆*[1]T2 ≘ T1 → ⦃G,K,ⓑ{p,I}V.T1⦄ ⬂+[b] ⦃G,K,T2⦄. +* /4 width=5 by fqup_strap2, fqu_fqup, fqu_drop, fqu_clear, fqu_bind_dx/ qed. (* Basic_2A1: removed theorems 1: fqup_drop *) diff --git a/matita/matita/contribs/lambdadelta/static_2/s_computation/fqup_drops.ma b/matita/matita/contribs/lambdadelta/static_2/s_computation/fqup_drops.ma index 37bd15ada..c21d46c60 100644 --- a/matita/matita/contribs/lambdadelta/static_2/s_computation/fqup_drops.ma +++ b/matita/matita/contribs/lambdadelta/static_2/s_computation/fqup_drops.ma @@ -20,7 +20,7 @@ include "static_2/s_computation/fqup.ma". (* Properties with generic slicing for local environments *******************) lemma fqup_drops_succ: ∀b,G,K,T,i,L,U. ⬇*[↑i] L ≘ K → ⬆*[↑i] T ≘ U → - ⦃G,L,U⦄ ⊐+[b] ⦃G,K,T⦄. + ⦃G,L,U⦄ ⬂+[b] ⦃G,K,T⦄. #b #G #K #T #i elim i -i [ #L #U #HLK #HTU elim (drops_inv_succ … HLK) -HLK #I #Y #HY #H destruct <(drops_fwd_isid … HY) -K // @@ -33,7 +33,7 @@ lemma fqup_drops_succ: ∀b,G,K,T,i,L,U. ⬇*[↑i] L ≘ K → ⬆*[↑i] T ≘ qed. lemma fqup_drops_strap1: ∀b,G1,G2,L1,K1,K2,T1,T2,U1,i. ⬇*[i] L1 ≘ K1 → ⬆*[i] T1 ≘ U1 → - ⦃G1,K1,T1⦄ ⊐[b] ⦃G2,K2,T2⦄ → ⦃G1,L1,U1⦄ ⊐+[b] ⦃G2,K2,T2⦄. + ⦃G1,K1,T1⦄ ⬂[b] ⦃G2,K2,T2⦄ → ⦃G1,L1,U1⦄ ⬂+[b] ⦃G2,K2,T2⦄. #b #G1 #G2 #L1 #K1 #K2 #T1 #T2 #U1 * [ #HLK1 #HTU1 #HT12 >(drops_fwd_isid … HLK1) -L1 // @@ -42,5 +42,5 @@ lemma fqup_drops_strap1: ∀b,G1,G2,L1,K1,K2,T1,T2,U1,i. ⬇*[i] L1 ≘ K1 → ] qed-. -lemma fqup_lref: ∀b,I,G,L,K,V,i. ⬇*[i] L ≘ K.ⓑ{I}V → ⦃G,L,#i⦄ ⊐+[b] ⦃G,K,V⦄. +lemma fqup_lref: ∀b,I,G,L,K,V,i. ⬇*[i] L ≘ K.ⓑ{I}V → ⦃G,L,#i⦄ ⬂+[b] ⦃G,K,V⦄. /2 width=6 by fqup_drops_strap1/ qed. diff --git a/matita/matita/contribs/lambdadelta/static_2/s_computation/fqup_weight.ma b/matita/matita/contribs/lambdadelta/static_2/s_computation/fqup_weight.ma index c92721f84..94319671a 100644 --- a/matita/matita/contribs/lambdadelta/static_2/s_computation/fqup_weight.ma +++ b/matita/matita/contribs/lambdadelta/static_2/s_computation/fqup_weight.ma @@ -19,7 +19,7 @@ include "static_2/s_computation/fqup.ma". (* Forward lemmas with weight for closures **********************************) -lemma fqup_fwd_fw: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐+[b] ⦃G2,L2,T2⦄ → +lemma fqup_fwd_fw: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂+[b] ⦃G2,L2,T2⦄ → ♯{G2,L2,T2} < ♯{G1,L1,T1}. #b #G1 #G2 #L1 #L2 #T1 #T2 #H @(fqup_ind … H) -G2 -L2 -T2 /3 width=3 by fqu_fwd_fw, transitive_lt/ @@ -28,7 +28,7 @@ qed-. (* Advanced eliminators *****************************************************) lemma fqup_wf_ind: ∀b. ∀Q:relation3 …. ( - ∀G1,L1,T1. (∀G2,L2,T2. ⦃G1,L1,T1⦄ ⊐+[b] ⦃G2,L2,T2⦄ → Q G2 L2 T2) → + ∀G1,L1,T1. (∀G2,L2,T2. ⦃G1,L1,T1⦄ ⬂+[b] ⦃G2,L2,T2⦄ → Q G2 L2 T2) → Q G1 L1 T1 ) → ∀G1,L1,T1. Q G1 L1 T1. #b #Q #HQ @(f3_ind … fw) #x #IHx #G1 #L1 #T1 #H destruct @@ -36,7 +36,7 @@ lemma fqup_wf_ind: ∀b. ∀Q:relation3 …. ( qed-. lemma fqup_wf_ind_eq: ∀b. ∀Q:relation3 …. ( - ∀G1,L1,T1. (∀G2,L2,T2. ⦃G1,L1,T1⦄ ⊐+[b] ⦃G2,L2,T2⦄ → Q G2 L2 T2) → + ∀G1,L1,T1. (∀G2,L2,T2. ⦃G1,L1,T1⦄ ⬂+[b] ⦃G2,L2,T2⦄ → Q G2 L2 T2) → ∀G2,L2,T2. G1 = G2 → L1 = L2 → T1 = T2 → Q G2 L2 T2 ) → ∀G1,L1,T1. Q G1 L1 T1. #b #Q #HQ @(f3_ind … fw) #x #IHx #G1 #L1 #T1 #H destruct diff --git a/matita/matita/contribs/lambdadelta/static_2/s_computation/fqus.ma b/matita/matita/contribs/lambdadelta/static_2/s_computation/fqus.ma index 1289e8487..d1183daff 100644 --- a/matita/matita/contribs/lambdadelta/static_2/s_computation/fqus.ma +++ b/matita/matita/contribs/lambdadelta/static_2/s_computation/fqus.ma @@ -31,15 +31,15 @@ interpretation "star-iterated structural successor (closure)" (* Basic eliminators ********************************************************) lemma fqus_ind: ∀b,G1,L1,T1. ∀Q:relation3 …. Q G1 L1 T1 → - (∀G,G2,L,L2,T,T2. ⦃G1,L1,T1⦄ ⊐*[b] ⦃G,L,T⦄ → ⦃G,L,T⦄ ⊐⸮[b] ⦃G2,L2,T2⦄ → Q G L T → Q G2 L2 T2) → - ∀G2,L2,T2. ⦃G1,L1,T1⦄ ⊐*[b] ⦃G2,L2,T2⦄ → Q G2 L2 T2. + (∀G,G2,L,L2,T,T2. ⦃G1,L1,T1⦄ ⬂*[b] ⦃G,L,T⦄ → ⦃G,L,T⦄ ⬂⸮[b] ⦃G2,L2,T2⦄ → Q G L T → Q G2 L2 T2) → + ∀G2,L2,T2. ⦃G1,L1,T1⦄ ⬂*[b] ⦃G2,L2,T2⦄ → Q G2 L2 T2. #b #G1 #L1 #T1 #R #IH1 #IH2 #G2 #L2 #T2 #H @(tri_TC_star_ind … IH1 IH2 G2 L2 T2 H) // qed-. lemma fqus_ind_dx: ∀b,G2,L2,T2. ∀Q:relation3 …. Q G2 L2 T2 → - (∀G1,G,L1,L,T1,T. ⦃G1,L1,T1⦄ ⊐⸮[b] ⦃G,L,T⦄ → ⦃G,L,T⦄ ⊐*[b] ⦃G2,L2,T2⦄ → Q G L T → Q G1 L1 T1) → - ∀G1,L1,T1. ⦃G1,L1,T1⦄ ⊐*[b] ⦃G2,L2,T2⦄ → Q G1 L1 T1. + (∀G1,G,L1,L,T1,T. ⦃G1,L1,T1⦄ ⬂⸮[b] ⦃G,L,T⦄ → ⦃G,L,T⦄ ⬂*[b] ⦃G2,L2,T2⦄ → Q G L T → Q G1 L1 T1) → + ∀G1,L1,T1. ⦃G1,L1,T1⦄ ⬂*[b] ⦃G2,L2,T2⦄ → Q G1 L1 T1. #b #G2 #L2 #T2 #Q #IH1 #IH2 #G1 #L1 #T1 #H @(tri_TC_star_ind_dx … IH1 IH2 G1 L1 T1 H) // qed-. @@ -49,78 +49,78 @@ qed-. lemma fqus_refl: ∀b. tri_reflexive … (fqus b). /2 width=1 by tri_inj/ qed. -lemma fquq_fqus: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐⸮[b] ⦃G2,L2,T2⦄ → - ⦃G1,L1,T1⦄ ⊐*[b] ⦃G2,L2,T2⦄. +lemma fquq_fqus: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂⸮[b] ⦃G2,L2,T2⦄ → + ⦃G1,L1,T1⦄ ⬂*[b] ⦃G2,L2,T2⦄. /2 width=1 by tri_inj/ qed. -lemma fqus_strap1: ∀b,G1,G,G2,L1,L,L2,T1,T,T2. ⦃G1,L1,T1⦄ ⊐*[b] ⦃G,L,T⦄ → - ⦃G,L,T⦄ ⊐⸮[b] ⦃G2,L2,T2⦄ → ⦃G1,L1,T1⦄ ⊐*[b] ⦃G2,L2,T2⦄. +lemma fqus_strap1: ∀b,G1,G,G2,L1,L,L2,T1,T,T2. ⦃G1,L1,T1⦄ ⬂*[b] ⦃G,L,T⦄ → + ⦃G,L,T⦄ ⬂⸮[b] ⦃G2,L2,T2⦄ → ⦃G1,L1,T1⦄ ⬂*[b] ⦃G2,L2,T2⦄. /2 width=5 by tri_step/ qed-. -lemma fqus_strap2: ∀b,G1,G,G2,L1,L,L2,T1,T,T2. ⦃G1,L1,T1⦄ ⊐⸮[b] ⦃G,L,T⦄ → - ⦃G,L,T⦄ ⊐*[b] ⦃G2,L2,T2⦄ → ⦃G1,L1,T1⦄ ⊐*[b] ⦃G2,L2,T2⦄. +lemma fqus_strap2: ∀b,G1,G,G2,L1,L,L2,T1,T,T2. ⦃G1,L1,T1⦄ ⬂⸮[b] ⦃G,L,T⦄ → + ⦃G,L,T⦄ ⬂*[b] ⦃G2,L2,T2⦄ → ⦃G1,L1,T1⦄ ⬂*[b] ⦃G2,L2,T2⦄. /2 width=5 by tri_TC_strap/ qed-. (* Basic inversion lemmas ***************************************************) -lemma fqus_inv_fqu_sn: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐*[b] ⦃G2,L2,T2⦄ → +lemma fqus_inv_fqu_sn: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂*[b] ⦃G2,L2,T2⦄ → (∧∧ G1 = G2 & L1 = L2 & T1 = T2) ∨ - ∃∃G,L,T. ⦃G1,L1,T1⦄ ⊐[b] ⦃G,L,T⦄ & ⦃G,L,T⦄ ⊐*[b] ⦃G2,L2,T2⦄. + ∃∃G,L,T. ⦃G1,L1,T1⦄ ⬂[b] ⦃G,L,T⦄ & ⦃G,L,T⦄ ⬂*[b] ⦃G2,L2,T2⦄. #b #G1 #G2 #L1 #L2 #T1 #T2 #H12 @(fqus_ind_dx … H12) -G1 -L1 -T1 /3 width=1 by and3_intro, or_introl/ #G1 #G #L1 #L #T1 #T * /3 width=5 by ex2_3_intro, or_intror/ * #HG #HL #HT #_ destruct // qed-. -lemma fqus_inv_sort1: ∀b,G1,G2,L1,L2,T2,s. ⦃G1,L1,⋆s⦄ ⊐*[b] ⦃G2,L2,T2⦄ → +lemma fqus_inv_sort1: ∀b,G1,G2,L1,L2,T2,s. ⦃G1,L1,⋆s⦄ ⬂*[b] ⦃G2,L2,T2⦄ → (∧∧ G1 = G2 & L1 = L2 & ⋆s = T2) ∨ - ∃∃J,L. ⦃G1,L,⋆s⦄ ⊐*[b] ⦃G2,L2,T2⦄ & L1 = L.ⓘ{J}. + ∃∃J,L. ⦃G1,L,⋆s⦄ ⬂*[b] ⦃G2,L2,T2⦄ & L1 = L.ⓘ{J}. #b #G1 #G2 #L1 #L2 #T2 #s #H elim (fqus_inv_fqu_sn … H) -H * /3 width=1 by and3_intro, or_introl/ #G #L #T #H elim (fqu_inv_sort1 … H) -H /3 width=4 by ex2_2_intro, or_intror/ qed-. -lemma fqus_inv_lref1: ∀b,G1,G2,L1,L2,T2,i. ⦃G1,L1,#i⦄ ⊐*[b] ⦃G2,L2,T2⦄ → +lemma fqus_inv_lref1: ∀b,G1,G2,L1,L2,T2,i. ⦃G1,L1,#i⦄ ⬂*[b] ⦃G2,L2,T2⦄ → ∨∨ ∧∧ G1 = G2 & L1 = L2 & #i = T2 - | ∃∃J,L,V. ⦃G1,L,V⦄ ⊐*[b] ⦃G2,L2,T2⦄ & L1 = L.ⓑ{J}V & i = 0 - | ∃∃J,L,j. ⦃G1,L,#j⦄ ⊐*[b] ⦃G2,L2,T2⦄ & L1 = L.ⓘ{J} & i = ↑j. + | ∃∃J,L,V. ⦃G1,L,V⦄ ⬂*[b] ⦃G2,L2,T2⦄ & L1 = L.ⓑ{J}V & i = 0 + | ∃∃J,L,j. ⦃G1,L,#j⦄ ⬂*[b] ⦃G2,L2,T2⦄ & L1 = L.ⓘ{J} & i = ↑j. #b #G1 #G2 #L1 #L2 #T2 #i #H elim (fqus_inv_fqu_sn … H) -H * /3 width=1 by and3_intro, or3_intro0/ #G #L #T #H elim (fqu_inv_lref1 … H) -H * /3 width=7 by or3_intro1, or3_intro2, ex3_4_intro, ex3_3_intro/ qed-. -lemma fqus_inv_gref1: ∀b,G1,G2,L1,L2,T2,l. ⦃G1,L1,§l⦄ ⊐*[b] ⦃G2,L2,T2⦄ → +lemma fqus_inv_gref1: ∀b,G1,G2,L1,L2,T2,l. ⦃G1,L1,§l⦄ ⬂*[b] ⦃G2,L2,T2⦄ → (∧∧ G1 = G2 & L1 = L2 & §l = T2) ∨ - ∃∃J,L. ⦃G1,L,§l⦄ ⊐*[b] ⦃G2,L2,T2⦄ & L1 = L.ⓘ{J}. + ∃∃J,L. ⦃G1,L,§l⦄ ⬂*[b] ⦃G2,L2,T2⦄ & L1 = L.ⓘ{J}. #b #G1 #G2 #L1 #L2 #T2 #l #H elim (fqus_inv_fqu_sn … H) -H * /3 width=1 by and3_intro, or_introl/ #G #L #T #H elim (fqu_inv_gref1 … H) -H /3 width=4 by ex2_2_intro, or_intror/ qed-. -lemma fqus_inv_bind1: ∀b,p,I,G1,G2,L1,L2,V1,T1,T2. ⦃G1,L1,ⓑ{p,I}V1.T1⦄ ⊐*[b] ⦃G2,L2,T2⦄ → +lemma fqus_inv_bind1: ∀b,p,I,G1,G2,L1,L2,V1,T1,T2. ⦃G1,L1,ⓑ{p,I}V1.T1⦄ ⬂*[b] ⦃G2,L2,T2⦄ → ∨∨ ∧∧ G1 = G2 & L1 = L2 & ⓑ{p,I}V1.T1 = T2 - | ⦃G1,L1,V1⦄ ⊐*[b] ⦃G2,L2,T2⦄ - | ⦃G1,L1.ⓑ{I}V1,T1⦄ ⊐*[b] ⦃G2,L2,T2⦄ - | ⦃G1,L1.ⓧ,T1⦄ ⊐*[b] ⦃G2,L2,T2⦄ ∧ b = Ⓕ - | ∃∃J,L,T. ⦃G1,L,T⦄ ⊐*[b] ⦃G2,L2,T2⦄ & ⬆*[1] T ≘ ⓑ{p,I}V1.T1 & L1 = L.ⓘ{J}. + | ⦃G1,L1,V1⦄ ⬂*[b] ⦃G2,L2,T2⦄ + | ∧∧ ⦃G1,L1.ⓑ{I}V1,T1⦄ ⬂*[b] ⦃G2,L2,T2⦄ & b = Ⓣ + | ∧∧ ⦃G1,L1.ⓧ,T1⦄ ⬂*[b] ⦃G2,L2,T2⦄ & b = Ⓕ + | ∃∃J,L,T. ⦃G1,L,T⦄ ⬂*[b] ⦃G2,L2,T2⦄ & ⬆*[1] T ≘ ⓑ{p,I}V1.T1 & L1 = L.ⓘ{J}. #b #p #I #G1 #G2 #L1 #L2 #V1 #T1 #T2 #H elim (fqus_inv_fqu_sn … H) -H * /3 width=1 by and3_intro, or5_intro0/ #G #L #T #H elim (fqu_inv_bind1 … H) -H * -[4: #J ] #H1 #H2 #H3 [4: #Hb ] #H destruct +[4: #J ] #H1 #H2 #H3 [3,4: #Hb ] #H destruct /3 width=6 by or5_intro1, or5_intro2, or5_intro3, or5_intro4, ex3_3_intro, conj/ qed-. -lemma fqus_inv_bind1_true: ∀p,I,G1,G2,L1,L2,V1,T1,T2. ⦃G1,L1,ⓑ{p,I}V1.T1⦄ ⊐* ⦃G2,L2,T2⦄ → +lemma fqus_inv_bind1_true: ∀p,I,G1,G2,L1,L2,V1,T1,T2. ⦃G1,L1,ⓑ{p,I}V1.T1⦄ ⬂* ⦃G2,L2,T2⦄ → ∨∨ ∧∧ G1 = G2 & L1 = L2 & ⓑ{p,I}V1.T1 = T2 - | ⦃G1,L1,V1⦄ ⊐* ⦃G2,L2,T2⦄ - | ⦃G1,L1.ⓑ{I}V1,T1⦄ ⊐* ⦃G2,L2,T2⦄ - | ∃∃J,L,T. ⦃G1,L,T⦄ ⊐* ⦃G2,L2,T2⦄ & ⬆*[1] T ≘ ⓑ{p,I}V1.T1 & L1 = L.ⓘ{J}. -#p #I #G1 #G2 #L1 #L2 #V1 #T1 #T2 #H elim (fqus_inv_bind1 … H) -H [1,4: * ] -/3 width=1 by and3_intro, or4_intro0, or4_intro1, or4_intro2, or4_intro3, ex3_3_intro/ + | ⦃G1,L1,V1⦄ ⬂* ⦃G2,L2,T2⦄ + | ⦃G1,L1.ⓑ{I}V1,T1⦄ ⬂* ⦃G2,L2,T2⦄ + | ∃∃J,L,T. ⦃G1,L,T⦄ ⬂* ⦃G2,L2,T2⦄ & ⬆*[1] T ≘ ⓑ{p,I}V1.T1 & L1 = L.ⓘ{J}. +#p #I #G1 #G2 #L1 #L2 #V1 #T1 #T2 #H elim (fqus_inv_bind1 … H) -H [1,3,4: * ] +/3 width=1 by and3_intro, or4_intro0, or4_intro1, or4_intro2, or4_intro3/ #_ #H destruct qed-. -lemma fqus_inv_flat1: ∀b,I,G1,G2,L1,L2,V1,T1,T2. ⦃G1,L1,ⓕ{I}V1.T1⦄ ⊐*[b] ⦃G2,L2,T2⦄ → +lemma fqus_inv_flat1: ∀b,I,G1,G2,L1,L2,V1,T1,T2. ⦃G1,L1,ⓕ{I}V1.T1⦄ ⬂*[b] ⦃G2,L2,T2⦄ → ∨∨ ∧∧ G1 = G2 & L1 = L2 & ⓕ{I}V1.T1 = T2 - | ⦃G1,L1,V1⦄ ⊐*[b] ⦃G2,L2,T2⦄ - | ⦃G1,L1,T1⦄ ⊐*[b] ⦃G2,L2,T2⦄ - | ∃∃J,L,T. ⦃G1,L,T⦄ ⊐*[b] ⦃G2,L2,T2⦄ & ⬆*[1] T ≘ ⓕ{I}V1.T1 & L1 = L.ⓘ{J}. + | ⦃G1,L1,V1⦄ ⬂*[b] ⦃G2,L2,T2⦄ + | ⦃G1,L1,T1⦄ ⬂*[b] ⦃G2,L2,T2⦄ + | ∃∃J,L,T. ⦃G1,L,T⦄ ⬂*[b] ⦃G2,L2,T2⦄ & ⬆*[1] T ≘ ⓕ{I}V1.T1 & L1 = L.ⓘ{J}. #b #I #G1 #G2 #L1 #L2 #V1 #T1 #T2 #H elim (fqus_inv_fqu_sn … H) -H * /3 width=1 by and3_intro, or4_intro0/ #G #L #T #H elim (fqu_inv_flat1 … H) -H * [3: #J ] #H1 #H2 #H3 #H destruct @@ -129,35 +129,35 @@ qed-. (* Advanced inversion lemmas ************************************************) -lemma fqus_inv_atom1: ∀b,I,G1,G2,L2,T2. ⦃G1,⋆,⓪{I}⦄ ⊐*[b] ⦃G2,L2,T2⦄ → +lemma fqus_inv_atom1: ∀b,I,G1,G2,L2,T2. ⦃G1,⋆,⓪{I}⦄ ⬂*[b] ⦃G2,L2,T2⦄ → ∧∧ G1 = G2 & ⋆ = L2 & ⓪{I} = T2. #b #I #G1 #G2 #L2 #T2 #H elim (fqus_inv_fqu_sn … H) -H * /2 width=1 by and3_intro/ #G #L #T #H elim (fqu_inv_atom1 … H) qed-. -lemma fqus_inv_sort1_bind: ∀b,I,G1,G2,L1,L2,T2,s. ⦃G1,L1.ⓘ{I},⋆s⦄ ⊐*[b] ⦃G2,L2,T2⦄ → - (∧∧ G1 = G2 & L1.ⓘ{I} = L2 & ⋆s = T2) ∨ ⦃G1,L1,⋆s⦄ ⊐*[b] ⦃G2,L2,T2⦄. +lemma fqus_inv_sort1_bind: ∀b,I,G1,G2,L1,L2,T2,s. ⦃G1,L1.ⓘ{I},⋆s⦄ ⬂*[b] ⦃G2,L2,T2⦄ → + (∧∧ G1 = G2 & L1.ⓘ{I} = L2 & ⋆s = T2) ∨ ⦃G1,L1,⋆s⦄ ⬂*[b] ⦃G2,L2,T2⦄. #b #I #G1 #G2 #L1 #L2 #T2 #s #H elim (fqus_inv_fqu_sn … H) -H * /3 width=1 by and3_intro, or_introl/ #G #L #T #H elim (fqu_inv_sort1_bind … H) -H #H1 #H2 #H3 #H destruct /2 width=1 by or_intror/ qed-. -lemma fqus_inv_zero1_pair: ∀b,I,G1,G2,L1,L2,V1,T2. ⦃G1,L1.ⓑ{I}V1,#0⦄ ⊐*[b] ⦃G2,L2,T2⦄ → - (∧∧ G1 = G2 & L1.ⓑ{I}V1 = L2 & #0 = T2) ∨ ⦃G1,L1,V1⦄ ⊐*[b] ⦃G2,L2,T2⦄. +lemma fqus_inv_zero1_pair: ∀b,I,G1,G2,L1,L2,V1,T2. ⦃G1,L1.ⓑ{I}V1,#0⦄ ⬂*[b] ⦃G2,L2,T2⦄ → + (∧∧ G1 = G2 & L1.ⓑ{I}V1 = L2 & #0 = T2) ∨ ⦃G1,L1,V1⦄ ⬂*[b] ⦃G2,L2,T2⦄. #b #I #G1 #G2 #L1 #L2 #V1 #T2 #H elim (fqus_inv_fqu_sn … H) -H * /3 width=1 by and3_intro, or_introl/ #G #L #T #H elim (fqu_inv_zero1_pair … H) -H #H1 #H2 #H3 #H destruct /2 width=1 by or_intror/ qed-. -lemma fqus_inv_lref1_bind: ∀b,I,G1,G2,L1,L2,T2,i. ⦃G1,L1.ⓘ{I},#↑i⦄ ⊐*[b] ⦃G2,L2,T2⦄ → - (∧∧ G1 = G2 & L1.ⓘ{I} = L2 & #(↑i) = T2) ∨ ⦃G1,L1,#i⦄ ⊐*[b] ⦃G2,L2,T2⦄. +lemma fqus_inv_lref1_bind: ∀b,I,G1,G2,L1,L2,T2,i. ⦃G1,L1.ⓘ{I},#↑i⦄ ⬂*[b] ⦃G2,L2,T2⦄ → + (∧∧ G1 = G2 & L1.ⓘ{I} = L2 & #(↑i) = T2) ∨ ⦃G1,L1,#i⦄ ⬂*[b] ⦃G2,L2,T2⦄. #b #I #G1 #G2 #L1 #L2 #T2 #i #H elim (fqus_inv_fqu_sn … H) -H * /3 width=1 by and3_intro, or_introl/ #G #L #T #H elim (fqu_inv_lref1_bind … H) -H #H1 #H2 #H3 #H destruct /2 width=1 by or_intror/ qed-. -lemma fqus_inv_gref1_bind: ∀b,I,G1,G2,L1,L2,T2,l. ⦃G1,L1.ⓘ{I},§l⦄ ⊐*[b] ⦃G2,L2,T2⦄ → - (∧∧ G1 = G2 & L1.ⓘ{I} = L2 & §l = T2) ∨ ⦃G1,L1,§l⦄ ⊐*[b] ⦃G2,L2,T2⦄. +lemma fqus_inv_gref1_bind: ∀b,I,G1,G2,L1,L2,T2,l. ⦃G1,L1.ⓘ{I},§l⦄ ⬂*[b] ⦃G2,L2,T2⦄ → + (∧∧ G1 = G2 & L1.ⓘ{I} = L2 & §l = T2) ∨ ⦃G1,L1,§l⦄ ⬂*[b] ⦃G2,L2,T2⦄. #b #I #G1 #G2 #L1 #L2 #T2 #l #H elim (fqus_inv_fqu_sn … H) -H * /3 width=1 by and3_intro, or_introl/ #G #L #T #H elim (fqu_inv_gref1_bind … H) -H #H1 #H2 #H3 #H destruct /2 width=1 by or_intror/ diff --git a/matita/matita/contribs/lambdadelta/static_2/s_computation/fqus_drops.ma b/matita/matita/contribs/lambdadelta/static_2/s_computation/fqus_drops.ma index 7c0f79cba..24ba92a09 100644 --- a/matita/matita/contribs/lambdadelta/static_2/s_computation/fqus_drops.ma +++ b/matita/matita/contribs/lambdadelta/static_2/s_computation/fqus_drops.ma @@ -20,7 +20,7 @@ include "static_2/s_computation/fqus_fqup.ma". (* Properties with generic slicing for local environments *******************) lemma fqus_drops: ∀b,G,L,K,T,U,i. ⬇*[i] L ≘ K → ⬆*[i] T ≘ U → - ⦃G,L,U⦄ ⊐*[b] ⦃G,K,T⦄. + ⦃G,L,U⦄ ⬂*[b] ⦃G,K,T⦄. #b #G #L #K #T #U * /3 width=3 by fqup_drops_succ, fqup_fqus/ #HLK #HTU <(lifts_fwd_isid … HTU) -U // <(drops_fwd_isid … HLK) -K // qed. diff --git a/matita/matita/contribs/lambdadelta/static_2/s_computation/fqus_fqup.ma b/matita/matita/contribs/lambdadelta/static_2/s_computation/fqus_fqup.ma index f5f521dd5..f59fd10aa 100644 --- a/matita/matita/contribs/lambdadelta/static_2/s_computation/fqus_fqup.ma +++ b/matita/matita/contribs/lambdadelta/static_2/s_computation/fqus_fqup.ma @@ -19,14 +19,14 @@ include "static_2/s_computation/fqus.ma". (* Alternative definition with plus-iterated supclosure *********************) -lemma fqup_fqus: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐+[b] ⦃G2,L2,T2⦄ → ⦃G1,L1,T1⦄ ⊐*[b] ⦃G2,L2,T2⦄. +lemma fqup_fqus: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂+[b] ⦃G2,L2,T2⦄ → ⦃G1,L1,T1⦄ ⬂*[b] ⦃G2,L2,T2⦄. #b #G1 #G2 #L1 #L2 #T1 #T2 #H @(fqup_ind … H) -G2 -L2 -T2 /3 width=5 by fqus_strap1, fquq_fqus, fqu_fquq/ qed. (* Basic_2A1: was: fqus_inv_gen *) -lemma fqus_inv_fqup: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐*[b] ⦃G2,L2,T2⦄ → - ⦃G1,L1,T1⦄ ⊐+[b] ⦃G2,L2,T2⦄ ∨ (∧∧ G1 = G2 & L1 = L2 & T1 = T2). +lemma fqus_inv_fqup: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂*[b] ⦃G2,L2,T2⦄ → + ⦃G1,L1,T1⦄ ⬂+[b] ⦃G2,L2,T2⦄ ∨ (∧∧ G1 = G2 & L1 = L2 & T1 = T2). #b #G1 #G2 #L1 #L2 #T1 #T2 #H @(fqus_ind … H) -G2 -L2 -T2 // #G #G2 #L #L2 #T #T2 #_ * [ #H2 * /3 width=5 by fqup_strap1, or_introl/ @@ -37,38 +37,38 @@ qed-. (* Advanced properties ******************************************************) -lemma fqus_strap1_fqu: ∀b,G1,G,G2,L1,L,L2,T1,T,T2. ⦃G1,L1,T1⦄ ⊐*[b] ⦃G,L,T⦄ → ⦃G,L,T⦄ ⊐[b] ⦃G2,L2,T2⦄ → - ⦃G1,L1,T1⦄ ⊐+[b] ⦃G2,L2,T2⦄. +lemma fqus_strap1_fqu: ∀b,G1,G,G2,L1,L,L2,T1,T,T2. ⦃G1,L1,T1⦄ ⬂*[b] ⦃G,L,T⦄ → ⦃G,L,T⦄ ⬂[b] ⦃G2,L2,T2⦄ → + ⦃G1,L1,T1⦄ ⬂+[b] ⦃G2,L2,T2⦄. #b #G1 #G #G2 #L1 #L #L2 #T1 #T #T2 #H1 #H2 elim (fqus_inv_fqup … H1) -H1 [ /2 width=5 by fqup_strap1/ | * /2 width=1 by fqu_fqup/ ] qed-. -lemma fqus_strap2_fqu: ∀b,G1,G,G2,L1,L,L2,T1,T,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G,L,T⦄ → ⦃G,L,T⦄ ⊐*[b] ⦃G2,L2,T2⦄ → - ⦃G1,L1,T1⦄ ⊐+[b] ⦃G2,L2,T2⦄. +lemma fqus_strap2_fqu: ∀b,G1,G,G2,L1,L,L2,T1,T,T2. ⦃G1,L1,T1⦄ ⬂[b] ⦃G,L,T⦄ → ⦃G,L,T⦄ ⬂*[b] ⦃G2,L2,T2⦄ → + ⦃G1,L1,T1⦄ ⬂+[b] ⦃G2,L2,T2⦄. #b #G1 #G #G2 #L1 #L #L2 #T1 #T #T2 #H1 #H2 elim (fqus_inv_fqup … H2) -H2 [ /2 width=5 by fqup_strap2/ | * /2 width=1 by fqu_fqup/ ] qed-. -lemma fqus_fqup_trans: ∀b,G1,G,G2,L1,L,L2,T1,T,T2. ⦃G1,L1,T1⦄ ⊐*[b] ⦃G,L,T⦄ → ⦃G,L,T⦄ ⊐+[b] ⦃G2,L2,T2⦄ → - ⦃G1,L1,T1⦄ ⊐+[b] ⦃G2,L2,T2⦄. +lemma fqus_fqup_trans: ∀b,G1,G,G2,L1,L,L2,T1,T,T2. ⦃G1,L1,T1⦄ ⬂*[b] ⦃G,L,T⦄ → ⦃G,L,T⦄ ⬂+[b] ⦃G2,L2,T2⦄ → + ⦃G1,L1,T1⦄ ⬂+[b] ⦃G2,L2,T2⦄. #b #G1 #G #G2 #L1 #L #L2 #T1 #T #T2 #H1 #H2 @(fqup_ind … H2) -H2 -G2 -L2 -T2 /2 width=5 by fqus_strap1_fqu, fqup_strap1/ qed-. -lemma fqup_fqus_trans: ∀b,G1,G,G2,L1,L,L2,T1,T,T2. ⦃G1,L1,T1⦄ ⊐+[b] ⦃G,L,T⦄ → - ⦃G,L,T⦄ ⊐*[b] ⦃G2,L2,T2⦄ → ⦃G1,L1,T1⦄ ⊐+[b] ⦃G2,L2,T2⦄. +lemma fqup_fqus_trans: ∀b,G1,G,G2,L1,L,L2,T1,T,T2. ⦃G1,L1,T1⦄ ⬂+[b] ⦃G,L,T⦄ → + ⦃G,L,T⦄ ⬂*[b] ⦃G2,L2,T2⦄ → ⦃G1,L1,T1⦄ ⬂+[b] ⦃G2,L2,T2⦄. #b #G1 #G #G2 #L1 #L #L2 #T1 #T #T2 #H1 @(fqup_ind_dx … H1) -H1 -G1 -L1 -T1 /3 width=5 by fqus_strap2_fqu, fqup_strap2/ qed-. (* Advanced inversion lemmas for plus-iterated supclosure *******************) -lemma fqup_inv_step_sn: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐+[b] ⦃G2,L2,T2⦄ → - ∃∃G,L,T. ⦃G1,L1,T1⦄ ⊐[b] ⦃G,L,T⦄ & ⦃G,L,T⦄ ⊐*[b] ⦃G2,L2,T2⦄. +lemma fqup_inv_step_sn: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂+[b] ⦃G2,L2,T2⦄ → + ∃∃G,L,T. ⦃G1,L1,T1⦄ ⬂[b] ⦃G,L,T⦄ & ⦃G,L,T⦄ ⬂*[b] ⦃G2,L2,T2⦄. #b #G1 #G2 #L1 #L2 #T1 #T2 #H @(fqup_ind_dx … H) -G1 -L1 -T1 /2 width=5 by ex2_3_intro/ #G1 #G #L1 #L #T1 #T #H1 #_ * /4 width=9 by fqus_strap2, fqu_fquq, ex2_3_intro/ qed-. diff --git a/matita/matita/contribs/lambdadelta/static_2/s_computation/fqus_weight.ma b/matita/matita/contribs/lambdadelta/static_2/s_computation/fqus_weight.ma index 02be24fc7..72c46008f 100644 --- a/matita/matita/contribs/lambdadelta/static_2/s_computation/fqus_weight.ma +++ b/matita/matita/contribs/lambdadelta/static_2/s_computation/fqus_weight.ma @@ -19,7 +19,7 @@ include "static_2/s_computation/fqus.ma". (* Forward lemmas with weight for closures **********************************) -lemma fqus_fwd_fw: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐*[b] ⦃G2,L2,T2⦄ → +lemma fqus_fwd_fw: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂*[b] ⦃G2,L2,T2⦄ → ♯{G2,L2,T2} ≤ ♯{G1,L1,T1}. #b #G1 #G2 #L1 #L2 #T1 #T2 #H @(fqus_ind … H) -L2 -T2 /3 width=3 by fquq_fwd_fw, transitive_le/ @@ -27,7 +27,7 @@ qed-. (* Advanced inversion lemmas ************************************************) -lemma fqus_inv_refl_atom3: ∀b,I,G,L,X. ⦃G,L,⓪{I}⦄ ⊐*[b] ⦃G,L,X⦄ → ⓪{I} = X. +lemma fqus_inv_refl_atom3: ∀b,I,G,L,X. ⦃G,L,⓪{I}⦄ ⬂*[b] ⦃G,L,X⦄ → ⓪{I} = X. #b #I #G #L #X #H elim (fqus_inv_fqu_sn … H) -H * // #G0 #L0 #T0 #H1 #H2 lapply (fqu_fwd_fw … H1) lapply (fqus_fwd_fw … H2) -H2 -H1 #H2 #H1 lapply (le_to_lt_to_lt … H2 H1) -G0 -L0 -T0 diff --git a/matita/matita/contribs/lambdadelta/static_2/s_transition/fqu.ma b/matita/matita/contribs/lambdadelta/static_2/s_transition/fqu.ma index bff7b2fe9..19dd4d45d 100644 --- a/matita/matita/contribs/lambdadelta/static_2/s_transition/fqu.ma +++ b/matita/matita/contribs/lambdadelta/static_2/s_transition/fqu.ma @@ -28,7 +28,7 @@ include "static_2/relocation/lifts.ma". inductive fqu (b:bool): tri_relation genv lenv term ≝ | fqu_lref_O : ∀I,G,L,V. fqu b G (L.ⓑ{I}V) (#0) G L V | fqu_pair_sn: ∀I,G,L,V,T. fqu b G L (②{I}V.T) G L V -| fqu_bind_dx: ∀p,I,G,L,V,T. fqu b G L (ⓑ{p,I}V.T) G (L.ⓑ{I}V) T +| fqu_bind_dx: ∀p,I,G,L,V,T. b = Ⓣ → fqu b G L (ⓑ{p,I}V.T) G (L.ⓑ{I}V) T | fqu_clear : ∀p,I,G,L,V,T. b = Ⓕ → fqu b G L (ⓑ{p,I}V.T) G (L.ⓧ) T | fqu_flat_dx: ∀I,G,L,V,T. fqu b G L (ⓕ{I}V.T) G L T | fqu_drop : ∀I,G,L,T,U. ⬆*[1] T ≘ U → fqu b G (L.ⓘ{I}) U G L T @@ -44,24 +44,24 @@ interpretation (* Basic properties *********************************************************) -lemma fqu_sort: ∀b,I,G,L,s. ⦃G,L.ⓘ{I},⋆s⦄ ⊐[b] ⦃G,L,⋆s⦄. +lemma fqu_sort: ∀b,I,G,L,s. ⦃G,L.ⓘ{I},⋆s⦄ ⬂[b] ⦃G,L,⋆s⦄. /2 width=1 by fqu_drop/ qed. -lemma fqu_lref_S: ∀b,I,G,L,i. ⦃G,L.ⓘ{I},#↑i⦄ ⊐[b] ⦃G,L,#i⦄. +lemma fqu_lref_S: ∀b,I,G,L,i. ⦃G,L.ⓘ{I},#↑i⦄ ⬂[b] ⦃G,L,#i⦄. /2 width=1 by fqu_drop/ qed. -lemma fqu_gref: ∀b,I,G,L,l. ⦃G,L.ⓘ{I},§l⦄ ⊐[b] ⦃G,L,§l⦄. +lemma fqu_gref: ∀b,I,G,L,l. ⦃G,L.ⓘ{I},§l⦄ ⬂[b] ⦃G,L,§l⦄. /2 width=1 by fqu_drop/ qed. (* Basic inversion lemmas ***************************************************) -fact fqu_inv_sort1_aux: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2⦄ → +fact fqu_inv_sort1_aux: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂[b] ⦃G2,L2,T2⦄ → ∀s. T1 = ⋆s → ∃∃J. G1 = G2 & L1 = L2.ⓘ{J} & T2 = ⋆s. #b #G1 #G2 #L1 #L2 #T1 #T2 * -G1 -G2 -L1 -L2 -T1 -T2 [ #I #G #L #T #s #H destruct | #I #G #L #V #T #s #H destruct -| #p #I #G #L #V #T #s #H destruct +| #p #I #G #L #V #T #_ #s #H destruct | #p #I #G #L #V #T #_ #s #H destruct | #I #G #L #V #T #s #H destruct | #I #G #L #T #U #HI12 #s #H destruct @@ -69,18 +69,18 @@ fact fqu_inv_sort1_aux: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T ] qed-. -lemma fqu_inv_sort1: ∀b,G1,G2,L1,L2,T2,s. ⦃G1,L1,⋆s⦄ ⊐[b] ⦃G2,L2,T2⦄ → +lemma fqu_inv_sort1: ∀b,G1,G2,L1,L2,T2,s. ⦃G1,L1,⋆s⦄ ⬂[b] ⦃G2,L2,T2⦄ → ∃∃J. G1 = G2 & L1 = L2.ⓘ{J} & T2 = ⋆s. /2 width=4 by fqu_inv_sort1_aux/ qed-. -fact fqu_inv_lref1_aux: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2⦄ → +fact fqu_inv_lref1_aux: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂[b] ⦃G2,L2,T2⦄ → ∀i. T1 = #i → (∃∃J,V. G1 = G2 & L1 = L2.ⓑ{J}V & T2 = V & i = 0) ∨ ∃∃J,j. G1 = G2 & L1 = L2.ⓘ{J} & T2 = #j & i = ↑j. #b #G1 #G2 #L1 #L2 #T1 #T2 * -G1 -G2 -L1 -L2 -T1 -T2 [ #I #G #L #T #i #H destruct /3 width=4 by ex4_2_intro, or_introl/ | #I #G #L #V #T #i #H destruct -| #p #I #G #L #V #T #i #H destruct +| #p #I #G #L #V #T #_ #i #H destruct | #p #I #G #L #V #T #_ #i #H destruct | #I #G #L #V #T #i #H destruct | #I #G #L #T #U #HI12 #i #H destruct @@ -88,18 +88,18 @@ fact fqu_inv_lref1_aux: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T ] qed-. -lemma fqu_inv_lref1: ∀b,G1,G2,L1,L2,T2,i. ⦃G1,L1,#i⦄ ⊐[b] ⦃G2,L2,T2⦄ → +lemma fqu_inv_lref1: ∀b,G1,G2,L1,L2,T2,i. ⦃G1,L1,#i⦄ ⬂[b] ⦃G2,L2,T2⦄ → (∃∃J,V. G1 = G2 & L1 = L2.ⓑ{J}V & T2 = V & i = 0) ∨ ∃∃J,j. G1 = G2 & L1 = L2.ⓘ{J} & T2 = #j & i = ↑j. /2 width=4 by fqu_inv_lref1_aux/ qed-. -fact fqu_inv_gref1_aux: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2⦄ → +fact fqu_inv_gref1_aux: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂[b] ⦃G2,L2,T2⦄ → ∀l. T1 = §l → ∃∃J. G1 = G2 & L1 = L2.ⓘ{J} & T2 = §l. #b #G1 #G2 #L1 #L2 #T1 #T2 * -G1 -G2 -L1 -L2 -T1 -T2 [ #I #G #L #T #l #H destruct | #I #G #L #V #T #l #H destruct -| #p #I #G #L #V #T #l #H destruct +| #p #I #G #L #V #T #_ #l #H destruct | #p #I #G #L #V #T #_ #l #H destruct | #I #G #L #V #T #s #H destruct | #I #G #L #T #U #HI12 #l #H destruct @@ -107,43 +107,44 @@ fact fqu_inv_gref1_aux: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T ] qed-. -lemma fqu_inv_gref1: ∀b,G1,G2,L1,L2,T2,l. ⦃G1,L1,§l⦄ ⊐[b] ⦃G2,L2,T2⦄ → +lemma fqu_inv_gref1: ∀b,G1,G2,L1,L2,T2,l. ⦃G1,L1,§l⦄ ⬂[b] ⦃G2,L2,T2⦄ → ∃∃J. G1 = G2 & L1 = L2.ⓘ{J} & T2 = §l. /2 width=4 by fqu_inv_gref1_aux/ qed-. -fact fqu_inv_bind1_aux: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2⦄ → +fact fqu_inv_bind1_aux: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂[b] ⦃G2,L2,T2⦄ → ∀p,I,V1,U1. T1 = ⓑ{p,I}V1.U1 → ∨∨ ∧∧ G1 = G2 & L1 = L2 & V1 = T2 - | ∧∧ G1 = G2 & L1.ⓑ{I}V1 = L2 & U1 = T2 + | ∧∧ G1 = G2 & L1.ⓑ{I}V1 = L2 & U1 = T2 & b = Ⓣ | ∧∧ G1 = G2 & L1.ⓧ = L2 & U1 = T2 & b = Ⓕ | ∃∃J. G1 = G2 & L1 = L2.ⓘ{J} & ⬆*[1] T2 ≘ ⓑ{p,I}V1.U1. #b #G1 #G2 #L1 #L2 #T1 #T2 * -G1 -G2 -L1 -L2 -T1 -T2 [ #I #G #L #T #q #J #V0 #U0 #H destruct | #I #G #L #V #T #q #J #V0 #U0 #H destruct /3 width=1 by and3_intro, or4_intro0/ -| #p #I #G #L #V #T #q #J #V0 #U0 #H destruct /3 width=1 by and3_intro, or4_intro1/ +| #p #I #G #L #V #T #Hb #q #J #V0 #U0 #H destruct /3 width=1 by and4_intro, or4_intro1/ | #p #I #G #L #V #T #Hb #q #J #V0 #U0 #H destruct /3 width=1 by and4_intro, or4_intro2/ | #I #G #L #V #T #q #J #V0 #U0 #H destruct | #I #G #L #T #U #HTU #q #J #V0 #U0 #H destruct /3 width=2 by or4_intro3, ex3_intro/ ] qed-. -lemma fqu_inv_bind1: ∀b,p,I,G1,G2,L1,L2,V1,U1,T2. ⦃G1,L1,ⓑ{p,I}V1.U1⦄ ⊐[b] ⦃G2,L2,T2⦄ → +lemma fqu_inv_bind1: ∀b,p,I,G1,G2,L1,L2,V1,U1,T2. ⦃G1,L1,ⓑ{p,I}V1.U1⦄ ⬂[b] ⦃G2,L2,T2⦄ → ∨∨ ∧∧ G1 = G2 & L1 = L2 & V1 = T2 - | ∧∧ G1 = G2 & L1.ⓑ{I}V1 = L2 & U1 = T2 + | ∧∧ G1 = G2 & L1.ⓑ{I}V1 = L2 & U1 = T2 & b = Ⓣ | ∧∧ G1 = G2 & L1.ⓧ = L2 & U1 = T2 & b = Ⓕ | ∃∃J. G1 = G2 & L1 = L2.ⓘ{J} & ⬆*[1] T2 ≘ ⓑ{p,I}V1.U1. /2 width=4 by fqu_inv_bind1_aux/ qed-. -lemma fqu_inv_bind1_true: ∀p,I,G1,G2,L1,L2,V1,U1,T2. ⦃G1,L1,ⓑ{p,I}V1.U1⦄ ⊐ ⦃G2,L2,T2⦄ → +lemma fqu_inv_bind1_true: ∀p,I,G1,G2,L1,L2,V1,U1,T2. ⦃G1,L1,ⓑ{p,I}V1.U1⦄ ⬂ ⦃G2,L2,T2⦄ → ∨∨ ∧∧ G1 = G2 & L1 = L2 & V1 = T2 | ∧∧ G1 = G2 & L1.ⓑ{I}V1 = L2 & U1 = T2 | ∃∃J. G1 = G2 & L1 = L2.ⓘ{J} & ⬆*[1] T2 ≘ ⓑ{p,I}V1.U1. #p #I #G1 #G2 #L1 #L2 #V1 #U1 #T2 #H elim (fqu_inv_bind1 … H) -H -/3 width=1 by or3_intro0, or3_intro1, or3_intro2/ -* #_ #_ #_ #H destruct +/3 width=1 by or3_intro0, or3_intro2/ +* #HG #HL #HU #H destruct +/3 width=1 by and3_intro, or3_intro1/ qed-. -fact fqu_inv_flat1_aux: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2⦄ → +fact fqu_inv_flat1_aux: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂[b] ⦃G2,L2,T2⦄ → ∀I,V1,U1. T1 = ⓕ{I}V1.U1 → ∨∨ ∧∧ G1 = G2 & L1 = L2 & V1 = T2 | ∧∧ G1 = G2 & L1 = L2 & U1 = T2 @@ -151,14 +152,14 @@ fact fqu_inv_flat1_aux: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T #b #G1 #G2 #L1 #L2 #T1 #T2 * -G1 -G2 -L1 -L2 -T1 -T2 [ #I #G #L #T #J #V0 #U0 #H destruct | #I #G #L #V #T #J #V0 #U0 #H destruct /3 width=1 by and3_intro, or3_intro0/ -| #p #I #G #L #V #T #J #V0 #U0 #H destruct +| #p #I #G #L #V #T #_ #J #V0 #U0 #H destruct | #p #I #G #L #V #T #_ #J #V0 #U0 #H destruct | #I #G #L #V #T #J #V0 #U0 #H destruct /3 width=1 by and3_intro, or3_intro1/ | #I #G #L #T #U #HTU #J #V0 #U0 #H destruct /3 width=2 by or3_intro2, ex3_intro/ ] qed-. -lemma fqu_inv_flat1: ∀b,I,G1,G2,L1,L2,V1,U1,T2. ⦃G1,L1,ⓕ{I}V1.U1⦄ ⊐[b] ⦃G2,L2,T2⦄ → +lemma fqu_inv_flat1: ∀b,I,G1,G2,L1,L2,V1,U1,T2. ⦃G1,L1,ⓕ{I}V1.U1⦄ ⬂[b] ⦃G2,L2,T2⦄ → ∨∨ ∧∧ G1 = G2 & L1 = L2 & V1 = T2 | ∧∧ G1 = G2 & L1 = L2 & U1 = T2 | ∃∃J. G1 = G2 & L1 = L2.ⓘ{J} & ⬆*[1] T2 ≘ ⓕ{I}V1.U1. @@ -166,31 +167,31 @@ lemma fqu_inv_flat1: ∀b,I,G1,G2,L1,L2,V1,U1,T2. ⦃G1,L1,ⓕ{I}V1.U1⦄ ⊐[b] (* Advanced inversion lemmas ************************************************) -lemma fqu_inv_atom1: ∀b,I,G1,G2,L2,T2. ⦃G1,⋆,⓪{I}⦄ ⊐[b] ⦃G2,L2,T2⦄ → ⊥. +lemma fqu_inv_atom1: ∀b,I,G1,G2,L2,T2. ⦃G1,⋆,⓪{I}⦄ ⬂[b] ⦃G2,L2,T2⦄ → ⊥. #b * #x #G1 #G2 #L2 #T2 #H [ elim (fqu_inv_sort1 … H) | elim (fqu_inv_lref1 … H) * | elim (fqu_inv_gref1 … H) ] -H #I [2: #V |3: #i ] #_ #H destruct qed-. -lemma fqu_inv_sort1_bind: ∀b,I,G1,G2,K,L2,T2,s. ⦃G1,K.ⓘ{I},⋆s⦄ ⊐[b] ⦃G2,L2,T2⦄ → +lemma fqu_inv_sort1_bind: ∀b,I,G1,G2,K,L2,T2,s. ⦃G1,K.ⓘ{I},⋆s⦄ ⬂[b] ⦃G2,L2,T2⦄ → ∧∧ G1 = G2 & L2 = K & T2 = ⋆s. #b #I #G1 #G2 #K #L2 #T2 #s #H elim (fqu_inv_sort1 … H) -H #Z #X #H1 #H2 destruct /2 width=1 by and3_intro/ qed-. -lemma fqu_inv_zero1_pair: ∀b,I,G1,G2,K,L2,V,T2. ⦃G1,K.ⓑ{I}V,#0⦄ ⊐[b] ⦃G2,L2,T2⦄ → +lemma fqu_inv_zero1_pair: ∀b,I,G1,G2,K,L2,V,T2. ⦃G1,K.ⓑ{I}V,#0⦄ ⬂[b] ⦃G2,L2,T2⦄ → ∧∧ G1 = G2 & L2 = K & T2 = V. #b #I #G1 #G2 #K #L2 #V #T2 #H elim (fqu_inv_lref1 … H) -H * #Z #X #H1 #H2 #H3 #H4 destruct /2 width=1 by and3_intro/ qed-. -lemma fqu_inv_lref1_bind: ∀b,I,G1,G2,K,L2,T2,i. ⦃G1,K.ⓘ{I},#(↑i)⦄ ⊐[b] ⦃G2,L2,T2⦄ → +lemma fqu_inv_lref1_bind: ∀b,I,G1,G2,K,L2,T2,i. ⦃G1,K.ⓘ{I},#(↑i)⦄ ⬂[b] ⦃G2,L2,T2⦄ → ∧∧ G1 = G2 & L2 = K & T2 = #i. #b #I #G1 #G2 #K #L2 #T2 #i #H elim (fqu_inv_lref1 … H) -H * #Z #X #H1 #H2 #H3 #H4 destruct /2 width=1 by and3_intro/ qed-. -lemma fqu_inv_gref1_bind: ∀b,I,G1,G2,K,L2,T2,l. ⦃G1,K.ⓘ{I},§l⦄ ⊐[b] ⦃G2,L2,T2⦄ → +lemma fqu_inv_gref1_bind: ∀b,I,G1,G2,K,L2,T2,l. ⦃G1,K.ⓘ{I},§l⦄ ⬂[b] ⦃G2,L2,T2⦄ → ∧∧ G1 = G2 & L2 = K & T2 = §l. #b #I #G1 #G2 #K #L2 #T2 #l #H elim (fqu_inv_gref1 … H) -H #Z #H1 #H2 #H3 destruct /2 width=1 by and3_intro/ diff --git a/matita/matita/contribs/lambdadelta/static_2/s_transition/fqu_length.ma b/matita/matita/contribs/lambdadelta/static_2/s_transition/fqu_length.ma index c2aa1a829..e9d8fcbfc 100644 --- a/matita/matita/contribs/lambdadelta/static_2/s_transition/fqu_length.ma +++ b/matita/matita/contribs/lambdadelta/static_2/s_transition/fqu_length.ma @@ -19,13 +19,13 @@ include "static_2/s_transition/fqu.ma". (* Forward lemmas with length for local environments ************************) -fact fqu_fwd_length_lref1_aux: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2⦄ → +fact fqu_fwd_length_lref1_aux: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂[b] ⦃G2,L2,T2⦄ → ∀i. T1 = #i → |L2| < |L1|. #b #G1 #G2 #L1 #L2 #T1 #T2 #H elim H -G1 -G2 -L1 -L2 -T1 -T2 // [2,3: #p] -#I #G #L #V #T [2: #_ ] #j #H destruct +#I #G #L #V #T [1,2: #_ ] #j #H destruct qed-. -lemma fqu_fwd_length_lref1: ∀b,G1,G2,L1,L2,T2,i. ⦃G1,L1,#i⦄ ⊐[b] ⦃G2,L2,T2⦄ → +lemma fqu_fwd_length_lref1: ∀b,G1,G2,L1,L2,T2,i. ⦃G1,L1,#i⦄ ⬂[b] ⦃G2,L2,T2⦄ → |L2| < |L1|. /2 width=8 by fqu_fwd_length_lref1_aux/ qed-. diff --git a/matita/matita/contribs/lambdadelta/static_2/s_transition/fqu_tdeq.ma b/matita/matita/contribs/lambdadelta/static_2/s_transition/fqu_tdeq.ma index 7d5e2e87d..fa341e425 100644 --- a/matita/matita/contribs/lambdadelta/static_2/s_transition/fqu_tdeq.ma +++ b/matita/matita/contribs/lambdadelta/static_2/s_transition/fqu_tdeq.ma @@ -19,7 +19,7 @@ include "static_2/s_transition/fqu_length.ma". (* Inversion lemmas with context-free sort-irrelevant equivalence for terms *) -fact fqu_inv_tdeq_aux: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2⦄ → +fact fqu_inv_tdeq_aux: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂[b] ⦃G2,L2,T2⦄ → G1 = G2 → |L1| = |L2| → T1 ≛ T2 → ⊥. #b #G1 #G2 #L1 #L2 #T1 #T2 * -G1 -G2 -L1 -L2 -T1 -T2 [1: #I #G #L #V #_ #H elim (succ_inv_refl_sn … H) @@ -29,7 +29,7 @@ fact fqu_inv_tdeq_aux: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2 qed-. (* Basic_2A1: uses: fqu_inv_eq *) -lemma fqu_inv_tdeq: ∀b,G,L1,L2,T1,T2. ⦃G,L1,T1⦄ ⊐[b] ⦃G,L2,T2⦄ → +lemma fqu_inv_tdeq: ∀b,G,L1,L2,T1,T2. ⦃G,L1,T1⦄ ⬂[b] ⦃G,L2,T2⦄ → |L1| = |L2| → T1 ≛ T2 → ⊥. #b #G #L1 #L2 #T1 #T2 #H @(fqu_inv_tdeq_aux … H) // (**) (* full auto fails *) diff --git a/matita/matita/contribs/lambdadelta/static_2/s_transition/fqu_weight.ma b/matita/matita/contribs/lambdadelta/static_2/s_transition/fqu_weight.ma index 2c19e9244..3b9964b46 100644 --- a/matita/matita/contribs/lambdadelta/static_2/s_transition/fqu_weight.ma +++ b/matita/matita/contribs/lambdadelta/static_2/s_transition/fqu_weight.ma @@ -20,7 +20,7 @@ include "static_2/s_transition/fqu.ma". (* Forward lemmas with weight for closures **********************************) -lemma fqu_fwd_fw: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2⦄ → +lemma fqu_fwd_fw: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂[b] ⦃G2,L2,T2⦄ → ♯{G2,L2,T2} < ♯{G1,L1,T1}. #b #G1 #G2 #L1 #L2 #T1 #T2 #H elim H -G1 -G2 -L1 -L2 -T1 -T2 // #I #I1 #I2 #G #L #HI12 normalize in ⊢ (?%%); -I1 @@ -30,7 +30,7 @@ qed-. (* Advanced eliminators *****************************************************) lemma fqu_wf_ind: ∀b. ∀Q:relation3 …. ( - ∀G1,L1,T1. (∀G2,L2,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2⦄ → Q G2 L2 T2) → + ∀G1,L1,T1. (∀G2,L2,T2. ⦃G1,L1,T1⦄ ⬂[b] ⦃G2,L2,T2⦄ → Q G2 L2 T2) → Q G1 L1 T1 ) → ∀G1,L1,T1. Q G1 L1 T1. #b #Q #HQ @(f3_ind … fw) #x #IHx #G1 #L1 #T1 #H destruct /4 width=2 by fqu_fwd_fw/ diff --git a/matita/matita/contribs/lambdadelta/static_2/s_transition/fquq.ma b/matita/matita/contribs/lambdadelta/static_2/s_transition/fquq.ma index 426c81518..d7736ab20 100644 --- a/matita/matita/contribs/lambdadelta/static_2/s_transition/fquq.ma +++ b/matita/matita/contribs/lambdadelta/static_2/s_transition/fquq.ma @@ -37,7 +37,7 @@ interpretation lemma fquq_refl: ∀b. tri_reflexive … (fquq b). // qed. -lemma fqu_fquq: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐[b] ⦃G2,L2,T2⦄ → ⦃G1,L1,T1⦄ ⊐⸮[b] ⦃G2,L2,T2⦄. +lemma fqu_fquq: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂[b] ⦃G2,L2,T2⦄ → ⦃G1,L1,T1⦄ ⬂⸮[b] ⦃G2,L2,T2⦄. /2 width=1 by or_introl/ qed. (* Basic_2A1: removed theorems 8: diff --git a/matita/matita/contribs/lambdadelta/static_2/s_transition/fquq_length.ma b/matita/matita/contribs/lambdadelta/static_2/s_transition/fquq_length.ma index 2e11ace14..3985a6c9e 100644 --- a/matita/matita/contribs/lambdadelta/static_2/s_transition/fquq_length.ma +++ b/matita/matita/contribs/lambdadelta/static_2/s_transition/fquq_length.ma @@ -19,7 +19,7 @@ include "static_2/s_transition/fquq.ma". (* Forward lemmas with length for local environments ************************) -lemma fquq_fwd_length_lref1: ∀b,G1,G2,L1,L2,T2,i. ⦃G1,L1,#i⦄ ⊐⸮[b] ⦃G2,L2,T2⦄ → +lemma fquq_fwd_length_lref1: ∀b,G1,G2,L1,L2,T2,i. ⦃G1,L1,#i⦄ ⬂⸮[b] ⦃G2,L2,T2⦄ → |L2| ≤ |L1|. #b #G1 #G2 #L1 #L2 #T2 #i #H elim H -H [2: * ] /3 width=6 by fqu_fwd_length_lref1, lt_to_le/ diff --git a/matita/matita/contribs/lambdadelta/static_2/s_transition/fquq_weight.ma b/matita/matita/contribs/lambdadelta/static_2/s_transition/fquq_weight.ma index f9293ec68..3aab7face 100644 --- a/matita/matita/contribs/lambdadelta/static_2/s_transition/fquq_weight.ma +++ b/matita/matita/contribs/lambdadelta/static_2/s_transition/fquq_weight.ma @@ -19,7 +19,7 @@ include "static_2/s_transition/fquq.ma". (* Forward lemmas with weight for closures **********************************) -lemma fquq_fwd_fw: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐⸮[b] ⦃G2,L2,T2⦄ → +lemma fquq_fwd_fw: ∀b,G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂⸮[b] ⦃G2,L2,T2⦄ → ♯{G2,L2,T2} ≤ ♯{G1,L1,T1}. #b #G1 #G2 #L1 #L2 #T1 #T2 #H elim H -H [2: * ] /3 width=2 by fqu_fwd_fw, lt_to_le/ diff --git a/matita/matita/contribs/lambdadelta/static_2/static/aaa_fqus.ma b/matita/matita/contribs/lambdadelta/static_2/static/aaa_fqus.ma index d3b9d83cb..4ba7d8c56 100644 --- a/matita/matita/contribs/lambdadelta/static_2/static/aaa_fqus.ma +++ b/matita/matita/contribs/lambdadelta/static_2/static/aaa_fqus.ma @@ -19,7 +19,7 @@ include "static_2/static/aaa_drops.ma". (* Properties on supclosure *************************************************) -lemma aaa_fqu_conf: ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐ ⦃G2,L2,T2⦄ → +lemma aaa_fqu_conf: ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂ ⦃G2,L2,T2⦄ → ∀A1. ⦃G1,L1⦄ ⊢ T1 ⁝ A1 → ∃A2. ⦃G2,L2⦄ ⊢ T2 ⁝ A2. #G1 #G2 #L1 #L2 #T1 #T2 #H elim H -G1 -G2 -L1 -L2 -T1 -T2 [ #I #G #L #T #A #H elim (aaa_inv_zero … H) -H @@ -30,7 +30,7 @@ lemma aaa_fqu_conf: ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐ ⦃G2,L2,T2⦄ → | elim (aaa_inv_appl … H) | elim (aaa_inv_cast … H) ] -H /2 width=2 by ex_intro/ -| #p * #G #L #V #T #X #H +| #p * #G #L #V #T #_ #X #H [ elim (aaa_inv_abbr … H) | elim (aaa_inv_abst … H) ] -H /2 width=2 by ex_intro/ @@ -43,20 +43,20 @@ lemma aaa_fqu_conf: ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐ ⦃G2,L2,T2⦄ → ] qed-. -lemma aaa_fquq_conf: ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐⸮ ⦃G2,L2,T2⦄ → +lemma aaa_fquq_conf: ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂⸮ ⦃G2,L2,T2⦄ → ∀A1. ⦃G1,L1⦄ ⊢ T1 ⁝ A1 → ∃A2. ⦃G2,L2⦄ ⊢ T2 ⁝ A2. #G1 #G2 #L1 #L2 #T1 #T2 #H elim H -H /2 width=6 by aaa_fqu_conf/ * #H1 #H2 #H3 destruct /2 width=2 by ex_intro/ qed-. -lemma aaa_fqup_conf: ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐+ ⦃G2,L2,T2⦄ → +lemma aaa_fqup_conf: ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂+ ⦃G2,L2,T2⦄ → ∀A1. ⦃G1,L1⦄ ⊢ T1 ⁝ A1 → ∃A2. ⦃G2,L2⦄ ⊢ T2 ⁝ A2. #G1 #G2 #L1 #L2 #T1 #T2 #H @(fqup_ind … H) -G2 -L2 -T2 [2: #G #G2 #L #L2 #T #T2 #_ #H2 #IH1 #A #HA elim (IH1 … HA) -IH1 -A ] /2 width=6 by aaa_fqu_conf/ qed-. -lemma aaa_fqus_conf: ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⊐* ⦃G2,L2,T2⦄ → +lemma aaa_fqus_conf: ∀G1,G2,L1,L2,T1,T2. ⦃G1,L1,T1⦄ ⬂* ⦃G2,L2,T2⦄ → ∀A1. ⦃G1,L1⦄ ⊢ T1 ⁝ A1 → ∃A2. ⦃G2,L2⦄ ⊢ T2 ⁝ A2. #G1 #G2 #L1 #L2 #T1 #T2 #H elim(fqus_inv_fqup … H) -H /2 width=6 by aaa_fqup_conf/ * #H1 #H2 #H3 destruct /2 width=2 by ex_intro/ diff --git a/matita/matita/contribs/lambdadelta/static_2/static/fdeq_fqus.ma b/matita/matita/contribs/lambdadelta/static_2/static/fdeq_fqus.ma index 26ae320e7..ce0dda0d0 100644 --- a/matita/matita/contribs/lambdadelta/static_2/static/fdeq_fqus.ma +++ b/matita/matita/contribs/lambdadelta/static_2/static/fdeq_fqus.ma @@ -20,8 +20,8 @@ include "static_2/static/fdeq.ma". (* Properties with star-iterated structural successor for closures **********) lemma fdeq_fqus_trans: ∀b,G1,G,L1,L,T1,T. ⦃G1,L1,T1⦄ ≛ ⦃G,L,T⦄ → - ∀G2,L2,T2. ⦃G,L,T⦄ ⊐*[b] ⦃G2,L2,T2⦄ → - ∃∃G,L0,T0. ⦃G1,L1,T1⦄ ⊐*[b] ⦃G,L0,T0⦄ & ⦃G,L0,T0⦄ ≛ ⦃G2,L2,T2⦄. + ∀G2,L2,T2. ⦃G,L,T⦄ ⬂*[b] ⦃G2,L2,T2⦄ → + ∃∃G,L0,T0. ⦃G1,L1,T1⦄ ⬂*[b] ⦃G,L0,T0⦄ & ⦃G,L0,T0⦄ ≛ ⦃G2,L2,T2⦄. #b #G1 #G #L1 #L #T1 #T #H1 #G2 #L2 #T2 #H2 elim(fdeq_inv_gen_dx … H1) -H1 #HG #HL1 #HT1 destruct elim (rdeq_fqus_trans … H2 … HL1) -L #L #T0 #H2 #HT02 #HL2 diff --git a/matita/matita/contribs/lambdadelta/static_2/static/frees.ma b/matita/matita/contribs/lambdadelta/static_2/static/frees.ma index 054003f83..a312c2525 100644 --- a/matita/matita/contribs/lambdadelta/static_2/static/frees.ma +++ b/matita/matita/contribs/lambdadelta/static_2/static/frees.ma @@ -13,7 +13,7 @@ (**************************************************************************) include "ground_2/relocation/rtmap_sor.ma". -include "static_2/notation/relations/freestar_3.ma". +include "static_2/notation/relations/freeplus_3.ma". include "static_2/syntax/lenv.ma". (* CONTEXT-SENSITIVE FREE VARIABLES *****************************************) @@ -35,11 +35,11 @@ inductive frees: relation3 lenv term rtmap ≝ interpretation "context-sensitive free variables (term)" - 'FreeStar L T f = (frees L T f). + 'FreePlus L T f = (frees L T f). (* Basic inversion lemmas ***************************************************) -fact frees_inv_sort_aux: ∀f,L,X. L ⊢ 𝐅*⦃X⦄ ≘ f → ∀x. X = ⋆x → 𝐈⦃f⦄. +fact frees_inv_sort_aux: ∀f,L,X. L ⊢ 𝐅+⦃X⦄ ≘ f → ∀x. X = ⋆x → 𝐈⦃f⦄. #L #X #f #H elim H -f -L -X // [ #f #i #_ #x #H destruct | #f #_ #L #V #_ #_ #x #H destruct @@ -50,11 +50,12 @@ fact frees_inv_sort_aux: ∀f,L,X. L ⊢ 𝐅*⦃X⦄ ≘ f → ∀x. X = ⋆x ] qed-. -lemma frees_inv_sort: ∀f,L,s. L ⊢ 𝐅*⦃⋆s⦄ ≘ f → 𝐈⦃f⦄. +lemma frees_inv_sort: ∀f,L,s. L ⊢ 𝐅+⦃⋆s⦄ ≘ f → 𝐈⦃f⦄. /2 width=5 by frees_inv_sort_aux/ qed-. -fact frees_inv_atom_aux: ∀f,L,X. L ⊢ 𝐅*⦃X⦄ ≘ f → ∀i. L = ⋆ → X = #i → - ∃∃g. 𝐈⦃g⦄ & f = ⫯*[i]↑g. +fact frees_inv_atom_aux: + ∀f,L,X. L ⊢ 𝐅+⦃X⦄ ≘ f → ∀i. L = ⋆ → X = #i → + ∃∃g. 𝐈⦃g⦄ & f = ⫯*[i]↑g. #f #L #X #H elim H -f -L -X [ #f #L #s #_ #j #_ #H destruct | #f #i #Hf #j #_ #H destruct /2 width=3 by ex2_intro/ @@ -67,11 +68,12 @@ fact frees_inv_atom_aux: ∀f,L,X. L ⊢ 𝐅*⦃X⦄ ≘ f → ∀i. L = ⋆ ] qed-. -lemma frees_inv_atom: ∀f,i. ⋆ ⊢ 𝐅*⦃#i⦄ ≘ f → ∃∃g. 𝐈⦃g⦄ & f = ⫯*[i]↑g. +lemma frees_inv_atom: ∀f,i. ⋆ ⊢ 𝐅+⦃#i⦄ ≘ f → ∃∃g. 𝐈⦃g⦄ & f = ⫯*[i]↑g. /2 width=5 by frees_inv_atom_aux/ qed-. -fact frees_inv_pair_aux: ∀f,L,X. L ⊢ 𝐅*⦃X⦄ ≘ f → ∀I,K,V. L = K.ⓑ{I}V → X = #0 → - ∃∃g. K ⊢ 𝐅*⦃V⦄ ≘ g & f = ↑g. +fact frees_inv_pair_aux: + ∀f,L,X. L ⊢ 𝐅+⦃X⦄ ≘ f → ∀I,K,V. L = K.ⓑ{I}V → X = #0 → + ∃∃g. K ⊢ 𝐅+⦃V⦄ ≘ g & f = ↑g. #f #L #X * -f -L -X [ #f #L #s #_ #Z #Y #X #_ #H destruct | #f #i #_ #Z #Y #X #H destruct @@ -84,11 +86,12 @@ fact frees_inv_pair_aux: ∀f,L,X. L ⊢ 𝐅*⦃X⦄ ≘ f → ∀I,K,V. L = K. ] qed-. -lemma frees_inv_pair: ∀f,I,K,V. K.ⓑ{I}V ⊢ 𝐅*⦃#0⦄ ≘ f → ∃∃g. K ⊢ 𝐅*⦃V⦄ ≘ g & f = ↑g. +lemma frees_inv_pair: ∀f,I,K,V. K.ⓑ{I}V ⊢ 𝐅+⦃#0⦄ ≘ f → ∃∃g. K ⊢ 𝐅+⦃V⦄ ≘ g & f = ↑g. /2 width=6 by frees_inv_pair_aux/ qed-. -fact frees_inv_unit_aux: ∀f,L,X. L ⊢ 𝐅*⦃X⦄ ≘ f → ∀I,K. L = K.ⓤ{I} → X = #0 → - ∃∃g. 𝐈⦃g⦄ & f = ↑g. +fact frees_inv_unit_aux: + ∀f,L,X. L ⊢ 𝐅+⦃X⦄ ≘ f → ∀I,K. L = K.ⓤ{I} → X = #0 → + ∃∃g. 𝐈⦃g⦄ & f = ↑g. #f #L #X * -f -L -X [ #f #L #s #_ #Z #Y #_ #H destruct | #f #i #_ #Z #Y #H destruct @@ -101,11 +104,12 @@ fact frees_inv_unit_aux: ∀f,L,X. L ⊢ 𝐅*⦃X⦄ ≘ f → ∀I,K. L = K. ] qed-. -lemma frees_inv_unit: ∀f,I,K. K.ⓤ{I} ⊢ 𝐅*⦃#0⦄ ≘ f → ∃∃g. 𝐈⦃g⦄ & f = ↑g. +lemma frees_inv_unit: ∀f,I,K. K.ⓤ{I} ⊢ 𝐅+⦃#0⦄ ≘ f → ∃∃g. 𝐈⦃g⦄ & f = ↑g. /2 width=7 by frees_inv_unit_aux/ qed-. -fact frees_inv_lref_aux: ∀f,L,X. L ⊢ 𝐅*⦃X⦄ ≘ f → ∀I,K,j. L = K.ⓘ{I} → X = #(↑j) → - ∃∃g. K ⊢ 𝐅*⦃#j⦄ ≘ g & f = ⫯g. +fact frees_inv_lref_aux: + ∀f,L,X. L ⊢ 𝐅+⦃X⦄ ≘ f → ∀I,K,j. L = K.ⓘ{I} → X = #(↑j) → + ∃∃g. K ⊢ 𝐅+⦃#j⦄ ≘ g & f = ⫯g. #f #L #X * -f -L -X [ #f #L #s #_ #Z #Y #j #_ #H destruct | #f #i #_ #Z #Y #j #H destruct @@ -118,11 +122,12 @@ fact frees_inv_lref_aux: ∀f,L,X. L ⊢ 𝐅*⦃X⦄ ≘ f → ∀I,K,j. L = K. ] qed-. -lemma frees_inv_lref: ∀f,I,K,i. K.ⓘ{I} ⊢ 𝐅*⦃#(↑i)⦄ ≘ f → - ∃∃g. K ⊢ 𝐅*⦃#i⦄ ≘ g & f = ⫯g. +lemma frees_inv_lref: + ∀f,I,K,i. K.ⓘ{I} ⊢ 𝐅+⦃#(↑i)⦄ ≘ f → + ∃∃g. K ⊢ 𝐅+⦃#i⦄ ≘ g & f = ⫯g. /2 width=6 by frees_inv_lref_aux/ qed-. -fact frees_inv_gref_aux: ∀f,L,X. L ⊢ 𝐅*⦃X⦄ ≘ f → ∀x. X = §x → 𝐈⦃f⦄. +fact frees_inv_gref_aux: ∀f,L,X. L ⊢ 𝐅+⦃X⦄ ≘ f → ∀x. X = §x → 𝐈⦃f⦄. #f #L #X #H elim H -f -L -X // [ #f #i #_ #x #H destruct | #f #_ #L #V #_ #_ #x #H destruct @@ -133,11 +138,12 @@ fact frees_inv_gref_aux: ∀f,L,X. L ⊢ 𝐅*⦃X⦄ ≘ f → ∀x. X = §x ] qed-. -lemma frees_inv_gref: ∀f,L,l. L ⊢ 𝐅*⦃§l⦄ ≘ f → 𝐈⦃f⦄. +lemma frees_inv_gref: ∀f,L,l. L ⊢ 𝐅+⦃§l⦄ ≘ f → 𝐈⦃f⦄. /2 width=5 by frees_inv_gref_aux/ qed-. -fact frees_inv_bind_aux: ∀f,L,X. L ⊢ 𝐅*⦃X⦄ ≘ f → ∀p,I,V,T. X = ⓑ{p,I}V.T → - ∃∃f1,f2. L ⊢ 𝐅*⦃V⦄ ≘ f1 & L.ⓑ{I}V ⊢ 𝐅*⦃T⦄ ≘ f2 & f1 ⋓ ⫱f2 ≘ f. +fact frees_inv_bind_aux: + ∀f,L,X. L ⊢ 𝐅+⦃X⦄ ≘ f → ∀p,I,V,T. X = ⓑ{p,I}V.T → + ∃∃f1,f2. L ⊢ 𝐅+⦃V⦄ ≘ f1 & L.ⓑ{I}V ⊢ 𝐅+⦃T⦄ ≘ f2 & f1 ⋓ ⫱f2 ≘ f. #f #L #X * -f -L -X [ #f #L #s #_ #q #J #W #U #H destruct | #f #i #_ #q #J #W #U #H destruct @@ -150,12 +156,13 @@ fact frees_inv_bind_aux: ∀f,L,X. L ⊢ 𝐅*⦃X⦄ ≘ f → ∀p,I,V,T. X = ] qed-. -lemma frees_inv_bind: ∀f,p,I,L,V,T. L ⊢ 𝐅*⦃ⓑ{p,I}V.T⦄ ≘ f → - ∃∃f1,f2. L ⊢ 𝐅*⦃V⦄ ≘ f1 & L.ⓑ{I}V ⊢ 𝐅*⦃T⦄ ≘ f2 & f1 ⋓ ⫱f2 ≘ f. +lemma frees_inv_bind: + ∀f,p,I,L,V,T. L ⊢ 𝐅+⦃ⓑ{p,I}V.T⦄ ≘ f → + ∃∃f1,f2. L ⊢ 𝐅+⦃V⦄ ≘ f1 & L.ⓑ{I}V ⊢ 𝐅+⦃T⦄ ≘ f2 & f1 ⋓ ⫱f2 ≘ f. /2 width=4 by frees_inv_bind_aux/ qed-. -fact frees_inv_flat_aux: ∀f,L,X. L ⊢ 𝐅*⦃X⦄ ≘ f → ∀I,V,T. X = ⓕ{I}V.T → - ∃∃f1,f2. L ⊢ 𝐅*⦃V⦄ ≘ f1 & L ⊢ 𝐅*⦃T⦄ ≘ f2 & f1 ⋓ f2 ≘ f. +fact frees_inv_flat_aux: ∀f,L,X. L ⊢ 𝐅+⦃X⦄ ≘ f → ∀I,V,T. X = ⓕ{I}V.T → + ∃∃f1,f2. L ⊢ 𝐅+⦃V⦄ ≘ f1 & L ⊢ 𝐅+⦃T⦄ ≘ f2 & f1 ⋓ f2 ≘ f. #f #L #X * -f -L -X [ #f #L #s #_ #J #W #U #H destruct | #f #i #_ #J #W #U #H destruct @@ -168,13 +175,14 @@ fact frees_inv_flat_aux: ∀f,L,X. L ⊢ 𝐅*⦃X⦄ ≘ f → ∀I,V,T. X = ] qed-. -lemma frees_inv_flat: ∀f,I,L,V,T. L ⊢ 𝐅*⦃ⓕ{I}V.T⦄ ≘ f → - ∃∃f1,f2. L ⊢ 𝐅*⦃V⦄ ≘ f1 & L ⊢ 𝐅*⦃T⦄ ≘ f2 & f1 ⋓ f2 ≘ f. +lemma frees_inv_flat: + ∀f,I,L,V,T. L ⊢ 𝐅+⦃ⓕ{I}V.T⦄ ≘ f → + ∃∃f1,f2. L ⊢ 𝐅+⦃V⦄ ≘ f1 & L ⊢ 𝐅+⦃T⦄ ≘ f2 & f1 ⋓ f2 ≘ f. /2 width=4 by frees_inv_flat_aux/ qed-. (* Basic properties ********************************************************) -lemma frees_eq_repl_back: ∀L,T. eq_repl_back … (λf. L ⊢ 𝐅*⦃T⦄ ≘ f). +lemma frees_eq_repl_back: ∀L,T. eq_repl_back … (λf. L ⊢ 𝐅+⦃T⦄ ≘ f). #L #T #f1 #H elim H -f1 -L -T [ /3 width=3 by frees_sort, isid_eq_repl_back/ | #f1 #i #Hf1 #g2 #H @@ -195,11 +203,11 @@ lemma frees_eq_repl_back: ∀L,T. eq_repl_back … (λf. L ⊢ 𝐅*⦃T⦄ ≘ ] qed-. -lemma frees_eq_repl_fwd: ∀L,T. eq_repl_fwd … (λf. L ⊢ 𝐅*⦃T⦄ ≘ f). +lemma frees_eq_repl_fwd: ∀L,T. eq_repl_fwd … (λf. L ⊢ 𝐅+⦃T⦄ ≘ f). #L #T @eq_repl_sym /2 width=3 by frees_eq_repl_back/ qed-. -lemma frees_lref_push: ∀f,i. ⋆ ⊢ 𝐅*⦃#i⦄ ≘ f → ⋆ ⊢ 𝐅*⦃#↑i⦄ ≘ ⫯f. +lemma frees_lref_push: ∀f,i. ⋆ ⊢ 𝐅+⦃#i⦄ ≘ f → ⋆ ⊢ 𝐅+⦃#↑i⦄ ≘ ⫯f. #f #i #H elim (frees_inv_atom … H) -H #g #Hg #H destruct /2 width=1 by frees_atom/ @@ -207,7 +215,7 @@ qed. (* Forward lemmas with test for finite colength *****************************) -lemma frees_fwd_isfin: ∀f,L,T. L ⊢ 𝐅*⦃T⦄ ≘ f → 𝐅⦃f⦄. +lemma frees_fwd_isfin: ∀f,L,T. L ⊢ 𝐅+⦃T⦄ ≘ f → 𝐅⦃f⦄. #f #L #T #H elim H -f -L -T /4 width=5 by sor_isfin, isfin_isid, isfin_tl, isfin_pushs, isfin_push, isfin_next/ qed-. diff --git a/matita/matita/contribs/lambdadelta/static_2/static/frees_append.ma b/matita/matita/contribs/lambdadelta/static_2/static/frees_append.ma index ce8d34808..42523bb39 100644 --- a/matita/matita/contribs/lambdadelta/static_2/static/frees_append.ma +++ b/matita/matita/contribs/lambdadelta/static_2/static/frees_append.ma @@ -19,7 +19,7 @@ include "static_2/static/frees.ma". (* Properties with append for local environments ****************************) -lemma frees_append_void: ∀f,K,T. K ⊢ 𝐅*⦃T⦄ ≘ f → ⓧ.K ⊢ 𝐅*⦃T⦄ ≘ f. +lemma frees_append_void: ∀f,K,T. K ⊢ 𝐅+⦃T⦄ ≘ f → ⓧ.K ⊢ 𝐅+⦃T⦄ ≘ f. #f #K #T #H elim H -f -K -T [ /2 width=1 by frees_sort/ | #f * /3 width=1 by frees_atom, frees_unit, frees_lref/ @@ -34,8 +34,9 @@ qed. (* Inversion lemmas with append for local environments **********************) -fact frees_inv_append_void_aux: ∀f,L,T. L ⊢ 𝐅*⦃T⦄ ≘ f → - ∀K. L = ⓧ.K → K ⊢ 𝐅*⦃T⦄ ≘ f. +fact frees_inv_append_void_aux: + ∀f,L,T. L ⊢ 𝐅+⦃T⦄ ≘ f → + ∀K. L = ⓧ.K → K ⊢ 𝐅+⦃T⦄ ≘ f. #f #L #T #H elim H -f -L -T [ /2 width=1 by frees_sort/ | #f #i #_ #K #H @@ -55,5 +56,5 @@ fact frees_inv_append_void_aux: ∀f,L,T. L ⊢ 𝐅*⦃T⦄ ≘ f → ] qed-. -lemma frees_inv_append_void: ∀f,K,T. ⓧ.K ⊢ 𝐅*⦃T⦄ ≘ f → K ⊢ 𝐅*⦃T⦄ ≘ f. +lemma frees_inv_append_void: ∀f,K,T. ⓧ.K ⊢ 𝐅+⦃T⦄ ≘ f → K ⊢ 𝐅+⦃T⦄ ≘ f. /2 width=3 by frees_inv_append_void_aux/ qed-. diff --git a/matita/matita/contribs/lambdadelta/static_2/static/frees_drops.ma b/matita/matita/contribs/lambdadelta/static_2/static/frees_drops.ma index 8a9fc3ce0..d936eda81 100644 --- a/matita/matita/contribs/lambdadelta/static_2/static/frees_drops.ma +++ b/matita/matita/contribs/lambdadelta/static_2/static/frees_drops.ma @@ -20,8 +20,9 @@ include "static_2/static/frees_fqup.ma". (* Advanced properties ******************************************************) -lemma frees_atom_drops: ∀b,L,i. ⬇*[b,𝐔❴i❵] L ≘ ⋆ → - ∀f. 𝐈⦃f⦄ → L ⊢ 𝐅*⦃#i⦄ ≘ ⫯*[i]↑f. +lemma frees_atom_drops: + ∀b,L,i. ⬇*[b,𝐔❴i❵] L ≘ ⋆ → + ∀f. 𝐈⦃f⦄ → L ⊢ 𝐅+⦃#i⦄ ≘ ⫯*[i]↑f. #b #L elim L -L /2 width=1 by frees_atom/ #L #I #IH * [ #H lapply (drops_fwd_isid … H ?) -H // #H destruct @@ -29,16 +30,18 @@ lemma frees_atom_drops: ∀b,L,i. ⬇*[b,𝐔❴i❵] L ≘ ⋆ → ] qed. -lemma frees_pair_drops: ∀f,K,V. K ⊢ 𝐅*⦃V⦄ ≘ f → - ∀i,I,L. ⬇*[i] L ≘ K.ⓑ{I}V → L ⊢ 𝐅*⦃#i⦄ ≘ ⫯*[i] ↑f. +lemma frees_pair_drops: + ∀f,K,V. K ⊢ 𝐅+⦃V⦄ ≘ f → + ∀i,I,L. ⬇*[i] L ≘ K.ⓑ{I}V → L ⊢ 𝐅+⦃#i⦄ ≘ ⫯*[i] ↑f. #f #K #V #Hf #i elim i -i [ #I #L #H lapply (drops_fwd_isid … H ?) -H /2 width=1 by frees_pair/ | #i #IH #I #L #H elim (drops_inv_succ … H) -H /3 width=2 by frees_lref/ ] qed. -lemma frees_unit_drops: ∀f. 𝐈⦃f⦄ → ∀I,K,i,L. ⬇*[i] L ≘ K.ⓤ{I} → - L ⊢ 𝐅*⦃#i⦄ ≘ ⫯*[i] ↑f. +lemma frees_unit_drops: + ∀f. 𝐈⦃f⦄ → ∀I,K,i,L. ⬇*[i] L ≘ K.ⓤ{I} → + L ⊢ 𝐅+⦃#i⦄ ≘ ⫯*[i] ↑f. #f #Hf #I #K #i elim i -i [ #L #H lapply (drops_fwd_isid … H ?) -H /2 width=1 by frees_unit/ | #i #IH #Y #H elim (drops_inv_succ … H) -H @@ -46,16 +49,18 @@ lemma frees_unit_drops: ∀f. 𝐈⦃f⦄ → ∀I,K,i,L. ⬇*[i] L ≘ K.ⓤ{I ] qed. (* -lemma frees_sort_pushs: ∀f,K,s. K ⊢ 𝐅*⦃⋆s⦄ ≘ f → - ∀i,L. ⬇*[i] L ≘ K → L ⊢ 𝐅*⦃⋆s⦄ ≘ ⫯*[i] f. +lemma frees_sort_pushs: + ∀f,K,s. K ⊢ 𝐅+⦃⋆s⦄ ≘ f → + ∀i,L. ⬇*[i] L ≘ K → L ⊢ 𝐅+⦃⋆s⦄ ≘ ⫯*[i] f. #f #K #s #Hf #i elim i -i [ #L #H lapply (drops_fwd_isid … H ?) -H // | #i #IH #L #H elim (drops_inv_succ … H) -H /3 width=1 by frees_sort/ ] qed. *) -lemma frees_lref_pushs: ∀f,K,j. K ⊢ 𝐅*⦃#j⦄ ≘ f → - ∀i,L. ⬇*[i] L ≘ K → L ⊢ 𝐅*⦃#(i+j)⦄ ≘ ⫯*[i] f. +lemma frees_lref_pushs: + ∀f,K,j. K ⊢ 𝐅+⦃#j⦄ ≘ f → + ∀i,L. ⬇*[i] L ≘ K → L ⊢ 𝐅+⦃#(i+j)⦄ ≘ ⫯*[i] f. #f #K #j #Hf #i elim i -i [ #L #H lapply (drops_fwd_isid … H ?) -H // | #i #IH #L #H elim (drops_inv_succ … H) -H @@ -63,8 +68,9 @@ lemma frees_lref_pushs: ∀f,K,j. K ⊢ 𝐅*⦃#j⦄ ≘ f → ] qed. (* -lemma frees_gref_pushs: ∀f,K,l. K ⊢ 𝐅*⦃§l⦄ ≘ f → - ∀i,L. ⬇*[i] L ≘ K → L ⊢ 𝐅*⦃§l⦄ ≘ ⫯*[i] f. +lemma frees_gref_pushs: + ∀f,K,l. K ⊢ 𝐅+⦃§l⦄ ≘ f → + ∀i,L. ⬇*[i] L ≘ K → L ⊢ 𝐅+⦃§l⦄ ≘ ⫯*[i] f. #f #K #l #Hf #i elim i -i [ #L #H lapply (drops_fwd_isid … H ?) -H // | #i #IH #L #H elim (drops_inv_succ … H) -H /3 width=1 by frees_gref/ @@ -73,11 +79,11 @@ qed. *) (* Advanced inversion lemmas ************************************************) -lemma frees_inv_lref_drops: ∀L,i,f. L ⊢ 𝐅*⦃#i⦄ ≘ f → - ∨∨ ∃∃g. ⬇*[Ⓕ,𝐔❴i❵] L ≘ ⋆ & 𝐈⦃g⦄ & f = ⫯*[i] ↑g - | ∃∃g,I,K,V. K ⊢ 𝐅*⦃V⦄ ≘ g & - ⬇*[i] L ≘ K.ⓑ{I}V & f = ⫯*[i] ↑g - | ∃∃g,I,K. ⬇*[i] L ≘ K.ⓤ{I} & 𝐈⦃g⦄ & f = ⫯*[i] ↑g. +lemma frees_inv_lref_drops: + ∀L,i,f. L ⊢ 𝐅+⦃#i⦄ ≘ f → + ∨∨ ∃∃g. ⬇*[Ⓕ,𝐔❴i❵] L ≘ ⋆ & 𝐈⦃g⦄ & f = ⫯*[i] ↑g + | ∃∃g,I,K,V. K ⊢ 𝐅+⦃V⦄ ≘ g & ⬇*[i] L ≘ K.ⓑ{I}V & f = ⫯*[i] ↑g + | ∃∃g,I,K. ⬇*[i] L ≘ K.ⓤ{I} & 𝐈⦃g⦄ & f = ⫯*[i] ↑g. #L elim L -L [ #i #g | #L #I #IH * [ #g cases I -I [ #I | #I #V ] -IH | #i #g ] ] #H [ elim (frees_inv_atom … H) -H #f #Hf #H destruct @@ -97,9 +103,10 @@ qed-. (* Properties with generic slicing for local environments *******************) -lemma frees_lifts: ∀b,f1,K,T. K ⊢ 𝐅*⦃T⦄ ≘ f1 → - ∀f,L. ⬇*[b,f] L ≘ K → ∀U. ⬆*[f] T ≘ U → - ∀f2. f ~⊚ f1 ≘ f2 → L ⊢ 𝐅*⦃U⦄ ≘ f2. +lemma frees_lifts: + ∀b,f1,K,T. K ⊢ 𝐅+⦃T⦄ ≘ f1 → + ∀f,L. ⬇*[b,f] L ≘ K → ∀U. ⬆*[f] T ≘ U → + ∀f2. f ~⊚ f1 ≘ f2 → L ⊢ 𝐅+⦃U⦄ ≘ f2. #b #f1 #K #T #H lapply (frees_fwd_isfin … H) elim H -f1 -K -T [ #f1 #K #s #Hf1 #_ #f #L #HLK #U #H2 #f2 #H3 lapply (coafter_isid_inv_dx … H3 … Hf1) -f1 #Hf2 @@ -154,48 +161,54 @@ lemma frees_lifts: ∀b,f1,K,T. K ⊢ 𝐅*⦃T⦄ ≘ f1 → ] qed-. -lemma frees_lifts_SO: ∀b,L,K. ⬇*[b,𝐔❴1❵] L ≘ K → ∀T,U. ⬆*[1] T ≘ U → - ∀f. K ⊢ 𝐅*⦃T⦄ ≘ f → L ⊢ 𝐅*⦃U⦄ ≘ ⫯f. +lemma frees_lifts_SO: + ∀b,L,K. ⬇*[b,𝐔❴1❵] L ≘ K → ∀T,U. ⬆*[1] T ≘ U → + ∀f. K ⊢ 𝐅+⦃T⦄ ≘ f → L ⊢ 𝐅+⦃U⦄ ≘ ⫯f. #b #L #K #HLK #T #U #HTU #f #Hf @(frees_lifts b … Hf … HTU) // (**) (* auto fails *) qed. (* Forward lemmas with generic slicing for local environments ***************) -lemma frees_fwd_coafter: ∀b,f2,L,U. L ⊢ 𝐅*⦃U⦄ ≘ f2 → - ∀f,K. ⬇*[b,f] L ≘ K → ∀T. ⬆*[f] T ≘ U → - ∀f1. K ⊢ 𝐅*⦃T⦄ ≘ f1 → f ~⊚ f1 ≘ f2. +lemma frees_fwd_coafter: + ∀b,f2,L,U. L ⊢ 𝐅+⦃U⦄ ≘ f2 → + ∀f,K. ⬇*[b,f] L ≘ K → ∀T. ⬆*[f] T ≘ U → + ∀f1. K ⊢ 𝐅+⦃T⦄ ≘ f1 → f ~⊚ f1 ≘ f2. /4 width=11 by frees_lifts, frees_mono, coafter_eq_repl_back0/ qed-. (* Inversion lemmas with generic slicing for local environments *************) -lemma frees_inv_lifts_ex: ∀b,f2,L,U. L ⊢ 𝐅*⦃U⦄ ≘ f2 → - ∀f,K. ⬇*[b,f] L ≘ K → ∀T. ⬆*[f] T ≘ U → - ∃∃f1. f ~⊚ f1 ≘ f2 & K ⊢ 𝐅*⦃T⦄ ≘ f1. +lemma frees_inv_lifts_ex: + ∀b,f2,L,U. L ⊢ 𝐅+⦃U⦄ ≘ f2 → + ∀f,K. ⬇*[b,f] L ≘ K → ∀T. ⬆*[f] T ≘ U → + ∃∃f1. f ~⊚ f1 ≘ f2 & K ⊢ 𝐅+⦃T⦄ ≘ f1. #b #f2 #L #U #Hf2 #f #K #HLK #T elim (frees_total K T) /3 width=9 by frees_fwd_coafter, ex2_intro/ qed-. -lemma frees_inv_lifts_SO: ∀b,f,L,U. L ⊢ 𝐅*⦃U⦄ ≘ f → - ∀K. ⬇*[b,𝐔❴1❵] L ≘ K → ∀T. ⬆*[1] T ≘ U → - K ⊢ 𝐅*⦃T⦄ ≘ ⫱f. +lemma frees_inv_lifts_SO: + ∀b,f,L,U. L ⊢ 𝐅+⦃U⦄ ≘ f → + ∀K. ⬇*[b,𝐔❴1❵] L ≘ K → ∀T. ⬆*[1] T ≘ U → + K ⊢ 𝐅+⦃T⦄ ≘ ⫱f. #b #f #L #U #H #K #HLK #T #HTU elim(frees_inv_lifts_ex … H … HLK … HTU) -b -L -U #f1 #Hf #Hf1 elim (coafter_inv_nxx … Hf) -Hf /3 width=5 by frees_eq_repl_back, coafter_isid_inv_sn/ qed-. -lemma frees_inv_lifts: ∀b,f2,L,U. L ⊢ 𝐅*⦃U⦄ ≘ f2 → - ∀f,K. ⬇*[b,f] L ≘ K → ∀T. ⬆*[f] T ≘ U → - ∀f1. f ~⊚ f1 ≘ f2 → K ⊢ 𝐅*⦃T⦄ ≘ f1. +lemma frees_inv_lifts: + ∀b,f2,L,U. L ⊢ 𝐅+⦃U⦄ ≘ f2 → + ∀f,K. ⬇*[b,f] L ≘ K → ∀T. ⬆*[f] T ≘ U → + ∀f1. f ~⊚ f1 ≘ f2 → K ⊢ 𝐅+⦃T⦄ ≘ f1. #b #f2 #L #U #H #f #K #HLK #T #HTU #f1 #Hf2 elim (frees_inv_lifts_ex … H … HLK … HTU) -b -L -U /3 width=7 by frees_eq_repl_back, coafter_inj/ qed-. (* Note: this is used by rex_conf and might be modified *) -lemma frees_inv_drops_next: ∀f1,L1,T1. L1 ⊢ 𝐅*⦃T1⦄ ≘ f1 → - ∀I2,L2,V2,n. ⬇*[n] L1 ≘ L2.ⓑ{I2}V2 → - ∀g1. ↑g1 = ⫱*[n] f1 → - ∃∃g2. L2 ⊢ 𝐅*⦃V2⦄ ≘ g2 & g2 ⊆ g1. +lemma frees_inv_drops_next: + ∀f1,L1,T1. L1 ⊢ 𝐅+⦃T1⦄ ≘ f1 → + ∀I2,L2,V2,n. ⬇*[n] L1 ≘ L2.ⓑ{I2}V2 → + ∀g1. ↑g1 = ⫱*[n] f1 → + ∃∃g2. L2 ⊢ 𝐅+⦃V2⦄ ≘ g2 & g2 ⊆ g1. #f1 #L1 #T1 #H elim H -f1 -L1 -T1 [ #f1 #L1 #s #Hf1 #I2 #L2 #V2 #n #_ #g1 #H1 -I2 -L1 -s lapply (isid_tls n … Hf1) -Hf1

(tdeq_inv_lref1 … H) -X /2 width=5 by fqu_lref_O, ex3_2_intro/ | #I #G #L #W1 #U1 #X #H elim (tdeq_inv_pair1 … H) -H #W2 #U2 #HW12 #_ #H destruct /2 width=5 by fqu_pair_sn, ex3_2_intro/ -| #p #I #G #L #W1 #U1 #X #H +| #p #I #G #L #W1 #U1 #Hb #X #H elim (tdeq_inv_pair1 … H) -H #W2 #U2 #HW12 #HU12 #H destruct /3 width=5 by rdeq_pair_refl, fqu_bind_dx, ex3_2_intro/ | #p #I #G #L #W1 #U1 #Hb #X #H @@ -45,18 +45,18 @@ lemma fqu_tdeq_conf: ∀b,G1,G2,L1,L2,U1,T1. ⦃G1,L1,U1⦄ ⊐[b] ⦃G2,L2,T1 ] qed-. -lemma tdeq_fqu_trans: ∀b,G1,G2,L1,L2,U1,T1. ⦃G1,L1,U1⦄ ⊐[b] ⦃G2,L2,T1⦄ → +lemma tdeq_fqu_trans: ∀b,G1,G2,L1,L2,U1,T1. ⦃G1,L1,U1⦄ ⬂[b] ⦃G2,L2,T1⦄ → ∀U2. U2 ≛ U1 → - ∃∃L,T2. ⦃G1,L1,U2⦄ ⊐[b] ⦃G2,L,T2⦄ & T2 ≛ T1 & L ≛[T1] L2. + ∃∃L,T2. ⦃G1,L1,U2⦄ ⬂[b] ⦃G2,L,T2⦄ & T2 ≛ T1 & L ≛[T1] L2. #b #G1 #G2 #L1 #L2 #U1 #T1 #H12 #U2 #HU21 elim (fqu_tdeq_conf … H12 U2) -H12 /3 width=5 by rdeq_sym, tdeq_sym, ex3_2_intro/ qed-. (* Basic_2A1: uses: lleq_fqu_trans *) -lemma rdeq_fqu_trans: ∀b,G1,G2,L2,K2,T,U. ⦃G1,L2,T⦄ ⊐[b] ⦃G2,K2,U⦄ → +lemma rdeq_fqu_trans: ∀b,G1,G2,L2,K2,T,U. ⦃G1,L2,T⦄ ⬂[b] ⦃G2,K2,U⦄ → ∀L1. L1 ≛[T] L2 → - ∃∃K1,U0. ⦃G1,L1,T⦄ ⊐[b] ⦃G2,K1,U0⦄ & U0 ≛ U & K1 ≛[U] K2. + ∃∃K1,U0. ⦃G1,L1,T⦄ ⬂[b] ⦃G2,K1,U0⦄ & U0 ≛ U & K1 ≛[U] K2. #b #G1 #G2 #L2 #K2 #T #U #H elim H -G1 -G2 -L2 -K2 -T -U [ #I #G #L2 #V2 #L1 #H elim (rdeq_inv_zero_pair_dx … H) -H #K1 #V1 #HV1 #HV12 #H destruct @@ -66,8 +66,8 @@ lemma rdeq_fqu_trans: ∀b,G1,G2,L2,K2,T,U. ⦃G1,L2,T⦄ ⊐[b] ⦃G2,K2,U⦄ | elim (rdeq_inv_flat … H) ] -H /2 width=5 by fqu_pair_sn, ex3_2_intro/ -| #p #I #G #L2 #V #T #L1 #H elim (rdeq_inv_bind … H) -H - /2 width=5 by fqu_bind_dx, ex3_2_intro/ +| #p #I #G #L2 #V #T #Hb #L1 #H elim (rdeq_inv_bind … H) -H + /3 width=5 by fqu_bind_dx, ex3_2_intro/ | #p #I #G #L2 #V #T #Hb #L1 #H elim (rdeq_inv_bind_void … H) -H /3 width=5 by fqu_clear, ex3_2_intro/ | #I #G #L2 #V #T #L1 #H elim (rdeq_inv_flat … H) -H @@ -80,9 +80,9 @@ qed-. (* Properties with optional structural successor for closures ***************) -lemma tdeq_fquq_trans: ∀b,G1,G2,L1,L2,U1,T1. ⦃G1,L1,U1⦄ ⊐⸮[b] ⦃G2,L2,T1⦄ → +lemma tdeq_fquq_trans: ∀b,G1,G2,L1,L2,U1,T1. ⦃G1,L1,U1⦄ ⬂⸮[b] ⦃G2,L2,T1⦄ → ∀U2. U2 ≛ U1 → - ∃∃L,T2. ⦃G1,L1,U2⦄ ⊐⸮[b] ⦃G2,L,T2⦄ & T2 ≛ T1 & L ≛[T1] L2. + ∃∃L,T2. ⦃G1,L1,U2⦄ ⬂⸮[b] ⦃G2,L,T2⦄ & T2 ≛ T1 & L ≛[T1] L2. #b #G1 #G2 #L1 #L2 #U1 #T1 #H elim H -H [ #H #U2 #HU21 elim (tdeq_fqu_trans … H … HU21) -U1 /3 width=5 by fqu_fquq, ex3_2_intro/ @@ -91,9 +91,9 @@ lemma tdeq_fquq_trans: ∀b,G1,G2,L1,L2,U1,T1. ⦃G1,L1,U1⦄ ⊐⸮[b] ⦃G2,L2 qed-. (* Basic_2A1: was just: lleq_fquq_trans *) -lemma rdeq_fquq_trans: ∀b,G1,G2,L2,K2,T,U. ⦃G1,L2,T⦄ ⊐⸮[b] ⦃G2,K2,U⦄ → +lemma rdeq_fquq_trans: ∀b,G1,G2,L2,K2,T,U. ⦃G1,L2,T⦄ ⬂⸮[b] ⦃G2,K2,U⦄ → ∀L1. L1 ≛[T] L2 → - ∃∃K1,U0. ⦃G1,L1,T⦄ ⊐⸮[b] ⦃G2,K1,U0⦄ & U0 ≛ U & K1 ≛[U] K2. + ∃∃K1,U0. ⦃G1,L1,T⦄ ⬂⸮[b] ⦃G2,K1,U0⦄ & U0 ≛ U & K1 ≛[U] K2. #b #G1 #G2 #L2 #K2 #T #U #H elim H -H [ #H #L1 #HL12 elim (rdeq_fqu_trans … H … HL12) -L2 /3 width=5 by fqu_fquq, ex3_2_intro/ | * #HG #HL #HT destruct /2 width=5 by ex3_2_intro/ @@ -103,9 +103,9 @@ qed-. (* Properties with plus-iterated structural successor for closures **********) (* Basic_2A1: was just: lleq_fqup_trans *) -lemma rdeq_fqup_trans: ∀b,G1,G2,L2,K2,T,U. ⦃G1,L2,T⦄ ⊐+[b] ⦃G2,K2,U⦄ → +lemma rdeq_fqup_trans: ∀b,G1,G2,L2,K2,T,U. ⦃G1,L2,T⦄ ⬂+[b] ⦃G2,K2,U⦄ → ∀L1. L1 ≛[T] L2 → - ∃∃K1,U0. ⦃G1,L1,T⦄ ⊐+[b] ⦃G2,K1,U0⦄ & U0 ≛ U & K1 ≛[U] K2. + ∃∃K1,U0. ⦃G1,L1,T⦄ ⬂+[b] ⦃G2,K1,U0⦄ & U0 ≛ U & K1 ≛[U] K2. #b #G1 #G2 #L2 #K2 #T #U #H @(fqup_ind … H) -G2 -K2 -U [ #G2 #K2 #U #HTU #L1 #HL12 elim (rdeq_fqu_trans … HTU … HL12) -L2 /3 width=5 by fqu_fqup, ex3_2_intro/ @@ -118,9 +118,9 @@ lemma rdeq_fqup_trans: ∀b,G1,G2,L2,K2,T,U. ⦃G1,L2,T⦄ ⊐+[b] ⦃G2,K2,U⦄ ] qed-. -lemma tdeq_fqup_trans: ∀b,G1,G2,L1,L2,U1,T1. ⦃G1,L1,U1⦄ ⊐+[b] ⦃G2,L2,T1⦄ → +lemma tdeq_fqup_trans: ∀b,G1,G2,L1,L2,U1,T1. ⦃G1,L1,U1⦄ ⬂+[b] ⦃G2,L2,T1⦄ → ∀U2. U2 ≛ U1 → - ∃∃L,T2. ⦃G1,L1,U2⦄ ⊐+[b] ⦃G2,L,T2⦄ & T2 ≛ T1 & L ≛[T1] L2. + ∃∃L,T2. ⦃G1,L1,U2⦄ ⬂+[b] ⦃G2,L,T2⦄ & T2 ≛ T1 & L ≛[T1] L2. #b #G1 #G2 #L1 #L2 #U1 #T1 #H @(fqup_ind_dx … H) -G1 -L1 -U1 [ #G1 #L1 #U1 #H #U2 #HU21 elim (tdeq_fqu_trans … H … HU21) -U1 /3 width=5 by fqu_fqup, ex3_2_intro/ @@ -136,9 +136,9 @@ qed-. (* Properties with star-iterated structural successor for closures **********) -lemma tdeq_fqus_trans: ∀b,G1,G2,L1,L2,U1,T1. ⦃G1,L1,U1⦄ ⊐*[b] ⦃G2,L2,T1⦄ → +lemma tdeq_fqus_trans: ∀b,G1,G2,L1,L2,U1,T1. ⦃G1,L1,U1⦄ ⬂*[b] ⦃G2,L2,T1⦄ → ∀U2. U2 ≛ U1 → - ∃∃L,T2. ⦃G1,L1,U2⦄ ⊐*[b] ⦃G2,L,T2⦄ & T2 ≛ T1 & L ≛[T1] L2. + ∃∃L,T2. ⦃G1,L1,U2⦄ ⬂*[b] ⦃G2,L,T2⦄ & T2 ≛ T1 & L ≛[T1] L2. #b #G1 #G2 #L1 #L2 #U1 #T1 #H #U2 #HU21 elim(fqus_inv_fqup … H) -H [ #H elim (tdeq_fqup_trans … H … HU21) -U1 /3 width=5 by fqup_fqus, ex3_2_intro/ | * #HG #HL #HT destruct /2 width=5 by ex3_2_intro/ @@ -146,9 +146,9 @@ lemma tdeq_fqus_trans: ∀b,G1,G2,L1,L2,U1,T1. ⦃G1,L1,U1⦄ ⊐*[b] ⦃G2,L2,T qed-. (* Basic_2A1: was just: lleq_fqus_trans *) -lemma rdeq_fqus_trans: ∀b,G1,G2,L2,K2,T,U. ⦃G1,L2,T⦄ ⊐*[b] ⦃G2,K2,U⦄ → +lemma rdeq_fqus_trans: ∀b,G1,G2,L2,K2,T,U. ⦃G1,L2,T⦄ ⬂*[b] ⦃G2,K2,U⦄ → ∀L1. L1 ≛[T] L2 → - ∃∃K1,U0. ⦃G1,L1,T⦄ ⊐*[b] ⦃G2,K1,U0⦄ & U0 ≛ U & K1 ≛[U] K2. + ∃∃K1,U0. ⦃G1,L1,T⦄ ⬂*[b] ⦃G2,K1,U0⦄ & U0 ≛ U & K1 ≛[U] K2. #b #G1 #G2 #L2 #K2 #T #U #H #L1 #HL12 elim(fqus_inv_fqup … H) -H [ #H elim (rdeq_fqup_trans … H … HL12) -L2 /3 width=5 by fqup_fqus, ex3_2_intro/ | * #HG #HL #HT destruct /2 width=5 by ex3_2_intro/ diff --git a/matita/matita/contribs/lambdadelta/static_2/static/req.ma b/matita/matita/contribs/lambdadelta/static_2/static/req.ma index 46e436d68..acfb6c4e8 100644 --- a/matita/matita/contribs/lambdadelta/static_2/static/req.ma +++ b/matita/matita/contribs/lambdadelta/static_2/static/req.ma @@ -76,8 +76,8 @@ qed-. (* Basic_properties *********************************************************) -lemma frees_req_conf: ∀f,L1,T. L1 ⊢ 𝐅*⦃T⦄ ≘ f → - ∀L2. L1 ≡[T] L2 → L2 ⊢ 𝐅*⦃T⦄ ≘ f. +lemma frees_req_conf: ∀f,L1,T. L1 ⊢ 𝐅+⦃T⦄ ≘ f → + ∀L2. L1 ≡[T] L2 → L2 ⊢ 𝐅+⦃T⦄ ≘ f. #f #L1 #T #H elim H -f -L1 -T [ /2 width=3 by frees_sort/ | #f #i #Hf #L2 #H2 diff --git a/matita/matita/contribs/lambdadelta/static_2/static/rex.ma b/matita/matita/contribs/lambdadelta/static_2/static/rex.ma index 0848e8503..07ad9fe05 100644 --- a/matita/matita/contribs/lambdadelta/static_2/static/rex.ma +++ b/matita/matita/contribs/lambdadelta/static_2/static/rex.ma @@ -21,7 +21,7 @@ include "static_2/static/frees.ma". (* GENERIC EXTENSION ON REFERRED ENTRIES OF A CONTEXT-SENSITIVE REALTION ****) definition rex (R) (T): relation lenv ≝ - λL1,L2. ∃∃f. L1 ⊢ 𝐅*⦃T⦄ ≘ f & L1 ⪤[cext2 R,cfull,f] L2. + λL1,L2. ∃∃f. L1 ⊢ 𝐅+⦃T⦄ ≘ f & L1 ⪤[cext2 R,cfull,f] L2. interpretation "generic extension on referred entries (local environment)" 'Relation R T L1 L2 = (rex R T L1 L2). @@ -53,10 +53,10 @@ lemma rex_inv_atom_dx (R): ∀Y1,T. Y1 ⪤[R,T] ⋆ → Y1 = ⋆. #R #I #Y1 * /2 width=4 by sex_inv_atom2/ qed-. -lemma rex_inv_sort (R): ∀Y1,Y2,s. Y1 ⪤[R,⋆s] Y2 → - ∨∨ Y1 = ⋆ ∧ Y2 = ⋆ - | ∃∃I1,I2,L1,L2. L1 ⪤[R,⋆s] L2 & - Y1 = L1.ⓘ{I1} & Y2 = L2.ⓘ{I2}. +lemma rex_inv_sort (R): + ∀Y1,Y2,s. Y1 ⪤[R,⋆s] Y2 → + ∨∨ ∧∧ Y1 = ⋆ & Y2 = ⋆ + | ∃∃I1,I2,L1,L2. L1 ⪤[R,⋆s] L2 & Y1 = L1.ⓘ{I1} & Y2 = L2.ⓘ{I2}. #R * [ | #Y1 #I1 ] #Y2 #s * #f #H1 #H2 [ lapply (sex_inv_atom1 … H2) -H2 /3 width=1 by or_introl, conj/ | lapply (frees_inv_sort … H1) -H1 #Hf @@ -66,12 +66,13 @@ lemma rex_inv_sort (R): ∀Y1,Y2,s. Y1 ⪤[R,⋆s] Y2 → ] qed-. -lemma rex_inv_zero (R): ∀Y1,Y2. Y1 ⪤[R,#0] Y2 → - ∨∨ Y1 = ⋆ ∧ Y2 = ⋆ - | ∃∃I,L1,L2,V1,V2. L1 ⪤[R,V1] L2 & R L1 V1 V2 & - Y1 = L1.ⓑ{I}V1 & Y2 = L2.ⓑ{I}V2 - | ∃∃f,I,L1,L2. 𝐈⦃f⦄ & L1 ⪤[cext2 R,cfull,f] L2 & - Y1 = L1.ⓤ{I} & Y2 = L2.ⓤ{I}. +lemma rex_inv_zero (R): + ∀Y1,Y2. Y1 ⪤[R,#0] Y2 → + ∨∨ Y1 = ⋆ ∧ Y2 = ⋆ + | ∃∃I,L1,L2,V1,V2. L1 ⪤[R,V1] L2 & R L1 V1 V2 & + Y1 = L1.ⓑ{I}V1 & Y2 = L2.ⓑ{I}V2 + | ∃∃f,I,L1,L2. 𝐈⦃f⦄ & L1 ⪤[cext2 R,cfull,f] L2 & + Y1 = L1.ⓤ{I} & Y2 = L2.ⓤ{I}. #R * [ | #Y1 * #I1 [ | #X ] ] #Y2 * #f #H1 #H2 [ lapply (sex_inv_atom1 … H2) -H2 /3 width=1 by or3_intro0, conj/ | elim (frees_inv_unit … H1) -H1 #g #HX #H destruct @@ -84,10 +85,10 @@ lemma rex_inv_zero (R): ∀Y1,Y2. Y1 ⪤[R,#0] Y2 → ] qed-. -lemma rex_inv_lref (R): ∀Y1,Y2,i. Y1 ⪤[R,#↑i] Y2 → - ∨∨ Y1 = ⋆ ∧ Y2 = ⋆ - | ∃∃I1,I2,L1,L2. L1 ⪤[R,#i] L2 & - Y1 = L1.ⓘ{I1} & Y2 = L2.ⓘ{I2}. +lemma rex_inv_lref (R): + ∀Y1,Y2,i. Y1 ⪤[R,#↑i] Y2 → + ∨∨ ∧∧ Y1 = ⋆ & Y2 = ⋆ + | ∃∃I1,I2,L1,L2. L1 ⪤[R,#i] L2 & Y1 = L1.ⓘ{I1} & Y2 = L2.ⓘ{I2}. #R * [ | #Y1 #I1 ] #Y2 #i * #f #H1 #H2 [ lapply (sex_inv_atom1 … H2) -H2 /3 width=1 by or_introl, conj/ | elim (frees_inv_lref … H1) -H1 #g #Hg #H destruct @@ -96,10 +97,10 @@ lemma rex_inv_lref (R): ∀Y1,Y2,i. Y1 ⪤[R,#↑i] Y2 → ] qed-. -lemma rex_inv_gref (R): ∀Y1,Y2,l. Y1 ⪤[R,§l] Y2 → - ∨∨ Y1 = ⋆ ∧ Y2 = ⋆ - | ∃∃I1,I2,L1,L2. L1 ⪤[R,§l] L2 & - Y1 = L1.ⓘ{I1} & Y2 = L2.ⓘ{I2}. +lemma rex_inv_gref (R): + ∀Y1,Y2,l. Y1 ⪤[R,§l] Y2 → + ∨∨ ∧∧ Y1 = ⋆ & Y2 = ⋆ + | ∃∃I1,I2,L1,L2. L1 ⪤[R,§l] L2 & Y1 = L1.ⓘ{I1} & Y2 = L2.ⓘ{I2}. #R * [ | #Y1 #I1 ] #Y2 #l * #f #H1 #H2 [ lapply (sex_inv_atom1 … H2) -H2 /3 width=1 by or_introl, conj/ | lapply (frees_inv_gref … H1) -H1 #Hf @@ -110,40 +111,44 @@ lemma rex_inv_gref (R): ∀Y1,Y2,l. Y1 ⪤[R,§l] Y2 → qed-. (* Basic_2A1: uses: llpx_sn_inv_bind llpx_sn_inv_bind_O *) -lemma rex_inv_bind (R): ∀p,I,L1,L2,V1,V2,T. L1 ⪤[R,ⓑ{p,I}V1.T] L2 → R L1 V1 V2 → - ∧∧ L1 ⪤[R,V1] L2 & L1.ⓑ{I}V1 ⪤[R,T] L2.ⓑ{I}V2. +lemma rex_inv_bind (R): + ∀p,I,L1,L2,V1,V2,T. L1 ⪤[R,ⓑ{p,I}V1.T] L2 → R L1 V1 V2 → + ∧∧ L1 ⪤[R,V1] L2 & L1.ⓑ{I}V1 ⪤[R,T] L2.ⓑ{I}V2. #R #p #I #L1 #L2 #V1 #V2 #T * #f #Hf #HL #HV elim (frees_inv_bind … Hf) -Hf /6 width=6 by sle_sex_trans, sex_inv_tl, ext2_pair, sor_inv_sle_dx, sor_inv_sle_sn, ex2_intro, conj/ qed-. (* Basic_2A1: uses: llpx_sn_inv_flat *) -lemma rex_inv_flat (R): ∀I,L1,L2,V,T. L1 ⪤[R,ⓕ{I}V.T] L2 → - ∧∧ L1 ⪤[R,V] L2 & L1 ⪤[R,T] L2. +lemma rex_inv_flat (R): + ∀I,L1,L2,V,T. L1 ⪤[R,ⓕ{I}V.T] L2 → + ∧∧ L1 ⪤[R,V] L2 & L1 ⪤[R,T] L2. #R #I #L1 #L2 #V #T * #f #Hf #HL elim (frees_inv_flat … Hf) -Hf /5 width=6 by sle_sex_trans, sor_inv_sle_dx, sor_inv_sle_sn, ex2_intro, conj/ qed-. (* Advanced inversion lemmas ************************************************) -lemma rex_inv_sort_bind_sn (R): ∀I1,K1,L2,s. K1.ⓘ{I1} ⪤[R,⋆s] L2 → - ∃∃I2,K2. K1 ⪤[R,⋆s] K2 & L2 = K2.ⓘ{I2}. +lemma rex_inv_sort_bind_sn (R): + ∀I1,K1,L2,s. K1.ⓘ{I1} ⪤[R,⋆s] L2 → + ∃∃I2,K2. K1 ⪤[R,⋆s] K2 & L2 = K2.ⓘ{I2}. #R #I1 #K1 #L2 #s #H elim (rex_inv_sort … H) -H * [ #H destruct | #Z1 #I2 #Y1 #K2 #Hs #H1 #H2 destruct /2 width=4 by ex2_2_intro/ ] qed-. -lemma rex_inv_sort_bind_dx (R): ∀I2,K2,L1,s. L1 ⪤[R,⋆s] K2.ⓘ{I2} → - ∃∃I1,K1. K1 ⪤[R,⋆s] K2 & L1 = K1.ⓘ{I1}. +lemma rex_inv_sort_bind_dx (R): + ∀I2,K2,L1,s. L1 ⪤[R,⋆s] K2.ⓘ{I2} → + ∃∃I1,K1. K1 ⪤[R,⋆s] K2 & L1 = K1.ⓘ{I1}. #R #I2 #K2 #L1 #s #H elim (rex_inv_sort … H) -H * [ #_ #H destruct | #I1 #Z2 #K1 #Y2 #Hs #H1 #H2 destruct /2 width=4 by ex2_2_intro/ ] qed-. -lemma rex_inv_zero_pair_sn (R): ∀I,L2,K1,V1. K1.ⓑ{I}V1 ⪤[R,#0] L2 → - ∃∃K2,V2. K1 ⪤[R,V1] K2 & R K1 V1 V2 & - L2 = K2.ⓑ{I}V2. +lemma rex_inv_zero_pair_sn (R): + ∀I,L2,K1,V1. K1.ⓑ{I}V1 ⪤[R,#0] L2 → + ∃∃K2,V2. K1 ⪤[R,V1] K2 & R K1 V1 V2 & L2 = K2.ⓑ{I}V2. #R #I #L2 #K1 #V1 #H elim (rex_inv_zero … H) -H * [ #H destruct | #Z #Y1 #K2 #X1 #V2 #HK12 #HV12 #H1 #H2 destruct @@ -152,9 +157,9 @@ lemma rex_inv_zero_pair_sn (R): ∀I,L2,K1,V1. K1.ⓑ{I}V1 ⪤[R,#0] L2 → ] qed-. -lemma rex_inv_zero_pair_dx (R): ∀I,L1,K2,V2. L1 ⪤[R,#0] K2.ⓑ{I}V2 → - ∃∃K1,V1. K1 ⪤[R,V1] K2 & R K1 V1 V2 & - L1 = K1.ⓑ{I}V1. +lemma rex_inv_zero_pair_dx (R): + ∀I,L1,K2,V2. L1 ⪤[R,#0] K2.ⓑ{I}V2 → + ∃∃K1,V1. K1 ⪤[R,V1] K2 & R K1 V1 V2 & L1 = K1.ⓑ{I}V1. #R #I #L1 #K2 #V2 #H elim (rex_inv_zero … H) -H * [ #_ #H destruct | #Z #K1 #Y2 #V1 #X2 #HK12 #HV12 #H1 #H2 destruct @@ -163,9 +168,9 @@ lemma rex_inv_zero_pair_dx (R): ∀I,L1,K2,V2. L1 ⪤[R,#0] K2.ⓑ{I}V2 → ] qed-. -lemma rex_inv_zero_unit_sn (R): ∀I,K1,L2. K1.ⓤ{I} ⪤[R,#0] L2 → - ∃∃f,K2. 𝐈⦃f⦄ & K1 ⪤[cext2 R,cfull,f] K2 & - L2 = K2.ⓤ{I}. +lemma rex_inv_zero_unit_sn (R): + ∀I,K1,L2. K1.ⓤ{I} ⪤[R,#0] L2 → + ∃∃f,K2. 𝐈⦃f⦄ & K1 ⪤[cext2 R,cfull,f] K2 & L2 = K2.ⓤ{I}. #R #I #K1 #L2 #H elim (rex_inv_zero … H) -H * [ #H destruct | #Z #Y1 #Y2 #X1 #X2 #_ #_ #H destruct @@ -173,9 +178,9 @@ lemma rex_inv_zero_unit_sn (R): ∀I,K1,L2. K1.ⓤ{I} ⪤[R,#0] L2 → ] qed-. -lemma rex_inv_zero_unit_dx (R): ∀I,L1,K2. L1 ⪤[R,#0] K2.ⓤ{I} → - ∃∃f,K1. 𝐈⦃f⦄ & K1 ⪤[cext2 R,cfull,f] K2 & - L1 = K1.ⓤ{I}. +lemma rex_inv_zero_unit_dx (R): + ∀I,L1,K2. L1 ⪤[R,#0] K2.ⓤ{I} → + ∃∃f,K1. 𝐈⦃f⦄ & K1 ⪤[cext2 R,cfull,f] K2 & L1 = K1.ⓤ{I}. #R #I #L1 #K2 #H elim (rex_inv_zero … H) -H * [ #_ #H destruct | #Z #Y1 #Y2 #X1 #X2 #_ #_ #_ #H destruct @@ -183,32 +188,36 @@ lemma rex_inv_zero_unit_dx (R): ∀I,L1,K2. L1 ⪤[R,#0] K2.ⓤ{I} → ] qed-. -lemma rex_inv_lref_bind_sn (R): ∀I1,K1,L2,i. K1.ⓘ{I1} ⪤[R,#↑i] L2 → - ∃∃I2,K2. K1 ⪤[R,#i] K2 & L2 = K2.ⓘ{I2}. +lemma rex_inv_lref_bind_sn (R): + ∀I1,K1,L2,i. K1.ⓘ{I1} ⪤[R,#↑i] L2 → + ∃∃I2,K2. K1 ⪤[R,#i] K2 & L2 = K2.ⓘ{I2}. #R #I1 #K1 #L2 #i #H elim (rex_inv_lref … H) -H * [ #H destruct | #Z1 #I2 #Y1 #K2 #Hi #H1 #H2 destruct /2 width=4 by ex2_2_intro/ ] qed-. -lemma rex_inv_lref_bind_dx (R): ∀I2,K2,L1,i. L1 ⪤[R,#↑i] K2.ⓘ{I2} → - ∃∃I1,K1. K1 ⪤[R,#i] K2 & L1 = K1.ⓘ{I1}. +lemma rex_inv_lref_bind_dx (R): + ∀I2,K2,L1,i. L1 ⪤[R,#↑i] K2.ⓘ{I2} → + ∃∃I1,K1. K1 ⪤[R,#i] K2 & L1 = K1.ⓘ{I1}. #R #I2 #K2 #L1 #i #H elim (rex_inv_lref … H) -H * [ #_ #H destruct | #I1 #Z2 #K1 #Y2 #Hi #H1 #H2 destruct /2 width=4 by ex2_2_intro/ ] qed-. -lemma rex_inv_gref_bind_sn (R): ∀I1,K1,L2,l. K1.ⓘ{I1} ⪤[R,§l] L2 → - ∃∃I2,K2. K1 ⪤[R,§l] K2 & L2 = K2.ⓘ{I2}. +lemma rex_inv_gref_bind_sn (R): + ∀I1,K1,L2,l. K1.ⓘ{I1} ⪤[R,§l] L2 → + ∃∃I2,K2. K1 ⪤[R,§l] K2 & L2 = K2.ⓘ{I2}. #R #I1 #K1 #L2 #l #H elim (rex_inv_gref … H) -H * [ #H destruct | #Z1 #I2 #Y1 #K2 #Hl #H1 #H2 destruct /2 width=4 by ex2_2_intro/ ] qed-. -lemma rex_inv_gref_bind_dx (R): ∀I2,K2,L1,l. L1 ⪤[R,§l] K2.ⓘ{I2} → - ∃∃I1,K1. K1 ⪤[R,§l] K2 & L1 = K1.ⓘ{I1}. +lemma rex_inv_gref_bind_dx (R): + ∀I2,K2,L1,l. L1 ⪤[R,§l] K2.ⓘ{I2} → + ∃∃I1,K1. K1 ⪤[R,§l] K2 & L1 = K1.ⓘ{I1}. #R #I2 #K2 #L1 #l #H elim (rex_inv_gref … H) -H * [ #_ #H destruct | #I1 #Z2 #K1 #Y2 #Hl #H1 #H2 destruct /2 width=4 by ex2_2_intro/ @@ -217,8 +226,8 @@ qed-. (* Basic forward lemmas *****************************************************) -lemma rex_fwd_zero_pair (R): ∀I,K1,K2,V1,V2. - K1.ⓑ{I}V1 ⪤[R,#0] K2.ⓑ{I}V2 → K1 ⪤[R,V1] K2. +lemma rex_fwd_zero_pair (R): + ∀I,K1,K2,V1,V2. K1.ⓑ{I}V1 ⪤[R,#0] K2.ⓑ{I}V2 → K1 ⪤[R,V1] K2. #R #I #K1 #K2 #V1 #V2 #H elim (rex_inv_zero_pair_sn … H) -H #Y #X #HK12 #_ #H destruct // qed-. @@ -231,8 +240,9 @@ lemma rex_fwd_pair_sn (R): ∀I,L1,L2,V,T. L1 ⪤[R,②{I}V.T] L2 → L1 ⪤[R,V qed-. (* Basic_2A1: uses: llpx_sn_fwd_bind_dx llpx_sn_fwd_bind_O_dx *) -lemma rex_fwd_bind_dx (R): ∀p,I,L1,L2,V1,V2,T. L1 ⪤[R,ⓑ{p,I}V1.T] L2 → - R L1 V1 V2 → L1.ⓑ{I}V1 ⪤[R,T] L2.ⓑ{I}V2. +lemma rex_fwd_bind_dx (R): + ∀p,I,L1,L2,V1,V2,T. L1 ⪤[R,ⓑ{p,I}V1.T] L2 → + R L1 V1 V2 → L1.ⓑ{I}V1 ⪤[R,T] L2.ⓑ{I}V2. #R #p #I #L1 #L2 #V1 #V2 #T #H #HV elim (rex_inv_bind … H HV) -H -HV // qed-. @@ -241,8 +251,9 @@ lemma rex_fwd_flat_dx (R): ∀I,L1,L2,V,T. L1 ⪤[R,ⓕ{I}V.T] L2 → L1 ⪤[R,T #R #I #L1 #L2 #V #T #H elim (rex_inv_flat … H) -H // qed-. -lemma rex_fwd_dx (R): ∀I2,L1,K2,T. L1 ⪤[R,T] K2.ⓘ{I2} → - ∃∃I1,K1. L1 = K1.ⓘ{I1}. +lemma rex_fwd_dx (R): + ∀I2,L1,K2,T. L1 ⪤[R,T] K2.ⓘ{I2} → + ∃∃I1,K1. L1 = K1.ⓘ{I1}. #R #I2 #L1 #K2 #T * #f elim (pn_split f) * #g #Hg #_ #Hf destruct [ elim (sex_inv_push2 … Hf) | elim (sex_inv_next2 … Hf) ] -Hf #I1 #K1 #_ #_ #H destruct /2 width=3 by ex1_2_intro/ @@ -254,59 +265,62 @@ lemma rex_atom (R): ∀I. ⋆ ⪤[R,⓪{I}] ⋆. #R * /3 width=3 by frees_sort, frees_atom, frees_gref, sex_atom, ex2_intro/ qed. -lemma rex_sort (R): ∀I1,I2,L1,L2,s. - L1 ⪤[R,⋆s] L2 → L1.ⓘ{I1} ⪤[R,⋆s] L2.ⓘ{I2}. +lemma rex_sort (R): + ∀I1,I2,L1,L2,s. L1 ⪤[R,⋆s] L2 → L1.ⓘ{I1} ⪤[R,⋆s] L2.ⓘ{I2}. #R #I1 #I2 #L1 #L2 #s * #f #Hf #H12 lapply (frees_inv_sort … Hf) -Hf /4 width=3 by frees_sort, sex_push, isid_push, ex2_intro/ qed. -lemma rex_pair (R): ∀I,L1,L2,V1,V2. L1 ⪤[R,V1] L2 → - R L1 V1 V2 → L1.ⓑ{I}V1 ⪤[R,#0] L2.ⓑ{I}V2. +lemma rex_pair (R): + ∀I,L1,L2,V1,V2. L1 ⪤[R,V1] L2 → + R L1 V1 V2 → L1.ⓑ{I}V1 ⪤[R,#0] L2.ⓑ{I}V2. #R #I1 #I2 #L1 #L2 #V1 * /4 width=3 by ext2_pair, frees_pair, sex_next, ex2_intro/ qed. -lemma rex_unit (R): ∀f,I,L1,L2. 𝐈⦃f⦄ → L1 ⪤[cext2 R,cfull,f] L2 → - L1.ⓤ{I} ⪤[R,#0] L2.ⓤ{I}. +lemma rex_unit (R): + ∀f,I,L1,L2. 𝐈⦃f⦄ → L1 ⪤[cext2 R,cfull,f] L2 → + L1.ⓤ{I} ⪤[R,#0] L2.ⓤ{I}. /4 width=3 by frees_unit, sex_next, ext2_unit, ex2_intro/ qed. -lemma rex_lref (R): ∀I1,I2,L1,L2,i. - L1 ⪤[R,#i] L2 → L1.ⓘ{I1} ⪤[R,#↑i] L2.ⓘ{I2}. +lemma rex_lref (R): + ∀I1,I2,L1,L2,i. L1 ⪤[R,#i] L2 → L1.ⓘ{I1} ⪤[R,#↑i] L2.ⓘ{I2}. #R #I1 #I2 #L1 #L2 #i * /3 width=3 by sex_push, frees_lref, ex2_intro/ qed. -lemma rex_gref (R): ∀I1,I2,L1,L2,l. - L1 ⪤[R,§l] L2 → L1.ⓘ{I1} ⪤[R,§l] L2.ⓘ{I2}. +lemma rex_gref (R): + ∀I1,I2,L1,L2,l. L1 ⪤[R,§l] L2 → L1.ⓘ{I1} ⪤[R,§l] L2.ⓘ{I2}. #R #I1 #I2 #L1 #L2 #l * #f #Hf #H12 lapply (frees_inv_gref … Hf) -Hf /4 width=3 by frees_gref, sex_push, isid_push, ex2_intro/ qed. -lemma rex_bind_repl_dx (R): ∀I,I1,L1,L2,T. - L1.ⓘ{I} ⪤[R,T] L2.ⓘ{I1} → - ∀I2. cext2 R L1 I I2 → - L1.ⓘ{I} ⪤[R,T] L2.ⓘ{I2}. +lemma rex_bind_repl_dx (R): + ∀I,I1,L1,L2,T. L1.ⓘ{I} ⪤[R,T] L2.ⓘ{I1} → + ∀I2. cext2 R L1 I I2 → L1.ⓘ{I} ⪤[R,T] L2.ⓘ{I2}. #R #I #I1 #L1 #L2 #T * #f #Hf #HL12 #I2 #HR /3 width=5 by sex_pair_repl, ex2_intro/ qed-. (* Basic_2A1: uses: llpx_sn_co *) -lemma rex_co (R1) (R2): (∀L,T1,T2. R1 L T1 T2 → R2 L T1 T2) → - ∀L1,L2,T. L1 ⪤[R1,T] L2 → L1 ⪤[R2,T] L2. +lemma rex_co (R1) (R2): + (∀L,T1,T2. R1 L T1 T2 → R2 L T1 T2) → + ∀L1,L2,T. L1 ⪤[R1,T] L2 → L1 ⪤[R2,T] L2. #R1 #R2 #HR #L1 #L2 #T * /5 width=7 by sex_co, cext2_co, ex2_intro/ qed-. -lemma rex_isid (R1) (R2): ∀L1,L2,T1,T2. - (∀f. L1 ⊢ 𝐅*⦃T1⦄ ≘ f → 𝐈⦃f⦄) → - (∀f. 𝐈⦃f⦄ → L1 ⊢ 𝐅*⦃T2⦄ ≘ f) → - L1 ⪤[R1,T1] L2 → L1 ⪤[R2,T2] L2. +lemma rex_isid (R1) (R2): + ∀L1,L2,T1,T2. + (∀f. L1 ⊢ 𝐅+⦃T1⦄ ≘ f → 𝐈⦃f⦄) → + (∀f. 𝐈⦃f⦄ → L1 ⊢ 𝐅+⦃T2⦄ ≘ f) → + L1 ⪤[R1,T1] L2 → L1 ⪤[R2,T2] L2. #R1 #R2 #L1 #L2 #T1 #T2 #H1 #H2 * /4 width=7 by sex_co_isid, ex2_intro/ qed-. lemma rex_unit_sn (R1) (R2): - ∀I,K1,L2. K1.ⓤ{I} ⪤[R1,#0] L2 → K1.ⓤ{I} ⪤[R2,#0] L2. + ∀I,K1,L2. K1.ⓤ{I} ⪤[R1,#0] L2 → K1.ⓤ{I} ⪤[R2,#0] L2. #R1 #R2 #I #K1 #L2 #H elim (rex_inv_zero_unit_sn … H) -H #f #K2 #Hf #HK12 #H destruct /3 width=7 by rex_unit, sex_co_isid/ diff --git a/matita/matita/contribs/lambdadelta/static_2/static/rex_drops.ma b/matita/matita/contribs/lambdadelta/static_2/static/rex_drops.ma index 5a0466800..f3421b04c 100644 --- a/matita/matita/contribs/lambdadelta/static_2/static/rex_drops.ma +++ b/matita/matita/contribs/lambdadelta/static_2/static/rex_drops.ma @@ -35,14 +35,15 @@ definition f_dropable_dx: predicate (relation3 lenv term term) ≝ ∃∃K1. ⬇*[b,f] L1 ≘ K1 & K1 ⪤[R,T] K2. definition f_transitive_next: relation3 … ≝ λR1,R2,R3. - ∀f,L,T. L ⊢ 𝐅*⦃T⦄ ≘ f → + ∀f,L,T. L ⊢ 𝐅+⦃T⦄ ≘ f → ∀g,I,K,n. ⬇*[n] L ≘ K.ⓘ{I} → ↑g = ⫱*[n] f → sex_transitive (cext2 R1) (cext2 R2) (cext2 R3) (cext2 R1) cfull g K I. (* Properties with generic slicing for local environments *******************) -lemma rex_liftable_dedropable_sn: ∀R. (∀L. reflexive ? (R L)) → - d_liftable2_sn … lifts R → f_dedropable_sn R. +lemma rex_liftable_dedropable_sn (R): + (∀L. reflexive ? (R L)) → + d_liftable2_sn … lifts R → f_dedropable_sn R. #R #H1R #H2R #b #f #L1 #K1 #HLK1 #K2 #T * #f1 #Hf1 #HK12 #U #HTU elim (frees_total L1 U) #f2 #Hf2 lapply (frees_fwd_coafter … Hf2 … HLK1 … HTU … Hf1) -HTU #Hf @@ -50,7 +51,8 @@ elim (sex_liftable_co_dedropable_sn … HLK1 … HK12 … Hf) -f1 -K1 /3 width=6 by cext2_d_liftable2_sn, cfull_lift_sn, ext2_refl, ex3_intro, ex2_intro/ qed-. -lemma rex_trans_next: ∀R1,R2,R3. rex_transitive R1 R2 R3 → f_transitive_next R1 R2 R3. +lemma rex_trans_next (R1) (R2) (R3): + rex_transitive R1 R2 R3 → f_transitive_next R1 R2 R3. #R1 #R2 #R3 #HR #f #L1 #T #Hf #g #I1 #K1 #n #HLK #Hgf #I #H generalize in match HLK; -HLK elim H -I1 -I [ #I #_ #L2 #_ #I2 #H @@ -67,7 +69,7 @@ qed. (* Basic_2A1: uses: llpx_sn_inv_lift_le llpx_sn_inv_lift_be llpx_sn_inv_lift_ge *) (* Basic_2A1: was: llpx_sn_drop_conf_O *) -lemma rex_dropable_sn: ∀R. f_dropable_sn R. +lemma rex_dropable_sn (R): f_dropable_sn R. #R #b #f #L1 #K1 #HLK1 #H1f #L2 #U * #f2 #Hf2 #HL12 #T #HTU elim (frees_total K1 T) #f1 #Hf1 lapply (frees_fwd_coafter … Hf2 … HLK1 … HTU … Hf1) -HTU #H2f @@ -77,7 +79,7 @@ qed-. (* Basic_2A1: was: llpx_sn_drop_trans_O *) (* Note: the proof might be simplified *) -lemma rex_dropable_dx: ∀R. f_dropable_dx R. +lemma rex_dropable_dx (R): f_dropable_dx R. #R #L1 #L2 #U * #f2 #Hf2 #HL12 #b #f #K2 #HLK2 #H1f #T #HTU elim (drops_isuni_ex … H1f L1) #K1 #HLK1 elim (frees_total K1 T) #f1 #Hf1 @@ -87,48 +89,53 @@ elim (sex_co_dropable_dx … HL12 … HLK2 … H2f) -L2 qed-. (* Basic_2A1: uses: llpx_sn_inv_lift_O *) -lemma rex_inv_lifts_bi: ∀R,L1,L2,U. L1 ⪤[R,U] L2 → ∀b,f. 𝐔⦃f⦄ → - ∀K1,K2. ⬇*[b,f] L1 ≘ K1 → ⬇*[b,f] L2 ≘ K2 → - ∀T. ⬆*[f] T ≘ U → K1 ⪤[R,T] K2. +lemma rex_inv_lifts_bi (R): + ∀L1,L2,U. L1 ⪤[R,U] L2 → ∀b,f. 𝐔⦃f⦄ → + ∀K1,K2. ⬇*[b,f] L1 ≘ K1 → ⬇*[b,f] L2 ≘ K2 → + ∀T. ⬆*[f] T ≘ U → K1 ⪤[R,T] K2. #R #L1 #L2 #U #HL12 #b #f #Hf #K1 #K2 #HLK1 #HLK2 #T #HTU elim (rex_dropable_sn … HLK1 … HL12 … HTU) -L1 -U // #Y #HK12 #HY lapply (drops_mono … HY … HLK2) -b -f -L2 #H destruct // qed-. -lemma rex_inv_lref_pair_sn: ∀R,L1,L2,i. L1 ⪤[R,#i] L2 → ∀I,K1,V1. ⬇*[i] L1 ≘ K1.ⓑ{I}V1 → - ∃∃K2,V2. ⬇*[i] L2 ≘ K2.ⓑ{I}V2 & K1 ⪤[R,V1] K2 & R K1 V1 V2. +lemma rex_inv_lref_pair_sn (R): + ∀L1,L2,i. L1 ⪤[R,#i] L2 → ∀I,K1,V1. ⬇*[i] L1 ≘ K1.ⓑ{I}V1 → + ∃∃K2,V2. ⬇*[i] L2 ≘ K2.ⓑ{I}V2 & K1 ⪤[R,V1] K2 & R K1 V1 V2. #R #L1 #L2 #i #HL12 #I #K1 #V1 #HLK1 elim (rex_dropable_sn … HLK1 … HL12 (#0)) -HLK1 -HL12 // #Y #HY #HLK2 elim (rex_inv_zero_pair_sn … HY) -HY #K2 #V2 #HK12 #HV12 #H destruct /2 width=5 by ex3_2_intro/ qed-. -lemma rex_inv_lref_pair_dx: ∀R,L1,L2,i. L1 ⪤[R,#i] L2 → ∀I,K2,V2. ⬇*[i] L2 ≘ K2.ⓑ{I}V2 → - ∃∃K1,V1. ⬇*[i] L1 ≘ K1.ⓑ{I}V1 & K1 ⪤[R,V1] K2 & R K1 V1 V2. +lemma rex_inv_lref_pair_dx (R): + ∀L1,L2,i. L1 ⪤[R,#i] L2 → ∀I,K2,V2. ⬇*[i] L2 ≘ K2.ⓑ{I}V2 → + ∃∃K1,V1. ⬇*[i] L1 ≘ K1.ⓑ{I}V1 & K1 ⪤[R,V1] K2 & R K1 V1 V2. #R #L1 #L2 #i #HL12 #I #K2 #V2 #HLK2 elim (rex_dropable_dx … HL12 … HLK2 … (#0)) -HLK2 -HL12 // #Y #HLK1 #HY elim (rex_inv_zero_pair_dx … HY) -HY #K1 #V1 #HK12 #HV12 #H destruct /2 width=5 by ex3_2_intro/ qed-. lemma rex_inv_lref_pair_bi (R) (L1) (L2) (i): - L1 ⪤[R,#i] L2 → - ∀I1,K1,V1. ⬇*[i] L1 ≘ K1.ⓑ{I1}V1 → - ∀I2,K2,V2. ⬇*[i] L2 ≘ K2.ⓑ{I2}V2 → - ∧∧ K1 ⪤[R,V1] K2 & R K1 V1 V2 & I1 = I2. + L1 ⪤[R,#i] L2 → + ∀I1,K1,V1. ⬇*[i] L1 ≘ K1.ⓑ{I1}V1 → + ∀I2,K2,V2. ⬇*[i] L2 ≘ K2.ⓑ{I2}V2 → + ∧∧ K1 ⪤[R,V1] K2 & R K1 V1 V2 & I1 = I2. #R #L1 #L2 #i #H12 #I1 #K1 #V1 #H1 #I2 #K2 #V2 #H2 elim (rex_inv_lref_pair_sn … H12 … H1) -L1 #Y2 #X2 #HLY2 #HK12 #HV12 lapply (drops_mono … HLY2 … H2) -HLY2 -H2 #H destruct /2 width=1 by and3_intro/ qed-. -lemma rex_inv_lref_unit_sn: ∀R,L1,L2,i. L1 ⪤[R,#i] L2 → ∀I,K1. ⬇*[i] L1 ≘ K1.ⓤ{I} → - ∃∃f,K2. ⬇*[i] L2 ≘ K2.ⓤ{I} & K1 ⪤[cext2 R,cfull,f] K2 & 𝐈⦃f⦄. +lemma rex_inv_lref_unit_sn (R): + ∀L1,L2,i. L1 ⪤[R,#i] L2 → ∀I,K1. ⬇*[i] L1 ≘ K1.ⓤ{I} → + ∃∃f,K2. ⬇*[i] L2 ≘ K2.ⓤ{I} & K1 ⪤[cext2 R,cfull,f] K2 & 𝐈⦃f⦄. #R #L1 #L2 #i #HL12 #I #K1 #HLK1 elim (rex_dropable_sn … HLK1 … HL12 (#0)) -HLK1 -HL12 // #Y #HY #HLK2 elim (rex_inv_zero_unit_sn … HY) -HY #f #K2 #Hf #HK12 #H destruct /2 width=5 by ex3_2_intro/ qed-. -lemma rex_inv_lref_unit_dx: ∀R,L1,L2,i. L1 ⪤[R,#i] L2 → ∀I,K2. ⬇*[i] L2 ≘ K2.ⓤ{I} → - ∃∃f,K1. ⬇*[i] L1 ≘ K1.ⓤ{I} & K1 ⪤[cext2 R,cfull,f] K2 & 𝐈⦃f⦄. +lemma rex_inv_lref_unit_dx (R): + ∀L1,L2,i. L1 ⪤[R,#i] L2 → ∀I,K2. ⬇*[i] L2 ≘ K2.ⓤ{I} → + ∃∃f,K1. ⬇*[i] L1 ≘ K1.ⓤ{I} & K1 ⪤[cext2 R,cfull,f] K2 & 𝐈⦃f⦄. #R #L1 #L2 #i #HL12 #I #K2 #HLK2 elim (rex_dropable_dx … HL12 … HLK2 … (#0)) -HLK2 -HL12 // #Y #HLK1 #HY elim (rex_inv_zero_unit_dx … HY) -HY #f #K2 #Hf #HK12 #H destruct /2 width=5 by ex3_2_intro/ diff --git a/matita/matita/contribs/lambdadelta/static_2/static/rex_fqup.ma b/matita/matita/contribs/lambdadelta/static_2/static/rex_fqup.ma index 5c7e82b33..601e8b28d 100644 --- a/matita/matita/contribs/lambdadelta/static_2/static/rex_fqup.ma +++ b/matita/matita/contribs/lambdadelta/static_2/static/rex_fqup.ma @@ -20,13 +20,14 @@ include "static_2/static/rex.ma". (* Advanced properties ******************************************************) (* Basic_2A1: uses: llpx_sn_refl *) -lemma rex_refl: ∀R. (∀L. reflexive … (R L)) → ∀L,T. L ⪤[R,T] L. +lemma rex_refl (R): (∀L. reflexive … (R L)) → ∀L,T. L ⪤[R,T] L. #R #HR #L #T elim (frees_total L T) /4 width=3 by sex_refl, ext2_refl, ex2_intro/ qed. -lemma rex_pair_refl: ∀R. (∀L. reflexive … (R L)) → - ∀L,V1,V2. R L V1 V2 → ∀I,T. L.ⓑ{I}V1 ⪤[R,T] L.ⓑ{I}V2. +lemma rex_pair_refl (R): + (∀L. reflexive … (R L)) → + ∀L,V1,V2. R L V1 V2 → ∀I,T. L.ⓑ{I}V1 ⪤[R,T] L.ⓑ{I}V2. #R #HR #L #V1 #V2 #HV12 #I #T elim (frees_total (L.ⓑ{I}V1) T) #f #Hf elim (pn_split f) * #g #H destruct @@ -35,15 +36,15 @@ qed. (* Advanced inversion lemmas ************************************************) -lemma rex_inv_bind_void: ∀R,p,I,L1,L2,V,T. L1 ⪤[R,ⓑ{p,I}V.T] L2 → - L1 ⪤[R,V] L2 ∧ L1.ⓧ ⪤[R,T] L2.ⓧ. +lemma rex_inv_bind_void (R): + ∀p,I,L1,L2,V,T. L1 ⪤[R,ⓑ{p,I}V.T] L2 → L1 ⪤[R,V] L2 ∧ L1.ⓧ ⪤[R,T] L2.ⓧ. #R #p #I #L1 #L2 #V #T * #f #Hf #HL elim (frees_inv_bind_void … Hf) -Hf /6 width=6 by sle_sex_trans, sex_inv_tl, sor_inv_sle_dx, sor_inv_sle_sn, ex2_intro, conj/ qed-. (* Advanced forward lemmas **************************************************) -lemma rex_fwd_bind_dx_void: ∀R,p,I,L1,L2,V,T. L1 ⪤[R,ⓑ{p,I}V.T] L2 → - L1.ⓧ ⪤[R,T] L2.ⓧ. +lemma rex_fwd_bind_dx_void (R): + ∀p,I,L1,L2,V,T. L1 ⪤[R,ⓑ{p,I}V.T] L2 → L1.ⓧ ⪤[R,T] L2.ⓧ. #R #p #I #L1 #L2 #V #T #H elim (rex_inv_bind_void … H) -H // qed-. diff --git a/matita/matita/contribs/lambdadelta/static_2/static/rex_fsle.ma b/matita/matita/contribs/lambdadelta/static_2/static/rex_fsle.ma index 1a2829da3..7974bb900 100644 --- a/matita/matita/contribs/lambdadelta/static_2/static/rex_fsle.ma +++ b/matita/matita/contribs/lambdadelta/static_2/static/rex_fsle.ma @@ -30,10 +30,11 @@ definition rex_fsle_compatible: predicate (relation3 …) ≝ λRN. (* Basic inversions with free variables inclusion for restricted closures ***) -lemma frees_sex_conf: ∀R. rex_fsge_compatible R → - ∀L1,T,f1. L1 ⊢ 𝐅*⦃T⦄ ≘ f1 → - ∀L2. L1 ⪤[cext2 R,cfull,f1] L2 → - ∃∃f2. L2 ⊢ 𝐅*⦃T⦄ ≘ f2 & f2 ⊆ f1. +lemma frees_sex_conf (R): + rex_fsge_compatible R → + ∀L1,T,f1. L1 ⊢ 𝐅+⦃T⦄ ≘ f1 → + ∀L2. L1 ⪤[cext2 R,cfull,f1] L2 → + ∃∃f2. L2 ⊢ 𝐅+⦃T⦄ ≘ f2 & f2 ⊆ f1. #R #HR #L1 #T #f1 #Hf1 #L2 #H1L lapply (HR L1 L2 T ?) /2 width=3 by ex2_intro/ #H2L @(fsle_frees_trans_eq … H2L … Hf1) /3 width=4 by sex_fwd_length, sym_eq/ @@ -42,26 +43,29 @@ qed-. (* Properties with free variables inclusion for restricted closures *********) (* Note: we just need lveq_inv_refl: ∀L, n1, n2. L ≋ⓧ*[n1, n2] L → ∧∧ 0 = n1 & 0 = n2 *) -lemma fsge_rex_trans: ∀R,L1,T1,T2. ⦃L1,T1⦄ ⊆ ⦃L1,T2⦄ → - ∀L2. L1 ⪤[R,T2] L2 → L1 ⪤[R,T1] L2. +lemma fsge_rex_trans (R): + ∀L1,T1,T2. ⦃L1,T1⦄ ⊆ ⦃L1,T2⦄ → + ∀L2. L1 ⪤[R,T2] L2 → L1 ⪤[R,T1] L2. #R #L1 #T1 #T2 * #n1 #n2 #f1 #f2 #Hf1 #Hf2 #Hn #Hf #L2 #HL12 elim (lveq_inj_length … Hn ?) // #H1 #H2 destruct /4 width=5 by rex_inv_frees, sle_sex_trans, ex2_intro/ qed-. -lemma rex_sym: ∀R. rex_fsge_compatible R → - (∀L1,L2,T1,T2. R L1 T1 T2 → R L2 T2 T1) → - ∀T. symmetric … (rex R T). +lemma rex_sym (R): + rex_fsge_compatible R → + (∀L1,L2,T1,T2. R L1 T1 T2 → R L2 T2 T1) → + ∀T. symmetric … (rex R T). #R #H1R #H2R #T #L1 #L2 * #f1 #Hf1 #HL12 elim (frees_sex_conf … Hf1 … HL12) -Hf1 // /5 width=5 by sle_sex_trans, sex_sym, cext2_sym, ex2_intro/ qed-. -lemma rex_pair_sn_split: ∀R1,R2. (∀L. reflexive … (R1 L)) → (∀L. reflexive … (R2 L)) → - rex_fsge_compatible R1 → - ∀L1,L2,V. L1 ⪤[R1,V] L2 → ∀I,T. - ∃∃L. L1 ⪤[R1,②{I}V.T] L & L ⪤[R2,V] L2. +lemma rex_pair_sn_split (R1) (R2): + (∀L. reflexive … (R1 L)) → (∀L. reflexive … (R2 L)) → + rex_fsge_compatible R1 → + ∀L1,L2,V. L1 ⪤[R1,V] L2 → ∀I,T. + ∃∃L. L1 ⪤[R1,②{I}V.T] L & L ⪤[R2,V] L2. #R1 #R2 #HR1 #HR2 #HR #L1 #L2 #V * #f #Hf #HL12 * [ #p ] #I #T [ elim (frees_total L1 (ⓑ{p,I}V.T)) #g #Hg elim (frees_inv_bind … Hg) #y1 #y2 #H #_ #Hy @@ -77,10 +81,11 @@ elim (frees_sex_conf … Hf … H) -Hf -H /4 width=7 by sle_sex_trans, ex2_intro/ qed-. -lemma rex_flat_dx_split: ∀R1,R2. (∀L. reflexive … (R1 L)) → (∀L. reflexive … (R2 L)) → - rex_fsge_compatible R1 → - ∀L1,L2,T. L1 ⪤[R1,T] L2 → ∀I,V. - ∃∃L. L1 ⪤[R1,ⓕ{I}V.T] L & L ⪤[R2,T] L2. +lemma rex_flat_dx_split (R1) (R2): + (∀L. reflexive … (R1 L)) → (∀L. reflexive … (R2 L)) → + rex_fsge_compatible R1 → + ∀L1,L2,T. L1 ⪤[R1,T] L2 → ∀I,V. + ∃∃L. L1 ⪤[R1,ⓕ{I}V.T] L & L ⪤[R2,T] L2. #R1 #R2 #HR1 #HR2 #HR #L1 #L2 #T * #f #Hf #HL12 #I #V elim (frees_total L1 (ⓕ{I}V.T)) #g #Hg elim (frees_inv_flat … Hg) #y1 #y2 #_ #H #Hy @@ -93,10 +98,11 @@ elim (frees_sex_conf … Hf … H) -Hf -H /4 width=7 by sle_sex_trans, ex2_intro/ qed-. -lemma rex_bind_dx_split: ∀R1,R2. (∀L. reflexive … (R1 L)) → (∀L. reflexive … (R2 L)) → - rex_fsge_compatible R1 → - ∀I,L1,L2,V1,T. L1.ⓑ{I}V1 ⪤[R1,T] L2 → ∀p. - ∃∃L,V. L1 ⪤[R1,ⓑ{p,I}V1.T] L & L.ⓑ{I}V ⪤[R2,T] L2 & R1 L1 V1 V. +lemma rex_bind_dx_split (R1) (R2): + (∀L. reflexive … (R1 L)) → (∀L. reflexive … (R2 L)) → + rex_fsge_compatible R1 → + ∀I,L1,L2,V1,T. L1.ⓑ{I}V1 ⪤[R1,T] L2 → ∀p. + ∃∃L,V. L1 ⪤[R1,ⓑ{p,I}V1.T] L & L.ⓑ{I}V ⪤[R2,T] L2 & R1 L1 V1 V. #R1 #R2 #HR1 #HR2 #HR #I #L1 #L2 #V1 #T * #f #Hf #HL12 #p elim (frees_total L1 (ⓑ{p,I}V1.T)) #g #Hg elim (frees_inv_bind … Hg) #y1 #y2 #_ #H #Hy @@ -113,10 +119,11 @@ elim (frees_sex_conf … Hf … H0) -Hf -H0 /4 width=7 by sle_sex_trans, ex3_2_intro, ex2_intro/ qed-. -lemma rex_bind_dx_split_void: ∀R1,R2. (∀L. reflexive … (R1 L)) → (∀L. reflexive … (R2 L)) → - rex_fsge_compatible R1 → - ∀L1,L2,T. L1.ⓧ ⪤[R1,T] L2 → ∀p,I,V. - ∃∃L. L1 ⪤[R1,ⓑ{p,I}V.T] L & L.ⓧ ⪤[R2,T] L2. +lemma rex_bind_dx_split_void (R1) (R2): + (∀L. reflexive … (R1 L)) → (∀L. reflexive … (R2 L)) → + rex_fsge_compatible R1 → + ∀L1,L2,T. L1.ⓧ ⪤[R1,T] L2 → ∀p,I,V. + ∃∃L. L1 ⪤[R1,ⓑ{p,I}V.T] L & L.ⓧ ⪤[R2,T] L2. #R1 #R2 #HR1 #HR2 #HR #L1 #L2 #T * #f #Hf #HL12 #p #I #V elim (frees_total L1 (ⓑ{p,I}V.T)) #g #Hg elim (frees_inv_bind_void … Hg) #y1 #y2 #_ #H #Hy @@ -135,11 +142,10 @@ qed-. (* Main properties with free variables inclusion for restricted closures ****) -theorem rex_conf: ∀R1,R2. - rex_fsge_compatible R1 → - rex_fsge_compatible R2 → - R_confluent2_rex R1 R2 R1 R2 → - ∀T. confluent2 … (rex R1 T) (rex R2 T). +theorem rex_conf (R1) (R2): + rex_fsge_compatible R1 → rex_fsge_compatible R2 → + R_confluent2_rex R1 R2 R1 R2 → + ∀T. confluent2 … (rex R1 T) (rex R2 T). #R1 #R2 #HR1 #HR2 #HR12 #T #L0 #L1 * #f1 #Hf1 #HL01 #L2 * #f #Hf #HL02 lapply (frees_mono … Hf1 … Hf) -Hf1 #Hf12 lapply (sex_eq_repl_back … HL01 … Hf12) -f1 #HL01 @@ -164,10 +170,9 @@ elim (sex_conf … HL01 … HL02) /2 width=3 by ex2_intro/ [ | -HL01 -HL02 ] ] qed-. -theorem rex_trans_fsle: ∀R1,R2,R3. - rex_fsle_compatible R1 → f_transitive_next R1 R2 R3 → - ∀L1,L,T. L1 ⪤[R1,T] L → - ∀L2. L ⪤[R2,T] L2 → L1 ⪤[R3,T] L2. +theorem rex_trans_fsle (R1) (R2) (R3): + rex_fsle_compatible R1 → f_transitive_next R1 R2 R3 → + ∀L1,L,T. L1 ⪤[R1,T] L → ∀L2. L ⪤[R2,T] L2 → L1 ⪤[R3,T] L2. #R1 #R2 #R3 #H1R #H2R #L1 #L #T #H lapply (H1R … H) -H1R #H0 cases H -H #f1 #Hf1 #HL1 #L2 * #f2 #Hf2 #HL2 diff --git a/matita/matita/contribs/lambdadelta/static_2/static/rex_length.ma b/matita/matita/contribs/lambdadelta/static_2/static/rex_length.ma index e91111142..0fa17450b 100644 --- a/matita/matita/contribs/lambdadelta/static_2/static/rex_length.ma +++ b/matita/matita/contribs/lambdadelta/static_2/static/rex_length.ma @@ -50,10 +50,11 @@ lemma rex_unit_length (R): ∀L1,L2. |L1| = |L2| → ∀I. L1.ⓤ{I} ⪤[R,#0] L /3 width=3 by rex_unit, sex_length_isid/ qed. (* Basic_2A1: uses: llpx_sn_lift_le llpx_sn_lift_ge *) -lemma rex_lifts_bi (R): d_liftable2_sn … lifts R → - ∀L1,L2. |L1| = |L2| → ∀K1,K2,T. K1 ⪤[R,T] K2 → - ∀b,f. ⬇*[b,f] L1 ≘ K1 → ⬇*[b,f] L2 ≘ K2 → - ∀U. ⬆*[f] T ≘ U → L1 ⪤[R,U] L2. +lemma rex_lifts_bi (R): + d_liftable2_sn … lifts R → + ∀L1,L2. |L1| = |L2| → ∀K1,K2,T. K1 ⪤[R,T] K2 → + ∀b,f. ⬇*[b,f] L1 ≘ K1 → ⬇*[b,f] L2 ≘ K2 → + ∀U. ⬆*[f] T ≘ U → L1 ⪤[R,U] L2. #R #HR #L1 #L2 #HL12 #K1 #K2 #T * #f1 #Hf1 #HK12 #b #f #HLK1 #HLK2 #U #HTU elim (frees_total L1 U) #f2 #Hf2 lapply (frees_fwd_coafter … Hf2 … HLK1 … HTU … Hf1) -HTU #Hf @@ -62,11 +63,12 @@ qed-. (* Inversion lemmas with length for local environment ***********************) -lemma rex_inv_zero_length (R): ∀Y1,Y2. Y1 ⪤[R,#0] Y2 → - ∨∨ ∧∧ Y1 = ⋆ & Y2 = ⋆ - | ∃∃I,L1,L2,V1,V2. L1 ⪤[R,V1] L2 & R L1 V1 V2 & - Y1 = L1.ⓑ{I}V1 & Y2 = L2.ⓑ{I}V2 - | ∃∃I,L1,L2. |L1| = |L2| & Y1 = L1.ⓤ{I} & Y2 = L2.ⓤ{I}. +lemma rex_inv_zero_length (R): + ∀Y1,Y2. Y1 ⪤[R,#0] Y2 → + ∨∨ ∧∧ Y1 = ⋆ & Y2 = ⋆ + | ∃∃I,L1,L2,V1,V2. L1 ⪤[R,V1] L2 & R L1 V1 V2 & + Y1 = L1.ⓑ{I}V1 & Y2 = L2.ⓑ{I}V2 + | ∃∃I,L1,L2. |L1| = |L2| & Y1 = L1.ⓤ{I} & Y2 = L2.ⓤ{I}. #R #Y1 #Y2 #H elim (rex_inv_zero … H) -H * /4 width=9 by sex_fwd_length, ex4_5_intro, ex3_3_intro, or3_intro2, or3_intro1, or3_intro0, conj/ qed-. diff --git a/matita/matita/contribs/lambdadelta/static_2/static/rex_lex.ma b/matita/matita/contribs/lambdadelta/static_2/static/rex_lex.ma index d031d93c4..dd074c1c4 100644 --- a/matita/matita/contribs/lambdadelta/static_2/static/rex_lex.ma +++ b/matita/matita/contribs/lambdadelta/static_2/static/rex_lex.ma @@ -20,7 +20,8 @@ include "static_2/static/req.ma". (* Properties with generic extension of a context-sensitive relation ********) -lemma rex_lex: ∀R,L1,L2. L1 ⪤[R] L2 → ∀T. L1 ⪤[R,T] L2. +lemma rex_lex (R): + ∀L1,L2. L1 ⪤[R] L2 → ∀T. L1 ⪤[R,T] L2. #R #L1 #L2 * #f #Hf #HL12 #T elim (frees_total L1 T) #g #Hg /4 width=5 by sex_sdj, sdj_isid_sn, ex2_intro/ @@ -28,10 +29,10 @@ qed. (* Inversion lemmas with generic extension of a context sensitive relation **) -lemma rex_inv_lex_req: ∀R. c_reflexive … R → - rex_fsge_compatible R → - ∀L1,L2,T. L1 ⪤[R,T] L2 → - ∃∃L. L1 ⪤[R] L & L ≡[T] L2. +lemma rex_inv_lex_req (R): + c_reflexive … R → rex_fsge_compatible R → + ∀L1,L2,T. L1 ⪤[R,T] L2 → + ∃∃L. L1 ⪤[R] L & L ≡[T] L2. #R #H1R #H2R #L1 #L2 #T * #f1 #Hf1 #HL elim (sex_sdj_split … ceq_ext … HL 𝐈𝐝 ?) -HL [ #L0 #HL10 #HL02 |*: /2 width=1 by ext2_refl, sdj_isid_dx/ ] -H1R diff --git a/matita/matita/contribs/lambdadelta/static_2/static/rex_rex.ma b/matita/matita/contribs/lambdadelta/static_2/static/rex_rex.ma index 7bbf5d895..10d2b9178 100644 --- a/matita/matita/contribs/lambdadelta/static_2/static/rex_rex.ma +++ b/matita/matita/contribs/lambdadelta/static_2/static/rex_rex.ma @@ -20,16 +20,18 @@ include "static_2/static/rex.ma". (* Advanced inversion lemmas ************************************************) -lemma rex_inv_frees: ∀R,L1,L2,T. L1 ⪤[R,T] L2 → - ∀f. L1 ⊢ 𝐅*⦃T⦄ ≘ f → L1 ⪤[cext2 R,cfull,f] L2. +lemma rex_inv_frees (R): + ∀L1,L2,T. L1 ⪤[R,T] L2 → + ∀f. L1 ⊢ 𝐅+⦃T⦄ ≘ f → L1 ⪤[cext2 R,cfull,f] L2. #R #L1 #L2 #T * /3 width=6 by frees_mono, sex_eq_repl_back/ qed-. (* Advanced properties ******************************************************) (* Basic_2A1: uses: llpx_sn_dec *) -lemma rex_dec: ∀R. (∀L,T1,T2. Decidable (R L T1 T2)) → - ∀L1,L2,T. Decidable (L1 ⪤[R,T] L2). +lemma rex_dec (R): + (∀L,T1,T2. Decidable (R L T1 T2)) → + ∀L1,L2,T. Decidable (L1 ⪤[R,T] L2). #R #HR #L1 #L2 #T elim (frees_total L1 T) #f #Hf elim (sex_dec (cext2 R) cfull … L1 L2 f) @@ -39,25 +41,23 @@ qed-. (* Main properties **********************************************************) (* Basic_2A1: uses: llpx_sn_bind llpx_sn_bind_O *) -theorem rex_bind: ∀R,p,I,L1,L2,V1,V2,T. - L1 ⪤[R,V1] L2 → L1.ⓑ{I}V1 ⪤[R,T] L2.ⓑ{I}V2 → - L1 ⪤[R,ⓑ{p,I}V1.T] L2. +theorem rex_bind (R) (p) (I): + ∀L1,L2,V1,V2,T. L1 ⪤[R,V1] L2 → L1.ⓑ{I}V1 ⪤[R,T] L2.ⓑ{I}V2 → + L1 ⪤[R,ⓑ{p,I}V1.T] L2. #R #p #I #L1 #L2 #V1 #V2 #T * #f1 #HV #Hf1 * #f2 #HT #Hf2 lapply (sex_fwd_bind … Hf2) -Hf2 #Hf2 elim (sor_isfin_ex f1 (⫱f2)) /3 width=7 by frees_fwd_isfin, frees_bind, sex_join, isfin_tl, ex2_intro/ qed. (* Basic_2A1: llpx_sn_flat *) -theorem rex_flat: ∀R,I,L1,L2,V,T. - L1 ⪤[R,V] L2 → L1 ⪤[R,T] L2 → - L1 ⪤[R,ⓕ{I}V.T] L2. +theorem rex_flat (R) (I): + ∀L1,L2,V,T. L1 ⪤[R,V] L2 → L1 ⪤[R,T] L2 → L1 ⪤[R,ⓕ{I}V.T] L2. #R #I #L1 #L2 #V #T * #f1 #HV #Hf1 * #f2 #HT #Hf2 elim (sor_isfin_ex f1 f2) /3 width=7 by frees_fwd_isfin, frees_flat, sex_join, ex2_intro/ qed. -theorem rex_bind_void: ∀R,p,I,L1,L2,V,T. - L1 ⪤[R,V] L2 → L1.ⓧ ⪤[R,T] L2.ⓧ → - L1 ⪤[R,ⓑ{p,I}V.T] L2. +theorem rex_bind_void (R) (p) (I): + ∀L1,L2,V,T. L1 ⪤[R,V] L2 → L1.ⓧ ⪤[R,T] L2.ⓧ → L1 ⪤[R,ⓑ{p,I}V.T] L2. #R #p #I #L1 #L2 #V #T * #f1 #HV #Hf1 * #f2 #HT #Hf2 lapply (sex_fwd_bind … Hf2) -Hf2 #Hf2 elim (sor_isfin_ex f1 (⫱f2)) /3 width=7 by frees_fwd_isfin, frees_bind_void, sex_join, isfin_tl, ex2_intro/ @@ -66,24 +66,27 @@ qed. (* Negated inversion lemmas *************************************************) (* Basic_2A1: uses: nllpx_sn_inv_bind nllpx_sn_inv_bind_O *) -lemma rnex_inv_bind: ∀R. (∀L,T1,T2. Decidable (R L T1 T2)) → - ∀p,I,L1,L2,V,T. (L1 ⪤[R,ⓑ{p,I}V.T] L2 → ⊥) → - (L1 ⪤[R,V] L2 → ⊥) ∨ (L1.ⓑ{I}V ⪤[R,T] L2.ⓑ{I}V → ⊥). +lemma rnex_inv_bind (R): + (∀L,T1,T2. Decidable (R L T1 T2)) → + ∀p,I,L1,L2,V,T. (L1 ⪤[R,ⓑ{p,I}V.T] L2 → ⊥) → + ∨∨ (L1 ⪤[R,V] L2 → ⊥) | (L1.ⓑ{I}V ⪤[R,T] L2.ⓑ{I}V → ⊥). #R #HR #p #I #L1 #L2 #V #T #H elim (rex_dec … HR L1 L2 V) /4 width=2 by rex_bind, or_intror, or_introl/ qed-. (* Basic_2A1: uses: nllpx_sn_inv_flat *) -lemma rnex_inv_flat: ∀R. (∀L,T1,T2. Decidable (R L T1 T2)) → - ∀I,L1,L2,V,T. (L1 ⪤[R,ⓕ{I}V.T] L2 → ⊥) → - (L1 ⪤[R,V] L2 → ⊥) ∨ (L1 ⪤[R,T] L2 → ⊥). +lemma rnex_inv_flat (R): + (∀L,T1,T2. Decidable (R L T1 T2)) → + ∀I,L1,L2,V,T. (L1 ⪤[R,ⓕ{I}V.T] L2 → ⊥) → + ∨∨ (L1 ⪤[R,V] L2 → ⊥) | (L1 ⪤[R,T] L2 → ⊥). #R #HR #I #L1 #L2 #V #T #H elim (rex_dec … HR L1 L2 V) /4 width=1 by rex_flat, or_intror, or_introl/ qed-. -lemma rnex_inv_bind_void: ∀R. (∀L,T1,T2. Decidable (R L T1 T2)) → - ∀p,I,L1,L2,V,T. (L1 ⪤[R,ⓑ{p,I}V.T] L2 → ⊥) → - (L1 ⪤[R,V] L2 → ⊥) ∨ (L1.ⓧ ⪤[R,T] L2.ⓧ → ⊥). +lemma rnex_inv_bind_void (R): + (∀L,T1,T2. Decidable (R L T1 T2)) → + ∀p,I,L1,L2,V,T. (L1 ⪤[R,ⓑ{p,I}V.T] L2 → ⊥) → + ∨∨ (L1 ⪤[R,V] L2 → ⊥) | (L1.ⓧ ⪤[R,T] L2.ⓧ → ⊥). #R #HR #p #I #L1 #L2 #V #T #H elim (rex_dec … HR L1 L2 V) /4 width=2 by rex_bind_void, or_intror, or_introl/ 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 2df44f0d2..3793e6896 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 @@ -45,8 +45,8 @@ table { ] [ { "context-sensitive free variables" * } { [ [ "inclusion for restricted closures" ] "fsle" + "( ⦃?,?⦄ ⊆ ⦃?,?⦄ )" "fsle_length" + "fsle_drops" + "fsle_fqup" + "fsle_fsle" * ] - [ [ "restricted refinement for lenvs" ] "lsubf" + "( ⦃?,?⦄ ⫃𝐅* ⦃?,?⦄ )" "lsubf_lsubr" + "lsubf_frees" + "lsubf_lsubf" * ] - [ [ "for terms" ] "frees" + "( ? ⊢ 𝐅*⦃?⦄ ≘ ? )" "frees_append" + "frees_drops" + "frees_fqup" + "frees_frees" * ] + [ [ "restricted refinement for lenvs" ] "lsubf" + "( ⦃?,?⦄ ⫃𝐅+ ⦃?,?⦄ )" "lsubf_lsubr" + "lsubf_frees" + "lsubf_lsubf" * ] + [ [ "for terms" ] "frees" + "( ? ⊢ 𝐅+⦃?⦄ ≘ ? )" "frees_append" + "frees_drops" + "frees_fqup" + "frees_frees" * ] } ] [ { "local environments" * } { @@ -58,8 +58,8 @@ table { class "grass" [ { "s-computation" * } { [ { "iterated structural successor" * } { - [ [ "for closures" ] "fqus" + "( ⦃?,?,?⦄ ⊐*[?] ⦃?,?,?⦄ )" + "( ⦃?,?,?⦄ ⊐* ⦃?,?,?⦄ )" "fqus_weight" + "fqus_drops" + "fqus_fqup" + "fqus_fqus" * ] - [ [ "proper for closures" ] "fqup" + "( ⦃?,?,?⦄ ⊐+[?] ⦃?,?,?⦄ )" + "( ⦃?,?,?⦄ ⊐+ ⦃?,?,?⦄ )" "fqup_weight" + "fqup_drops" + "fqup_fqup" * ] + [ [ "for closures" ] "fqus" + "( ⦃?,?,?⦄ ⬂*[?] ⦃?,?,?⦄ )" + "( ⦃?,?,?⦄ ⬂* ⦃?,?,?⦄ )" "fqus_weight" + "fqus_drops" + "fqus_fqup" + "fqus_fqus" * ] + [ [ "proper for closures" ] "fqup" + "( ⦃?,?,?⦄ ⬂+[?] ⦃?,?,?⦄ )" + "( ⦃?,?,?⦄ ⬂+ ⦃?,?,?⦄ )" "fqup_weight" + "fqup_drops" + "fqup_fqup" * ] } ] } @@ -67,8 +67,8 @@ table { class "yellow" [ { "s-transition" * } { [ { "structural successor" * } { - [ [ "for closures" ] "fquq" + "( ⦃?,?,?⦄ ⊐⸮[?] ⦃?,?,?⦄ )" + "( ⦃?,?,?⦄ ⊐⸮ ⦃?,?,?⦄ )" "fquq_length" + "fquq_weight" * ] - [ [ "proper for closures" ] "fqu" + "( ⦃?,?,?⦄ ⊐[?] ⦃?,?,?⦄ )" + "( ⦃?,?,?⦄ ⊐ ⦃?,?,?⦄ )" "fqu_length" + "fqu_weight" + "fqu_tdeq" * ] + [ [ "for closures" ] "fquq" + "( ⦃?,?,?⦄ ⬂⸮[?] ⦃?,?,?⦄ )" + "( ⦃?,?,?⦄ ⬂⸮ ⦃?,?,?⦄ )" "fquq_length" + "fquq_weight" * ] + [ [ "proper for closures" ] "fqu" + "( ⦃?,?,?⦄ ⬂[?] ⦃?,?,?⦄ )" + "( ⦃?,?,?⦄ ⬂ ⦃?,?,?⦄ )" "fqu_length" + "fqu_weight" + "fqu_tdeq" * ] } ] } diff --git a/matita/matita/predefined_virtuals.ml b/matita/matita/predefined_virtuals.ml index ead63683a..fccf04870 100644 --- a/matita/matita/predefined_virtuals.ml +++ b/matita/matita/predefined_virtuals.ml @@ -1514,10 +1514,10 @@ let predefined_classes = [ ["-"; "÷"; "⊢"; "⊩"; "⧟"; "⊟"; ]; ["="; "≝"; "≡"; "≘"; "≗"; "≐"; "≑"; "≛"; "≚"; "≙"; "⌆"; "⧦"; "⊜"; "≋"; "⩳"; "≅"; "⩬"; "≂"; "≃"; "≈"; ]; ["→"; "⥲"; "↦"; "⇝"; "⤞"; "⇾"; "⤍"; "⤏"; "⤳"; ] ; - ["⇒"; "⤇"; "➾"; "⇨"; "➡"; "⬈"; "➤"; "➸"; "⇉"; "⥰"; ] ; + ["⇒"; "⤇"; "➾"; "⇨"; "⬀"; "➡"; "⬈"; "➤"; "➸"; "⇉"; "⥰"; ] ; ["^"; "↑"; "⇡"; ] ; ["⇑"; "⇧"; "⬆"; ] ; - ["⇓"; "⇩"; "⬇"; "⬊"; "➷"; ] ; + ["⇓"; "⇩"; "⬂"; "⬇"; "⬊"; "➷"; ] ; ["⇕"; "⇳"; "⬍"; "↕"; ]; ["↔"; "⇔"; "⬄"; "⬌"; ] ; ["≤"; "≲"; "≼"; "≰"; "≴"; "⋠"; "⊆"; "⫃"; "⊑"; ] ; -- 2.39.2