@@ -407,6 +407,30 @@ rhsSubstitute subst RHS { existentials, right, ensures } =
407407 where
408408 subst' = foldr (Map. delete . inject . variableName) subst existentials
409409
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+
410434rhsForgetSimplified :: InternalVariable variable => RHS variable -> RHS variable
411435rhsForgetSimplified RHS { existentials, right, ensures } =
412436 RHS
@@ -871,26 +895,36 @@ instance UnifyingRule RulePattern where
871895
872896 precondition = requires
873897
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)
890924 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
894928
895929 mapRuleVariables adj rule1@ (RulePattern _ _ _ _ _) =
896930 rule1
0 commit comments