9
11
open import Function
10
12
open import Function.Equality using (_⟨$⟩_)
11
13
open import Function.Equivalence
12
using (_⇔_; equivalent; module Equivalent)
14
using (_⇔_; equivalence; module Equivalence)
13
15
open import Algebra
14
16
open import Algebra.Structures
15
17
import Algebra.RingSolver.Simple as Solver
16
18
import Algebra.RingSolver.AlmostCommutativeRing as ACR
17
open import Relation.Binary.PropositionalEquality
18
hiding (proof-irrelevance)
20
import Algebra.FunctionProperties as P; open P _≡_
19
open import Relation.Binary.PropositionalEquality as P
20
using (_≡_; _≢_; refl)
22
import Algebra.FunctionProperties as FP; open FP (_≡_ {A = Bool})
21
23
open import Data.Product
22
24
open import Data.Sum
23
25
open import Data.Empty
76
78
isCommutativeSemiring-∨-∧ = record
77
79
{ +-isCommutativeMonoid = record
78
80
{ isSemigroup = record
79
{ isEquivalence = isEquivalence
81
{ isEquivalence = P.isEquivalence
83
; ∙-cong = P.cong₂ _∨_
83
85
; identityˡ = λ _ → refl
86
88
; *-isCommutativeMonoid = record
87
89
{ isSemigroup = record
88
{ isEquivalence = isEquivalence
90
{ isEquivalence = P.isEquivalence
92
; ∙-cong = P.cong₂ _∧_
92
94
; identityˡ = λ _ → refl
137
139
isCommutativeSemiring-∧-∨ = record
138
140
{ +-isCommutativeMonoid = record
139
141
{ isSemigroup = record
140
{ isEquivalence = isEquivalence
142
{ isEquivalence = P.isEquivalence
141
143
; assoc = ∧-assoc
144
; ∙-cong = P.cong₂ _∧_
144
146
; identityˡ = λ _ → refl
147
149
; *-isCommutativeMonoid = record
148
150
{ isSemigroup = record
149
{ isEquivalence = isEquivalence
151
{ isEquivalence = P.isEquivalence
150
152
; assoc = ∨-assoc
153
; ∙-cong = P.cong₂ _∨_
153
155
; identityˡ = λ _ → refl
185
187
not-∧-inverse : Inverse false not _∧_
187
¬x∧x≡⊥ , (λ x → ∧-comm x (not x) ⟨ trans ⟩ ¬x∧x≡⊥ x)
189
¬x∧x≡⊥ , (λ x → ∧-comm x (not x) ⟨ P.trans ⟩ ¬x∧x≡⊥ x)
189
191
¬x∧x≡⊥ : LeftInverse false not _∧_
190
192
¬x∧x≡⊥ false = refl
193
195
not-∨-inverse : Inverse true not _∨_
195
¬x∨x≡⊤ , (λ x → ∨-comm x (not x) ⟨ trans ⟩ ¬x∨x≡⊤ x)
197
¬x∨x≡⊤ , (λ x → ∨-comm x (not x) ⟨ P.trans ⟩ ¬x∨x≡⊤ x)
197
199
¬x∨x≡⊤ : LeftInverse true not _∨_
198
200
¬x∨x≡⊤ false = refl
202
204
isBooleanAlgebra = record
203
205
{ isDistributiveLattice = record
204
206
{ isLattice = record
205
{ isEquivalence = isEquivalence
207
{ isEquivalence = P.isEquivalence
206
208
; ∨-comm = ∨-comm
207
209
; ∨-assoc = ∨-assoc
210
; ∨-cong = P.cong₂ _∨_
209
211
; ∧-comm = ∧-comm
210
212
; ∧-assoc = ∧-assoc
213
; ∧-cong = P.cong₂ _∧_
212
214
; absorptive = absorptive
214
216
; ∨-∧-distribʳ = proj₂ distrib-∨-∧
216
218
; ∨-complementʳ = proj₂ not-∨-inverse
217
219
; ∧-complementʳ = proj₂ not-∧-inverse
220
; ¬-cong = P.cong not
221
223
booleanAlgebra : BooleanAlgebra _ _
236
238
xor-is-ok : ∀ x y → x xor y ≡ (x ∨ y) ∧ not (x ∧ y)
237
239
xor-is-ok true y = refl
238
xor-is-ok false y = sym $ proj₂ CS.*-identity _
240
xor-is-ok false y = P.sym $ proj₂ CS.*-identity _
239
241
where module CS = CommutativeSemiring commutativeSemiring-∨-∧
241
243
commutativeRing-xor-∧ : CommutativeRing _ _
268
270
⇔→≡ : {b₁ b₂ b : Bool} → b₁ ≡ b ⇔ b₂ ≡ b → b₁ ≡ b₂
269
271
⇔→≡ {true } {true } hyp = refl
270
⇔→≡ {true } {false} {true } hyp = sym (Equivalent.to hyp ⟨$⟩ refl)
271
⇔→≡ {true } {false} {false} hyp = Equivalent.from hyp ⟨$⟩ refl
272
⇔→≡ {false} {true } {true } hyp = Equivalent.from hyp ⟨$⟩ refl
273
⇔→≡ {false} {true } {false} hyp = sym (Equivalent.to hyp ⟨$⟩ refl)
272
⇔→≡ {true } {false} {true } hyp = P.sym (Equivalence.to hyp ⟨$⟩ refl)
273
⇔→≡ {true } {false} {false} hyp = Equivalence.from hyp ⟨$⟩ refl
274
⇔→≡ {false} {true } {true } hyp = Equivalence.from hyp ⟨$⟩ refl
275
⇔→≡ {false} {true } {false} hyp = P.sym (Equivalence.to hyp ⟨$⟩ refl)
274
276
⇔→≡ {false} {false} hyp = refl
276
278
T-≡ : ∀ {b} → T b ⇔ b ≡ true
277
T-≡ {false} = equivalent (λ ()) (λ ())
278
T-≡ {true} = equivalent (const refl) (const _)
279
T-≡ {false} = equivalence (λ ()) (λ ())
280
T-≡ {true} = equivalence (const refl) (const _)
280
282
T-∧ : ∀ {b₁ b₂} → T (b₁ ∧ b₂) ⇔ (T b₁ × T b₂)
281
T-∧ {true} {true} = equivalent (const (_ , _)) (const _)
282
T-∧ {true} {false} = equivalent (λ ()) proj₂
283
T-∧ {false} {_} = equivalent (λ ()) proj₁
283
T-∧ {true} {true} = equivalence (const (_ , _)) (const _)
284
T-∧ {true} {false} = equivalence (λ ()) proj₂
285
T-∧ {false} {_} = equivalence (λ ()) proj₁
285
287
T-∨ : ∀ {b₁ b₂} → T (b₁ ∨ b₂) ⇔ (T b₁ ⊎ T b₂)
286
T-∨ {true} {b₂} = equivalent inj₁ (const _)
287
T-∨ {false} {true} = equivalent inj₂ (const _)
288
T-∨ {false} {false} = equivalent inj₁ [ id , id ]
288
T-∨ {true} {b₂} = equivalence inj₁ (const _)
289
T-∨ {false} {true} = equivalence inj₂ (const _)
290
T-∨ {false} {false} = equivalence inj₁ [ id , id ]
290
292
proof-irrelevance : ∀ {b} (p q : T b) → p ≡ q
291
293
proof-irrelevance {true} _ _ = refl