Compare commits

...
Sign in to create a new pull request.

5 commits

Author SHA1 Message Date
d8e040b2a6 Save 2025-01-04 19:26:18 -05:00
Yiyun Liu
7ffb8a912d Add some todos 2025-01-04 01:48:31 -05:00
Yiyun Liu
68207eb3bd Add a possible fix 2025-01-04 01:40:38 -05:00
Yiyun Liu
162db5296f Stuck 2025-01-04 01:31:02 -05:00
Yiyun Liu
f699ce2d4f Add prov_antiren 2025-01-04 00:45:42 -05:00

View file

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