]> matita.cs.unibo.it Git - helm.git/blobdiff - matita/matita/contribs/lambdadelta/delayed_updating/syntax/bdd_term.ma
update in ground and delayed updating
[helm.git] / matita / matita / contribs / lambdadelta / delayed_updating / syntax / bdd_term.ma
index 5052f4cc9776ac2013be96b7bef2322af98cdfbb..d9f371823579474ec24bba792624aceb4388e81c 100644 (file)
@@ -17,47 +17,57 @@ include "ground/xoa/ex_3_1.ma".
 include "ground/xoa/ex_4_2.ma".
 include "ground/xoa/ex_4_3.ma".
 include "ground/xoa/ex_5_3.ma".
-include "delayed_updating/syntax/term_constructors.ma".
-include "delayed_updating/notation/relations/in_predicate_d_phi_1.ma".
+include "delayed_updating/syntax/preterm_equivalence.ma".
+include "delayed_updating/syntax/preterm_constructors.ma".
+include "delayed_updating/notation/functions/class_d_phi_0.ma".
 
 (* BY-DEPTH DELAYED (BDD) TERM **********************************************)
 
-inductive bdd: predicate term β‰
-| bdd_oref: βˆ€n. bdd #n
-| bdd_iref: βˆ€t,n. bdd t β†’ bdd π›—n.t
-| bdd_abst: βˆ€t. bdd t β†’ bdd π›Œ.t
-| bdd_appl: βˆ€u,t. bdd u β†’ bdd t β†’ bdd @u.t
+inductive bdd: π’«β¨preterm❩ β‰
+| bdd_oref: βˆ€n. bdd (#n)
+| bdd_iref: βˆ€t,n. bdd t β†’ bdd (𝛗n.t)
+| bdd_abst: βˆ€t. bdd t β†’ bdd (π›Œ.t)
+| bdd_appl: βˆ€u,t. bdd u β†’ bdd t β†’ bdd (@u.t)
+| bdd_conv: βˆ€t1,t2. t1 β‡” t2 β†’ bdd t1 β†’ bdd t2
 .
 
 interpretation
-  "well-formed by-depth delayed (term)"
-  'InPredicateDPhi t = (bdd t).
-
-(* Basic destructions *******************************************************)
-
-lemma bdd_inv_in_com_gen:
-      βˆ€t,p. t Ο΅ πƒπ›— β†’ p Ο΅β¬¦ t β†’
-      βˆ¨βˆ¨ βˆƒβˆƒn. #n = t & π—±β¨n❩;𝐞 = p
-       | βˆƒβˆƒu,q,n. u Ο΅ πƒπ›— & q Ο΅β¬¦ u & π›—n.u = t & π—±β¨n❩;q = p
-       | βˆƒβˆƒu,q. u Ο΅ πƒπ›— & q Ο΅β¬¦ u & π›Œ.u = t & π—Ÿ;q = p
-       | βˆƒβˆƒv,u,q. v Ο΅ πƒπ›— & u Ο΅ πƒπ›— & q Ο΅β¬¦ u & @v.u = t & π—”;q = p
-       | βˆƒβˆƒv,u,q. v Ο΅ πƒπ›— & u Ο΅ πƒπ›— & q Ο΅β¬¦ v & @v.u = t & π—¦;q = p
+  "by-depth delayed (preterm)"
+  'ClassDPhi = (bdd).
+
+(* Basic inversions *********************************************************)
+
+lemma bdd_inv_in_comp_gen:
+      βˆ€t,p. t Ο΅ πƒπ›— β†’ p Ο΅ t β†’
+      βˆ¨βˆ¨ βˆƒβˆƒn. #n β‡” t & π—±β¨nβ©β——πž = p
+       | βˆƒβˆƒu,q,n. u Ο΅ πƒπ›— & q Ο΅ u & π›—n.u β‡” t & π—±β¨n❩◗q = p
+       | βˆƒβˆƒu,q. u Ο΅ πƒπ›— & q Ο΅ u & π›Œ.u β‡” t & π—Ÿβ——q = p
+       | βˆƒβˆƒv,u,q. v Ο΅ πƒπ›— & u Ο΅ πƒπ›— & q Ο΅ u & @v.u β‡” t & π—”β——q = p
+       | βˆƒβˆƒv,u,q. v Ο΅ πƒπ›— & u Ο΅ πƒπ›— & q Ο΅ v & @v.u β‡” t & π—¦β——q = p
 .
-#t #p *
+#t #p #H elim H -H
 [ #n * /3 width=3 by or5_intro0, ex2_intro/
-| #u #n #Hu * #q #Hq #Hp /3 width=7 by ex4_3_intro, or5_intro1/
-| #u #Hu * #q #Hq #Hp /3 width=6 by or5_intro2, ex4_2_intro/
-| #v #u #Hv #Hu * * #q #Hq #Hp /3 width=8 by ex5_3_intro, or5_intro3, or5_intro4/
+| #u #n #Hu #_ * #q #Hq #Hp /3 width=7 by ex4_3_intro, or5_intro1/
+| #u #Hu #_ * #q #Hq #Hp /3 width=6 by or5_intro2, ex4_2_intro/
+| #v #u #Hv #Hu #_ #_ * * #q #Hq #Hp /3 width=8 by ex5_3_intro, or5_intro3, or5_intro4/
+| #t1 #t2 #Ht12 #_ #IH #Ht2
+  elim IH -IH [6: /2 width=3 by subset_in_eq_repl_fwd/ ] *
+  [ /4 width=3 by subset_eq_trans, or5_intro0, ex2_intro/
+  | /4 width=7 by subset_eq_trans, ex4_3_intro, or5_intro1/
+  | /4 width=6 by subset_eq_trans, or5_intro2, ex4_2_intro/
+  | /4 width=8 by subset_eq_trans, ex5_3_intro, or5_intro3/
+  | /4 width=8 by subset_eq_trans, ex5_3_intro, or5_intro4/
+  ]
 ]
 qed-.
 
-lemma bdd_inv_in_com_d:
-      βˆ€t,q,n. t Ο΅ πƒπ›— β†’ π—±β¨n❩;q Ο΅β¬¦ t β†’
-      βˆ¨βˆ¨ βˆ§βˆ§ #n = t & πž = q
-       | βˆƒβˆƒu. u Ο΅ πƒπ›— & q Ο΅β¬¦ u & π›—n.u = t
+lemma bdd_inv_in_comp_d:
+      βˆ€t,q,n. t Ο΅ πƒπ›— β†’ π—±β¨n❩◗q Ο΅ t β†’
+      βˆ¨βˆ¨ βˆ§βˆ§ #n β‡” t & πž = q
+       | βˆƒβˆƒu. u Ο΅ πƒπ›— & q Ο΅ u & π›—n.u β‡” t
 .
 #t #q #n #Ht #Hq
-elim (bdd_inv_in_com_gen β€¦ Ht Hq) -Ht -Hq *
+elim (bdd_inv_in_comp_gen β€¦ Ht Hq) -Ht -Hq *
 [ #n0 #H1 #H2 destruct /3 width=1 by or_introl, conj/
 | #u0 #q0 #n0 #Hu0 #Hq0 #H1 #H2 destruct /3 width=4 by ex3_intro, or_intror/
 | #u0 #q0 #_ #_ #_ #H0 destruct
@@ -66,40 +76,137 @@ elim (bdd_inv_in_com_gen β€¦ Ht Hq) -Ht -Hq *
 ]
 qed-.
 
-lemma bdd_inv_in_ini_d:
-      βˆ€t,q,n. t Ο΅ πƒπ›— β†’ π—±β¨n❩;q Ο΅β–΅ t β†’
-      βˆ¨βˆ¨ βˆ§βˆ§ #n = t & πž = q
-       | βˆƒβˆƒu. u Ο΅ πƒπ›— & q Ο΅β–΅ u & π›—n.u = t
+lemma bdd_inv_in_root_d:
+      βˆ€t,q,n. t Ο΅ πƒπ›— β†’ π—±β¨n❩◗q Ο΅ β–΅t β†’
+      βˆ¨βˆ¨ βˆ§βˆ§ #n β‡” t & πž = q
+       | βˆƒβˆƒu. u Ο΅ πƒπ›— & q Ο΅ β–΅u & π›—n.u β‡” t
 .
 #t #q #n #Ht * #r #Hq
-elim (bdd_inv_in_com_d β€¦ Ht Hq) -Ht -Hq *
+elim (bdd_inv_in_comp_d β€¦ Ht Hq) -Ht -Hq *
 [ #H1 #H2
   elim (eq_inv_list_empty_append β€¦ H2) -H2 #H2 #_ destruct
   /3 width=1 by or_introl, conj/
-| #u #Hu #Hq #H1 destruct
+| #u #Hu #Hq #H0 destruct
   /4 width=4 by ex3_intro, ex_intro, or_intror/
 ]
 qed-.
 
-lemma pippo:
-      βˆ€l,n,p,t. t Ο΅ πƒπ›— β†’ p,𝗱❨n❩ Ο΅β–΅ t β†’ p,l Ο΅β–΅ t β†’ π—±β¨n❩ = l.
+lemma bdd_inv_in_comp_L:
+      βˆ€t,q. t Ο΅ πƒπ›— β†’ π—Ÿβ——q Ο΅ t β†’
+      βˆƒβˆƒu. u Ο΅ πƒπ›— & q Ο΅ u & π›Œ.u β‡” t
+.
+#t #q #Ht #Hq
+elim (bdd_inv_in_comp_gen β€¦ Ht Hq) -Ht -Hq *
+[ #n0 #_ #H0 destruct
+| #u0 #q0 #n0 #_ #_ #_ #H0 destruct
+| #u0 #q0 #Hu0 #Hq0 #H1 #H2 destruct /2 width=4 by ex3_intro/
+| #v0 #u0 #q0 #_ #_ #_ #_ #H0 destruct
+| #v0 #u0 #q0 #_ #_ #_ #_ #H0 destruct
+]
+qed-.
+
+lemma bdd_inv_in_root_L:
+      βˆ€t,q. t Ο΅ πƒπ›— β†’ π—Ÿβ——q Ο΅ β–΅t β†’
+      βˆƒβˆƒu. u Ο΅ πƒπ›— & q Ο΅ β–΅u & π›Œ.u β‡” t.
+#t #q #Ht * #r #Hq
+elim (bdd_inv_in_comp_L β€¦ Ht Hq) -Ht -Hq
+#u #Hu #Hq #H0 destruct
+/3 width=4 by ex3_intro, ex_intro/
+qed-.
+
+lemma bdd_inv_in_comp_A:
+      βˆ€t,q. t Ο΅ πƒπ›— β†’ π—”β——q Ο΅ t β†’
+      βˆƒβˆƒv,u. v Ο΅ πƒπ›— & u Ο΅ πƒπ›— & q Ο΅ u & @v.u β‡” t
+.
+#t #q #Ht #Hq
+elim (bdd_inv_in_comp_gen β€¦ Ht Hq) -Ht -Hq *
+[ #n0 #_ #H0 destruct
+| #u0 #q0 #n0 #_ #_ #_ #H0 destruct
+| #u0 #q0 #_ #_ #_ #H0 destruct
+| #v0 #u0 #q0 #Hv0 #Hu0 #Hq0 #H1 #H2 destruct /2 width=6 by ex4_2_intro/
+| #v0 #u0 #q0 #_ #_ #_ #_ #H0 destruct
+]
+qed-.
+
+lemma bdd_inv_in_root_A:
+      βˆ€t,q. t Ο΅ πƒπ›— β†’ π—”β——q Ο΅ β–΅t β†’
+      βˆƒβˆƒv,u. v Ο΅ πƒπ›— & u Ο΅ πƒπ›— & q Ο΅ β–΅u & @v.u β‡” t
+.
+#t #q #Ht * #r #Hq
+elim (bdd_inv_in_comp_A β€¦ Ht Hq) -Ht -Hq
+#v #u #Hv #Hu #Hq #H0 destruct
+/3 width=6 by ex4_2_intro, ex_intro/
+qed-.
+
+lemma bdd_inv_in_comp_S:
+      βˆ€t,q. t Ο΅ πƒπ›— β†’ π—¦β——q Ο΅ t β†’
+      βˆƒβˆƒv,u. v Ο΅ πƒπ›— & u Ο΅ πƒπ›— & q Ο΅ v & @v.u β‡” t
+.
+#t #q #Ht #Hq
+elim (bdd_inv_in_comp_gen β€¦ Ht Hq) -Ht -Hq *
+[ #n0 #_ #H0 destruct
+| #u0 #q0 #n0 #_ #_ #_ #H0 destruct
+| #u0 #q0 #_ #_ #_ #H0 destruct
+| #v0 #u0 #q0 #_ #_ #_ #_ #H0 destruct
+| #v0 #u0 #q0 #Hv0 #Hu0 #Hq0 #H1 #H2 destruct /2 width=6 by ex4_2_intro/
+]
+qed-.
+
+lemma bdd_inv_in_root_S:
+      βˆ€t,q. t Ο΅ πƒπ›— β†’ π—¦β——q Ο΅ β–΅t β†’
+      βˆƒβˆƒv,u. v Ο΅ πƒπ›— & u Ο΅ πƒπ›— & q Ο΅ β–΅v & @v.u β‡” t
+.
+#t #q #Ht * #r #Hq
+elim (bdd_inv_in_comp_S β€¦ Ht Hq) -Ht -Hq
+#v #u #Hv #Hu #Hq #H0 destruct
+/3 width=6 by ex4_2_intro, ex_intro/
+qed-.
+
+(* Advanced inversions ******************************************************)
+
+lemma bbd_mono_in_root_d:
+      βˆ€l,n,p,t. t Ο΅ πƒπ›— β†’ p◖𝗱❨n❩ Ο΅ β–΅t β†’ pβ—–l Ο΅ β–΅t β†’ π—±β¨n❩ = l.
 #l #n #p elim p -p
 [ #t #Ht <list_cons_comm <list_cons_comm #Hn #Hl
-  elim (bdd_inv_in_ini_d β€¦ Ht Hn) -Ht -Hn *
-  [ #H1 #_ destruct
-    elim (term_in_ini_inv_lcons_oref β€¦ Hl) -Hl //
-  | #u #_ #_ #H1 destruct
-    elim (term_in_ini_inv_lcons_iref β€¦ Hl) -Hl //
+  elim (bdd_inv_in_root_d β€¦ Ht Hn) -Ht -Hn *
+  [ #H0 #_
+    lapply (preterm_root_eq_repl β€¦ H0) -H0 #H0
+    lapply (subset_in_eq_repl_fwd ?? β€¦ Hl β€¦ H0) -H0 -Hl #Hl
+    elim (preterm_in_root_inv_lcons_oref β€¦ Hl) -Hl //
+  | #u #_ #_ #H0
+    lapply (preterm_root_eq_repl β€¦ H0) -H0 #H0
+    lapply (subset_in_eq_repl_fwd ?? β€¦ Hl β€¦ H0) -H0 -Hl #Hl
+    elim (preterm_in_root_inv_lcons_iref β€¦ Hl) -Hl //
   ]
 | * [ #m ] #p #IH #t #Ht
   <list_cons_shift <list_cons_shift #Hn #Hl
-  [ elim (bdd_inv_in_ini_d β€¦ Ht Hn) -Ht -Hn *
-    [ #_ #H
-      elim (eq_inv_list_empty_rcons ??? H)
-    | #u #Hu #Hp #H destruct
-      elim (term_in_ini_inv_lcons_iref β€¦ Hl) -Hl #_ #Hl
-      @(IH β€¦ Hu) //
+  [ elim (bdd_inv_in_root_d β€¦ Ht Hn) -Ht -Hn *
+    [ #_ #H0
+      elim (eq_inv_list_empty_rcons ??? H0)
+    | #u #Hu #Hp #H0
+      lapply (preterm_root_eq_repl β€¦ H0) -H0 #H0
+      lapply (subset_in_eq_repl_fwd ?? β€¦ Hl β€¦ H0) -H0 -Hl #Hl
+      elim (preterm_in_root_inv_lcons_iref β€¦ Hl) -Hl #_ #Hl
+      /2 width=4 by/
     ]
-  |
+  | elim (bdd_inv_in_root_L β€¦ Ht Hn) -Ht -Hn
+    #u #Hu #Hp #H0
+    lapply (preterm_root_eq_repl β€¦ H0) -H0 #H0
+    lapply (subset_in_eq_repl_fwd ?? β€¦ Hl β€¦ H0) -H0 -Hl #Hl  
+    elim (preterm_in_root_inv_lcons_abst β€¦ Hl) -Hl #_ #Hl
+    /2 width=4 by/
+  | elim (bdd_inv_in_root_A β€¦ Ht Hn) -Ht -Hn
+    #v #u #_ #Hu #Hp #H0
+    lapply (preterm_root_eq_repl β€¦ H0) -H0 #H0
+    lapply (subset_in_eq_repl_fwd ?? β€¦ Hl β€¦ H0) -H0 -Hl #Hl
+    elim (preterm_in_root_inv_lcons_appl β€¦ Hl) -Hl * #H0 #Hl destruct
+    /2 width=4 by/
+  | elim (bdd_inv_in_root_S β€¦ Ht Hn) -Ht -Hn
+    #v #u #Hv #_ #Hp #H0
+    lapply (preterm_root_eq_repl β€¦ H0) -H0 #H0
+    lapply (subset_in_eq_repl_fwd ?? β€¦ Hl β€¦ H0) -H0 -Hl #Hl
+    elim (preterm_in_root_inv_lcons_appl β€¦ Hl) -Hl * #H0 #Hl destruct
+    /2 width=4 by/
   ]
 ]
+qed-.