{-# OPTIONS --cubical --safe #-}
open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Function
open import Cubical.Data.Sigma
open import Cubical.Data.Empty hiding (rec)
open import Cubical.Data.Unit
open import Cubical.Data.Sum
open import Cubical.Data.Nat
open import Cubical.Induction.WellFounded
renaming (WellFounded to isWellFounded;
Acc to isAcc;
Rel to BinRel)
open import Cubical.Data.List.Base hiding (rev)
open import Cubical.Data.List.Properties
open import Cubical.Relation.Nullary.Base
open import squier.accessibility
open import squier.graphclosures
open import squier.polygraphs
module squier.newman {ℓ₀ ℓ₁ ℓ₂ : Level} (p : 2-polygraph {ℓ₀} {ℓ₁} {ℓ₂}) where
private variable
ℓ₃ : Level
open polygraph-properties p
hasWB : hasOrder {ℓ₃} → Type _
hasWB (_>_ , _) = ∀ {y x z} (s : x ↝ y) (t : x ↝ z) →
Σ[ u ∈ y ↭* z ]
forall-in-list {ℓ₀ = ℓ₀} (λ a → x > a) (safe-middle (object-list u))
× (mkLocalPeak s t ⇔* u)
hasLC = ∀ {y x z} (s : x ↝ y) (t : x ↝ z) →
Σ[ x' ∈ Σ₀ ]
Σ[ s' ∈ y ↝* x' ]
Σ[ t' ∈ z ↝* x' ]
(mkLocalPeak s t ⇔* mkValley s' t')
hasC = ∀ {y x z} (s : x ↝* y) (t : x ↝* z) →
Σ[ x' ∈ Σ₀ ]
Σ[ s' ∈ y ↝* x' ]
Σ[ t' ∈ z ↝* x' ]
(mkPeak s t ⇔* mkValley s' t')
hasCR = ∀ {y z} (u : y ↭* z) →
Σ[ x' ∈ Σ₀ ]
Σ[ s' ∈ y ↝* x' ]
Σ[ t' ∈ z ↝* x' ]
(u ⇔* mkValley s' t')
module _ (ord : hasOrder {ℓ₃}) (wb : hasWB ord) where
private
_>_ = fst ord
open import squier.listextension Σ₀ (λ x y → y > x)
_<ᴸ⁺_ = TransClosure _<ᴸ_
wb-smaller-aux : ∀ {y x z} (s : x ↝ y) (t : x ↝ z) → (u : y ↭* z)
→ (forall-in-list {ℓ₀ = ℓ₀} (λ a → x > a)
(safe-middle (object-list u)))
→ object-list u <ᴸ⁺ object-list (mkLocalPeak s t)
wb-smaller-aux {y} {x} {.y} s t []ᵗ ∀> =
(stp {x} {[]} {[ y ]} _) ∷⁺ [ (stp {y} {[]} {x ∷ [ y ]} _) ]⁺
wb-smaller-aux {y} {x} {z} s t (u₀ ∷ᵗ u) ∀> =
let
split-u₀u = split-object-list {R = SymClosure _↝_} u₀ u
y-middle-z-<-y-x-z : (y ∷ safe-middle (y ∷ object-list u) ++ [ z ])
<ᴸ⁺ (y ∷ x ∷ z ∷ [])
y-middle-z-<-y-x-z =
[ add {n = y} (stp {x} {safe-middle (y ∷ object-list u)} {[ z ]} ∀>) ]⁺
in
subst (λ v → v <ᴸ⁺ (y ∷ x ∷ z ∷ [])) (sym split-u₀u) y-middle-z-<-y-x-z
wb-smaller : ∀ {y x z} (s : x ↝ y) (t : x ↝ z)
→ object-list (fst (wb s t)) <ᴸ⁺ object-list (mkLocalPeak s t)
wb-smaller {y} {x} {z} s t =
wb-smaller-aux s t (fst (wb s t)) (fst (snd (wb s t)))
module wb2cr {ℓ₃ : Level} (cc : ⇔*isCongrClosed) (ord : hasOrder {ℓ₃})
(noether : isNoetherian ord) (wb : hasWB ord) where
private
_>_ = fst ord
↝2> = snd ord
open import squier.listextension Σ₀ (λ x y → y > x)
_<ᴸ⁺_ = TransClosure _<ᴸ_
P : List Σ₀ → Type _
P l = ∀ {y z} (u : y ↭* z) → l ≡ (object-list u) →
Σ[ x ∈ Σ₀ ]
Σ[ s ∈ y ↝* x ]
Σ[ t ∈ z ↝* x ]
(u ⇔* mkValley s t)
× ((object-list (mkValley s t) <ᴸ⁺ l) ⊎ (u ≡ mkValley s t))
induction : (l : List Σ₀) (ih : ∀ l' → l' <ᴸ⁺ l → P l') → P l
induction l ih {y} {.y} []ᵗ l≡[] = y , []ᵗ , []ᵗ , []ᵗ , inr refl
induction l ih {y} {z} (q ∷ᵗ u) l≡qu
with ih (object-list u)
[ subst (λ ll → object-list u <ᴸ ll) (sym l≡qu) (stp {y} tt*) ]⁺
u refl
induction l ih {y} {z} (q ∷ᵗ u) l≡qu | x , s , t , α , inl st<u =
let
yst<l = subst (λ l' → object-list(q ∷ᵗ mkValley s t) <ᴸ⁺ l')
(sym l≡qu)
(add+ {y} st<u)
(x₁ , s₁ , t₁ , α₁ , s₁t₁<qst-⊎-qst≡s₁t₁) =
ih (object-list (q ∷ᵗ (mkValley s t)))
yst<l
(q ∷ᵗ (mkValley s t))
refl
α-combined =
(q ∷ᵗ u
⇔*⟨ ⇔*cc2ccr cc (q ∷ᵗ []ᵗ) u (mkValley s t) α ⟩
q ∷ᵗ mkValley s t
⇔*⟨ α₁ ⟩
mkValley s₁ t₁
⇔*∎)
s₁t₁<qu =
rec {A = object-list (mkValley s₁ t₁) <ᴸ⁺ object-list (q ∷ᵗ mkValley s t)}
{B = q ∷ᵗ mkValley s t ≡ mkValley s₁ t₁}
{C = object-list (mkValley s₁ t₁) <ᴸ⁺ l}
(λ st<yst → st<yst ++⁺ yst<l)
(λ qst≡s₁t₁ → subst (λ v → object-list v <ᴸ⁺ l) qst≡s₁t₁ yst<l)
s₁t₁<qst-⊎-qst≡s₁t₁
in (x₁ , s₁ , t₁ , α-combined , inl s₁t₁<qu)
induction l ih {y} {z} (inj q ∷ᵗ u) l≡qu | x , s , t , α , inr u≡st =
let
qu⇔*qst = ⇔*cc2ccr cc (inj q ∷ᵗ []ᵗ) u (mkValley s t) α
qu≡qst = cong (λ u' → inj q ∷ᵗ u') u≡st
in
x , q ∷ᵗ s , t , qu⇔*qst , inr qu≡qst
induction l ih {y} {z} (rev q ∷ᵗ u) l≡qu | x , []ᵗ , t , α , inr u≡t =
y , []ᵗ , (t ++ᵗ q ∷ᵗ []ᵗ) , α₁ , inr qu≡qt
where
qu≡qt : (rev q ∷ᵗ u) ≡ embed⁻ (t ++ᵗ q ∷ᵗ []ᵗ)
qu≡qt =
(rev q ∷ᵗ u)
≡⟨ cong (rev q ∷ᵗ_) u≡t ⟩
(rev q ∷ᵗ embed⁻ t)
≡⟨ sym (emb⁻-++ t (q ∷ᵗ []ᵗ)) ⟩
(embed⁻ (t ++ᵗ q ∷ᵗ []ᵗ))
∎
α₁ : (rev q ∷ᵗ u) ⇔* (embed⁻ (t ++ᵗ q ∷ᵗ []ᵗ))
α₁ = ≡→[] qu≡qt
induction l ih {y} {z} (rev q ∷ᵗ u) l≡qu | x , s₀ ∷ᵗ s , t , u⇔*s₀st , inr u≡s₀st =
let
(v , all< , v⇔*qs₀) = wb q s₀
vst = v ++ᵗ mkValley s t
qs₀st⇔*vst : (rev q ∷ᵗ inj s₀ ∷ᵗ (mkValley s t)) ⇔* vst
qs₀st⇔*vst = ⇔*cc2ccl cc (rev q ∷ᵗ inj s₀ ∷ᵗ []ᵗ) v (mkValley s t) v⇔*qs₀
qu⇔*vst : (rev q ∷ᵗ u) ⇔* vst
qu⇔*vst = subst (λ w → (rev q ∷ᵗ w) ⇔* vst) (sym u≡s₀st) qs₀st⇔*vst
vst<qs₀st : object-list vst <ᴸ⁺ object-list (mkLocalPeak q s₀ ++ᵗ mkValley s t)
vst<qs₀st =
let
mod-assoc : ((object-list v) ++ (safe-tail (object-list (mkValley s t))))
<ᴸ⁺
((object-list (mkLocalPeak q s₀)) ++
(safe-tail (object-list (mkValley s t))))
mod-assoc = cc-r {object-list v}
{object-list (mkLocalPeak q s₀)}
{safe-tail (object-list (mkValley s t))}
(wb-smaller ord wb q s₀)
rebracket₁ : ((object-list v) ++ (safe-tail (object-list (mkValley s t))))
<ᴸ⁺
(object-list (mkLocalPeak q s₀ ++ᵗ mkValley s t))
rebracket₁ = subst (λ w → ((object-list v) ++
(safe-tail (object-list (mkValley s t)))) <ᴸ⁺ w)
(sym (obj-++-commute (mkLocalPeak q s₀) (mkValley s t)))
mod-assoc
rebracket₂ : object-list vst <ᴸ⁺ object-list (mkLocalPeak q s₀ ++ᵗ mkValley s t)
rebracket₂ = subst (λ w → w <ᴸ⁺ object-list (mkLocalPeak q s₀ ++ᵗ mkValley s t))
(sym (obj-++-commute v (mkValley s t)))
rebracket₁
in
rebracket₂
vst<l : object-list vst <ᴸ⁺ l
vst<l = subst (λ ll → _ <ᴸ⁺ ll)
(sym (l≡qu ∙ cong (y ∷_) (cong object-list u≡s₀st)))
vst<qs₀st
(x₁ , s₁ , t₁ , vst⇔*s₁t₁ , s₁t₁<vst-⊎-vst≡s₁t₁) =
ih (object-list vst) vst<l vst refl
qu⇔*s₁t₁ : (rev q ∷ᵗ u) ⇔* mkValley s₁ t₁
qu⇔*s₁t₁ = qu⇔*vst ++ᵗ vst⇔*s₁t₁
s₁t₁<l : object-list (mkValley s₁ t₁) <ᴸ⁺ l
s₁t₁<l = rec (λ s₁t₁<vst → s₁t₁<vst ++⁺ vst<l)
(λ vst≡s₁t₁ → subst (λ w → object-list w <ᴸ⁺ l) vst≡s₁t₁ vst<l)
s₁t₁<vst-⊎-vst≡s₁t₁
in
x₁ , s₁ , t₁ , qu⇔*s₁t₁ , inl s₁t₁<l
all-P : (xs : List Σ₀) → P xs
all-P = WFI.induction {_<_ = _<ᴸ⁺_}
(transitive-wellfounded _ _ (isWF⟨<⟩⇒isWF⟨<ᴸ⟩ noether))
{P = P}
induction
cr : hasCR
cr {y} {z} u =
let (x , s , t , α , _) = all-P (object-list u) {y} {z} u refl
in (x , s , t , α)