@@ -407,6 +407,30 @@ rhsSubstitute subst RHS { existentials, right, ensures } =
407
407
where
408
408
subst' = foldr (Map. delete . inject . variableName) subst existentials
409
409
410
+ renameExistentials
411
+ :: forall variable
412
+ . HasCallStack
413
+ => InternalVariable variable
414
+ => Map (SomeVariableName variable ) (SomeVariable variable )
415
+ -> RHS variable
416
+ -> RHS variable
417
+ renameExistentials rename RHS { existentials, right, ensures } =
418
+ RHS
419
+ { existentials =
420
+ renameVariable <$> existentials
421
+ , right = TermLike. substitute subst right
422
+ , ensures = Predicate. substitute subst ensures
423
+ }
424
+ where
425
+ renameVariable
426
+ :: ElementVariable variable
427
+ -> ElementVariable variable
428
+ renameVariable var =
429
+ let name = SomeVariableNameElement . variableName $ var
430
+ in maybe var expectElementVariable
431
+ $ Map. lookup name rename
432
+ subst = TermLike. mkVar <$> rename
433
+
410
434
rhsForgetSimplified :: InternalVariable variable => RHS variable -> RHS variable
411
435
rhsForgetSimplified RHS { existentials, right, ensures } =
412
436
RHS
@@ -871,26 +895,36 @@ instance UnifyingRule RulePattern where
871
895
872
896
precondition = requires
873
897
874
- refreshRule avoid' rule1@ (RulePattern _ _ _ _ _) =
875
- let avoid = FreeVariables. toNames avoid'
876
- rename = refreshVariables (avoid <> exVars) originalFreeVariables
877
- subst = TermLike. mkVar <$> rename
878
- left' = TermLike. substitute subst left
879
- antiLeft' = TermLike. substitute subst <$> antiLeft
880
- requires' = Predicate. substitute subst requires
881
- rhs' = rhsSubstitute subst rhs
882
- rule2 =
883
- rule1
884
- { left = left'
885
- , antiLeft = antiLeft'
886
- , requires = requires'
887
- , rhs = rhs'
888
- }
889
- in (rename, rule2)
898
+ refreshRule stale0' rule0@ (RulePattern _ _ _ _ _) =
899
+ let stale0 = FreeVariables. toNames stale0'
900
+ freeVariables0 = freeVariables rule0
901
+ renaming1 =
902
+ refreshVariables stale0
903
+ $ FreeVariables. toSet freeVariables0
904
+ freeVariables1 =
905
+ FreeVariables. toSet freeVariables0
906
+ & Set. map (renameVariable renaming1)
907
+ & foldMap FreeVariables. freeVariable
908
+ existentials0 = Set. fromList . map inject $ existentials $ rhs rule0
909
+ stale1 = FreeVariables. toNames freeVariables1 <> stale0
910
+ renamingExists = refreshVariables stale1 existentials0
911
+ subst = TermLike. mkVar <$> renaming1
912
+ rule1 =
913
+ RulePattern
914
+ { left = left rule0 & TermLike. substitute subst
915
+ , antiLeft = antiLeft rule0 & fmap (TermLike. substitute subst)
916
+ , requires = requires rule0 & Predicate. substitute subst
917
+ , rhs =
918
+ rhs rule0
919
+ & renameExistentials renamingExists
920
+ & rhsSubstitute subst
921
+ , attributes = attributes rule0
922
+ }
923
+ in (renaming1, rule1)
890
924
where
891
- RulePattern { left, antiLeft, requires, rhs } = rule1
892
- exVars = Set. fromList $ inject . variableName <$> existentials rhs
893
- originalFreeVariables = freeVariables rule1 & FreeVariables. toSet
925
+ renameVariable map' var =
926
+ Map. lookup ( variableName var) map'
927
+ & fromMaybe var
894
928
895
929
mapRuleVariables adj rule1@ (RulePattern _ _ _ _ _) =
896
930
rule1
0 commit comments