{-# OPTIONS --without-K --safe --guardedness --no-sized-types #-} ----------------------------- -- Generic DTT definitions -- ----------------------------- module dtt where record One : Set where constructor ⋆ -- ⋆ is \star (\st is actually enough for emacs/Agda) {-data One : Set where ⋆ : One -- ⋆ is \star (\st is actually enough for emacs/Agda)-} -- Sigma types open import Agda.Builtin.Sigma public -- Σ is \Sigma -- Pi type: just a synomym that sometimes looks nice with Σ Π : (A : Set) (P : A → Set) → Set -- Π is \Pi Π A P = (x : A) → P x -- cartesian product infixr 1 _×_ _×_ : Set → Set → Set A × B = Σ A (λ _ → B) -- abbreviations Pow : Set → Set₁ Pow X = X → Set Rel : Set → Set → Set₁ Rel X Y = X → Y → Set _⊂_ : {I : Set} → Pow I → Pow I → Set -- ⊂ is \sub (or \subset) _⊂_ {I} U V = {i : I} → U i → V i _==_ : {I : Set} → Pow I → Pow I → Set -- ⊂ is \sub (or \subset) _==_ {I} U V = (U ⊂ V) × (V ⊂ U) _≬_ : {I : Set} → Pow I → Pow I → Set -- ≬ is \between _≬_ {I} U V = Σ I λ i → (U i) × (V i) -- reversing a relation _~ : {X : Set} → {Y : Set} → Rel X Y → Rel Y X (R ~) y x = R x y -- composing relations _•_ : {I₁ : Set} {I₂ : Set} {I₃ : Set} → Rel I₂ I₃ → Rel I₁ I₂ → Rel I₁ I₃ -- • is \bub _•_ {I₁} {I₂} {I₃} R₁ R₂ i₁ i₃ = Σ I₂ (λ i₂ → R₁ i₂ i₃ × R₂ i₁ i₂) -------------------------------------------- -- Interaction systems -- -- They amount to elements of I → Fam²(I) -- -------------------------------------------- record IS (I : Set) : Set₁ where field Command : I → Set Response : (i : I) → Command i → Set next : {i : I} → (c : Command i) → Response i c → I -- extension of an interaction system ⟦_⟧ : {I : Set} → IS I → Pow I → Pow I -- ⟦ is \[[ and ⟧ is \]] ⟦ w ⟧ U i = let open IS w renaming (Command to A ; Response to D ; next to n) in Σ (A i) (λ a → Π (D i a) (λ d → U (n a d))) --------------------------- -- greatest fixed points -- --------------------------- open import Agda.Builtin.Coinduction renaming (∞ to Lazy ; ♯_ to Freeze ; ♭ to Unfreeze) -- I cannot use the following to define greatest fixed points, as the termination -- checker doesn't see the definition is productive... --⟦_⟧ : {I : Set} → IS I → Pow I → Pow I --⟦ w ⟧ U i = let open IS w renaming (Command to A ; Response to D ; next to n) in -- Σ (A i) (λ a → Π (D i a) (λ d → Lazy (U (n a d)))) --ν w i = let open IS w renaming (Command to A ; Response to D ; next to n) in -- Σ (A i) (λ a → Π (D i a) (λ d → Lazy (ν w (n a d)))) data ν {I : Set} (w : IS I) (i : I) : Set where -- ν is \nu Root : (a : IS.Command w i) → ((d : IS.Response w i a) → Lazy (ν w (IS.next w a d))) → ν w i νElim : {I : Set} → {w : IS I} → ν w ⊂ ⟦ w ⟧ (ν w) νElim {I} {w} {i} (Root a l) = ( a , (λ x → Unfreeze (l x)) ) νIntro : {I : Set} → {w : IS I} → (X : Pow I) → (X ⊂ ⟦ w ⟧ X) → {i : I} → (x : X i) → ν w i νIntro {I} {w} X coalg {i} x = let open IS w renaming (Command to A ; Response to D ;next to n) in let a : A i a = fst (coalg x) in let f : (d : D i a) → ν w (n a d) f d = νIntro X coalg {n a d} (snd (coalg x) d) in Root a (λ d → Freeze (f d)) {- record ν {I : Set} (w : IS I) (i : I) : Set where -- ν is \nu coinductive field Root : IS.Command w i Branch : (d : IS.Response w i Root) → ν w (IS.next w Root d) νElim : {I : Set} → {w : IS I} → ν w ⊂ ⟦ w ⟧ (ν w) νElim {I} {w} {i} T = ν.Root T , λ x → ν.Branch T x -- WHY isn't the following accepted ? νIntro : {I : Set} → {w : IS I} → (X : Pow I) → (X ⊂ ⟦ w ⟧ X) → {i : I} → (x : X i) → ν w i ν.Root (νIntro X coalg x) = fst (coalg x) ν.Branch (νIntro X coalg x) d = νIntro X coalg (snd (coalg x) d) -} {- module STREAM (I : Set) where record Stream (i : I) : Set where coinductive field hd : I tl : Stream hd repeat : (i : I) → Stream i Stream.hd (repeat i) = i Stream.tl (repeat i) = repeat {!!} -}