diff --git a/theories/fp_red.v b/theories/fp_red.v index 04b0263..a87874e 100644 --- a/theories/fp_red.v +++ b/theories/fp_red.v @@ -1061,26 +1061,29 @@ Definition prov_univ {n} i0 (a : Tm n) := | _ => False end. -(* Can consider combine prov and provU *) -#[tactic="prov_tac"]Equations prov {n} (h : Tm n) (a : Tm n) : Prop by wf (depth_tm a) lt := - prov h (TBind p0 A0 B0) := prov_bind p0 A0 B0 h; - prov h (Abs a) := prov (ren_Tm shift h) a; - prov h (App a b) := prov h a; - prov h (Pair a b) := prov h a /\ prov h b; - prov h (Proj p a) := prov h a; - prov h Bot := False; - prov h (VarTm _) := False; - prov h (Univ i) := prov_univ i h . +Fixpoint prov {n} (h : Tm n) (a : Tm n) : Prop := + match a with + | (TBind p0 A0 B0) => prov_bind p0 A0 B0 h + | (Abs a) => prov (ren_Tm shift h) a + | (App a b) => prov h a + | (Pair a b) => prov h a /\ prov h b + | (Proj p a) => prov h a + | Bot => h = Bot + | VarTm i => h = VarTm i + | Univ i => prov_univ i h + end. -#[tactic="prov_tac"]Equations extract {n} (a : Tm n) : Tm n by wf (depth_tm a) lt := - extract (TBind p A B) := TBind p A B; - extract (Abs a) := subst_Tm (scons Bot VarTm) (extract a); - extract (App a b) := extract a; - extract (Pair a b) := extract a; - extract (Proj p a) := extract a; - extract Bot := Bot; - extract (VarTm i) := (VarTm i); - extract (Univ i) := Univ i. +Fixpoint extract {n} (a : Tm n) : Tm n := + match a with + | TBind p A B => TBind p A B + | Abs a => subst_Tm (scons Bot VarTm) (extract a) + | App a b => extract a + | Pair a b => extract a + | Proj p a => extract a + | Bot => Bot + | VarTm i => VarTm i + | Univ i => Univ i + end. Lemma ren_extract n m (a : Tm n) (ξ : fin n -> fin m) : extract (ren_Tm ξ a) = ren_Tm ξ (extract a). @@ -1091,29 +1094,14 @@ Proof. simp extract. rewrite ih. by asimpl. - - hauto q:on rew:db:extract. - - hauto q:on rew:db:extract. - - hauto q:on rew:db:extract. - - hauto q:on rew:db:extract. + - hauto q:on . + - hauto q:on . + - hauto q:on . + - hauto q:on . - sfirstorder. - sfirstorder. Qed. -Lemma tm_depth_ind (P : forall n, Tm n -> Prop) : - (forall n (a : Tm n), (forall m (b : Tm m), depth_tm b < depth_tm a -> P m b) -> P n a) -> forall n a, P n a. -Proof. - move => ih. - suff : forall m n (a : Tm n), depth_tm a <= m -> P n a by sfirstorder. - elim. - - move => n a h. - apply ih. lia. - - move => n ih0 m a h. - apply : ih. - move => m0 b h0. - apply : ih0. - lia. -Qed. - Lemma prov_bind_ren n m p (A : Tm n) B (ξ : fin n -> fin m) a : prov_bind p A B a -> prov_bind p (ren_Tm ξ A) (ren_Tm (upRen_Tm_Tm ξ) B) (ren_Tm ξ a). @@ -1126,7 +1114,7 @@ Lemma prov_ren n m (ξ : fin n -> fin m) h a : prov h a -> prov (ren_Tm ξ h) (ren_Tm ξ a). Proof. move : m ξ h. elim : n / a. - - sfirstorder rew:db:prov. + - hauto q:on. - move => n a ih m ξ h. simp prov. move /ih => {ih}. @@ -1136,88 +1124,132 @@ Proof. suff : ren_Tm (upRen_Tm_Tm ξ) (ren_Tm shift h) = ren_Tm shift (ren_Tm ξ h) by move => <-. clear. case : h => * /=; by asimpl. - - hauto q:on rew:db:prov. - - qauto l:on rew:db:prov. - - hauto lq:on rew:db:prov. - - hauto l:on use:prov_bind_ren rew:db:prov. - - sfirstorder. - - hauto l:on inv:Tm rew:db:prov. + - hauto q:on. + - qauto l:on. + - hauto lq:on. + - hauto l:on use:prov_bind_ren. + - hauto lq:on. + - hauto l:on inv:Tm. Qed. -Definition hfb {n} (a : Tm n) := +Fixpoint erase {n} (a : Tm n) : Tm n := match a with - | TBind _ _ _ => true - | Univ _ => true - | _ => false + | TBind p0 A0 B0 => TBind p0 A0 B0 + | Abs a => Abs (erase a) + | App a b => erase a + | Pair a b => Pair (erase a) (erase b) + | Proj p a => Proj p (erase a) + | Bot => Bot + | VarTm i => VarTm i + | Univ i => Univ i end. -Lemma prov_morph n m (ρ : fin n -> Tm m) h a : - prov h a -> - hfb h -> - prov (subst_Tm ρ h) (subst_Tm ρ a). +Lemma prov_antiren n m (ξ : fin n -> fin m) h a: + prov (ren_Tm ξ h) a -> exists a', ren_Tm ξ a' = erase a /\ prov h a'. Proof. - move : m ρ h. elim : n / a. - - hauto q:on rew:db:prov. - - move => n a ih m ρ h + hb. + move E : (ren_Tm ξ h) => H. + move : ξ H E. + elim : m / a => m. + - move => i ξ H ?. subst. simp prov. + case : h => //=. + move => j [?]. subst. + exists (VarTm j). firstorder. + - move => a iha ξ ? ?. subst. simp prov => /=. - move /ih => {ih}. - move /(_ _ (up_Tm_Tm ρ) ltac:(hauto lq:on inv:Tm)). - simp prov. by asimpl. - - hauto q:on rew:db:prov. - - hauto q:on rew:db:prov. - - hauto lq:on rew:db:prov. - - move => n p A ihA B ihB m ρ h /=. simp prov => //= + h0. - case : h h0 => //=. - move => p0 A0 B0 _ [? [h1 h2]]. subst. - hauto l:on use:Pars.substing rew:db:prov. - - qauto rew:db:prov. - - hauto l:on inv:Tm rew:db:prov. + asimpl. + move => {}/iha iha. + specialize iha with (1 := eq_refl). + move : iha => [a' [h1 h2]]. + rewrite -h1. + exists (Abs (ren_Tm shift a')). + simpl. + split. f_equal. + by asimpl. + hauto l:on use:prov_ren. + - move => a iha b ihb ξ ? ?. subst. + simp prov. + move /iha. move/(_ ξ eq_refl) => [a' [h0 h1]] {iha ihb}. + simpl. rewrite -{}h0. + sfirstorder. + - move => a ha b hb ξ ? ?. subst => /=. + move => [{}/ha h0 {}/hb h1]. + specialize h0 with (1 := eq_refl). + specialize h1 with (1 := eq_refl). + move : h0 => [a' [h0 ?]]. + move : h1 => [b' [h1 ?]]. + exists (Pair a' b'). sfirstorder. +Admitted. + +(* Lemma ren_hfb {n m} (ξ : fin n -> fin m) u : hfb (ren_Tm ξ u) = hfb u. *) +(* Proof. move : m ξ. elim : n /u =>//=. Qed. *) + +(* Hint Rewrite @ren_hfb : prov. *) + +Lemma erase_ren n m (u : Tm n) (ξ : fin n -> fin m) : + erase (ren_Tm ξ u) = ren_Tm ξ (erase u). +Proof. + move : m ξ. + elim : n /u => //=; scongruence. Qed. -Lemma ren_hfb {n m} (ξ : fin n -> fin m) u : hfb (ren_Tm ξ u) = hfb u. -Proof. move : m ξ. elim : n /u =>//=. Qed. - -Hint Rewrite @ren_hfb : prov. - -Lemma prov_par n (u : Tm n) a b : prov u a -> hfb u -> Par.R a b -> prov u b. +Lemma erase_subst n m (u : Tm n) (ρ : fin n -> Tm m) : + erase (subst_Tm ρ u) = subst_Tm (funcomp erase ρ) (erase u). Proof. - move => + + h. move : u. - elim : n a b /h. + move : m ρ. + elim : n /u => //= n. + - move => a iha m ρ. f_equal. + rewrite iha. + asimpl => /=. + apply ext_Tm. + move => x. + destruct x as [x|] => //=. + rewrite /funcomp. + by rewrite erase_ren. + - scongruence. + - scongruence. + - move => p A ihA B ihB m ρ. + f_equal. + rewrite +Admitted. + +Lemma prov_par n (u : Tm n) a b : prov u a -> Par.R a b -> prov u b. +Proof. + move => + h. move : u. + elim : n a b /h => //=. - move => n a0 a1 b0 b1 ha iha hb ihb u /=. - simp prov => h h0. - have h1 : hfb (ren_Tm shift u) by eauto using ren_hfb. - move /iha /(_ h1) : h. - move /(prov_morph _ _ (scons b1 VarTm)) /(_ h1). - by asimpl. - - hauto lq:on rew:db:prov. - - hauto lq:on rew:db:prov. - - hauto lq:on rew:db:prov. - - move => n a0 a1 ha iha A B. simp prov. move /iha. - hauto l:on use:prov_ren. - - hauto l:on rew:db:prov. - - simp prov. - - hauto lq:on rew:db:prov. - - hauto l:on rew:db:prov. - - hauto l:on rew:db:prov. - - hauto lq:on rew:db:prov. + simp prov => h. + have [a1' [h0 h1]] : exists a1', ren_Tm shift a1' = erase a1 /\ prov u a1' + by eauto using prov_antiren. + have {h0} : subst_Tm (scons (erase b1) VarTm) (ren_Tm shift a1') = subst_Tm (scons (erase b1) VarTm) (erase a1) by congruence. + asimpl => ?. subst. + move : h1. + have -> : subst_Tm (scons (erase b1) VarTm) (erase a1) = subst_Tm (funcomp erase (scons b1 VarTm)) (erase a1) by admit. + rewrite -erase_subst. + + - hauto lq:on. + - hauto lq:on. + - hauto lq:on. + - hauto l:on use:prov_ren. + - hauto l:on. + - hauto lq:on. + - hauto l:on. - move => n p A0 A1 B0 B1 hA ihA hB ihB u. simp prov. case : u => //=. move => p0 A B [? [h2 h3]]. subst. - move => ?. repeat split => //=; - hauto l:on use:rtc_r rew:db:prov. - - sfirstorder. - - sfirstorder. + repeat split => //=; + hauto l:on use:rtc_r. Qed. -Lemma prov_pars n (u : Tm n) a b : hfb u -> prov u a -> rtc Par.R a b -> prov u b. +Lemma prov_pars n (u : Tm n) a b : prov u a -> rtc Par.R a b -> prov u b. Proof. - induction 3; hauto lq:on ctrs:rtc use:prov_par. + induction 2; hauto lq:on ctrs:rtc use:prov_par. Qed. Definition prov_extract_spec {n} u (a : Tm n) := match u with | TBind p A B => exists A0 B0, extract a = TBind p A0 B0 /\ rtc Par.R A A0 /\ rtc Par.R B B0 | Univ i => extract a = Univ i + | VarTm i => extract a = VarTm i | _ => True end. @@ -1225,7 +1257,9 @@ Lemma prov_extract n u (a : Tm n) : prov u a -> prov_extract_spec u a. Proof. move : u. elim : n / a => //=. + - hauto l:on inv:Tm, extract. - move => n a ih [] //=. + + hauto q:on , prov. + move => p A B /=. simp prov. move /ih {ih}. simpl. @@ -1240,14 +1274,15 @@ Proof. have {}h0 : subst_Tm (scons Bot VarTm) (extract a) = subst_Tm (scons Bot VarTm) (ren_Tm shift (TBind p A1 B1)) by sauto lq:on. move : h0. asimpl. - hauto lq:on rew:db:extract. - + hauto q:on rew:db:extract, prov. - - hauto lq:on rew:off inv:Tm rew:db:prov, extract. + hauto lq:on . + + hauto q:on . + - hauto lq:on rew:off inv:Tm, extract. - move => + + + + + []//=; - hauto lq:on rew:off rew:db:prov, extract. - - hauto inv:Tm l:on rew:db:prov, extract. - - hauto l:on inv:Tm rew:db:prov, extract. - - hauto l:on inv:Tm rew:db:prov, extract. + hauto lq:on rew:off, extract. + - hauto inv:Tm l:on, extract. + - hauto l:on inv:Tm, extract. + - hauto l:on inv:Tm, extract. + - hauto l:on inv:Tm, extract. Qed. Lemma EPar_Par n (a b : Tm n) : EPar.R a b -> Par.R a b. @@ -1623,7 +1658,6 @@ Lemma pars_univ_inv n i (c : Tm n) : Proof. have : prov (Univ i) (Univ i : Tm n) by sfirstorder. move : prov_pars. repeat move/[apply]. - move /(_ ltac:(reflexivity)). by move/prov_extract. Qed. @@ -1634,7 +1668,6 @@ Lemma pars_pi_inv n p (A : Tm n) B C : Proof. have : prov (TBind p A B) (TBind p A B) by sfirstorder. move : prov_pars. repeat move/[apply]. - move /(_ eq_refl). by move /prov_extract. Qed.