@@ -17,45 +17,48 @@ module Induction where
17
17
18
18
open import Level
19
19
open import Relation.Unary
20
+ open import Relation.Unary.PredicateTransformer using (PT)
20
21
22
+ private
23
+ variable
24
+ a ℓ ℓ₁ ℓ₂ : Level
25
+ A : Set a
26
+ Q : Pred A ℓ
27
+ Rec : PT A A ℓ₁ ℓ₂
28
+
29
+
30
+ ------------------------------------------------------------------------
21
31
-- A RecStruct describes the allowed structure of recursion. The
22
32
-- examples in Data.Nat.Induction should explain what this is all
23
33
-- about.
24
34
25
- RecStruct : ∀ {a} → Set a → (ℓ₁ ℓ₂ : Level) → Set _
26
- RecStruct A ℓ₁ ℓ₂ = Pred A ℓ₁ → Pred A ℓ₂
35
+ RecStruct : Set a → (ℓ₁ ℓ₂ : Level) → Set _
36
+ RecStruct A = PT A A
27
37
28
38
-- A recursor builder constructs an instance of a recursion structure
29
39
-- for a given input.
30
40
31
- RecursorBuilder : ∀ {a ℓ₁ ℓ₂} {A : Set a} → RecStruct A ℓ₁ ℓ₂ → Set _
41
+ RecursorBuilder : RecStruct A ℓ₁ ℓ₂ → Set _
32
42
RecursorBuilder Rec = ∀ P → Rec P ⊆′ P → Universal (Rec P)
33
43
34
44
-- A recursor can be used to actually compute/prove something useful.
35
45
36
- Recursor : ∀ {a ℓ₁ ℓ₂} {A : Set a} → RecStruct A ℓ₁ ℓ₂ → Set _
46
+ Recursor : RecStruct A ℓ₁ ℓ₂ → Set _
37
47
Recursor Rec = ∀ P → Rec P ⊆′ P → Universal P
38
48
39
49
-- And recursors can be constructed from recursor builders.
40
50
41
- build : ∀ {a ℓ₁ ℓ₂} {A : Set a} {Rec : RecStruct A ℓ₁ ℓ₂} →
42
- RecursorBuilder Rec →
43
- Recursor Rec
51
+ build : RecursorBuilder Rec → Recursor Rec
44
52
build builder P f x = f x (builder P f x)
45
53
46
54
-- We can repeat the exercise above for subsets of the type we are
47
55
-- recursing over.
48
56
49
- SubsetRecursorBuilder : ∀ {a ℓ₁ ℓ₂ ℓ₃} {A : Set a} →
50
- Pred A ℓ₁ → RecStruct A ℓ₂ ℓ₃ → Set _
57
+ SubsetRecursorBuilder : Pred A ℓ → RecStruct A ℓ₁ ℓ₂ → Set _
51
58
SubsetRecursorBuilder Q Rec = ∀ P → Rec P ⊆′ P → Q ⊆′ Rec P
52
59
53
- SubsetRecursor : ∀ {a ℓ₁ ℓ₂ ℓ₃} {A : Set a} →
54
- Pred A ℓ₁ → RecStruct A ℓ₂ ℓ₃ → Set _
60
+ SubsetRecursor : Pred A ℓ → RecStruct A ℓ₁ ℓ₂ → Set _
55
61
SubsetRecursor Q Rec = ∀ P → Rec P ⊆′ P → Q ⊆′ P
56
62
57
- subsetBuild : ∀ {a ℓ₁ ℓ₂ ℓ₃}
58
- {A : Set a} {Q : Pred A ℓ₁} {Rec : RecStruct A ℓ₂ ℓ₃} →
59
- SubsetRecursorBuilder Q Rec →
60
- SubsetRecursor Q Rec
63
+ subsetBuild : SubsetRecursorBuilder Q Rec → SubsetRecursor Q Rec
61
64
subsetBuild builder P f x q = f x (builder P f x q)
0 commit comments