-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBoolRing.lagda
135 lines (115 loc) · 3.46 KB
/
BoolRing.lagda
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
\begin{code}
module BoolRing where
open import Data.Bool
open import Relation.Binary.PropositionalEquality
open import SemiNearRingRecord
open import SemiRingRecord
open import ClosedSemiRingRecord
open import Algebra.Structures using (IsSemigroup; IsCommutativeMonoid)
assoc : ∀ x y z → (x ∨ y) ∨ z ≡ x ∨ (y ∨ z)
assoc true true true = refl
assoc true true false = refl
assoc true false true = refl
assoc true false false = refl
assoc false true true = refl
assoc false true false = refl
assoc false false true = refl
assoc false false false = refl
+-cong : ∀ {x y u v} → x ≡ y → u ≡ v → x ∨ u ≡ y ∨ v
+-cong refl refl = refl
semigroup : IsSemigroup _≡_ _∨_
semigroup =
record
{ isMagma = record { isEquivalence = isEquivalence
; ∙-cong = +-cong }
; assoc = assoc}
-- identl : ∀ (x : Bool) → x ≡ x
-- identl true = refl
-- identl false = refl
identl : ∀ (x : Bool) → x ∨ false ≡ x
identl false = refl
identl true = refl
comm : ∀ x y → x ∨ y ≡ y ∨ x
comm true true = refl
comm true false = refl
comm false true = refl
comm false false = refl
open import Data.Product using (Σ; _,_)
commMon : IsCommutativeMonoid _≡_ _∨_ false
commMon =
record
{ isMonoid = record { isSemigroup = semigroup
; identity = (λ x → refl) , identl
}
; comm = comm
}
zeror : ∀ x → x ∧ false ≡ false
zeror true = refl
zeror false = refl
_<*>_ : ∀ {x y u v} → x ≡ y → u ≡ v → x ∧ u ≡ y ∧ v
refl <*> refl = refl
idem : ∀ x → x ∨ x ≡ x
idem true = refl
idem false = refl
distl : ∀ x y z → x ∧ (y ∨ z) ≡ (x ∧ y) ∨ (x ∧ z)
distl true true true = refl
distl true true false = refl
distl true false true = refl
distl true false false = refl
distl false true true = refl
distl false true false = refl
distl false false true = refl
distl false false false = refl
distr : ∀ x y z → (y ∨ z) ∧ x ≡ (y ∧ x) ∨ (z ∧ x)
distr true true true = refl
distr true true false = refl
distr true false true = refl
distr true false false = refl
distr false true true = refl
distr false true false = refl
distr false false true = refl
distr false false false = refl
BoolSNR : SemiNearRing
BoolSNR = record
{ s = Bool
; _≃s_ = _≡_
; zers = false
; _+s_ = _∨_
; _*s_ = _∧_
; isCommMon = commMon
; zeroˡ = λ x → refl
; zeroʳ = zeror
; _<*>_ = _<*>_
; idem = idem
; distl = distl
; distr = distr
}
identr : ∀ x → x ∧ true ≡ x
identr true = refl
identr false = refl
assocs : ∀ x y z → (x ∧ y) ∧ z ≡ x ∧ (y ∧ z)
assocs true true true = refl
assocs true true false = refl
assocs true false true = refl
assocs true false false = refl
assocs false true true = refl
assocs false true false = refl
assocs false false true = refl
assocs false false false = refl
BoolSR : SemiRing
BoolSR = record
{ snr = BoolSNR
; ones = true
; *-assocs = assocs
; *-identls = λ x → refl
; *-identrs = identr
}
entire : Bool → Σ Bool (λ c → c ≡ true)
entire true = true , refl
entire false = true , refl
BoolCSR : ClosedSemiRing
BoolCSR = record
{ sr = BoolSR
; entireQ = entire
}
\end{code}