Cross Reference: /hets/HasCASL/Merge.hs
Merge.hs revision ad270004874ce1d0697fb30d7309f180553bb315
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
c797f343be2f3619bb1f5569753166ec49d27bdbChristian Maeder{- |
c797f343be2f3619bb1f5569753166ec49d27bdbChristian MaederModule : $Header$
81d182b21020b815887e9057959228546cf61b6bChristian MaederCopyright : (c) Christian Maeder and Uni Bremen 2003-2005
10397bcc134edbcfbe3ae2c7ea4c6080036aae22Christian MaederLicense : similar to LGPL, see HetCATS/LICENSE.txt or LIZENZ.txt
97018cf5fa25b494adffd7e9b4e87320dae6bf47Christian Maeder
c797f343be2f3619bb1f5569753166ec49d27bdbChristian MaederMaintainer : maeder@tzi.de
3f69b6948966979163bdfe8331c38833d5d90ecdChristian MaederStability : experimental
c797f343be2f3619bb1f5569753166ec49d27bdbChristian MaederPortability : portable
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder
f3a94a197960e548ecd6520bb768cb0d547457bbChristian Maedermerging parts of local environment
f3a94a197960e548ecd6520bb768cb0d547457bbChristian Maeder-}
462ec4b2fa3e0e788eb60dcb4aebc518298f342cChristian Maeder
462ec4b2fa3e0e788eb60dcb4aebc518298f342cChristian Maedermodule HasCASL.Merge where
462ec4b2fa3e0e788eb60dcb4aebc518298f342cChristian Maeder
462ec4b2fa3e0e788eb60dcb4aebc518298f342cChristian Maederimport Common.Id
462ec4b2fa3e0e788eb60dcb4aebc518298f342cChristian Maederimport Common.DocUtils
23a00c966f2aa8da525d7a7c51933c99964426c0Christian Maederimport Common.Result
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian Maeder
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian Maederimport HasCASL.As
462ec4b2fa3e0e788eb60dcb4aebc518298f342cChristian Maederimport HasCASL.Le
462ec4b2fa3e0e788eb60dcb4aebc518298f342cChristian Maederimport HasCASL.AsUtils
462ec4b2fa3e0e788eb60dcb4aebc518298f342cChristian Maederimport HasCASL.TypeAna
10397bcc134edbcfbe3ae2c7ea4c6080036aae22Christian Maederimport HasCASL.PrintLe()
b645cf3dc1e449038ed291bbd11fcc6e02b2fc7fChristian Maederimport HasCASL.Unify
04dada28736b4a237745e92063d8bdd49a362debChristian Maederimport HasCASL.Builtin
b984ff0ba75221f64451c1e69b3977967d4e99a1Christian Maederimport HasCASL.MapTerm
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian Maederimport qualified Data.Map as Map
ad270004874ce1d0697fb30d7309f180553bb315Christian Maederimport qualified Data.Set as Set
ad270004874ce1d0697fb30d7309f180553bb315Christian Maeder
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian Maederimport Control.Monad(foldM)
89054b2b95a3f92e78324dc852f3d34704e2ca49Christian Maederimport Data.List
b984ff0ba75221f64451c1e69b3977967d4e99a1Christian Maeder
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian Maeder-- | merge together repeated or extended items
8b9fda012e5ee53b7b2320c0638896a0ff6e99f3Christian Maederclass Mergeable a where
8b9fda012e5ee53b7b2320c0638896a0ff6e99f3Christian Maeder merge :: a -> a -> Result a
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder
8b9fda012e5ee53b7b2320c0638896a0ff6e99f3Christian Maederinstance (Ord a, PosItem a, Pretty a, Mergeable b)
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder => Mergeable (Map.Map a b) where
b190f5c7cf3ddda73724efe5ce82b9585ed76be1Christian Maeder merge = mergeMap id merge
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian Maeder
04dada28736b4a237745e92063d8bdd49a362debChristian MaederimproveDiag :: (PosItem a, Pretty a) => a -> Diagnosis -> Diagnosis
5a13581acc5a76d392c1dec01657bb3efd4dcf2dChristian MaederimproveDiag v d = d { diagString = let f:l = lines $ diagString d in
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder unlines $ (f ++ " of '" ++ showDoc v "'") : l
4ef2a978e66e2246ff0b7f00c77deb7aabb28b8eChristian Maeder , diagPos = getRange v
42c01284bba8d7c8d995c8dfb96ace57d28ed1bcTill Mossakowski }
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian Maeder
b190f5c7cf3ddda73724efe5ce82b9585ed76be1Christian MaedermergeMap :: (Ord a, PosItem a, Pretty a) =>
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder (b -> b) -> (b -> b -> Result b)
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder -> Map.Map a b -> Map.Map a b -> Result (Map.Map a b)
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian MaedermergeMap e f m1 m2 = foldM ( \ m (k, v) ->
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder case k `Map.lookup` m of
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian Maeder Nothing -> return $ Map.insert k (e v) m
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian Maeder Just w ->
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder let Result ds mu = f (e v) w
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian Maeder ns = map (improveDiag k) ds
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder in case mu of
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder Nothing -> Result ns $ Nothing
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian Maeder Just u -> Result ns $ Just $ Map.insert k u m)
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian Maeder Map.empty (Map.toList m1 ++ Map.toList m2)
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder
462ec4b2fa3e0e788eb60dcb4aebc518298f342cChristian Maederinstance Mergeable a => Mergeable (Maybe a) where
462ec4b2fa3e0e788eb60dcb4aebc518298f342cChristian Maeder merge m1 m2 = case m1 of
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder Nothing -> return m2
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian Maeder Just v1 -> case m2 of
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder Nothing -> return m1
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian Maeder Just v2 -> do v <- merge v1 v2
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian Maeder return $ Just v
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian Maeder
462ec4b2fa3e0e788eb60dcb4aebc518298f342cChristian Maederinstance Mergeable ClassInfo where
462ec4b2fa3e0e788eb60dcb4aebc518298f342cChristian Maeder merge = mergeA "super classes"
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian Maeder
462ec4b2fa3e0e788eb60dcb4aebc518298f342cChristian Maederinstance (Pretty a, Eq a) => Mergeable (AnyKind a) where
f94e26f892cf0fe2aa54252ec98920aed3a5c5ecChristian Maeder merge = mergeA "super kinds"
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder
462ec4b2fa3e0e788eb60dcb4aebc518298f342cChristian MaedermergeTypeInfo :: TypeInfo -> TypeInfo -> Result TypeInfo
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian MaedermergeTypeInfo t1 t2 =
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder do k <- merge (typeKind t1) $ typeKind t2
f4741f6b7da52b5417899c8fcbe4349b920b006eChristian Maeder o <- merge (otherTypeKinds t1) $ otherTypeKinds t2
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian Maeder s <- merge (superTypes t1) $ superTypes t2
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian Maeder d <- mergeTypeDefn (typeDefn t1) $ typeDefn t2
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian Maeder return $ TypeInfo k o s d
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder
462ec4b2fa3e0e788eb60dcb4aebc518298f342cChristian MaedermergeTypeDefn :: TypeDefn -> TypeDefn -> Result TypeDefn
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian MaedermergeTypeDefn d1 d2 =
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder case (d1, d2) of
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder (_, DatatypeDefn _) -> return d2
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder (PreDatatype, _) -> fail "expected data type definition"
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian Maeder (_, PreDatatype) -> return d1
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian Maeder (NoTypeDefn, _) -> return d2
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian Maeder (_, NoTypeDefn) -> return d1
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian Maeder (AliasTypeDefn s1, AliasTypeDefn s2) ->
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder do s <- mergeScheme s1 s2
27912d626bf179b82fcb337077e5cd9653bb71cfChristian Maeder return $ AliasTypeDefn s
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian Maeder (_, _) -> mergeA "TypeDefn" d1 d2
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian Maeder
462ec4b2fa3e0e788eb60dcb4aebc518298f342cChristian Maederinstance Mergeable Vars where
f4741f6b7da52b5417899c8fcbe4349b920b006eChristian Maeder merge = mergeA "variables for subtype definition"
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian Maeder
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian MaedermergeScheme :: TypeScheme -> TypeScheme -> Result TypeScheme
27912d626bf179b82fcb337077e5cd9653bb71cfChristian MaedermergeScheme s1@(TypeScheme a1 t1 _)
27912d626bf179b82fcb337077e5cd9653bb71cfChristian Maeder s2@(TypeScheme a2 t2 _) =
27912d626bf179b82fcb337077e5cd9653bb71cfChristian Maeder let v1 = genVarsOf t1
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian Maeder v2 = genVarsOf t2
04dada28736b4a237745e92063d8bdd49a362debChristian Maeder mp a v = foldr ( \ i l ->
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder maybe l (:l) $ findIndex ((== i) . getTypeVar) a)
15bb922b665fcd44c6230a1202785d0c7890e90cChristian Maeder [] (map fst v)
42c01284bba8d7c8d995c8dfb96ace57d28ed1bcTill Mossakowski in
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder if t1 == t2 then
04dada28736b4a237745e92063d8bdd49a362debChristian Maeder if null a1 && null a2 || isSingle a1 && isSingle a2 then
76fa667489c5e0868ac68de9f0253ac10f73d0b5Christian Maeder return s1
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder else if mp a1 v1 == mp a2 v2 then return s1
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder else fail ("differently bound type variables"
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder ++ expected s1 s2)
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder else fail ("wrong type scheme" ++ expected s1 s2)
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maederinstance Mergeable OpAttr where
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder merge (UnitOpAttr t1 p1) (UnitOpAttr t2 p2) =
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian Maeder do t <- mergeTerm Warning t1 t2
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder return $ UnitOpAttr t (p1 `appRange` p2)
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder merge a1 a2 = mergeA "attributes" a1 a2
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maederinstance Mergeable OpBrand where
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder merge b1 b2 = return $ case (b1, b2) of
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian Maeder (Pred, _) -> Pred
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder (_, Pred) -> Pred
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder (Op, _) -> Op
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder (_, Op) -> Op
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder _ -> Fun
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maederinstance Mergeable OpDefn where
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder merge d1 d2 = case (d1, d2) of
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder (NoOpDefn b1, NoOpDefn b2) -> do
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder b <- merge b1 b2
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder return $ NoOpDefn b
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder (SelectData c1 s, SelectData c2 _) -> do
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder c <- merge c1 c2
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder return $ SelectData c s
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder (Definition b1 e1, Definition b2 e2) -> do
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder d <- mergeTerm Hint e1 e2
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder b <- merge b1 b2
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder return $ Definition b d
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder (NoOpDefn b1, Definition b2 e2) -> do
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder b <- merge b1 b2
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian Maeder return $ Definition b e2
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian Maeder (Definition b1 e1, NoOpDefn b2) -> do
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder b <- merge b1 b2
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder return $ Definition b e1
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder (ConstructData _, SelectData _ _) ->
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder fail "illegal selector as constructor redefinition"
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder (SelectData _ _, ConstructData _) ->
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian Maeder fail "illegal constructor as selector redefinition"
975642b989852fc24119c59cf40bc1af653608ffChristian Maeder (ConstructData _, _) -> return d1
975642b989852fc24119c59cf40bc1af653608ffChristian Maeder (_, ConstructData _) -> return d2
975642b989852fc24119c59cf40bc1af653608ffChristian Maeder (SelectData _ _, _) -> return d1
ad187062b0009820118c1b773a232e29b879a2faChristian Maeder (_, SelectData _ _) -> return d2
ad187062b0009820118c1b773a232e29b879a2faChristian Maeder
ad187062b0009820118c1b773a232e29b879a2faChristian Maederinstance Eq a => Mergeable [a] where
ad187062b0009820118c1b773a232e29b879a2faChristian Maeder merge l1 l2 = case l1 of
ad187062b0009820118c1b773a232e29b879a2faChristian Maeder [] -> return l2
ad187062b0009820118c1b773a232e29b879a2faChristian Maeder e : l -> do
ad187062b0009820118c1b773a232e29b879a2faChristian Maeder l3 <- merge l l2
ad187062b0009820118c1b773a232e29b879a2faChristian Maeder return $ if any (e==) l2 then l3 else e : l3
ad187062b0009820118c1b773a232e29b879a2faChristian Maeder
ad187062b0009820118c1b773a232e29b879a2faChristian Maederinstance Ord a => Mergeable (Set.Set a) where
ad187062b0009820118c1b773a232e29b879a2faChristian Maeder merge s1 s2 = return $ Set.union s1 s2
ad187062b0009820118c1b773a232e29b879a2faChristian Maeder
b984ff0ba75221f64451c1e69b3977967d4e99a1Christian MaedermergeOpInfos :: TypeMap -> OpInfos -> OpInfos -> Result OpInfos
962d5c684e2b86d1f9c556c096b426e10cc74026Christian MaedermergeOpInfos tm (OpInfos l1) (OpInfos l2) =
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder do l <- mergeOps (addUnit tm) l1 l2
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian Maeder return $ OpInfos l
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder
962d5c684e2b86d1f9c556c096b426e10cc74026Christian MaedermergeOps :: TypeMap -> [OpInfo] -> [OpInfo] -> Result [OpInfo]
962d5c684e2b86d1f9c556c096b426e10cc74026Christian MaedermergeOps _ [] l = return l
962d5c684e2b86d1f9c556c096b426e10cc74026Christian MaedermergeOps tm (o:os) l2 = do
962d5c684e2b86d1f9c556c096b426e10cc74026Christian Maeder let (es, us) = partition (isUnifiable tm 1
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian Maeder (opType o) . opType) l2
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian Maeder l1 <- mergeOps tm os us
b984ff0ba75221f64451c1e69b3977967d4e99a1Christian Maeder if null es then return (o : l1)
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian Maeder else do r <- mergeOpInfo tm o $ head es
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian Maeder return (r : l1)
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian Maeder
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian MaedermergeOpInfo :: TypeMap -> OpInfo -> OpInfo -> Result OpInfo
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian MaedermergeOpInfo tm o1 o2 =
27912d626bf179b82fcb337077e5cd9653bb71cfChristian Maeder do let s1 = opType o1
27912d626bf179b82fcb337077e5cd9653bb71cfChristian Maeder s2 = opType o2
ad187062b0009820118c1b773a232e29b879a2faChristian Maeder sc <- if instScheme tm 1 s2 s1 then return s1
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian Maeder else if instScheme tm 1 s1 s2 then return s2
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian Maeder else fail "overlapping but incompatible type schemes"
2ac1742771a267119f1d839054b5e45d0a468085Christian Maeder as <- merge (opAttrs o1) $ opAttrs o2
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian Maeder d <- merge (opDefn o1) $ opDefn o2
6cca02cb6a5ae882d887a879f8b7a71941c3715cChristian Maeder return $ OpInfo sc as d
ee9eddfa6953868fd6fbaff0d9ff68675a13675aChristian Maeder
5a13581acc5a76d392c1dec01657bb3efd4dcf2dChristian Maederinstance Mergeable Env where
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder merge e1 e2 =
4fb19f237193a3bd6778f8aee3b6dd8da5856665Christian Maeder do cMap <- merge (classMap e1) $ classMap e2
c797f343be2f3619bb1f5569753166ec49d27bdbChristian Maeder tMap <- mergeMap id mergeTypeInfo
15bb922b665fcd44c6230a1202785d0c7890e90cChristian Maeder (typeMap e1) $ typeMap e2
15bb922b665fcd44c6230a1202785d0c7890e90cChristian Maeder as <- mergeMap (OpInfos .
e95bbf384f5cbcb7eb23286d5f15dffbd471db17Christian Maeder map (mapOpInfo (id, expandAlias tMap)) . opInfos)
42c01284bba8d7c8d995c8dfb96ace57d28ed1bcTill Mossakowski (mergeOpInfos tMap)
(assumps e1) $ assumps e2
return initialEnv { classMap = cMap
, typeMap = tMap
, assumps = as }
mergeA :: (Pretty a, Eq a) => String -> a -> a -> Result a
mergeA str t1 t2 = if t1 == t2 then return t1 else
fail ("different " ++ str ++ expected t1 t2)
mergeTerm :: DiagKind -> Term -> Term -> Result Term
mergeTerm k t1 t2 = if t1 == t2 then return t1 else
Result [Diag k ("different terms" ++ expected t1 t2)
nullRange] $ Just t2