@@ -49,14 +49,6 @@ import Data.Void
49
49
import Language.CQL.Common
50
50
import Prelude hiding (EQ )
51
51
52
- data RawTerm = RawApp String [RawTerm ]
53
- deriving Eq
54
-
55
- instance Show RawTerm where
56
- show (RawApp sym az) = show sym ++ " (" ++ (intercalate " ," . fmap show $ az) ++ " )"
57
-
58
- --------------------------------------------------------------------------------------------
59
- -- Terms
60
52
61
53
data Term var ty sym en fk att gen sk
62
54
-- | Variable.
@@ -86,48 +78,40 @@ data Head ty sym en fk att gen sk
86
78
| HSk sk
87
79
deriving (Eq , Ord )
88
80
89
- instance TyMap NFData '[var , ty , sym , en , fk , att , gen , sk ] =>
90
- NFData (Term var ty sym en fk att gen sk ) where
91
- rnf x = case x of
92
- Var v -> rnf v
93
- Sym f a -> let _ = rnf f in rnf a
94
- Fk f a -> let _ = rnf f in rnf a
95
- Att f a -> let _ = rnf f in rnf a
96
- Gen a -> rnf a
97
- Sk a -> rnf a
98
-
99
- instance TyMap NFData '[var , ty , sym , en , fk , att , gen , sk ] =>
100
- NFData (EQ var ty sym en fk att gen sk ) where
101
- rnf (EQ (x, y)) = deepseq x $ rnf y
102
-
103
-
104
- instance TyMap Show '[var , ty , sym , en , fk , att , gen , sk ] =>
105
- Show (Term var ty sym en fk att gen sk )
106
- where
107
- show x = case x of
108
- Var v -> show' v
109
- Gen g -> show' g
110
- Sk s -> show' s
111
- Fk fk a -> show' a ++ " ." ++ show' fk
112
- Att att a -> show' a ++ " ." ++ show' att
113
- Sym sym [] -> show' sym
114
- Sym sym az -> show' sym ++ " (" ++ (intercalate " ," . fmap show' $ az) ++ " )"
115
- where
116
-
117
- show' :: Show a => a -> String
118
- show' = dropQuotes . show
81
+ deriving instance TyMap Eq '[var , sym , fk , att , gen , sk ] => Eq (Term var ty sym en fk att gen sk )
119
82
120
83
deriving instance TyMap Ord '[var , ty , sym , en , fk , att , gen , sk ] => Ord (Term var ty sym en fk att gen sk )
121
84
122
- instance (Show ty , Show sym , Show en , Show fk , Show att , Show gen , Show sk )
123
- => Show (Head ty sym en fk att gen sk ) where
85
+ instance TyMap NFData '[var , ty , sym , en , fk , att , gen , sk ] => NFData (Term var ty sym en fk att gen sk ) where
86
+ rnf x = case x of
87
+ Var v -> rnf v
88
+ Sym f a -> let _ = rnf f in rnf a
89
+ Fk f a -> let _ = rnf f in rnf a
90
+ Att f a -> let _ = rnf f in rnf a
91
+ Gen a -> rnf a
92
+ Sk a -> rnf a
93
+
94
+ instance TyMap Show '[var , ty , sym , en , fk , att , gen , sk ] => Show (Term var ty sym en fk att gen sk ) where
95
+ show x = case x of
96
+ Var v -> show' v
97
+ Gen g -> show' g
98
+ Sk s -> show' s
99
+ Fk fk a -> show' a ++ " ." ++ show' fk
100
+ Att att a -> show' a ++ " ." ++ show' att
101
+ Sym sym [] -> show' sym
102
+ Sym sym az -> show' sym ++ " (" ++ (intercalate " ," . fmap show' $ az) ++ " )"
103
+
104
+ instance TyMap Show '[ty , sym , en , fk , att , gen , sk ] => Show (Head ty sym en fk att gen sk ) where
124
105
show x = case x of
125
106
HSym sym -> show' sym
126
107
HFk fk -> show' fk
127
108
HAtt att -> show' att
128
109
HGen gen -> show' gen
129
110
HSk sk -> show' sk
130
111
112
+ show' :: Show a => a -> String
113
+ show' = dropQuotes . show
114
+
131
115
-- | Maps functions through a term.
132
116
mapTerm
133
117
:: (var -> var' )
@@ -150,8 +134,11 @@ mapTerm v t r e f a g s x = case x of
150
134
where
151
135
mt = mapTerm v t r e f a g s
152
136
153
- mapVar :: var -> Term () ty sym en fk att gen sk -> Term var ty sym en fk att gen sk
154
- mapVar v = mapTerm (const v) id id id id id id id
137
+ mapTermVar
138
+ :: (var -> var' )
139
+ -> Term var ty sym en fk att gen sk
140
+ -> Term var' ty sym en fk att gen sk
141
+ mapTermVar f = mapTerm f id id id id id id id
155
142
156
143
-- | The number of variable and symbol occurrences in a term.
157
144
size :: Term var ty sym en fk att gen sk -> Integer
@@ -208,7 +195,7 @@ hasTypeType'' t = case t of
208
195
Fk _ _ -> False
209
196
210
197
----------------------------------------------------------------------------------------------------------
211
- -- Substitution and simplification of theories
198
+ -- Substitution and simplification on terms
212
199
213
200
-- | Experimental
214
201
subst2
@@ -268,6 +255,41 @@ occurs h x = case x of
268
255
Att h' a -> h == HAtt h' || occurs h a
269
256
Sym h' as -> h == HSym h' || any (occurs h) as
270
257
258
+
259
+ --------------------------------------------------------------------------------------------------------------------
260
+ -- Equality, especially on Terms
261
+
262
+ -- | A value of this type means the lhs and rhs are equal.
263
+ -- One reason for its existence is to allow pretty-printing.
264
+ type EQ var ty sym en fk att gen sk = EQF (Term var ty sym en fk att gen sk )
265
+
266
+ newtype EQF a = EQ (a , a )
267
+
268
+ instance Functor EQF where
269
+ fmap f (EQ (l, r)) = EQ (f l, f r)
270
+
271
+ instance (Show a ) => Show (EQF a ) where
272
+ show (EQ (lhs, rhs)) = show lhs ++ " = " ++ show rhs
273
+
274
+ deriving instance (Ord a ) => Ord (EQF a )
275
+
276
+ deriving instance (Eq a ) => Eq (EQF a )
277
+
278
+ instance TyMap NFData '[var , ty , sym , en , fk , att , gen , sk ] => NFData (EQ var ty sym en fk att gen sk ) where
279
+ rnf (EQ (x, y)) = deepseq x $ rnf y
280
+
281
+ hasTypeType' :: EQ Void ty sym en fk att gen sk -> Bool
282
+ hasTypeType' (EQ (lhs, _)) = hasTypeType lhs
283
+
284
+
285
+ --------------------------------------------------------------------------------------------------------------------
286
+ -- Theories
287
+
288
+ type Theory var ty sym en fk att gen sk = Set (Ctx var (ty + en ), EQ var ty sym en fk att gen sk )
289
+
290
+ -- TODO wrap Map class to throw an error (or do something less ad hoc) if a key is ever inserted twice
291
+ type Ctx k v = Map k v
292
+
271
293
-- | If there is one, finds an equation of the form @empty |- gen/sk = term@,
272
294
-- where @gen@ does not occur in @term@.
273
295
findSimplifiableEq
@@ -367,23 +389,10 @@ instance Up x (x + y) where
367
389
instance Up y (x + y ) where
368
390
upgr = Right
369
391
370
- --------------------------------------------------------------------------------------------------------------------
371
- -- Theories
372
-
373
- type Theory var ty sym en fk att gen sk = Set (Ctx var (ty + en ), EQ var ty sym en fk att gen sk )
374
-
375
- -- TODO wrap Map class to throw an error (or do something less ad hoc) if a key is ever put twice
376
- type Ctx k v = Map k v
377
-
378
- -- Our own pair type for pretty printing purposes
379
- -- | This type indicates that the two terms are equal.
380
- newtype EQ var ty sym en fk att gen sk
381
- = EQ (Term var ty sym en fk att gen sk , Term var ty sym en fk att gen sk ) deriving (Ord , Eq )
382
-
383
- instance TyMap Show '[var , ty , sym , en , fk , att , gen , sk ] => Show (EQ var ty sym en fk att gen sk ) where
384
- show (EQ (lhs,rhs)) = show lhs ++ " = " ++ show rhs
392
+ --------------------------------------------------------------------------------
385
393
386
- deriving instance TyMap Eq '[var , sym , fk , att , gen , sk ] => Eq (Term var ty sym en fk att gen sk )
394
+ data RawTerm = RawApp String [RawTerm ]
395
+ deriving Eq
387
396
388
- hasTypeType' :: EQ Void ty sym en fk att gen sk -> Bool
389
- hasTypeType' ( EQ (lhs, _)) = hasTypeType lhs
397
+ instance Show RawTerm where
398
+ show ( RawApp sym az) = show sym ++ " ( " ++ (intercalate " , " . fmap show $ az) ++ " ) "
0 commit comments