aboutsummaryrefslogtreecommitdiff
path: root/Data/System/Values.agda
blob: 737e34e1e9004eecf7adca16d3ee9e76487bd898 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
{-# OPTIONS --without-K --safe #-}

open import Algebra.Bundles using (CommutativeMonoid)
open import Level using (0)

module Data.System.Values (A : CommutativeMonoid 0 0) where

import Algebra.Properties.CommutativeMonoid.Sum as Sum
import Data.Vec.Functional.Properties as VecProps
import Relation.Binary.PropositionalEquality as open import Data.Fin using (_↑ˡ_; _↑ʳ_; zero; suc)
open import Data.Nat using (ℕ; _+_; suc)
open import Data.Product using (_,_)
open import Data.Product.Relation.Binary.Pointwise.NonDependent using (_×ₛ_)
open import Data.Setoid using (∣_∣)
open import Data.Vec.Functional as Vec using (Vector; zipWith; replicate)
open import Data.Vec.Functional.Relation.Binary.Equality.Setoid using (≋-setoid)
open import Function using (Func; _⟶ₛ_; _⟨$⟩_; _∘_)
open import Level using (0)
open import Relation.Binary using (Rel; Setoid)

open CommutativeMonoid A renaming (Carrier to Value)
open Func
open Sum A using (sum)

opaque

  Values :   Setoid 0 0  Values = ≋-setoid (≡.setoid Value)

module _ {n : } where

  opaque

    unfolding Values

    merge :  Values n   Value
    merge = sum

    _⊕_ :  Values n    Values n    Values n     xs  ys = zipWith _∙_ xs ys

    <ε> :  Values n     <ε> = replicate n ε

    head :  Values (suc n)   Value
    head xs = xs zero

    tail :  Values (suc n)    Values n     tail xs = xs  suc

  module ≋ = Setoid (Values n)

  _≋_ : Rel  Values n  0  _≋_ = ≋._≈_

  infix 4 _≋_

opaque

  unfolding Values

  [] :  Values 0   [] = Vec.[]

  []-unique : (xs ys :  Values 0 )  xs  ys
  []-unique xs ys ()

module _ {n m : } where

  opaque

    unfolding Values

    _++_ :  Values n    Values m    Values (n + m)     _++_ = Vec._++_

    infixr 5 _++_

    ++-cong
        : (xs xs′ :  Values n )
          {ys ys′ :  Values m }
         xs  xs′
         ys  ys′
         xs ++ ys  xs′ ++ ys′
    ++-cong xs xs′ = VecProps.++-cong xs xs′

    splitₛ : Values (n + m) ⟶ₛ Values n ×ₛ Values m
    to splitₛ v = v  (_↑ˡ m) , v  (n ↑ʳ_)
    cong splitₛ v₁≋v₂ = v₁≋v₂  (_↑ˡ m) , v₁≋v₂  (n ↑ʳ_)

  ++ₛ : Values n ×ₛ Values m ⟶ₛ Values (n + m)
  to ++ₛ (xs , ys) = xs ++ ys
  cong ++ₛ (≗xs , ≗ys) = ++-cong _ _ ≗xs ≗ys