{-# OPTIONS --safe --cubical-compatible --guardedness --exact-split --double-check #-}
module ALMA.Cosmos.Carried.Boundaries where
open import Agda.Primitive using (lzero; _⊔_)
open import Agda.Builtin.Sigma using (Σ; _,_)
open import Agda.Builtin.Equality using (_≡_; refl)
open import Data.Product.Base using (_×_)
open import Data.Empty using (⊥)
open import Data.Nat using (ℕ; suc; _≤_)
open import Data.Nat.Properties using
(≤-refl; <⇒≢; n<1+n; suc-injective; m≤n⇒m≤1+n; m≥n⇒m⊓n≡n; ⊓-comm)
open import Data.Fin.Base using (Fin; zero; toℕ; inject₁; fromℕ)
open import Data.Fin.Properties using (toℕ<n; toℕ-inject₁; toℕ-fromℕ; toℕ-injective)
open import Data.Unit.Polymorphic.Base using (tt)
open import Relation.Binary.PropositionalEquality.Core using (cong; trans; sym)
open import Relation.Nullary.Negation using (¬_)
open import ALMA.Base.MCorr using (Sys; FMap)
open Sys
open import ALMA.Cosmos.Carried.DetSys
open import ALMA.Cosmos.Carried.LimitSystem using (n-at)
open import ALMA.Cosmos.Carried.FinProj using (clamp; clamp-val)
Surjective : ∀ {a b} {A : Set a} {B : Set b} → (A → B) → Set (a ⊔ b)
Surjective f = ∀ y → Σ _ λ x → f x ≡ y
inject₁-top-⊥ : ∀ (m : ℕ) (x : Fin (n-at m))
→ inject₁ x ≡ fromℕ (n-at m) → ⊥
inject₁-top-⊥ m x eq = <⇒≢ (toℕ<n x) eq2
where
eq2 : toℕ x ≡ n-at m
eq2 = trans (sym (toℕ-inject₁ x))
(trans (cong toℕ eq) (toℕ-fromℕ (n-at m)))
inject₁-notSurj : ∀ (m : ℕ)
→ ¬ Surjective (inject₁ {n = n-at m})
inject₁-notSurj m surj with surj (fromℕ (n-at m))
... | x , eq = inject₁-top-⊥ m x eq
FMap-u-surjective
: ∀ {i j a b c d} {X : Sys i a b} {Y : Sys j c d}
→ (f : FMap X Y) (x₀ : I X) (a₀ : A X x₀)
→ Surjective (FMap.u f)
FMap-u-surjective f x₀ a₀ v = FMap.childF f x₀ a₀ v
module _ (m : ℕ)
(tm : Fin (n-at m) → Fin (n-at m))
(ts : Fin (n-at (suc m)) → Fin (n-at (suc m)))
where
private
module Src = TrivDet {i = lzero} (Fin (n-at m)) tm
module Tgt = TrivDet {i = lzero} (Fin (n-at (suc m))) ts
no-inject₁-FMap
: ¬ Σ (FMap Src.sys Tgt.sys)
λ f → ∀ x → FMap.u f x ≡ inject₁ x
no-inject₁-FMap (f , eu)
with FMap.childF f zero (tt {lzero}) (fromℕ (n-at m))
... | x' , r = inject₁-top-⊥ m x' (trans (sym (eu x')) r)
private
clamp-is-top : ∀ (k x : ℕ) (ge : k ≤ x) → clamp {k = k} x ≡ fromℕ k
clamp-is-top k x ge =
toℕ-injective
(trans (clamp-val x)
(trans (⊓-comm k x)
(trans (m≥n⇒m⊓n≡n {m = x} {n = k} ge)
(sym (toℕ-fromℕ k)))))
clamp-collapses : ∀ (k : ℕ)
→ Σ ℕ λ x → Σ ℕ λ y
→ (x ≡ y → ⊥) × (clamp {k = k} x ≡ clamp {k = k} y)
clamp-collapses k =
suc k , suc (suc k) , (neq , eq)
where
neq-refl : ∀ n → n ≡ suc n → ⊥
neq-refl n e' = <⇒≢ (n<1+n n) e'
neq : suc k ≡ suc (suc k) → ⊥
neq e = neq-refl k (suc-injective e)
eq : clamp {k = k} (suc k) ≡ clamp {k = k} (suc (suc k))
eq =
trans
(clamp-is-top k (suc k)
(m≤n⇒m≤1+n ≤-refl))
(sym (clamp-is-top k (suc (suc k))
(m≤n⇒m≤1+n (m≤n⇒m≤1+n ≤-refl))))