Skip to content

Commit 6b0f13d

Browse files
authored
Update decidable equality of reflected syntax (#1226)
1 parent 9bf613b commit 6b0f13d

File tree

4 files changed

+164
-120
lines changed

4 files changed

+164
-120
lines changed

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ matrix:
5656
cd ../ &&
5757
git clone https://github.com/agda/agda &&
5858
cd agda &&
59-
git checkout c2d5ec4b2403c68d615b81258d6131774e492797 &&
59+
git checkout e9007b49996e041760fee0b4e44ac10f2721d22c &&
6060
cabal install --only-dependencies --dry -v > $HOME/installplan.txt ;
6161
fi
6262

src/Reflection/Pattern.agda

Lines changed: 14 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ module Reflection.Pattern where
1010

1111
open import Data.List.Base hiding (_++_)
1212
open import Data.List.Properties
13+
import Data.Nat as Nat
1314
open import Data.Product
1415
open import Data.String as String using (String; braces; parens; _++_; _<+>_)
1516
import Reflection.Literal as Literal
@@ -32,69 +33,16 @@ open import Agda.Builtin.Reflection public using (Pattern)
3233
open Pattern public
3334

3435
------------------------------------------------------------------------
35-
-- Decidable equality
36-
37-
con-injective₁ : {c c′ args args′} con c args ≡ con c′ args′ c ≡ c′
38-
con-injective₁ refl = refl
39-
40-
con-injective₂ : {c c′ args args′} con c args ≡ con c′ args′ args ≡ args′
41-
con-injective₂ refl = refl
42-
43-
con-injective : {c c′ args args′} con c args ≡ con c′ args′ c ≡ c′ × args ≡ args′
44-
con-injective = < con-injective₁ , con-injective₂ >
45-
46-
var-injective : {x y} var x ≡ var y x ≡ y
47-
var-injective refl = refl
48-
49-
lit-injective : {x y} Pattern.lit x ≡ lit y x ≡ y
50-
lit-injective refl = refl
51-
52-
proj-injective : {x y} proj x ≡ proj y x ≡ y
53-
proj-injective refl = refl
54-
55-
_≟s_ : Decidable (_≡_ {A = Args Pattern})
56-
_≟_ : Decidable (_≡_ {A = Pattern})
57-
58-
con c ps ≟ con c′ ps′ = Dec.map′ (uncurry (cong₂ con)) con-injective (c Name.≟ c′ ×-dec ps ≟s ps′)
59-
var s ≟ var s′ = Dec.map′ (cong var) var-injective (s String.≟ s′)
60-
lit l ≟ lit l′ = Dec.map′ (cong lit) lit-injective (l Literal.≟ l′)
61-
proj a ≟ proj a′ = Dec.map′ (cong proj) proj-injective (a Name.≟ a′)
62-
63-
con x x₁ ≟ dot = no (λ ())
64-
con x x₁ ≟ var x₂ = no (λ ())
65-
con x x₁ ≟ lit x₂ = no (λ ())
66-
con x x₁ ≟ proj x₂ = no (λ ())
67-
con x x₁ ≟ absurd = no (λ ())
68-
dot ≟ con x x₁ = no (λ ())
69-
dot ≟ dot = yes refl
70-
dot ≟ var x = no (λ ())
71-
dot ≟ lit x = no (λ ())
72-
dot ≟ proj x = no (λ ())
73-
dot ≟ absurd = no (λ ())
74-
var s ≟ con x x₁ = no (λ ())
75-
var s ≟ dot = no (λ ())
76-
var s ≟ lit x = no (λ ())
77-
var s ≟ proj x = no (λ ())
78-
var s ≟ absurd = no (λ ())
79-
lit x ≟ con x₁ x₂ = no (λ ())
80-
lit x ≟ dot = no (λ ())
81-
lit x ≟ var _ = no (λ ())
82-
lit x ≟ proj x₁ = no (λ ())
83-
lit x ≟ absurd = no (λ ())
84-
proj x ≟ con x₁ x₂ = no (λ ())
85-
proj x ≟ dot = no (λ ())
86-
proj x ≟ var _ = no (λ ())
87-
proj x ≟ lit x₁ = no (λ ())
88-
proj x ≟ absurd = no (λ ())
89-
absurd ≟ con x x₁ = no (λ ())
90-
absurd ≟ dot = no (λ ())
91-
absurd ≟ var _ = no (λ ())
92-
absurd ≟ lit x = no (λ ())
93-
absurd ≟ proj x = no (λ ())
94-
absurd ≟ absurd = yes refl
95-
96-
[] ≟s [] = yes refl
97-
(arg i p ∷ xs) ≟s (arg j q ∷ ys) = ∷-dec (unArg-dec (p ≟ q)) (xs ≟s ys)
98-
99-
[] ≟s (_ ∷ _) = no λ()
100-
(_ ∷ _) ≟s [] = no λ()
36+
-- Re-exporting definitions that used to be here
37+
38+
open import Reflection.Term
39+
using ( proj-injective )
40+
renaming ( pat-con-injective₁ to con-injective₁
41+
; pat-con-injective₂ to con-injective₂
42+
; pat-con-injective to con-injective
43+
; pat-var-injective to var-injective
44+
; pat-lit-injective to lit-injective
45+
; _≟-Patterns_ to _≟s_
46+
; _≟-Pattern_ to _≟_
47+
)
48+
public

src/Reflection/Show.agda

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import Data.Float as Float
1616
open import Data.List hiding (_++_; intersperse)
1717
import Data.Nat as ℕ
1818
import Data.Nat.Show as ℕ
19+
open import Data.Product using (_×_; _,_)
1920
open import Data.String as String
2021
import Data.Word as Word
2122
open import Relation.Nullary using (yes; no)
@@ -65,26 +66,6 @@ showLiteral (string x) = String.show x
6566
showLiteral (name x) = showName x
6667
showLiteral (meta x) = showMeta x
6768

68-
mutual
69-
70-
showPatterns : List (Arg Pattern) String
71-
showPatterns [] = ""
72-
showPatterns (a ∷ ps) = showArg a <+> showPatterns ps
73-
where
74-
showArg : Arg Pattern String
75-
showArg (arg (arg-info visible r) p) = showRel r ++ showPattern p
76-
showArg (arg (arg-info hidden r) p) = braces (showRel r ++ showPattern p)
77-
showArg (arg (arg-info instance′ r) p) = braces (braces (showRel r ++ showPattern p))
78-
79-
showPattern : Pattern String
80-
showPattern (con c []) = showName c
81-
showPattern (con c ps) = parens (showName c <+> showPatterns ps)
82-
showPattern dot = "._"
83-
showPattern (var s) = s
84-
showPattern (lit l) = showLiteral l
85-
showPattern (proj f) = showName f
86-
showPattern absurd = "()"
87-
8869
private
8970
-- add appropriate parens depending on the given visibility
9071
visibilityParen : Visibility String String
@@ -118,14 +99,36 @@ mutual
11899
showSort (lit n) = "Set" ++ ℕ.show n -- no space to disambiguate from set t
119100
showSort unknown = "unknown"
120101

102+
showPatterns : List (Arg Pattern) String
103+
showPatterns [] = ""
104+
showPatterns (a ∷ ps) = showArg a <+> showPatterns ps
105+
where
106+
showArg : Arg Pattern String
107+
showArg (arg (arg-info visible r) p) = showRel r ++ showPattern p
108+
showArg (arg (arg-info hidden r) p) = braces (showRel r ++ showPattern p)
109+
showArg (arg (arg-info instance′ r) p) = braces (braces (showRel r ++ showPattern p))
110+
111+
showPattern : Pattern String
112+
showPattern (con c []) = showName c
113+
showPattern (con c ps) = parens (showName c <+> showPatterns ps)
114+
showPattern (dot t) = "." ++ parens (showTerm t)
115+
showPattern (var x) = "pat-var" <+> ℕ.show x
116+
showPattern (lit l) = showLiteral l
117+
showPattern (proj f) = showName f
118+
showPattern absurd = "()"
119+
121120
showClause : Clause String
122-
showClause (clause ps t) = showPatterns ps <+> "→" <+> showTerm t
123-
showClause (absurd-clause ps) = showPatterns ps
121+
showClause (clause tel ps t) = "[" <+> showTel tel <+> "]" <+> showPatterns ps <+> "→" <+> showTerm t
122+
showClause (absurd-clause tel ps) = "[" <+> showTel tel <+> "]" <+> showPatterns ps
124123

125124
showClauses : List Clause String
126125
showClauses [] = ""
127126
showClauses (c ∷ cs) = showClause c <+> ";" <+> showClauses cs
128127

128+
showTel : List (String × Arg Type) String
129+
showTel [] = ""
130+
showTel ((x , arg i t) ∷ tel) = visibilityParen (visibility i) (x <+> ":" <+> showTerm t) ++ showTel tel
131+
129132
showDefinition : Definition String
130133
showDefinition (function cs) = "function" <+> braces (showClauses cs)
131134
showDefinition (data-type pars cs) =

src/Reflection/Term.agda

Lines changed: 124 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,16 @@ open import Data.List.Base hiding (_++_)
1212
import Data.List.Properties as Lₚ
1313
open import Data.Nat as ℕ using (ℕ; zero; suc)
1414
open import Data.Product
15+
import Data.Product.Properties as Product
1516
open import Data.Maybe.Base using (Maybe; just; nothing)
17+
open import Data.String as String using (String)
1618
open import Reflection.Abstraction
1719
open import Reflection.Argument
1820
open import Reflection.Argument.Information using (visibility)
1921
import Reflection.Argument.Visibility as Visibility; open Visibility.Visibility
2022
import Reflection.Literal as Literal
2123
import Reflection.Meta as Meta
2224
open import Reflection.Name as Name using (Name)
23-
import Reflection.Pattern as Pattern
2425
open import Relation.Nullary
2526
open import Relation.Nullary.Product using (_×-dec_)
2627
open import Relation.Nullary.Decidable as Dec
@@ -31,17 +32,21 @@ open import Relation.Binary.PropositionalEquality
3132
-- Re-exporting the builtin type and constructors
3233

3334
open import Agda.Builtin.Reflection as Builtin public
34-
using (Sort; Type; Term; Clause)
35+
using (Sort; Type; Term; Clause; Pattern)
3536
open Sort public
3637
open Term public renaming (agda-sort to sort)
3738
open Clause public
39+
open Pattern public
3840

3941
------------------------------------------------------------------------
4042
-- Handy synonyms
4143

4244
Clauses : Set
4345
Clauses = List Clause
4446

47+
Telescope : Set
48+
Telescope = List (String × Arg Type)
49+
4550
-- Pattern synonyms for more compact presentation
4651

4752
pattern vLam s t = lam visible (abs s t)
@@ -81,31 +86,42 @@ suc i ⋯⟅∷⟆ xs = unknown ⟅∷⟆ (i ⋯⟅∷⟆ xs)
8186
------------------------------------------------------------------------
8287
-- Decidable equality
8388

84-
clause-injective₁ : {ps ps′ b b′} clause ps b ≡ clause ps′ b′ psps
89+
clause-injective₁ : {tel tel′ ps ps′ b b′} clause tel ps b ≡ clause tel′ ps′ b′ teltel
8590
clause-injective₁ refl = refl
8691

87-
clause-injective₂ : {ps ps′ b b′} clause ps b ≡ clause ps′ b′ bb
92+
clause-injective₂ : {tel tel′ ps ps′ b b′} clause tel ps b ≡ clause tel′ ps′ b′ psps
8893
clause-injective₂ refl = refl
8994

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
92106

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₂ >
95109

96110
infix 4 _≟-AbsTerm_ _≟-AbsType_ _≟-ArgTerm_ _≟-ArgType_ _≟-Args_
97111
_≟-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})
109125

110126
-- Decidable equality 'transformers'
111127
-- 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′)
127143
[] ≟-Clauses (_ ∷ _) = no λ()
128144
(_ ∷ _) ≟-Clauses [] = no λ()
129145

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′
139166
var-injective₁ refl = refl
140167

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′
142169
var-injective₂ refl = refl
143170

144171
var-injective : {x x′ args args′} var x args ≡ var x′ args′ x ≡ x′ × args ≡ args′
145172
var-injective = < var-injective₁ , var-injective₂ >
146173

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′
148175
con-injective₁ refl = refl
149176

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′
151178
con-injective₂ refl = refl
152179

153180
con-injective : {c c′ args args′} con c args ≡ con c′ args′ c ≡ c′ × args ≡ args′
@@ -329,3 +356,69 @@ lit _ ≟-Sort set _ = no λ()
329356
lit _ ≟-Sort unknown = no λ()
330357
unknown ≟-Sort set _ = no λ()
331358
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

Comments
 (0)