LogRel.Validity.Introductions.Pi

From Coq Require Import ssrbool.
From LogRel Require Import Utils Syntax.All GenericTyping LogicalRelation.
From LogRel.LogicalRelation Require Import Properties.
From LogRel.LogicalRelation.Introductions Require Import Poly Pi.
From LogRel.Validity Require Import Validity Irrelevance Properties Universe Poly ValidityTactics.

Set Universe Polymorphism.
Set Printing Primitive Projection Parameters.

Section PiValidity.

  Context `{GenericTypingProperties}.

  Lemma validΠdom {Γ Γ' F F' G G' l}
    { : [||-v Γ Γ']}
    ( : [Γ ||-v<l> tProd F G tProd F' G' | ]) :
    [Γ ||-v<l> F F' | ].
  Proof.
    constructor; intros ? wfΔ ?? Vσ.
    pose proof ( := validTyExt wfΔ Vσ).
    rewrite 2!subst_prod in .
    now unshelve eapply (instKripke _ (normRedΠ ).(PolyRed.shpRed)).
  Qed.

  Lemma validΠcod {Γ Γ' F F' G G' l}
    { : [||-v Γ Γ']}
    ( : [Γ ||-v<l> tProd F G tProd F' G' | ]) :
    [Γ,, F ||-v<l> G G' | validSnoc (validΠdom )].
  Proof.
    constructor; intros ? wfΔ ?? [Vσ hd].
    pose proof ( := validTyExt wfΔ Vσ).
    rewrite 2!subst_prod in .
    generalize (instKripkeSubst (normRedΠ ).(PolyRed.posRed) _ hd).
    cbn -[wk1]; now rewrite 2!eta_up_single_subst.
  Qed.

  Lemma substSΠ {Γ Γ' F F' G G' t u l}
    { : [||-v Γ Γ']}
    ( : [Γ ||-v<l> tProd F G tProd F' G' | ])
    (Vt : [Γ ||-v<l> t u : F | | validΠdom ]) :
    [_ ||-v<l> G[t..] G'[u..] | ].
  Proof. eapply substS ; tea; eapply validΠcod. Qed.

  Definition PiValid {l Γ Γ' F F' G G'} ( : [||-v Γ Γ'])
    (VF : [Γ ||-v< l > F F' | ])
    (VG : [Γ ,, F ||-v< l > G G' | validSnoc VF]) :
    [Γ ||-v< l > tProd F G tProd F' G' | ].
  Proof.
    constructor; intros; rewrite 2!subst_prod.
    eapply LRPi', substParamRedTy; tea; intros; gtyping.
  Qed.

  Lemma PiValidU {Γ Γ' F F' G G'}
    ( : [||-v Γ Γ'])
    (VF : [ Γ ||-v< one > F F' | ])
    (VΓF := validSnoc VF)
    (VU : [ Γ ||-v< one > U | ])
    (VU' : [ Γ ,, F ||-v< one > U | VΓF ])
    (VFU : [ Γ ||-v< one > F F' : U | | VU ])
    (VGU : [ Γ ,, F ||-v< one > G G' : U | VΓF | VU' ]) :
    [ Γ ||-v< one > tProd F G tProd F' G' : U | | UValid ].
  Proof.
    constructor; intros ? wfΔ0 ?? Vσ.
    pose proof (univValid zero VFU) as VF0.
    pose proof (univValid zero VGU) as VG0.
    pose (v := validSnoc (urefl VF)).
    assert [_ ||-v<one> G G' : _ | _ | UValid v] by irrValid.
    pose proof (Vuσ := liftSubst' VF Vσ).
    pose proof (Vuσ' := liftSubst' (urefl VF) (urefl Vσ)).
    instValid Vuσ'.
    instValid Vuσ; instValid Vσ; escape.
    unshelve econstructor.
    1,2: econstructor; [apply redtmwf_refl; cbn; eapply ty_prod; tea| constructor].
    1: cbn in *; gtyping.
    enough (h : [ Δ ||-< zero > (tProd F G)[σ] (tProd F' G')[σ']]) by exact (cumLR h).
    eapply validTyExt; tea; unshelve eapply PiValid; tea.
    eapply convValidTy; exact VG0.
  Qed.

End PiValidity.