Files
agdaproofs/Sequences.agda
2020-04-19 13:40:22 +01:00

94 lines
4.7 KiB
Agda
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{-# OPTIONS --warning=error --without-K --guardedness --safe #-}
open import LogicalFormulae
open import Numbers.Naturals.Definition
open import Setoids.Setoids
open import Numbers.Naturals.Order
open import Vectors
module Sequences where
record Sequence {a : _} (A : Set a) : Set a where
coinductive
field
head : A
tail : Sequence A
headInjective : {a : _} {A : Set a} {s1 s2 : Sequence A} s1 s2 Sequence.head s1 Sequence.head s2
headInjective {s1 = s1} {.s1} refl = refl
constSequence : {a : _} {A : Set a} (k : A) Sequence A
Sequence.head (constSequence k) = k
Sequence.tail (constSequence k) = constSequence k
index : {a : _} {A : Set a} (s : Sequence A) (n : ) A
index s zero = Sequence.head s
index s (succ n) = index (Sequence.tail s) n
funcToSequence : {a : _} {A : Set a} (f : A) Sequence A
Sequence.head (funcToSequence f) = f 0
Sequence.tail (funcToSequence f) = funcToSequence (λ i f (succ i))
funcToSequenceReversible : {a : _} {A : Set a} (f : A) (n : ) index (funcToSequence f) n f n
funcToSequenceReversible f zero = refl
funcToSequenceReversible f (succ n) = funcToSequenceReversible (λ i f (succ i)) n
map : {a b : _} {A : Set a} {B : Set b} (f : A B) (s : Sequence A) Sequence B
Sequence.head (map f s) = f (Sequence.head s)
Sequence.tail (map f s) = map f (Sequence.tail s)
apply : {a b c : _} {A : Set a} {B : Set b} {C : Set c} (f : A B C) (s1 : Sequence A) (s2 : Sequence B) Sequence C
Sequence.head (apply f s1 s2) = f (Sequence.head s1) (Sequence.head s2)
Sequence.tail (apply f s1 s2) = apply f (Sequence.tail s1) (Sequence.tail s2)
indexAndConst : {a : _} {A : Set a} (a : A) (n : ) index (constSequence a) n a
indexAndConst a zero = refl
indexAndConst a (succ n) = indexAndConst a n
mapTwice : {a b c : _} {A : Set a} {B : Set b} {C : Set c} (f : A B) (g : B C) (s : Sequence A) {n : } index (map g (map f s)) n index (map (λ i g (f i)) s) n
mapTwice f g s {zero} = refl
mapTwice f g s {succ n} = mapTwice f g (Sequence.tail s) {n}
mapAndIndex : {a b : _} {A : Set a} {B : Set b} (s : Sequence A) (f : A B) (n : ) f (index s n) index (map f s) n
mapAndIndex s f zero = refl
mapAndIndex s f (succ n) = mapAndIndex (Sequence.tail s) f n
indexExtensional : {a b c : _} {A : Set a} {B : Set b} (T : Setoid {_} {c} B) (s : Sequence A) (f g : A B) (extension : {x} (Setoid.__ T (f x) (g x))) {n : } Setoid.__ T (index (map f s) n) (index (map g s) n)
indexExtensional T s f g extension {zero} = extension
indexExtensional T s f g extension {succ n} = indexExtensional T (Sequence.tail s) f g extension {n}
indexAndApply : {a b c : _} {A : Set a} {B : Set b} {C : Set c} (s1 : Sequence A) (s2 : Sequence B) (f : A B C) {m : } index (apply f s1 s2) m f (index s1 m) (index s2 m)
indexAndApply s1 s2 f {zero} = refl
indexAndApply s1 s2 f {succ m} = indexAndApply (Sequence.tail s1) (Sequence.tail s2) f {m}
mapAndApply : {a b c d : _} {A : Set a} {B : Set b} {C : Set c} {D : Set d} (s1 : Sequence A) (s2 : Sequence B) (f : A B C) (g : C D) (m : ) index (map g (apply f s1 s2)) m g (f (index s1 m) (index s2 m))
mapAndApply s1 s2 f g zero = refl
mapAndApply s1 s2 f g (succ m) = mapAndApply (Sequence.tail s1) (Sequence.tail s2) f g m
assemble : {a : _} {A : Set a} (x : A) (s : Sequence A) Sequence A
Sequence.head (assemble x s) = x
Sequence.tail (assemble x s) = s
allTrue : {a : _} {A : Set a} {c : _} (pred : A Set c) (s : Sequence A) Set c
allTrue pred s = (n : ) pred (index s n)
tailFrom : {a : _} {A : Set a} (n : ) (s : Sequence A) Sequence A
tailFrom zero s = s
tailFrom (succ n) s = tailFrom n (Sequence.tail s)
subsequence : {a : _} {A : Set a} (x : Sequence A) (indices : Sequence ) ((n : ) index indices n <N index indices (succ n)) Sequence A
Sequence.head (subsequence x selector increasing) = index x (Sequence.head selector)
Sequence.tail (subsequence x selector increasing) = subsequence (tailFrom (succ (Sequence.head selector)) x) (Sequence.tail selector) λ n increasing (succ n)
take : {a : _} {A : Set a} (n : ) (s : Sequence A) Vec A n
take zero s = []
take (succ n) s = Sequence.head s ,- take n (Sequence.tail s)
unfold : {a : _} {A : Set a} (A A) A Sequence A
Sequence.head (unfold f a) = a
Sequence.tail (unfold f a) = unfold f (f a)
indexAndUnfold : {a : _} {A : Set a} (f : A A) (start : A) (n : ) index (unfold f start) (succ n) f (index (unfold f start) n)
indexAndUnfold f s zero = refl
indexAndUnfold f s (succ n) = indexAndUnfold f (f s) n