@@ -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