Skip to content

Commit 42bc9d1

Browse files
authored
TermLike: Remove externalizeFreshVariables (#1859)
1 parent fc5c8a9 commit 42bc9d1

File tree

17 files changed

+576
-754
lines changed

17 files changed

+576
-754
lines changed

kore/src/Kore/Internal/Predicate.hs

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ module Kore.Internal.Predicate
1010
, pattern PredicateFalse
1111
, pattern PredicateTrue
1212
, compactPredicatePredicate
13-
, externalizeFreshVariables
1413
, isFalse
1514
, depth
1615
, makePredicate, NotPredicate (..)
@@ -103,7 +102,6 @@ import qualified Kore.Internal.SideCondition.SideCondition as SideCondition
103102
)
104103
import Kore.Internal.TermLike hiding
105104
( depth
106-
, externalizeFreshVariables
107105
, hasFreeVariable
108106
, isSimplified
109107
, mapVariables
@@ -152,7 +150,7 @@ instance TopBottom patt => TopBottom (GenericPredicate patt) where
152150
isBottom (GenericPredicate patt) = isBottom patt
153151

154152
instance
155-
(Ord variable, From variable VariableName)
153+
(Ord variable, Unparse variable)
156154
=> Unparse (GenericPredicate (TermLike variable))
157155
where
158156
unparse predicate =
@@ -823,20 +821,5 @@ substitute
823821
substitute subst (GenericPredicate termLike) =
824822
GenericPredicate (TermLike.substitute subst termLike)
825823

826-
{- | Transform arbitrary 'InternalVariable's into external 'Variable's.
827-
828-
@externalizeFreshVariables@ ensures that bound variables are renamed to avoid
829-
capturing the resulting 'Variable's.
830-
831-
-}
832-
externalizeFreshVariables
833-
:: InternalVariable variable
834-
=> Predicate variable
835-
-> Predicate VariableName
836-
externalizeFreshVariables predicate =
837-
TermLike.externalizeFreshVariables
838-
. TermLike.mapVariables (pure toVariableName)
839-
<$> predicate
840-
841824
depth :: Predicate variable -> Int
842825
depth (GenericPredicate predicate) = TermLike.depth predicate

kore/src/Kore/Internal/TermLike.hs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ module Kore.Internal.TermLike
3838
, isConcrete
3939
, fromConcrete
4040
, Substitute.substitute
41-
, externalizeFreshVariables
4241
, refreshElementBinder
4342
, refreshSetBinder
4443
, depth

kore/src/Kore/Internal/TermLike/TermLike.hs

Lines changed: 3 additions & 238 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ module Kore.Internal.TermLike.TermLike
1111
, Evaluated (..)
1212
, TermLike (..)
1313
, TermLikeF (..)
14-
, externalizeFreshVariables
1514
, extractAttributes
1615
, freeVariables
1716
, mapVariables
@@ -34,12 +33,8 @@ import Control.DeepSeq
3433
)
3534
import qualified Control.Lens as Lens
3635
import qualified Control.Lens.Combinators as Lens.Combinators
37-
import Control.Monad.Reader
38-
( Reader
39-
)
4036
import qualified Control.Monad.Reader as Reader
4137
import qualified Data.Bifunctor as Bifunctor
42-
import qualified Data.Foldable as Foldable
4338
import Data.Functor.Adjunction
4439
( Adjunction (..)
4540
)
@@ -62,11 +57,6 @@ import qualified Data.Generics.Product as Lens.Product
6257
import Data.List
6358
( foldl'
6459
)
65-
import qualified Data.Map.Strict as Map
66-
import Data.Set
67-
( Set
68-
)
69-
import qualified Data.Set as Set
7060
import qualified Generics.SOP as SOP
7161
import qualified GHC.Generics as GHC
7262
import qualified GHC.Stack as GHC
@@ -126,7 +116,6 @@ import Kore.Syntax.Or
126116
import Kore.Syntax.Rewrites
127117
import Kore.Syntax.StringLiteral
128118
import Kore.Syntax.Top
129-
import Kore.Syntax.Variable as Variable
130119
import Kore.TopBottom
131120
import Kore.Unparser
132121
( Unparse (..)
@@ -136,7 +125,6 @@ import Kore.Variables.Binding
136125
import Kore.Variables.Fresh
137126
( FreshPartialOrd
138127
)
139-
import qualified Kore.Variables.Fresh as Fresh
140128
import qualified Pretty
141129
import qualified SQL
142130

@@ -294,11 +282,9 @@ instance NFData variable => NFData (TermLike variable) where
294282
rnf (Recursive.project -> annotation :< pat) =
295283
rnf annotation `seq` rnf pat
296284

297-
instance
298-
(From variable VariableName, Ord variable) => Unparse (TermLike variable)
299-
where
285+
instance (Unparse variable, Ord variable) => Unparse (TermLike variable) where
300286
unparse term =
301-
case Recursive.project freshVarTerm of
287+
case Recursive.project term of
302288
(attrs :< termLikeF)
303289
| hasKnownCreator created ->
304290
Pretty.sep
@@ -350,18 +336,10 @@ instance
350336
constructorLike =
351337
Pattern.getConstructorLike
352338
(Attribute.constructorLikeAttribute attrs)
353-
where
354-
freshVarTerm =
355-
externalizeFreshVariables
356-
$ mapVariables (pure toVariableName) term
357339

358340
unparse2 term =
359-
case Recursive.project freshVarTerm of
341+
case Recursive.project term of
360342
(_ :< pat) -> unparse2 pat
361-
where
362-
freshVarTerm =
363-
externalizeFreshVariables
364-
$ mapVariables (pure toVariableName) term
365343

366344
type instance Base (TermLike variable) =
367345
CofreeF (TermLikeF variable) (Attribute.Pattern variable)
@@ -816,219 +794,6 @@ sequenceAdjunct gsequence =
816794
contract = counit
817795
{-# INLINE sequenceAdjunct #-}
818796

819-
{- | Reset the 'variableCounter' of all 'Variables'.
820-
821-
@externalizeFreshVariables@ resets the 'variableCounter' of all variables, while
822-
ensuring that no 'Variable' in the result is accidentally captured.
823-
824-
-}
825-
externalizeFreshVariables :: TermLike VariableName -> TermLike VariableName
826-
externalizeFreshVariables termLike =
827-
Reader.runReader
828-
(Recursive.fold externalizeFreshVariablesWorker termLike)
829-
renamedFreeVariables
830-
where
831-
-- | 'originalFreeVariables' are present in the original pattern; they do
832-
-- not have a generated counter. 'generatedFreeVariables' have a generated
833-
-- counter, usually because they were introduced by applying some axiom.
834-
originalFreeVariables, generatedFreeVariables
835-
:: Set (SomeVariable VariableName)
836-
(originalFreeVariables, generatedFreeVariables) =
837-
Set.partition (foldSomeVariable (pure Variable.isOriginalVariableName))
838-
$ FreeVariables.toSet $ freeVariables termLike
839-
840-
-- | The map of generated free variables, renamed to be unique from the
841-
-- original free variables.
842-
renamedFreeVariables :: VariableNameMap VariableName VariableName
843-
(renamedFreeVariables, _) =
844-
Foldable.foldl' rename initial generatedFreeVariables
845-
where
846-
initial
847-
:: ( VariableNameMap VariableName VariableName
848-
, FreeVariables VariableName
849-
)
850-
initial = (mempty, foldMap freeVariable originalFreeVariables)
851-
rename
852-
:: ( VariableNameMap VariableName VariableName
853-
, FreeVariables VariableName
854-
)
855-
-> SomeVariable VariableName
856-
-> ( VariableNameMap VariableName VariableName
857-
, FreeVariables VariableName
858-
)
859-
rename (renaming, avoiding) variable =
860-
case variableName variable of
861-
SomeVariableNameElement elementVariableName ->
862-
let
863-
elementVariableName' =
864-
safeElementVariable avoiding elementVariableName
865-
elementVariable' = variable $> elementVariableName'
866-
renaming' =
867-
renameElementVariable
868-
((,)
869-
<$> elementVariableName
870-
<*> elementVariableName'
871-
)
872-
renaming
873-
variable' = inject elementVariable'
874-
avoiding' = freeVariable variable' <> avoiding
875-
in
876-
(renaming', avoiding')
877-
SomeVariableNameSet setVariableName ->
878-
let
879-
setVariableName' =
880-
safeSetVariable avoiding setVariableName
881-
setVariable' = variable $> setVariableName'
882-
renaming' =
883-
renameSetVariable
884-
((,)
885-
<$> setVariableName
886-
<*> setVariableName'
887-
)
888-
renaming
889-
variable' = inject setVariable'
890-
avoiding' = freeVariable variable' <> avoiding
891-
in
892-
(renaming', avoiding')
893-
894-
lookupElementVariable
895-
:: VariableName
896-
-> Reader (VariableNameMap VariableName VariableName) VariableName
897-
lookupElementVariable elementVariableName =
898-
Reader.asks
899-
$ fromMaybe elementVariableName
900-
. Map.lookup elementVariableName
901-
. unElementVariableName
902-
. adjSomeVariableNameElement
903-
904-
lookupSetVariable
905-
:: VariableName
906-
-> Reader (VariableNameMap VariableName VariableName) VariableName
907-
lookupSetVariable setVariableName =
908-
Reader.asks
909-
$ fromMaybe setVariableName
910-
. Map.lookup setVariableName
911-
. unSetVariableName
912-
. adjSomeVariableNameSet
913-
914-
lookupVariable =
915-
AdjSomeVariableName
916-
{ adjSomeVariableNameElement = ElementVariableName lookupElementVariable
917-
, adjSomeVariableNameSet = SetVariableName lookupSetVariable
918-
}
919-
920-
{- | Externalize a variable safely.
921-
922-
The variable's counter is incremented until its externalized form is unique
923-
among the set of avoided variables. The externalized form is returned.
924-
925-
-}
926-
safeVariable
927-
:: Injection (SomeVariableName VariableName) (f VariableName)
928-
=> (Functor f, FreshPartialOrd (f VariableName))
929-
=> FreeVariables VariableName
930-
-> f VariableName
931-
-> f VariableName
932-
safeVariable avoiding variable =
933-
head
934-
$ dropWhile wouldCapture
935-
$ fmap externalize
936-
$ iterate Fresh.nextVariable variable
937-
where
938-
wouldCapture var = isFreeVariable (inject var) avoiding
939-
externalize = fmap Variable.externalizeFreshVariableName
940-
941-
safeElementVariable
942-
:: FreeVariables VariableName
943-
-> ElementVariableName VariableName
944-
-> ElementVariableName VariableName
945-
safeElementVariable avoiding = safeVariable avoiding
946-
947-
safeSetVariable
948-
:: FreeVariables VariableName
949-
-> SetVariableName VariableName
950-
-> SetVariableName VariableName
951-
safeSetVariable avoiding = safeVariable avoiding
952-
953-
underElementBinder freeVariables' variable child = do
954-
let variable' = safeElementVariable freeVariables' <$> variable
955-
names = (,) <$> variableName variable <*> variableName variable'
956-
child' <- Reader.local (renameElementVariable names) child
957-
return (variable', child')
958-
959-
underSetBinder freeVariables' variable child = do
960-
let variable' = safeSetVariable freeVariables' <$> variable
961-
names = (,) <$> variableName variable <*> variableName variable'
962-
child' <- Reader.local (renameSetVariable names) child
963-
return (variable', child')
964-
965-
externalizeFreshVariablesWorker
966-
:: Base
967-
(TermLike VariableName)
968-
(RenamingT VariableName VariableName Identity
969-
(TermLike VariableName)
970-
)
971-
-> RenamingT VariableName VariableName Identity (TermLike VariableName)
972-
externalizeFreshVariablesWorker (attrs :< patt) = do
973-
attrs' <- Attribute.traverseVariables lookupVariable attrs
974-
let freeVariables' = Attribute.freeVariables attrs'
975-
patt' <-
976-
case patt of
977-
ExistsF exists -> do
978-
let Exists { existsVariable, existsChild } = exists
979-
(existsVariable', existsChild') <-
980-
underElementBinder
981-
freeVariables'
982-
existsVariable
983-
existsChild
984-
let exists' =
985-
exists
986-
{ existsVariable = existsVariable'
987-
, existsChild = existsChild'
988-
}
989-
return (ExistsF exists')
990-
ForallF forall -> do
991-
let Forall { forallVariable, forallChild } = forall
992-
(forallVariable', forallChild') <-
993-
underElementBinder
994-
freeVariables'
995-
forallVariable
996-
forallChild
997-
let forall' =
998-
forall
999-
{ forallVariable = forallVariable'
1000-
, forallChild = forallChild'
1001-
}
1002-
return (ForallF forall')
1003-
MuF mu -> do
1004-
let Mu { muVariable, muChild } = mu
1005-
(muVariable', muChild') <-
1006-
underSetBinder
1007-
freeVariables'
1008-
muVariable
1009-
muChild
1010-
let mu' =
1011-
mu
1012-
{ muVariable = muVariable'
1013-
, muChild = muChild'
1014-
}
1015-
return (MuF mu')
1016-
NuF nu -> do
1017-
let Nu { nuVariable, nuChild } = nu
1018-
(nuVariable', nuChild') <-
1019-
underSetBinder
1020-
freeVariables'
1021-
nuVariable
1022-
nuChild
1023-
let nu' =
1024-
nu
1025-
{ nuVariable = nuVariable'
1026-
, nuChild = nuChild'
1027-
}
1028-
return (NuF nu')
1029-
_ -> traverseVariablesF lookupVariable patt >>= sequence
1030-
(return . Recursive.embed) (attrs' :< patt')
1031-
1032797
updateCallStack
1033798
:: forall variable
1034799
. HasCallStack

kore/src/Kore/Log/DebugEvaluateCondition.hs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ whileDebugEvaluateCondition
7575
-> log a
7676
-> log a
7777
whileDebugEvaluateCondition =
78-
logWhile . DebugEvaluateCondition . fmap Predicate.externalizeFreshVariables
78+
logWhile
79+
. DebugEvaluateCondition
80+
. fmap (Predicate.mapVariables (pure toVariableName))
7981

8082
debugEvaluateConditionResult :: MonadLog log => Result -> log ()
8183
debugEvaluateConditionResult = logEntry . DebugEvaluateConditionResult

0 commit comments

Comments
 (0)