@@ -10,6 +10,8 @@ module Function.Endo.Propositional {a} (A : Set a) where
10
10
11
11
open import Algebra using (Semigroup; Magma; RawMagma; Monoid; RawMonoid)
12
12
open import Algebra.Core
13
+ import Algebra.Definitions.RawMonoid as RawMonoidDefinitions
14
+ import Algebra.Properties.Monoid.Mult as MonoidMultProperties
13
15
open import Algebra.Structures using (IsMagma; IsSemigroup; IsMonoid)
14
16
open import Algebra.Morphism
15
17
using (module Definitions ; IsMagmaHomomorphism; IsMonoidHomomorphism)
@@ -19,17 +21,33 @@ open import Data.Nat.Base using (ℕ; zero; suc; _+_; +-rawMagma; +-0-rawMonoid)
19
21
open import Data.Nat.Properties using (+-0-monoid; +-semigroup)
20
22
open import Data.Product.Base using (_,_)
21
23
22
- open import Function.Base using (id; _∘′_; _∋_)
24
+ open import Function.Base using (id; _∘′_; _∋_; flip )
23
25
open import Function.Bundles using (Func; _⟶ₛ_; _⟨$⟩_)
24
26
open import Relation.Binary.Core using (_Preserves_⟶_)
25
27
open import Relation.Binary.PropositionalEquality.Core using (_≡_; refl; cong; cong₂)
26
28
import Relation.Binary.PropositionalEquality.Properties as ≡
27
29
28
30
import Function.Endo.Setoid (≡.setoid A) as Setoid
29
31
32
+ ------------------------------------------------------------------------
33
+ -- Basic type and raw bundles
34
+
30
35
Endo : Set a
31
36
Endo = A → A
32
37
38
+ private
39
+
40
+ _∘_ : Op₂ Endo
41
+ _∘_ = _∘′_
42
+
43
+ ∘-id-rawMonoid : RawMonoid a a
44
+ ∘-id-rawMonoid = record { Carrier = Endo; _≈_ = _≡_ ; _∙_ = _∘_ ; ε = id }
45
+
46
+ open RawMonoid ∘-id-rawMonoid
47
+ using ()
48
+ renaming (rawMagma to ∘-rawMagma)
49
+
50
+
33
51
------------------------------------------------------------------------
34
52
-- Conversion back and forth with the Setoid-based notion of Endomorphism
35
53
@@ -42,32 +60,19 @@ toSetoidEndo f = record
42
60
; cong = cong f
43
61
}
44
62
45
- ------------------------------------------------------------------------
46
- -- N-th composition
47
-
48
- infixr 8 _^_
49
-
50
- _^_ : Endo → ℕ → Endo
51
- f ^ zero = id
52
- f ^ suc n = f ∘′ (f ^ n)
53
-
54
- ^-homo : ∀ f → Homomorphic₂ ℕ Endo _≡_ (f ^_) _+_ _∘′_
55
- ^-homo f zero n = refl
56
- ^-homo f (suc m) n = cong (f ∘′_) (^-homo f m n)
57
-
58
63
------------------------------------------------------------------------
59
64
-- Structures
60
65
61
- ∘-isMagma : IsMagma _≡_ (Op₂ Endo ∋ _∘′_)
66
+ ∘-isMagma : IsMagma _≡_ _∘_
62
67
∘-isMagma = record
63
68
{ isEquivalence = ≡.isEquivalence
64
- ; ∙-cong = cong₂ _∘′ _
69
+ ; ∙-cong = cong₂ _∘_
65
70
}
66
71
67
72
∘-magma : Magma _ _
68
73
∘-magma = record { isMagma = ∘-isMagma }
69
74
70
- ∘-isSemigroup : IsSemigroup _≡_ (Op₂ Endo ∋ _∘′_)
75
+ ∘-isSemigroup : IsSemigroup _≡_ _∘_
71
76
∘-isSemigroup = record
72
77
{ isMagma = ∘-isMagma
73
78
; assoc = λ _ _ _ → refl
@@ -76,7 +81,7 @@ f ^ suc n = f ∘′ (f ^ n)
76
81
∘-semigroup : Semigroup _ _
77
82
∘-semigroup = record { isSemigroup = ∘-isSemigroup }
78
83
79
- ∘-id-isMonoid : IsMonoid _≡_ _∘′ _ id
84
+ ∘-id-isMonoid : IsMonoid _≡_ _∘_ id
80
85
∘-id-isMonoid = record
81
86
{ isSemigroup = ∘-isSemigroup
82
87
; identity = (λ _ → refl) , (λ _ → refl)
@@ -85,24 +90,32 @@ f ^ suc n = f ∘′ (f ^ n)
85
90
∘-id-monoid : Monoid _ _
86
91
∘-id-monoid = record { isMonoid = ∘-id-isMonoid }
87
92
88
- private
89
- ∘-rawMagma : RawMagma a a
90
- ∘-rawMagma = Semigroup.rawMagma ∘-semigroup
93
+ ------------------------------------------------------------------------
94
+ -- n-th iterated composition
91
95
92
- ∘-id-rawMonoid : RawMonoid a a
93
- ∘-id-rawMonoid = Monoid.rawMonoid ∘-id-monoid
96
+ infixr 8 _^_
97
+
98
+ _^_ : Endo → ℕ → Endo
99
+ _^_ = flip _×_ where open RawMonoidDefinitions ∘-id-rawMonoid
94
100
95
101
------------------------------------------------------------------------
96
102
-- Homomorphism
97
103
98
- ^-isMagmaHomomorphism : ∀ f → IsMagmaHomomorphism +-rawMagma ∘-rawMagma (f ^_)
99
- ^-isMagmaHomomorphism f = record
100
- { isRelHomomorphism = record { cong = cong (f ^_) }
101
- ; homo = ^-homo f
102
- }
104
+ module _ (f : Endo) where
103
105
104
- ^-isMonoidHomomorphism : ∀ f → IsMonoidHomomorphism +-0-rawMonoid ∘-id-rawMonoid (f ^_)
105
- ^-isMonoidHomomorphism f = record
106
- { isMagmaHomomorphism = ^-isMagmaHomomorphism f
107
- ; ε-homo = refl
108
- }
106
+ open MonoidMultProperties ∘-id-monoid
107
+
108
+ ^-homo : Homomorphic₂ ℕ Endo _≡_ (f ^_) _+_ _∘_
109
+ ^-homo = ×-homo-+ f
110
+
111
+ ^-isMagmaHomomorphism : IsMagmaHomomorphism +-rawMagma ∘-rawMagma (f ^_)
112
+ ^-isMagmaHomomorphism = record
113
+ { isRelHomomorphism = record { cong = cong (f ^_) }
114
+ ; homo = ^-homo
115
+ }
116
+
117
+ ^-isMonoidHomomorphism : IsMonoidHomomorphism +-0-rawMonoid ∘-id-rawMonoid (f ^_)
118
+ ^-isMonoidHomomorphism = record
119
+ { isMagmaHomomorphism = ^-isMagmaHomomorphism
120
+ ; ε-homo = refl
121
+ }
0 commit comments