| 359 | | let filt = Set.filter $ (== SortAsItemType) . symbType |
| 360 | | ss2 = filt sy2 |
| 361 | | ss1 = Set.filter (\ s -> not $ any (matches s) $ Map.keys rmap) |
| 362 | | $ Set.difference (filt sy1) ss2 |
| 363 | | prod = Set.size ss1 * Set.size ss2 |
| | 359 | let ss1 = Set.filter (\ s -> Set.null $ Set.filter (\ s2 -> |
| | 360 | compatibleSymbols True (s, s2)) sy2) |
| | 361 | $ Set.filter (\ s -> not $ any (matches s) $ Map.keys rmap) |
| | 362 | $ sy1 |
| | 363 | prod = Set.size ss1 * Set.size sy2 |
| | 376 | |
| | 377 | compatibleSymbTypes :: (SymbType, SymbType) -> Bool |
| | 378 | compatibleSymbTypes p = case p of |
| | 379 | (SortAsItemType, SortAsItemType) -> True |
| | 380 | (OtherTypeKind s1, OtherTypeKind s2) -> s1 == s2 |
| | 381 | (OpAsItemType t1, OpAsItemType t2) -> |
| | 382 | length (opArgs t1) == length (opArgs t2) |
| | 383 | (PredAsItemType p1, PredAsItemType p2) -> |
| | 384 | length (predArgs p1) == length (predArgs p2) |
| | 385 | _ -> False |
| | 386 | |
| | 387 | compatibleSymbols :: Bool -> (Symbol, Symbol) -> Bool |
| | 388 | compatibleSymbols alsoId (Symbol i1 k1, Symbol i2 k2) = |
| | 389 | compatibleSymbTypes (k1, k2) && (not alsoId || i1 == i2) |
| | 390 | |
| | 391 | compatibleRawSymbs :: (RawSymbol, RawSymbol) -> Bool |
| | 392 | compatibleRawSymbs p = case p of |
| | 393 | (ASymbol s1, ASymbol s2) -> compatibleSymbols False (s1, s2) |
| | 394 | _ -> False -- irrelevant |