« Home

Streams and finite observations [ag-000D]

From Topology via logic
{-# OPTIONS --safe --without-K --guardedness --no-exact-split #-}
module ag-000D where

open import MLTT.Spartan
open import MLTT.List

Stream can be defined as a coinductive record.

record Stream (A : 𝓤 ̇ ) : 𝓤 ̇ where
  coinductive
  constructor _∷_
  field
    head : A
    tail : Stream A

open Stream

For example a stream of all zero.

zeros : Stream 𝟚
head zeros = 
tail zeros = zeros

s ⊨starts o defines a relation that a stream can be realized by a finite observation.

_⊨starts_ : Stream 𝟚  List 𝟚  𝓤₀ ̇
s ⊨starts [] =   
s ⊨starts (x  xs) = (x  head s) × (tail s ⊨starts xs)

For example, the first bit zeros produces is .

first-bit : zeros ⊨starts [  ]
first-bit = refl , refl

Every stream can be realized by “no” observation.

realize-by-no-observation : (s : Stream 𝟚)  s ⊨starts []
realize-by-no-observation s = refl

We can define order relation for these finite observations.

_⊇_ : List 𝟚  List 𝟚  𝓤₀ ̇
_  [] =   
[]  _ = 𝟘
(x  l)  (x₁  l2) = (x  x₁) × (l  l2)

This order has antisymmetric

eq-condition : (l1 l2 : List 𝟚)  l1  l2  l2  l1  l1  l2
eq-condition [] [] p q = refl
eq-condition (x  l1) (y  l2) (ph , pt) (qh , qt) =
  x  l1 =⟨ ap (_∷ l1) ph 
  y  l1 =⟨ ap (y ∷_) (eq-condition l1 l2 pt qt) 
  y  l2 

, in fact total, which means a boring order. The order induces refinement of observations: if a observation is subsequence of another observation that realise the stream, then the stream also be realized by this subsequence.

refine-observation : {s : Stream 𝟚}  (l l2 : List 𝟚)  s ⊨starts l  l  l2  s ⊨starts l2
refine-observation l2 [] _ _ = refl
refine-observation (x  l) (y  l2) (x=head , tail) (x=y , rest) =
  (x=y ⁻¹  x=head) , refine-observation l l2 tail rest