У меня есть определение Коната в Агде (на самом деле это определение в кубической библиотеке ).Я пытаюсь показать, что связанная F-коалгебра является (Homotopy-) терминальной.
Мне удалось доказать существование F-коалгебры Homomorphsim в коалгебре Коната, но я борюсь с аспектом уникальности.it.
Для конкретности функтор F
имеет вид:
F : Set → Set
F X = Unit ⊎ X
Conat / Base.agda
{-# OPTIONS --cubical --safe --guardedness #-}
module Cubical.Codata.Conat.Base where
open import Cubical.Data.Unit
open import Cubical.Data.Sum
open import Cubical.Core.Everything
record Conat : Set
Conat′ = Unit ⊎ Conat
record Conat where
coinductive
constructor conat′
field force : Conat′
open Conat public
pattern zero = inl tt
pattern suc n = inr n
conat : Conat′ → Conat
force (conat a) = a
succ : Conat → Conat
force (succ a) = suc a
succ′ : Conat′ → Conat′
succ′ n = suc λ where .force → n
pred′ : Conat′ → Conat′
pred′ zero = zero
pred′ (suc x) = force x
pred′′ : Conat′ → Conat
force (pred′′ zero) = zero
pred′′ (suc x) = x
pred : Conat → Conat
force (pred x) = pred′ (force x)
Conat / Properties.agda (изменен, чтобы удалить irreleventвот где мой код)
{-# OPTIONS --cubical --safe --guardedness #-}
module Cubical.Codata.Conat.Properties where
open import Cubical.Data.Unit
open import Cubical.Data.Sum
open import Cubical.Data.Empty
import Cubical.Data.DecreasingBinarySequence
import Cubical.Data.Nat
import Cubical.Data.Bool
open import Cubical.Core.Everything
open import Cubical.Foundations.Equiv
open import Cubical.Foundations.Path
open import Cubical.Foundations.Function
open import Cubical.Relation.Nullary
open import Cubical.Relation.Nullary.DecidableEq
open import Cubical.Codata.Conat.Base
module F-Coalgebra where
-- definition of our functor F and Coalgebra stuff
F : Set → Set
F X = Unit ⊎ X
F-map : {A B : Set} → (A → B) → (F A → F B)
F-map f (inl tt) = inl tt
F-map f (inr x) = inr (f x)
F-Coalgebra : Set₁
F-Coalgebra = Σ[ C ∈ Set ] (C → F C)
coalgebraHomomorphism : (X Y : F-Coalgebra) → Set
coalgebraHomomorphism (C , sc) (D , sd) = Σ[ f ∈ (C → D) ] F-map f ∘ sc ≡ sd ∘ f
isTerminalCoalgebra : F-Coalgebra → Set₁
isTerminalCoalgebra X = (Y : F-Coalgebra) → (isContr (coalgebraHomomorphism Y X))
-- operations on Conat that might be useful
module coit {S : Set} where
coit : (S → F S) → S → Conat
coit′ : (S → F S) → F S → Conat′
coit f s .force = coit′ f (f s)
coit′ f (inl tt) = zero
coit′ f (inr x) = suc (coit f x)
-- this needs a proper name
yesy : (sc : S → F S) → F-map (coit sc) ≡ coit′ sc
yesy sc i (inl tt) = zero
yesy sc i (suc x) = suc (coit sc x)
coitSpec : (sc : S → F S) → (s : S) → F-map (coit sc) (sc s) ≡ force (coit sc s)
coitSpec sc s i = yesy sc i (sc s)
inF : F Conat → Conat
inF x .force = x
ioF : (x : Conat) → inF (force x) ≡ x
ioF x i .force = refl {x = force x} i
caseF : (P : Conat → Set) → ((t : F Conat) → P (inF t)) → (x : Conat) → P x
caseF P p x = subst P (ioF x) (p (force x))
-- The specific Conat F-Coalgebra
ConatCoalgebra : F-Coalgebra
ConatCoalgebra = Conat , force
ConatCoalgebraTerminal : isTerminalCoalgebra ConatCoalgebra
ConatCoalgebraTerminal (C , sc) = (coit.coit sc , λ i s → coit.coitSpec sc s i)
, {!!} -- notice the hole here, this is where I'm having trouble
-- proving the type of morphsisms is contractible
Конкретное место, в котором у меня возникли проблемы, отмечено дырой в конце второго файла.Определение isContr
:
isContr : Set ℓ → Set ℓ
isContr A = Σ[ x ∈ A ] (∀ y → x ≡ y)
Поскольку я использую кубический режим, можно показать, что равенство (фактически пути) совпадает с бисимуляцией.Я думаю, что это как-то дает мне коиндукцию, но я не знаю, как.
Также есть доказательства того, что Conat
является hSet, который может или не может быть полезен для доказательства.