Finish most of the pi pi case
This commit is contained in:
parent
926c2284a5
commit
3fb6d411e7
2 changed files with 88 additions and 2 deletions
|
@ -685,6 +685,26 @@ Lemma lored_hne_preservation n (a b : PTm n) :
|
||||||
LoRed.R a b -> ishne a -> ishne b.
|
LoRed.R a b -> ishne a -> ishne b.
|
||||||
Proof. induction 1; sfirstorder. Qed.
|
Proof. induction 1; sfirstorder. Qed.
|
||||||
|
|
||||||
|
Lemma lored_nsteps_bind_inv k n p (a0 : PTm n) b0 C :
|
||||||
|
nsteps LoRed.R k (PBind p a0 b0) C ->
|
||||||
|
exists i j a1 b1,
|
||||||
|
i <= k /\ j <= k /\
|
||||||
|
C = PBind p a1 b1 /\
|
||||||
|
nsteps LoRed.R i a0 a1 /\
|
||||||
|
nsteps LoRed.R j b0 b1.
|
||||||
|
Proof.
|
||||||
|
move E : (PBind p a0 b0) => u hu. move : p a0 b0 E.
|
||||||
|
elim : k u C / hu.
|
||||||
|
- sauto lq:on.
|
||||||
|
- move => k a0 a1 a2 ha ha' ih p a3 b0 ?. subst.
|
||||||
|
inversion ha; subst => //=;
|
||||||
|
spec_refl.
|
||||||
|
move : ih => [i][j][a1][b1][?][?][?][h0]h1. subst.
|
||||||
|
exists (S i),j,a1,b1. sauto lq:on solve+:lia.
|
||||||
|
move : ih => [i][j][a1][b1][?][?][?][h0]h1. subst.
|
||||||
|
exists i,(S j),a1,b1. sauto lq:on solve+:lia.
|
||||||
|
Qed.
|
||||||
|
|
||||||
Lemma lored_nsteps_app_inv k n (a0 b0 C : PTm n) :
|
Lemma lored_nsteps_app_inv k n (a0 b0 C : PTm n) :
|
||||||
nsteps LoRed.R k (PApp a0 b0) C ->
|
nsteps LoRed.R k (PApp a0 b0) C ->
|
||||||
ishne a0 ->
|
ishne a0 ->
|
||||||
|
@ -779,6 +799,25 @@ Proof.
|
||||||
repeat split => //=; sfirstorder b:on use:ne_nf.
|
repeat split => //=; sfirstorder b:on use:ne_nf.
|
||||||
Qed.
|
Qed.
|
||||||
|
|
||||||
|
Lemma algo_metric_bind n k p0 (A0 : PTm n) B0 p1 A1 B1 :
|
||||||
|
algo_metric k (PBind p0 A0 B0) (PBind p1 A1 B1) ->
|
||||||
|
p0 = p1 /\ exists j, j < k /\ algo_metric j A0 A1 /\ algo_metric j B0 B1.
|
||||||
|
Proof.
|
||||||
|
move => [i][j][va][vb][h0][h1][h2][h3][h4]h5.
|
||||||
|
move : lored_nsteps_bind_inv h0 => /[apply].
|
||||||
|
move => [i0][i1][a2][b2][?][?][?][ha02]hb02. subst.
|
||||||
|
move : lored_nsteps_bind_inv h1 => /[apply].
|
||||||
|
move => [j0][j1][a3][b3][?][?][?][ha13]hb13. subst.
|
||||||
|
move /EJoin.bind_inj : h4 => [?][hEa]hEb. subst.
|
||||||
|
split => //.
|
||||||
|
exists (k - 1). split. simpl in *; lia.
|
||||||
|
simpl in *.
|
||||||
|
split.
|
||||||
|
- exists i0,j0,a2,a3.
|
||||||
|
repeat split => //=; sfirstorder b:on solve+:lia.
|
||||||
|
- exists i1,j1,b2,b3. sfirstorder b:on solve+:lia.
|
||||||
|
Qed.
|
||||||
|
|
||||||
Lemma algo_metric_join n k (a b : PTm n) :
|
Lemma algo_metric_join n k (a b : PTm n) :
|
||||||
algo_metric k a b ->
|
algo_metric k a b ->
|
||||||
DJoin.R a b.
|
DJoin.R a b.
|
||||||
|
@ -861,10 +900,31 @@ Proof.
|
||||||
* hauto lq:on use:T_AbsBind_Imp.
|
* hauto lq:on use:T_AbsBind_Imp.
|
||||||
* hauto lq:on rew:off use:T_PairBind_Imp.
|
* hauto lq:on rew:off use:T_PairBind_Imp.
|
||||||
* move => p1 A1 B1 p0 A0 B0.
|
* move => p1 A1 B1 p0 A0 B0.
|
||||||
|
move /algo_metric_bind.
|
||||||
|
move => [?][j [ih0 [ih1 ih2]]]_ _. subst.
|
||||||
|
move => Γ A hU0 hU1.
|
||||||
|
move /Bind_Inv : hU0 => [i0 [hA0 [hB0 hS0]]].
|
||||||
|
move /Bind_Inv : hU1 => [i1 [hA1 [hB1 hS1]]].
|
||||||
|
have ? : Γ ⊢ PUniv i0 ≲ PUniv (max i0 i1)
|
||||||
|
by hauto lq:on rew:off use:Su_Univ, wff_mutual solve+:lia.
|
||||||
|
have ? : Γ ⊢ PUniv i1 ≲ PUniv (max i0 i1)
|
||||||
|
by hauto lq:on rew:off use:Su_Univ, wff_mutual solve+:lia.
|
||||||
|
have hA0' : Γ ⊢ A0 ∈ PUniv (max i0 i1) by eauto using T_Conv.
|
||||||
|
have hA1' : Γ ⊢ A1 ∈ PUniv (max i0 i1) by eauto using T_Conv.
|
||||||
|
have ihA : A0 ⇔ A1 by hauto l:on.
|
||||||
|
have hAE : Γ ⊢ A0 ≡ A1 ∈ PUniv (Nat.max i0 i1)
|
||||||
|
by hauto l:on use:coqeq_sound_mutual.
|
||||||
|
apply : CE_HRed; eauto using rtc_refl.
|
||||||
|
constructor => //.
|
||||||
|
admit.
|
||||||
|
(* eapply ih; eauto. *)
|
||||||
|
(* move /Su_Eq in hAE. *)
|
||||||
|
(* apply : ctx_eq_subst_one; eauto. *)
|
||||||
|
|
||||||
(* Show that A0 and A1 are algorithmically equal *)
|
(* Show that A0 and A1 are algorithmically equal *)
|
||||||
(* Use soundness to show that they are actually definitionally equal *)
|
(* Use soundness to show that they are actually definitionally equal *)
|
||||||
(* Use that to show that B0 and B1 can be assigned the same type *)
|
(* Use that to show that B0 and B1 can be assigned the same type *)
|
||||||
admit.
|
(* admit. *)
|
||||||
* move => > /algo_metric_join.
|
* move => > /algo_metric_join.
|
||||||
hauto lq:on use:DJoin.bind_univ_noconf.
|
hauto lq:on use:DJoin.bind_univ_noconf.
|
||||||
+ case : b => //=.
|
+ case : b => //=.
|
||||||
|
@ -877,7 +937,15 @@ Proof.
|
||||||
- move : k a b h fb fa. abstract : hnfneu.
|
- move : k a b h fb fa. abstract : hnfneu.
|
||||||
move => k.
|
move => k.
|
||||||
move => + b.
|
move => + b.
|
||||||
case : b => //=; admit.
|
case : b => //=.
|
||||||
|
(* NeuAbs *)
|
||||||
|
+ admit.
|
||||||
|
(* NeuPair *)
|
||||||
|
+ admit.
|
||||||
|
(* NeuBind: Impossible *)
|
||||||
|
+ admit.
|
||||||
|
(* NeuUniv: Impossible *)
|
||||||
|
+ admit.
|
||||||
- move {ih}.
|
- move {ih}.
|
||||||
move /algo_metric_sym in h.
|
move /algo_metric_sym in h.
|
||||||
qauto l:on use:coqeq_symmetric_mutual.
|
qauto l:on use:coqeq_symmetric_mutual.
|
||||||
|
|
|
@ -1540,6 +1540,17 @@ Module EReds.
|
||||||
hauto q:on ctrs:rtc,ERed.R inv:ERed.R.
|
hauto q:on ctrs:rtc,ERed.R inv:ERed.R.
|
||||||
Qed.
|
Qed.
|
||||||
|
|
||||||
|
Lemma bind_inv n p (A : PTm n) B C :
|
||||||
|
rtc ERed.R (PBind p A B) C ->
|
||||||
|
exists A0 B0, C = PBind p A0 B0 /\ rtc ERed.R A A0 /\ rtc ERed.R B B0.
|
||||||
|
Proof.
|
||||||
|
move E : (PBind p A B) => u hu.
|
||||||
|
move : p A B E.
|
||||||
|
elim : u C / hu.
|
||||||
|
hauto lq:on ctrs:rtc.
|
||||||
|
hauto lq:on rew:off ctrs:rtc, ERed.R inv:ERed.R, rtc.
|
||||||
|
Qed.
|
||||||
|
|
||||||
End EReds.
|
End EReds.
|
||||||
|
|
||||||
#[export]Hint Constructors ERed.R RRed.R EPar.R : red.
|
#[export]Hint Constructors ERed.R RRed.R EPar.R : red.
|
||||||
|
@ -1561,6 +1572,13 @@ Module EJoin.
|
||||||
hauto lq:on rew:off use:EReds.proj_inv.
|
hauto lq:on rew:off use:EReds.proj_inv.
|
||||||
Qed.
|
Qed.
|
||||||
|
|
||||||
|
Lemma bind_inj n p0 p1 (A0 A1 : PTm n) B0 B1 :
|
||||||
|
R (PBind p0 A0 B0) (PBind p1 A1 B1) ->
|
||||||
|
p0 = p1 /\ R A0 A1 /\ R B0 B1.
|
||||||
|
Proof.
|
||||||
|
hauto lq:on rew:off use:EReds.bind_inv.
|
||||||
|
Qed.
|
||||||
|
|
||||||
End EJoin.
|
End EJoin.
|
||||||
|
|
||||||
Module RERed.
|
Module RERed.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue