+++ /dev/null
-(**************************************************************************)
-(* ___ *)
-(* ||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 *)
-(* *)
-(**************************************************************************)
-
-(* GROUND NOTATION **********************************************************)
-
-notation "hvbox( f @❨ break term 46 a ❩ )"
- non associative with precedence 60
- for @{ 'Apply $f $a }.
+++ /dev/null
-(**************************************************************************)
-(* ___ *)
-(* ||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 *)
-(* *)
-(**************************************************************************)
-
-(* GROUND NOTATION **********************************************************)
-
-notation "hvbox( f @↑❨ break term 46 a ❩ )"
- non associative with precedence 60
- for @{ 'ApplySucc $f $a }.
--- /dev/null
+(**************************************************************************)
+(* ___ *)
+(* ||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 *)
+(* *)
+(**************************************************************************)
+
+(* GROUND NOTATION **********************************************************)
+
+notation "hvbox( f @❨ break term 46 a ❩ )"
+ non associative with precedence 60
+ for @{ 'At $f $a }.
--- /dev/null
+(**************************************************************************)
+(* ___ *)
+(* ||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 *)
+(* *)
+(**************************************************************************)
+
+(* GROUND NOTATION **********************************************************)
+
+notation "hvbox( f @§❨ break term 46 a ❩ )"
+ non associative with precedence 60
+ for @{ 'AtSection $f $a }.
--- /dev/null
+(**************************************************************************)
+(* ___ *)
+(* ||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 *)
+(* *)
+(**************************************************************************)
+
+(* GROUND NOTATION **********************************************************)
+
+notation "hvbox( @§❨ term 46 T1 , break term 46 f ❩ ≘ break term 46 T2 )"
+ non associative with precedence 45
+ for @{ 'RAtSection $T1 $f $T2 }.
+++ /dev/null
-(**************************************************************************)
-(* ___ *)
-(* ||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 *)
-(* *)
-(**************************************************************************)
-
-(* GROUND NOTATION **********************************************************)
-
-notation "hvbox( @↑❨ term 46 T1 , break term 46 f ❩ ≘ break term 46 T2 )"
- non associative with precedence 45
- for @{ 'RAtSucc $T1 $f $T2 }.
(* *)
(**************************************************************************)
-include "ground/notation/relations/ratsucc_3.ma".
+include "ground/notation/relations/ratsection_3.ma".
include "ground/arith/nat_plus.ma".
include "ground/arith/nat_lt.ma".
include "ground/relocation/fr2_map.ma".
interpretation
"non-negative relational application (finite relocation maps with pairs)"
- 'RAtSucc l1 f l2 = (fr2_nat f l1 l2).
+ 'RAtSection l1 f l2 = (fr2_nat f l1 l2).
(* Basic inversions *********************************************************)
(*** at_inv_nil *)
lemma fr2_nat_inv_empty (l1) (l2):
- @↑❨l1, 𝐞❩ ≘ l2 → l1 = l2.
+ @§❨l1, 𝐞❩ ≘ l2 → l1 = l2.
#l1 #l2 @(insert_eq_1 … (𝐞))
#f * -f -l1 -l2
[ //
(*** at_inv_cons *)
lemma fr2_nat_inv_lcons (f) (d) (h) (l1) (l2):
- @↑❨l1, ❨d,h❩◗f❩ ≘ l2 →
- ∨∨ ∧∧ l1 < d & @↑❨l1, f❩ ≘ l2
- | ∧∧ d ≤ l1 & @↑❨l1+h, f❩ ≘ l2.
+ @§❨l1, ❨d,h❩◗f❩ ≘ l2 →
+ ∨∨ ∧∧ l1 < d & @§❨l1, f❩ ≘ l2
+ | ∧∧ d ≤ l1 & @§❨l1+h, f❩ ≘ l2.
#g #d #h #l1 #l2 @(insert_eq_1 … (❨d, h❩◗g))
#f * -f -l1 -l2
[ #l #H destruct
(*** at_inv_cons *)
lemma fr2_nat_inv_lcons_lt (f) (d) (h) (l1) (l2):
- @↑❨l1, ❨d,h❩◗f❩ ≘ l2 → l1 < d → @↑❨l1, f❩ ≘ l2.
+ @§❨l1, ❨d,h❩◗f❩ ≘ l2 → l1 < d → @§❨l1, f❩ ≘ l2.
#f #d #h #l1 #h2 #H
elim (fr2_nat_inv_lcons … H) -H * // #Hdl1 #_ #Hl1d
elim (nlt_ge_false … Hl1d Hdl1)
(*** at_inv_cons *)
lemma fr2_nat_inv_lcons_ge (f) (d) (h) (l1) (l2):
- @↑❨l1, ❨d,h❩◗f❩ ≘ l2 → d ≤ l1 → @↑❨l1+h, f❩ ≘ l2.
+ @§❨l1, ❨d,h❩◗f❩ ≘ l2 → d ≤ l1 → @§❨l1+h, f❩ ≘ l2.
#f #d #h #l1 #h2 #H
elim (fr2_nat_inv_lcons … H) -H * // #Hl1d #_ #Hdl1
elim (nlt_ge_false … Hl1d Hdl1)
(*** at_mono *)
theorem fr2_nat_mono (f) (l):
- ∀l1. @↑❨l, f❩ ≘ l1 → ∀l2. @↑❨l, f❩ ≘ l2 → l1 = l2.
+ ∀l1. @§❨l, f❩ ≘ l1 → ∀l2. @§❨l, f❩ ≘ l2 → l1 = l2.
#f #l #l1 #H elim H -f -l -l1
[ #l #x #H <(fr2_nat_inv_empty … H) -x //
| #f #d #h #l #l1 #Hld #_ #IH #x #H
include "ground/relocation/tr_uni_pap.ma".
include "ground/relocation/tr_compose_pap.ma".
include "ground/relocation/tr_pap_eq.ma".
-include "ground/notation/functions/applysucc_2.ma".
+include "ground/notation/functions/atsection_2.ma".
include "ground/arith/nat_lt.ma".
include "ground/arith/nat_plus_rplus.ma".
include "ground/arith/nat_pred_succ.ma".
interpretation
"functional non-negative application (total relocation maps)"
- 'ApplySucc f l = (tr_nap f l).
+ 'AtSection f l = (tr_nap f l).
lemma tr_nap_unfold (f) (l):
- ↓(f@⧣❨↑l❩) = f@↑❨l❩.
+ ↓(f@⧣❨↑l❩) = f@§❨l❩.
// qed.
lemma tr_pap_succ_nap (f) (l):
- ↑(f@↑❨l❩) = f@⧣❨↑l❩.
+ ↑(f@§❨l❩) = f@⧣❨↑l❩.
// qed.
lemma tr_compose_nap (f2) (f1) (l):
- f2@↑❨f1@↑❨l❩❩ = (f2∘f1)@↑❨l❩.
+ f2@§❨f1@§❨l❩❩ = (f2∘f1)@§❨l❩.
#f2 #f1 #l
<tr_nap_unfold <tr_nap_unfold <tr_nap_unfold
<tr_compose_pap <npsucc_pred //
qed.
lemma tr_uni_nap (n) (m):
- m + n = 𝐮❨n❩@↑❨m❩.
+ m + n = 𝐮❨n❩@§❨m❩.
#n #m
<tr_nap_unfold
<tr_uni_pap <nrplus_npsucc_sn //
qed.
lemma tr_nap_push (f):
- ∀l. ↑(f@↑❨l❩) = (⫯f)@↑❨↑l❩.
+ ∀l. ↑(f@§❨l❩) = (⫯f)@§❨↑l❩.
#f #l
<tr_nap_unfold <tr_nap_unfold
<tr_pap_push <pnpred_psucc //
qed.
lemma tr_nap_pushs_lt (f) (n) (m):
- m < n → m = (⫯*[n]f)@↑❨m❩.
+ m < n → m = (⫯*[n]f)@§❨m❩.
#f #n #m #Hmn
<tr_nap_unfold <tr_pap_pushs_le
/2 width=1 by nlt_npsucc_bi/
qed-.
theorem tr_nap_eq_repl (i):
- stream_eq_repl … (λf1,f2. f1@↑❨i❩ = f2@↑❨i❩).
+ stream_eq_repl … (λf1,f2. f1@§❨i❩ = f2@§❨i❩).
#i #f1 #f2 #Hf
<tr_nap_unfold <tr_nap_unfold
/3 width=1 by tr_pap_eq_repl, eq_f/
qed-.
lemma pr_after_des_ist_nat:
- ∀f1,l1,l2. @↑❨l1, f1❩ ≘ l2 → ∀f2. 𝐓❨f2❩ → ∀f. f2 ⊚ f1 ≘ f →
- ∃∃l. @↑❨l2, f2❩ ≘ l & @↑❨l1, f❩ ≘ l.
+ ∀f1,l1,l2. @§❨l1, f1❩ ≘ l2 → ∀f2. 𝐓❨f2❩ → ∀f. f2 ⊚ f1 ≘ f →
+ ∃∃l. @§❨l2, f2❩ ≘ l & @§❨l1, f❩ ≘ l.
#f1 #l1 #l2 #H1 #f2 #H2 #f #Hf
elim (pr_after_des_ist_pat … H1 … H2 … Hf) -f1 -H2
/2 width=3 by ex2_intro/
(* Destructions with pr_nat *************************************************)
lemma pr_after_nat_des (l) (l1):
- ∀f. @↑❨l1, f❩ ≘ l → ∀f2,f1. f2 ⊚ f1 ≘ f →
- ∃∃l2. @↑❨l1, f1❩ ≘ l2 & @↑❨l2, f2❩ ≘ l.
+ ∀f. @§❨l1, f❩ ≘ l → ∀f2,f1. f2 ⊚ f1 ≘ f →
+ ∃∃l2. @§❨l1, f1❩ ≘ l2 & @§❨l2, f2❩ ≘ l.
#l #l1 #f #H1 #f2 #f1 #Hf
elim (pr_after_pat_des … H1 … Hf) -f #i2 #H1 #H2
/2 width=3 by ex2_intro/
qed-.
lemma pr_after_des_nat (l) (l2) (l1):
- ∀f1,f2. @↑❨l1, f1❩ ≘ l2 → @↑❨l2, f2❩ ≘ l →
- ∀f. f2 ⊚ f1 ≘ f → @↑❨l1, f❩ ≘ l.
+ ∀f1,f2. @§❨l1, f1❩ ≘ l2 → @§❨l2, f2❩ ≘ l →
+ ∀f. f2 ⊚ f1 ≘ f → @§❨l1, f❩ ≘ l.
/2 width=6 by pr_after_des_pat/ qed-.
lemma pr_after_des_nat_sn (l1) (l):
- ∀f. @↑❨l1, f❩ ≘ l → ∀f1,l2. @↑❨l1, f1❩ ≘ l2 →
- ∀f2. f2 ⊚ f1 ≘ f → @↑❨l2, f2❩ ≘ l.
+ ∀f. @§❨l1, f❩ ≘ l → ∀f1,l2. @§❨l1, f1❩ ≘ l2 →
+ ∀f2. f2 ⊚ f1 ≘ f → @§❨l2, f2❩ ≘ l.
/2 width=6 by pr_after_des_pat_sn/ qed-.
lemma pr_after_des_nat_dx (l) (l2) (l1):
- ∀f,f2. @↑❨l1, f❩ ≘ l → @↑❨l2, f2❩ ≘ l →
- ∀f1. f2 ⊚ f1 ≘ f → @↑❨l1, f1❩ ≘ l2.
+ ∀f,f2. @§❨l1, f❩ ≘ l → @§❨l2, f2❩ ≘ l →
+ ∀f1. f2 ⊚ f1 ≘ f → @§❨l1, f1❩ ≘ l2.
/2 width=6 by pr_after_des_pat_dx/ qed-.
(*** after_uni_dx *)
lemma pr_after_nat_uni (l2) (l1):
- ∀f2. @↑❨l1, f2❩ ≘ l2 →
+ ∀f2. @§❨l1, f2❩ ≘ l2 →
∀f. f2 ⊚ 𝐮❨l1❩ ≘ f → 𝐮❨l2❩ ⊚ ⫰*[l2] f2 ≘ f.
#l2 @(nat_ind_succ … l2) -l2
[ #l1 #f2 #Hf2 #f #Hf
(*** after_uni_sn *)
lemma pr_nat_after_uni_tls (l2) (l1):
- ∀f2. @↑❨l1, f2❩ ≘ l2 →
+ ∀f2. @§❨l1, f2❩ ≘ l2 →
∀f. 𝐮❨l2❩ ⊚ ⫰*[l2] f2 ≘ f → f2 ⊚ 𝐮❨l1❩ ≘ f.
#l2 @(nat_ind_succ … l2) -l2
[ #l1 #f2 #Hf2 #f #Hf
(*** coafter_tls *)
lemma pr_coafter_tls_bi_tls (n2) (n1):
- ∀f1,f2,f. @↑❨n1, f1❩ ≘ n2 →
+ ∀f1,f2,f. @§❨n1, f1❩ ≘ n2 →
f1 ~⊚ f2 ≘ f → ⫰*[n2]f1 ~⊚ ⫰*[n1]f2 ≘ ⫰*[n2]f.
#n2 @(nat_ind_succ … n2) -n2 [ #n1 | #n2 #IH * [| #n1 ] ] #f1 #f2 #f #Hf1 #Hf
[ elim (pr_nat_inv_zero_dx … Hf1) -Hf1 [ |*: // ] #g1 #Hg1 #H1 destruct //
(*** coafter_tls_O *)
lemma pr_coafter_tls_sn_tls:
- ∀n,f1,f2,f. @↑❨𝟎, f1❩ ≘ n →
+ ∀n,f1,f2,f. @§❨𝟎, f1❩ ≘ n →
f1 ~⊚ f2 ≘ f → ⫰*[n]f1 ~⊚ f2 ≘ ⫰*[n]f.
/2 width=1 by pr_coafter_tls_bi_tls/ qed.
(*** coafter_fwd_pushs *)
lemma pr_coafter_des_pushs_dx (n) (m):
- ∀g2,f1,g. g2 ~⊚ ⫯*[m]f1 ≘ g → @↑❨m, g2❩ ≘ n →
+ ∀g2,f1,g. g2 ~⊚ ⫯*[m]f1 ≘ g → @§❨m, g2❩ ≘ n →
∃∃f. ⫰*[n]g2 ~⊚ f1 ≘ f & ⫯*[n] f = g.
#n @(nat_ind_succ … n) -n
[ #m #g2 #f1 #g #Hg #H
(* Advanced constructions with pr_isi and pr_nat ****************************)
-lemma pr_isi_nat (f): (∀l. @↑❨l,f❩ ≘ l) → 𝐈❨f❩.
+lemma pr_isi_nat (f): (∀l. @§❨l,f❩ ≘ l) → 𝐈❨f❩.
/2 width=1 by pr_isi_pat/ qed.
(* Inversions with pr_nat ***************************************************)
-lemma pr_isi_inv_nat (f) (l): 𝐈❨f❩ → @↑❨l,f❩ ≘ l.
+lemma pr_isi_inv_nat (f) (l): 𝐈❨f❩ → @§❨l,f❩ ≘ l.
/2 width=1 by pr_isi_inv_pat/ qed-.
(* Destructions with pr_nat *************************************************)
-lemma pr_isi_nat_des (f) (l1) (l2): 𝐈❨f❩ → @↑❨l1,f❩ ≘ l2 → l1 = l2.
+lemma pr_isi_nat_des (f) (l1) (l2): 𝐈❨f❩ → @§❨l1,f❩ ≘ l2 → l1 = l2.
/3 width=3 by pr_isi_pat_des, eq_inv_npsucc_bi/ qed-.
(* Advanced constructions with pr_nat ***************************************)
-lemma is_pr_nat_dec (f) (l2): 𝐓❨f❩ → Decidable (∃l1. @↑❨l1,f❩ ≘ l2).
+lemma is_pr_nat_dec (f) (l2): 𝐓❨f❩ → Decidable (∃l1. @§❨l1,f❩ ≘ l2).
#f #l2 #Hf elim (is_pr_pat_dec … (↑l2) Hf)
[ * /3 width=2 by ex_intro, or_introl/
| #H @or_intror * /3 width=2 by ex_intro/
(* *)
(**************************************************************************)
-include "ground/notation/relations/ratsucc_3.ma".
+include "ground/notation/relations/ratsection_3.ma".
include "ground/arith/nat_pred_succ.ma".
include "ground/relocation/pr_pat.ma".
interpretation
"relational non-negative application (partial relocation maps)"
- 'RAtSucc l1 f l2 = (pr_nat f l1 l2).
+ 'RAtSection l1 f l2 = (pr_nat f l1 l2).
(* Basic constructions ******************************************************)
lemma pr_nat_refl (f) (g) (k1) (k2):
- (⫯f) = g → 𝟎 = k1 → 𝟎 = k2 → @↑❨k1,g❩ ≘ k2.
+ (⫯f) = g → 𝟎 = k1 → 𝟎 = k2 → @§❨k1,g❩ ≘ k2.
#f #g #k1 #k2 #H1 #H2 #H3 destruct
/2 width=2 by pr_pat_refl/
qed.
lemma pr_nat_push (f) (l1) (l2) (g) (k1) (k2):
- @↑❨l1,f❩ ≘ l2 → ⫯f = g → ↑l1 = k1 → ↑l2 = k2 → @↑❨k1,g❩ ≘ k2.
+ @§❨l1,f❩ ≘ l2 → ⫯f = g → ↑l1 = k1 → ↑l2 = k2 → @§❨k1,g❩ ≘ k2.
#f #l1 #l2 #g #k1 #k2 #Hf #H1 #H2 #H3 destruct
/2 width=7 by pr_pat_push/
qed.
lemma pr_nat_next (f) (l1) (l2) (g) (k2):
- @↑❨l1,f❩ ≘ l2 → ↑f = g → ↑l2 = k2 → @↑❨l1,g❩ ≘ k2.
+ @§❨l1,f❩ ≘ l2 → ↑f = g → ↑l2 = k2 → @§❨l1,g❩ ≘ k2.
#f #l1 #l2 #g #k2 #Hf #H1 #H2 destruct
/2 width=5 by pr_pat_next/
qed.
lemma pr_nat_pred_bi (f) (i1) (i2):
- @⧣❨i1,f❩ ≘ i2 → @↑❨↓i1,f❩ ≘ ↓i2.
+ @⧣❨i1,f❩ ≘ i2 → @§❨↓i1,f❩ ≘ ↓i2.
#f #i1 #i2
>(npsucc_pred i1) in ⊢ (%→?); >(npsucc_pred i2) in ⊢ (%→?);
//
(*** pr_nat_inv_ppx *)
lemma pr_nat_inv_zero_push (f) (l1) (l2):
- @↑❨l1,f❩ ≘ l2 → ∀g. 𝟎 = l1 → ⫯g = f → 𝟎 = l2.
+ @§❨l1,f❩ ≘ l2 → ∀g. 𝟎 = l1 → ⫯g = f → 𝟎 = l2.
#f #l1 #l2 #H #g #H1 #H2 destruct
lapply (pr_pat_inv_unit_push … H ???) -H
/2 width=2 by eq_inv_npsucc_bi/
(*** pr_nat_inv_npx *)
lemma pr_nat_inv_succ_push (f) (l1) (l2):
- @↑❨l1,f❩ ≘ l2 → ∀g,k1. ↑k1 = l1 → ⫯g = f →
- ∃∃k2. @↑❨k1,g❩ ≘ k2 & ↑k2 = l2.
+ @§❨l1,f❩ ≘ l2 → ∀g,k1. ↑k1 = l1 → ⫯g = f →
+ ∃∃k2. @§❨k1,g❩ ≘ k2 & ↑k2 = l2.
#f #l1 #l2 #H #g #k1 #H1 #H2 destruct
elim (pr_pat_inv_succ_push … H) -H [|*: // ] #k2 #Hg
>(npsucc_pred (↑l2)) #H
(*** pr_nat_inv_xnx *)
lemma pr_nat_inv_next (f) (l1) (l2):
- @↑❨l1,f❩ ≘ l2 → ∀g. ↑g = f →
- ∃∃k2. @↑❨l1,g❩ ≘ k2 & ↑k2 = l2.
+ @§❨l1,f❩ ≘ l2 → ∀g. ↑g = f →
+ ∃∃k2. @§❨l1,g❩ ≘ k2 & ↑k2 = l2.
#f #l1 #l2 #H #g #H1 destruct
elim (pr_pat_inv_next … H) -H [|*: // ] #k2
>(npsucc_pred (k2)) in ⊢ (%→?→?); #Hg #H
(*** pr_nat_inv_ppn *)
lemma pr_nat_inv_zero_push_succ (f) (l1) (l2):
- @↑❨l1,f❩ ≘ l2 → ∀g,k2. 𝟎 = l1 → ⫯g = f → ↑k2 = l2 → ⊥.
+ @§❨l1,f❩ ≘ l2 → ∀g,k2. 𝟎 = l1 → ⫯g = f → ↑k2 = l2 → ⊥.
#f #l1 #l2 #Hf #g #k2 #H1 #H <(pr_nat_inv_zero_push … Hf … H1 H) -f -g -l1 -l2
/2 width=3 by eq_inv_nsucc_zero/
qed-.
(*** pr_nat_inv_npp *)
lemma pr_nat_inv_succ_push_zero (f) (l1) (l2):
- @↑❨l1,f❩ ≘ l2 → ∀g,k1. ↑k1 = l1 → ⫯g = f → 𝟎 = l2 → ⊥.
+ @§❨l1,f❩ ≘ l2 → ∀g,k1. ↑k1 = l1 → ⫯g = f → 𝟎 = l2 → ⊥.
#f #l1 #l2 #Hf #g #k1 #H1 #H elim (pr_nat_inv_succ_push … Hf … H1 H) -f -l1
#x2 #Hg * -l2 /2 width=3 by eq_inv_zero_nsucc/
qed-.
(*** pr_nat_inv_npn *)
lemma pr_nat_inv_succ_push_succ (f) (l1) (l2):
- @↑❨l1,f❩ ≘ l2 → ∀g,k1,k2. ↑k1 = l1 → ⫯g = f → ↑k2 = l2 → @↑❨k1,g❩ ≘ k2.
+ @§❨l1,f❩ ≘ l2 → ∀g,k1,k2. ↑k1 = l1 → ⫯g = f → ↑k2 = l2 → @§❨k1,g❩ ≘ k2.
#f #l1 #l2 #Hf #g #k1 #k2 #H1 #H elim (pr_nat_inv_succ_push … Hf … H1 H) -f -l1
#x2 #Hg * -l2 #H >(eq_inv_nsucc_bi … H) -k2 //
qed-.
(*** pr_nat_inv_xnp *)
lemma pr_nat_inv_next_zero (f) (l1) (l2):
- @↑❨l1,f❩ ≘ l2 → ∀g. ↑g = f → 𝟎 = l2 → ⊥.
+ @§❨l1,f❩ ≘ l2 → ∀g. ↑g = f → 𝟎 = l2 → ⊥.
#f #l1 #l2 #Hf #g #H elim (pr_nat_inv_next … Hf … H) -f
#x2 #Hg * -l2 /2 width=3 by eq_inv_zero_nsucc/
qed-.
(*** pr_nat_inv_xnn *)
lemma pr_nat_inv_next_succ (f) (l1) (l2):
- @↑❨l1,f❩ ≘ l2 → ∀g,k2. ↑g = f → ↑k2 = l2 → @↑❨l1,g❩ ≘ k2.
+ @§❨l1,f❩ ≘ l2 → ∀g,k2. ↑g = f → ↑k2 = l2 → @§❨l1,g❩ ≘ k2.
#f #l1 #l2 #Hf #g #k2 #H elim (pr_nat_inv_next … Hf … H) -f
#x2 #Hg * -l2 #H >(eq_inv_nsucc_bi … H) -k2 //
qed-.
(*** pr_nat_inv_pxp *)
lemma pr_nat_inv_zero_bi (f) (l1) (l2):
- @↑❨l1,f❩ ≘ l2 → 𝟎 = l1 → 𝟎 = l2 → ∃g. ⫯g = f.
+ @§❨l1,f❩ ≘ l2 → 𝟎 = l1 → 𝟎 = l2 → ∃g. ⫯g = f.
#f elim (pr_map_split_tl … f) /2 width=2 by ex_intro/
#H #l1 #l2 #Hf #H1 #H2 cases (pr_nat_inv_next_zero … Hf … H H2)
qed-.
(*** pr_nat_inv_pxn *)
lemma pr_nat_inv_zero_succ (f) (l1) (l2):
- @↑❨l1,f❩ ≘ l2 → ∀k2. 𝟎 = l1 → ↑k2 = l2 →
- ∃∃g. @↑❨l1,g❩ ≘ k2 & ↑g = f.
+ @§❨l1,f❩ ≘ l2 → ∀k2. 𝟎 = l1 → ↑k2 = l2 →
+ ∃∃g. @§❨l1,g❩ ≘ k2 & ↑g = f.
#f elim (pr_map_split_tl … f)
#H #l1 #l2 #Hf #k2 #H1 #H2
[ elim (pr_nat_inv_zero_push_succ … Hf … H1 H H2)
(*** pr_nat_inv_nxp *)
lemma pr_nat_inv_succ_zero (f) (l1) (l2):
- @↑❨l1,f❩ ≘ l2 → ∀k1. ↑k1 = l1 → 𝟎 = l2 → ⊥.
+ @§❨l1,f❩ ≘ l2 → ∀k1. ↑k1 = l1 → 𝟎 = l2 → ⊥.
#f elim (pr_map_split_tl f)
#H #l1 #l2 #Hf #k1 #H1 #H2
[ elim (pr_nat_inv_succ_push_zero … Hf … H1 H H2)
(*** pr_nat_inv_nxn *)
lemma pr_nat_inv_succ_bi (f) (l1) (l2):
- @↑❨l1,f❩ ≘ l2 → ∀k1,k2. ↑k1 = l1 → ↑k2 = l2 →
- ∨∨ ∃∃g. @↑❨k1,g❩ ≘ k2 & ⫯g = f
- | ∃∃g. @↑❨l1,g❩ ≘ k2 & ↑g = f.
+ @§❨l1,f❩ ≘ l2 → ∀k1,k2. ↑k1 = l1 → ↑k2 = l2 →
+ ∨∨ ∃∃g. @§❨k1,g❩ ≘ k2 & ⫯g = f
+ | ∃∃g. @§❨l1,g❩ ≘ k2 & ↑g = f.
#f elim (pr_map_split_tl f) *
/4 width=7 by pr_nat_inv_next_succ, pr_nat_inv_succ_push_succ, ex2_intro, or_intror, or_introl/
qed-.
(* Note: the following inversion lemmas must be checked *)
(*** pr_nat_inv_xpx *)
lemma pr_nat_inv_push (f) (l1) (l2):
- @↑❨l1,f❩ ≘ l2 → ∀g. ⫯g = f →
+ @§❨l1,f❩ ≘ l2 → ∀g. ⫯g = f →
∨∨ ∧∧ 𝟎 = l1 & 𝟎 = l2
- | ∃∃k1,k2. @↑❨k1,g❩ ≘ k2 & ↑k1 = l1 & ↑k2 = l2.
+ | ∃∃k1,k2. @§❨k1,g❩ ≘ k2 & ↑k1 = l1 & ↑k2 = l2.
#f * [2: #l1 ] #l2 #Hf #g #H
[ elim (pr_nat_inv_succ_push … Hf … H) -f /3 width=5 by or_intror, ex3_2_intro/
| >(pr_nat_inv_zero_push … Hf … H) -f /3 width=1 by conj, or_introl/
(*** pr_nat_inv_xpp *)
lemma pr_nat_inv_push_zero (f) (l1) (l2):
- @↑❨l1,f❩ ≘ l2 → ∀g. ⫯g = f → 𝟎 = l2 → 𝟎 = l1.
+ @§❨l1,f❩ ≘ l2 → ∀g. ⫯g = f → 𝟎 = l2 → 𝟎 = l1.
#f #l1 #l2 #Hf #g #H elim (pr_nat_inv_push … Hf … H) -f * //
#k1 #k2 #_ #_ * -l2 #H elim (eq_inv_zero_nsucc … H)
qed-.
(*** pr_nat_inv_xpn *)
lemma pr_nat_inv_push_succ (f) (l1) (l2):
- @↑❨l1,f❩ ≘ l2 → ∀g,k2. ⫯g = f → ↑k2 = l2 →
- ∃∃k1. @↑❨k1,g❩ ≘ k2 & ↑k1 = l1.
+ @§❨l1,f❩ ≘ l2 → ∀g,k2. ⫯g = f → ↑k2 = l2 →
+ ∃∃k1. @§❨k1,g❩ ≘ k2 & ↑k1 = l1.
#f #l1 #l2 #Hf #g #k2 #H elim (pr_nat_inv_push … Hf … H) -f *
[ #_ * -l2 #H elim (eq_inv_nsucc_zero … H)
| #x1 #x2 #Hg #H1 * -l2 #H
(*** pr_nat_inv_xxp *)
lemma pr_nat_inv_zero_dx (f) (l1) (l2):
- @↑❨l1,f❩ ≘ l2 → 𝟎 = l2 → ∃∃g. 𝟎 = l1 & ⫯g = f.
+ @§❨l1,f❩ ≘ l2 → 𝟎 = l2 → ∃∃g. 𝟎 = l1 & ⫯g = f.
#f elim (pr_map_split_tl f)
#H #l1 #l2 #Hf #H2
[ /3 width=6 by pr_nat_inv_push_zero, ex2_intro/
qed-.
(*** pr_nat_inv_xxn *)
-lemma pr_nat_inv_succ_dx (f) (l1) (l2): @↑❨l1,f❩ ≘ l2 → ∀k2. ↑k2 = l2 →
- ∨∨ ∃∃g,k1. @↑❨k1,g❩ ≘ k2 & ↑k1 = l1 & ⫯g = f
- | ∃∃g. @↑❨l1,g❩ ≘ k2 & ↑g = f.
+lemma pr_nat_inv_succ_dx (f) (l1) (l2): @§❨l1,f❩ ≘ l2 → ∀k2. ↑k2 = l2 →
+ ∨∨ ∃∃g,k1. @§❨k1,g❩ ≘ k2 & ↑k1 = l1 & ⫯g = f
+ | ∃∃g. @§❨l1,g❩ ≘ k2 & ↑g = f.
#f elim (pr_map_split_tl f)
#H #l1 #l2 #Hf #k2 #H2
[ elim (pr_nat_inv_push_succ … Hf … H H2) -l2 /3 width=5 by or_introl, ex3_2_intro/
(* Constructions with pr_basic **********************************************)
lemma pr_nat_basic_lt (m) (n) (l):
- l < m → @↑❨l, 𝐛❨m,n❩❩ ≘ l.
+ l < m → @§❨l, 𝐛❨m,n❩❩ ≘ l.
#m @(nat_ind_succ … m) -m
[ #n #i #H elim (nlt_inv_zero_dx … H)
| #m #IH #n #l @(nat_ind_succ … l) -l
qed.
lemma pr_nat_basic_ge (m) (n) (l):
- m ≤ l → @↑❨l, 𝐛❨m,n❩❩ ≘ l+n.
+ m ≤ l → @§❨l, 𝐛❨m,n❩❩ ≘ l+n.
#m @(nat_ind_succ … m) -m //
#m #IH #n #l #H
elim (nle_inv_succ_sn … H) -H #Hml #H >H -H
(* Inversions with pr_basic *************************************************)
lemma pr_nat_basic_inv_lt (m) (n) (l) (k):
- l < m → @↑❨l, 𝐛❨m,n❩❩ ≘ k → l = k.
+ l < m → @§❨l, 𝐛❨m,n❩❩ ≘ k → l = k.
/3 width=4 by pr_nat_basic_lt, pr_nat_mono/ qed-.
lemma pr_nat_basic_inv_ge (m) (n) (l) (k):
- m ≤ l → @↑❨l, 𝐛❨m,n❩❩ ≘ k → l+n = k.
+ m ≤ l → @§❨l, 𝐛❨m,n❩❩ ≘ k → l+n = k.
/3 width=4 by pr_nat_basic_ge, pr_nat_mono/ qed-.
(* Main destructions ********************************************************)
theorem pr_nat_monotonic (k2) (l2) (f):
- @↑❨l2,f❩ ≘ k2 → ∀k1,l1. @↑❨l1,f❩ ≘ k1 → l1 < l2 → k1 < k2.
+ @§❨l2,f❩ ≘ k2 → ∀k1,l1. @§❨l1,f❩ ≘ k1 → l1 < l2 → k1 < k2.
#k2 @(nat_ind_succ … k2) -k2
[ #l2 #f #H2f elim (pr_nat_inv_zero_dx … H2f) -H2f //
#g #H21 #_ #k1 #l1 #_ #Hi destruct
qed-.
theorem pr_nat_inv_monotonic (k1) (l1) (f):
- @↑❨l1,f❩ ≘ k1 → ∀k2,l2. @↑❨l2,f❩ ≘ k2 → k1 < k2 → l1 < l2.
+ @§❨l1,f❩ ≘ k1 → ∀k2,l2. @§❨l2,f❩ ≘ k2 → k1 < k2 → l1 < l2.
#k1 @(nat_ind_succ … k1) -k1
[ #l1 #f #H1f elim (pr_nat_inv_zero_dx … H1f) -H1f //
#g * -l1 #H #k2 #l2 #H2f #Hk
qed-.
theorem pr_nat_mono (f) (l) (l1) (l2):
- @↑❨l,f❩ ≘ l1 → @↑❨l,f❩ ≘ l2 → l2 = l1.
+ @§❨l,f❩ ≘ l1 → @§❨l,f❩ ≘ l2 → l2 = l1.
#f #l #l1 #l2 #H1 #H2 elim (nat_split_lt_eq_gt l2 l1) //
#Hi elim (nlt_ge_false l l)
/2 width=6 by pr_nat_inv_monotonic/
qed-.
theorem pr_nat_inj (f) (l1) (l2) (l):
- @↑❨l1,f❩ ≘ l → @↑❨l2,f❩ ≘ l → l1 = l2.
+ @§❨l1,f❩ ≘ l → @§❨l2,f❩ ≘ l → l1 = l2.
#f #l1 #l2 #l #H1 #H2 elim (nat_split_lt_eq_gt l2 l1) //
#Hi elim (nlt_ge_false l l)
/2 width=6 by pr_nat_monotonic/
(* Constructions with pr_uni ************************************************)
lemma pr_nat_uni (n) (l):
- @↑❨l,𝐮❨n❩❩ ≘ l+n.
+ @§❨l,𝐮❨n❩❩ ≘ l+n.
/2 width=1 by pr_nat_pred_bi/
qed.
(* Inversions with pr_uni ***************************************************)
lemma pr_nat_inv_uni (n) (l) (k):
- @↑❨l,𝐮❨n❩❩ ≘ k → k = l+n.
+ @§❨l,𝐮❨n❩❩ ≘ k → k = l+n.
/2 width=4 by pr_nat_mono/ qed-.
-
(**) (* reverse include *)
include "ground/arith/nat_rplus_pplus.ma".
include "ground/relocation/tr_pn_eq.ma".
include "ground/relocation/tr_compose_pn.ma".
include "ground/relocation/nap.ma".
-include "ground/notation/functions/apply_2.ma".
+include "ground/notation/functions/at_2.ma".
definition tr_xap (f) (l:nat): nat ≝
- (⫯f)@↑❨l❩.
+ (⫯f)@§❨l❩.
interpretation
"functional extended application (total relocation maps)"
- 'Apply f l = (tr_xap f l).
+ 'At f l = (tr_xap f l).
lemma tr_xap_unfold (f) (l):
- (⫯f)@↑❨l❩ = f@❨l❩.
+ (⫯f)@§❨l❩ = f@❨l❩.
// qed.
lemma tr_xap_zero (f):
// qed.
lemma tr_xap_succ_nap (f) (n):
- ↑(f@↑❨n❩) = f@❨↑n❩.
+ ↑(f@§❨n❩) = f@❨↑n❩.
#f #n
<tr_xap_ninj //
qed.
[ "pr_fcla ( 𝐂❨?❩ ≘ ? )" "pr_fcla_eq" "fcla_uni" "pr_fcla_fcla" * ]
[ "pr_isu ( 𝐔❨?❩ )" "pr_isu_tl" "pr_isu_uni" * ]
[ "pr_isi ( 𝐈❨?❩ )" "pr_isi_eq" "pr_isi_tl" "pr_isi_pushs" "pr_isi_tls" "pr_isi_id" "pr_isi_uni" "pr_isi_pat" "pr_isi_nat" * ]
- [ "pr_nat ( @↑❨?,?❩ ≘ ? )" "pr_nat_uni" "pr_nat_basic" "pr_nat_nat" * ]
+ [ "pr_nat ( @§❨?,?❩ ≘ ? )" "pr_nat_uni" "pr_nat_basic" "pr_nat_nat" * ]
[ "pr_pat ( @⧣❨?,?❩ ≘ ? )" "pr_pat_lt" "pr_pat_eq" "pr_pat_tls" "pr_pat_id" "pr_pat_uni" "pr_pat_basic" "pr_pat_pat" "pr_pat_pat_id" * ]
[ "pr_basic ( 𝐛❨?,?❩ )" * ]
[ "pr_uni ( 𝐮❨?❩ )" "pr_uni_eq" * ]