{-# OPTIONS --without-K #-} module Spread.Core (X : Set) where open import Basis module Node where data Node : Set where [] : Node _⌢_ : Node → X → Node infixl 5 _⌢_ ∣_∣ : Node → ℕ ∣ [] ∣ = 0 ∣ U ⌢ x ∣ = suc ∣ U ∣ module ⊢ where _⟨⌢⟩_ : ∀ {U V : Node} {x y} → U ≡ V → x ≡ y → U ⌢ x ≡ V ⌢ y p ⟨⌢⟩ q = ≡.seq (≡.cong (_⌢ _) p) (≡.cong (_ ⌢_) q) module Point where Point : Set Point = ℕ → X head : Point → X head α = α 0 tail : Point → Point tail α = α ∘ suc _<∷_ : X → Point → Point (x <∷ α) zero = x (x <∷ α) (suc i) = α i _≈_ : Point → Point → Set α ≈ β = (i : ℕ) → α i ≡ β i open Node hiding (module ⊢) _<++_ : Node → Point → Point [] <++ α = α (U ⌢ x) <++ α = U <++ (x <∷ α) infixr 3 _<++_ infix 2 _[_] infix 1 _≈_ _[_] : Point → ℕ → Node α [ zero ] = [] α [ suc n ] = (α [ n ]) ⌢ α n module ⊢ where nth-cong : (α β : Point) {i j : ℕ} → α ≈ β → i ≡ j → α i ≡ β j nth-cong α β h q = ≡.seq (≡.cong α q) (h _) take-cong : ∀ {α β m n} → m ≡ n → α ≈ β → (α [ m ]) ≡ (β [ n ]) take-cong {m = zero} p q = ≡.cong (_ [_]) p take-cong {m = (suc m)} p q = (≡.seq (≡.seq (≡.cong (_ ⌢_) (q m)) (≡.cong (_⌢ _) (take-cong refl q))) (≡.cong (_ [_]) p)) su-+-transpose : ∀ m n → suc (n + m) ≡ n + suc m su-+-transpose zero zero = refl su-+-transpose zero (suc n) = ≡.cong suc (su-+-transpose zero n) su-+-transpose (suc m) zero = refl su-+-transpose (suc m) (suc n) = ≡.cong suc (su-+-transpose (suc m) n) nat-+-zero : ∀ n → n + 0 ≡ n nat-+-zero zero = refl nat-+-zero (suc n) = ≡.cong suc (nat-+-zero n) prepend-len : ∀ U n {α} → (U <++ α) (n + ∣ U ∣) ≡ α n prepend-len [] n {α} = ≡.cong α (nat-+-zero n) prepend-len (U ⌢ x) n = ≡.seq (nth-cong (U ⌢ x <++ _) _ (λ _ → refl) (≡.inv (su-+-transpose ∣ U ∣ n))) (prepend-len U (suc n)) prepend-take-len : ∀ U {α} → ((U <++ α) [ ∣ U ∣ ]) ≡ U prepend-take-len [] = refl prepend-take-len (U ⌢ x) = prepend-take-len U Node.⊢.⟨⌢⟩ prepend-len U 0 cons-head-tail-id : ∀ α → α ≈ (head α <∷ tail α) cons-head-tail-id α zero = refl cons-head-tail-id α (suc i) = refl prepend-extensional : ∀ U α β → α ≈ β → U <++ α ≈ U <++ β prepend-extensional [] α β h = h prepend-extensional (U ⌢ x) α β h = prepend-extensional U (x <∷ α) (x <∷ β) λ { zero → refl ; (suc j) → h j } prepend-snoc-id : ∀ U α → (U <++ α) ≈ (U ⌢ head α <++ tail α) prepend-snoc-id U α = prepend-extensional U _ _ (cons-head-tail-id α) module Species where open Node Species : Set₁ Species = Node → Set monotone : Species → Set monotone 𝔄 = {U : Node} {x : X} → 𝔄 U → 𝔄 (U ⌢ x) hereditary : Species → Set hereditary 𝔄 = {U : Node} → (∀ x → 𝔄 (U ⌢ x)) → 𝔄 U _⊑_ : Species → Species → Set 𝔄 ⊑ 𝔅 = ∀ x → 𝔄 x → 𝔅 x open Point public hiding (module ⊢) open Node public hiding (module Node; module ⊢) open Species public