@@ -12,15 +12,16 @@ open import Data.List.Base hiding (_++_)
12
12
import Data.List.Properties as Lₚ
13
13
open import Data.Nat as ℕ using (ℕ; zero; suc)
14
14
open import Data.Product
15
+ import Data.Product.Properties as Product
15
16
open import Data.Maybe.Base using (Maybe; just; nothing)
17
+ open import Data.String as String using (String)
16
18
open import Reflection.Abstraction
17
19
open import Reflection.Argument
18
20
open import Reflection.Argument.Information using (visibility)
19
21
import Reflection.Argument.Visibility as Visibility; open Visibility.Visibility
20
22
import Reflection.Literal as Literal
21
23
import Reflection.Meta as Meta
22
24
open import Reflection.Name as Name using (Name)
23
- import Reflection.Pattern as Pattern
24
25
open import Relation.Nullary
25
26
open import Relation.Nullary.Product using (_×-dec_)
26
27
open import Relation.Nullary.Decidable as Dec
@@ -31,17 +32,21 @@ open import Relation.Binary.PropositionalEquality
31
32
-- Re-exporting the builtin type and constructors
32
33
33
34
open import Agda.Builtin.Reflection as Builtin public
34
- using (Sort; Type; Term; Clause)
35
+ using (Sort; Type; Term; Clause; Pattern )
35
36
open Sort public
36
37
open Term public renaming (agda-sort to sort)
37
38
open Clause public
39
+ open Pattern public
38
40
39
41
------------------------------------------------------------------------
40
42
-- Handy synonyms
41
43
42
44
Clauses : Set
43
45
Clauses = List Clause
44
46
47
+ Telescope : Set
48
+ Telescope = List (String × Arg Type)
49
+
45
50
-- Pattern synonyms for more compact presentation
46
51
47
52
pattern vLam s t = lam visible (abs s t)
@@ -81,31 +86,42 @@ suc i ⋯⟅∷⟆ xs = unknown ⟅∷⟆ (i ⋯⟅∷⟆ xs)
81
86
------------------------------------------------------------------------
82
87
-- Decidable equality
83
88
84
- clause-injective₁ : ∀ {ps ps′ b b′} → clause ps b ≡ clause ps′ b′ → ps ≡ ps ′
89
+ clause-injective₁ : ∀ {tel tel′ ps ps′ b b′} → clause tel ps b ≡ clause tel′ ps′ b′ → tel ≡ tel ′
85
90
clause-injective₁ refl = refl
86
91
87
- clause-injective₂ : ∀ {ps ps′ b b′} → clause ps b ≡ clause ps′ b′ → b ≡ b ′
92
+ clause-injective₂ : ∀ {tel tel′ ps ps′ b b′} → clause tel ps b ≡ clause tel′ ps′ b′ → ps ≡ ps ′
88
93
clause-injective₂ refl = refl
89
94
90
- clause-injective : ∀ {ps ps′ b b′} → clause ps b ≡ clause ps′ b′ → ps ≡ ps′ × b ≡ b′
91
- clause-injective = < clause-injective₁ , clause-injective₂ >
95
+ clause-injective₃ : ∀ {tel tel′ ps ps′ b b′} → clause tel ps b ≡ clause tel′ ps′ b′ → b ≡ b′
96
+ clause-injective₃ refl = refl
97
+
98
+ clause-injective : ∀ {tel tel′ ps ps′ b b′} → clause tel ps b ≡ clause tel′ ps′ b′ → tel ≡ tel′ × ps ≡ ps′ × b ≡ b′
99
+ clause-injective = < clause-injective₁ , < clause-injective₂ , clause-injective₃ > >
100
+
101
+ absurd-clause-injective₁ : ∀ {tel tel′ ps ps′} → absurd-clause tel ps ≡ absurd-clause tel′ ps′ → tel ≡ tel′
102
+ absurd-clause-injective₁ refl = refl
103
+
104
+ absurd-clause-injective₂ : ∀ {tel tel′ ps ps′} → absurd-clause tel ps ≡ absurd-clause tel′ ps′ → ps ≡ ps′
105
+ absurd-clause-injective₂ refl = refl
92
106
93
- absurd-clause-injective : ∀ {ps ps′} → absurd-clause ps ≡ absurd-clause ps′ → ps ≡ ps′
94
- absurd-clause-injective refl = refl
107
+ absurd-clause-injective : ∀ {tel tel′ ps ps′} → absurd-clause tel ps ≡ absurd-clause tel′ ps′ → tel ≡ tel′ × ps ≡ ps′
108
+ absurd-clause-injective = < absurd-clause-injective₁ , absurd-clause-injective₂ >
95
109
96
110
infix 4 _≟-AbsTerm_ _≟-AbsType_ _≟-ArgTerm_ _≟-ArgType_ _≟-Args_
97
111
_≟-Clause_ _≟-Clauses_ _≟_
98
- _≟-Sort_
99
-
100
- _≟-AbsTerm_ : DecidableEquality (Abs Term)
101
- _≟-AbsType_ : DecidableEquality (Abs Type)
102
- _≟-ArgTerm_ : DecidableEquality (Arg Term)
103
- _≟-ArgType_ : DecidableEquality (Arg Type)
104
- _≟-Args_ : DecidableEquality (Args Term)
105
- _≟-Clause_ : DecidableEquality Clause
106
- _≟-Clauses_ : DecidableEquality Clauses
107
- _≟_ : DecidableEquality Term
108
- _≟-Sort_ : DecidableEquality Sort
112
+ _≟-Sort_ _≟-Pattern_ _≟-Patterns_
113
+
114
+ _≟-AbsTerm_ : DecidableEquality (Abs Term)
115
+ _≟-AbsType_ : DecidableEquality (Abs Type)
116
+ _≟-ArgTerm_ : DecidableEquality (Arg Term)
117
+ _≟-ArgType_ : DecidableEquality (Arg Type)
118
+ _≟-Args_ : DecidableEquality (Args Term)
119
+ _≟-Clause_ : DecidableEquality Clause
120
+ _≟-Clauses_ : DecidableEquality Clauses
121
+ _≟_ : DecidableEquality Term
122
+ _≟-Sort_ : DecidableEquality Sort
123
+ _≟-Patterns_ : Decidable (_≡_ {A = Args Pattern})
124
+ _≟-Pattern_ : Decidable (_≡_ {A = Pattern})
109
125
110
126
-- Decidable equality 'transformers'
111
127
-- We need to inline these because the terms are not sized so termination
@@ -127,27 +143,38 @@ arg i a ≟-ArgType arg i′ a′ = unArg-dec (a ≟ a′)
127
143
[] ≟-Clauses (_ ∷ _) = no λ ()
128
144
(_ ∷ _) ≟-Clauses [] = no λ ()
129
145
130
-
131
- clause ps b ≟-Clause clause ps′ b′ =
132
- Dec.map′ (uncurry (cong₂ clause)) clause-injective (ps Pattern.≟s ps′ ×-dec b ≟ b′)
133
- absurd-clause ps ≟-Clause absurd-clause ps′ =
134
- Dec.map′ (cong absurd-clause) absurd-clause-injective (ps Pattern.≟s ps′)
135
- clause _ _ ≟-Clause absurd-clause _ = no λ ()
136
- absurd-clause _ ≟-Clause clause _ _ = no λ ()
137
-
138
- var-injective₁ : ∀ {x x′ args args′} → var x args ≡ var x′ args′ → x ≡ x′
146
+ _≟-Telescope_ : DecidableEquality Telescope
147
+ [] ≟-Telescope [] = yes refl
148
+ ((x , t) ∷ tel) ≟-Telescope ((x′ , t′) ∷ tel′) = Lₚ.∷-dec
149
+ (map′ (uncurry (cong₂ _,_)) Product.,-injective ((x String.≟ x′) ×-dec (t ≟-ArgTerm t′)))
150
+ (tel ≟-Telescope tel′)
151
+ [] ≟-Telescope (_ ∷ _) = no λ ()
152
+ (_ ∷ _) ≟-Telescope [] = no λ ()
153
+
154
+ clause tel ps b ≟-Clause clause tel′ ps′ b′ =
155
+ Dec.map′ (λ (tel≡tel′ , ps≡ps′ , b≡b′) → cong₂ (uncurry clause) (cong₂ _,_ tel≡tel′ ps≡ps′) b≡b′)
156
+ clause-injective
157
+ (tel ≟-Telescope tel′ ×-dec ps ≟-Patterns ps′ ×-dec b ≟ b′)
158
+ absurd-clause tel ps ≟-Clause absurd-clause tel′ ps′ =
159
+ Dec.map′ (uncurry (cong₂ absurd-clause))
160
+ absurd-clause-injective
161
+ (tel ≟-Telescope tel′ ×-dec ps ≟-Patterns ps′)
162
+ clause _ _ _ ≟-Clause absurd-clause _ _ = no λ ()
163
+ absurd-clause _ _ ≟-Clause clause _ _ _ = no λ ()
164
+
165
+ var-injective₁ : ∀ {x x′ args args′} → Term.var x args ≡ var x′ args′ → x ≡ x′
139
166
var-injective₁ refl = refl
140
167
141
- var-injective₂ : ∀ {x x′ args args′} → var x args ≡ var x′ args′ → args ≡ args′
168
+ var-injective₂ : ∀ {x x′ args args′} → Term. var x args ≡ var x′ args′ → args ≡ args′
142
169
var-injective₂ refl = refl
143
170
144
171
var-injective : ∀ {x x′ args args′} → var x args ≡ var x′ args′ → x ≡ x′ × args ≡ args′
145
172
var-injective = < var-injective₁ , var-injective₂ >
146
173
147
- con-injective₁ : ∀ {c c′ args args′} → con c args ≡ con c′ args′ → c ≡ c′
174
+ con-injective₁ : ∀ {c c′ args args′} → Term. con c args ≡ con c′ args′ → c ≡ c′
148
175
con-injective₁ refl = refl
149
176
150
- con-injective₂ : ∀ {c c′ args args′} → con c args ≡ con c′ args′ → args ≡ args′
177
+ con-injective₂ : ∀ {c c′ args args′} → Term. con c args ≡ con c′ args′ → args ≡ args′
151
178
con-injective₂ refl = refl
152
179
153
180
con-injective : ∀ {c c′ args args′} → con c args ≡ con c′ args′ → c ≡ c′ × args ≡ args′
@@ -329,3 +356,69 @@ lit _ ≟-Sort set _ = no λ()
329
356
lit _ ≟-Sort unknown = no λ ()
330
357
unknown ≟-Sort set _ = no λ ()
331
358
unknown ≟-Sort lit _ = no λ ()
359
+
360
+
361
+ pat-con-injective₁ : ∀ {c c′ args args′} → Pattern.con c args ≡ con c′ args′ → c ≡ c′
362
+ pat-con-injective₁ refl = refl
363
+
364
+ pat-con-injective₂ : ∀ {c c′ args args′} → Pattern.con c args ≡ con c′ args′ → args ≡ args′
365
+ pat-con-injective₂ refl = refl
366
+
367
+ pat-con-injective : ∀ {c c′ args args′} → Pattern.con c args ≡ con c′ args′ → c ≡ c′ × args ≡ args′
368
+ pat-con-injective = < pat-con-injective₁ , pat-con-injective₂ >
369
+
370
+ pat-var-injective : ∀ {x y} → var x ≡ var y → x ≡ y
371
+ pat-var-injective refl = refl
372
+
373
+ pat-lit-injective : ∀ {x y} → Pattern.lit x ≡ lit y → x ≡ y
374
+ pat-lit-injective refl = refl
375
+
376
+ proj-injective : ∀ {x y} → proj x ≡ proj y → x ≡ y
377
+ proj-injective refl = refl
378
+
379
+ dot-injective : ∀ {x y} → dot x ≡ dot y → x ≡ y
380
+ dot-injective refl = refl
381
+
382
+ con c ps ≟-Pattern con c′ ps′ = Dec.map′ (uncurry (cong₂ con)) pat-con-injective (c Name.≟ c′ ×-dec ps ≟-Patterns ps′)
383
+ var x ≟-Pattern var x′ = Dec.map′ (cong var) pat-var-injective (x ℕ.≟ x′)
384
+ lit l ≟-Pattern lit l′ = Dec.map′ (cong lit) pat-lit-injective (l Literal.≟ l′)
385
+ proj a ≟-Pattern proj a′ = Dec.map′ (cong proj) proj-injective (a Name.≟ a′)
386
+ dot t ≟-Pattern dot t′ = Dec.map′ (cong dot) dot-injective (t ≟ t′)
387
+
388
+ con x x₁ ≟-Pattern dot x₂ = no (λ ())
389
+ con x x₁ ≟-Pattern var x₂ = no (λ ())
390
+ con x x₁ ≟-Pattern lit x₂ = no (λ ())
391
+ con x x₁ ≟-Pattern proj x₂ = no (λ ())
392
+ con x x₁ ≟-Pattern absurd = no (λ ())
393
+ dot x ≟-Pattern con x₁ x₂ = no (λ ())
394
+ dot x ≟-Pattern var x₁ = no (λ ())
395
+ dot x ≟-Pattern lit x₁ = no (λ ())
396
+ dot x ≟-Pattern proj x₁ = no (λ ())
397
+ dot x ≟-Pattern absurd = no (λ ())
398
+ var s ≟-Pattern con x x₁ = no (λ ())
399
+ var s ≟-Pattern dot x = no (λ ())
400
+ var s ≟-Pattern lit x = no (λ ())
401
+ var s ≟-Pattern proj x = no (λ ())
402
+ var s ≟-Pattern absurd = no (λ ())
403
+ lit x ≟-Pattern con x₁ x₂ = no (λ ())
404
+ lit x ≟-Pattern dot x₁ = no (λ ())
405
+ lit x ≟-Pattern var _ = no (λ ())
406
+ lit x ≟-Pattern proj x₁ = no (λ ())
407
+ lit x ≟-Pattern absurd = no (λ ())
408
+ proj x ≟-Pattern con x₁ x₂ = no (λ ())
409
+ proj x ≟-Pattern dot x₁ = no (λ ())
410
+ proj x ≟-Pattern var _ = no (λ ())
411
+ proj x ≟-Pattern lit x₁ = no (λ ())
412
+ proj x ≟-Pattern absurd = no (λ ())
413
+ absurd ≟-Pattern con x x₁ = no (λ ())
414
+ absurd ≟-Pattern dot x₁ = no (λ ())
415
+ absurd ≟-Pattern var _ = no (λ ())
416
+ absurd ≟-Pattern lit x = no (λ ())
417
+ absurd ≟-Pattern proj x = no (λ ())
418
+ absurd ≟-Pattern absurd = yes refl
419
+
420
+ [] ≟-Patterns [] = yes refl
421
+ (arg i p ∷ xs) ≟-Patterns (arg j q ∷ ys) = Lₚ.∷-dec (unArg-dec (p ≟-Pattern q)) (xs ≟-Patterns ys)
422
+
423
+ [] ≟-Patterns (_ ∷ _) = no λ ()
424
+ (_ ∷ _) ≟-Patterns [] = no λ ()
0 commit comments