@@ -39,6 +39,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
39
39
40
40
module Language.CQL.Term where
41
41
42
+ import Control.Applicative ((<|>) )
42
43
import Control.DeepSeq
43
44
import Data.Map.Merge.Strict
44
45
import Data.Map.Strict as Map hiding (foldr , size )
@@ -268,26 +269,26 @@ occurs h x = case x of
268
269
Sym h' as -> h == HSym h' || any (occurs h) as
269
270
270
271
-- | If there is one, finds an equation of the form empty |- @gen/sk = term@,
272
+ -- | If there is one, finds an equation of the form @empty |- gen/sk = term@,
271
273
-- where @gen@ does not occur in @term@.
272
- findSimplifiableEqs
274
+ findSimplifiableEq
273
275
:: (Eq ty , Eq sym , Eq en , Eq fk , Eq att , Eq gen , Eq sk )
274
276
=> Theory var ty sym en fk att gen sk
275
277
-> Maybe (Head ty sym en fk att gen sk , Term var ty sym en fk att gen sk )
276
- findSimplifiableEqs = procEqs . Set. toList
278
+ findSimplifiableEq = goEqs . Set. toList
277
279
where
280
+ goEqs [] = Nothing
281
+ goEqs ((m, _ ): tl) | not (Map. null m) = goEqs tl
282
+ goEqs ((_, eq): tl) = goEq eq <|> goEqs tl
283
+
284
+ goEq (EQ (lhs, rhs)) = g lhs rhs <|> g rhs lhs
285
+
278
286
g (Var _) _ = Nothing
279
- g (Sk y) t = if occurs ( HSk y) t then Nothing else Just (HSk y, t)
280
- g (Gen y) t = if occurs ( HGen y) t then Nothing else Just (HGen y, t)
287
+ g (Sk y) t = if HSk y `occurs` t then Nothing else Just (HSk y, t)
288
+ g (Gen y) t = if HGen y `occurs` t then Nothing else Just (HGen y, t)
281
289
g (Sym _ [] ) _ = Nothing
282
- g _ _ = Nothing
290
+ g _ _ = Nothing
283
291
284
- procEqs [] = Nothing
285
- procEqs ((m, _): tl) | not (Map. null m) = procEqs tl
286
- procEqs ((_, EQ (lhs, rhs)): tl) = case g lhs rhs of
287
- Nothing -> case g rhs lhs of
288
- Nothing -> procEqs tl
289
- Just y -> Just y
290
- Just y -> Just y
291
292
292
293
-- | Replaces a symbol by a term in a term.
293
294
replace
@@ -331,7 +332,7 @@ simplifyTheoryStep
331
332
:: (MultiTyMap '[Ord ] '[var , ty , sym , en , fk , att , gen , sk ])
332
333
=> Theory var ty sym en fk att gen sk
333
334
-> Maybe (Theory var ty sym en fk att gen sk , (Head ty sym en fk att gen sk , Term var ty sym en fk att gen sk ))
334
- simplifyTheoryStep eqs = case findSimplifiableEqs eqs of
335
+ simplifyTheoryStep eqs = case findSimplifiableEq eqs of
335
336
Nothing -> Nothing
336
337
Just (toRemove, replacer) -> let
337
338
eqs2 = Set. map (\ (ctx, EQ (lhs, rhs)) -> (ctx, EQ (replace toRemove replacer lhs, replace toRemove replacer rhs))) eqs
0 commit comments