Skip to content

Commit fdf62fc

Browse files
committed
Reuse substitution internalisation code
Handle with care
1 parent b1793b8 commit fdf62fc

File tree

4 files changed

+34
-11
lines changed

4 files changed

+34
-11
lines changed

booster/library/Booster/Pattern/ApplyEquations.hs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ import Booster.Pattern.Util
7171
import Booster.Prettyprinter (renderOneLineText)
7272
import Booster.SMT.Interface qualified as SMT
7373
import Booster.Syntax.Json.Externalise (externaliseTerm)
74+
import Booster.Syntax.Json.Internalise (extractSubsitution)
7475
import Booster.Util (Bound (..))
7576
import Kore.JsonRpc.Types.ContextLog (CLContext (CLWithId), IdContext (CtxCached))
7677
import Kore.Util (showHashHex)
@@ -483,11 +484,11 @@ evaluatePattern' pat@Pattern{term, ceilConditions} = withPatternContext pat $ do
483484
-- evaluatedConstraints. To avoid duplicating constraints (i.e. having equivalent entities
484485
-- in pat.predicate and pat.substitution), we discard the old substitution here
485486
-- and extract a possible simplified one from evaluatedConstraints.
486-
let (simplifiedSubsitution, simplifiedConstraints) = partitionPredicates (Set.toList evaluatedConstraints)
487+
let (simplifiedSubsitution, simplifiedConstraints) = extractSubsitution (Set.toList evaluatedConstraints)
487488

488489
pure
489490
Pattern
490-
{ constraints = Set.fromList simplifiedConstraints
491+
{ constraints = simplifiedConstraints
491492
, term = newTerm
492493
, ceilConditions
493494
, substitution = simplifiedSubsitution

booster/library/Booster/Pattern/Rewrite.hs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ import Booster.Pattern.Util
7171
import Booster.Prettyprinter
7272
import Booster.SMT.Interface qualified as SMT
7373
import Booster.Syntax.Json.Externalise (externaliseTerm)
74+
import Booster.Syntax.Json.Internalise (extractSubsitution)
7475
import Booster.Util (Flag (..))
7576

7677
newtype RewriteT io a = RewriteT
@@ -364,22 +365,21 @@ applyRule pat@Pattern{ceilConditions} rule =
364365
lift . RewriteT . lift . modify $ \s -> s{equations = mempty}
365366

366367
-- partition ensured constrains into substitution and predicates
367-
let (newSubsitution, newConstraints) = partitionPredicates ensuredConditions
368+
let (newSubsitution, newConstraints) = extractSubsitution ensuredConditions
368369

369370
-- compose the existing substitution pattern and the newly acquired one
370-
let modifiedPatternSubst = newSubsitution `compose` pat.substitution
371+
let (modifiedPatternSubst, leftoverConstraints) = extractSubsitution . asEquations $ newSubsitution `compose` pat.substitution
371372

372373
let rewrittenTerm = substituteInTerm (modifiedPatternSubst `compose` ruleSubstitution) rule.rhs
373374
substitutedNewConstraints =
374-
Set.fromList $
375-
map
376-
(coerce . substituteInTerm (modifiedPatternSubst `compose` ruleSubstitution) . coerce)
377-
newConstraints
375+
Set.map
376+
(coerce . substituteInTerm (modifiedPatternSubst `compose` ruleSubstitution) . coerce)
377+
newConstraints
378378
let rewritten =
379379
Pattern
380380
rewrittenTerm
381381
-- adding new constraints that have not been trivially `Top`, substituting the Ex# variables
382-
(pat.constraints <> substitutedNewConstraints)
382+
(pat.constraints <> substitutedNewConstraints <> leftoverConstraints)
383383
modifiedPatternSubst -- ruleSubstitution is not needed, do not attach it to the result
384384
ceilConditions
385385
withContext CtxSuccess $

booster/library/Booster/Syntax/Json/Externalise.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import Data.Text.Encoding qualified as Text
1919
import Booster.Pattern.Base (externaliseKmapUnsafe)
2020
import Booster.Pattern.Base qualified as Internal
2121
import Booster.Pattern.Bool qualified as Internal
22+
import Booster.Pattern.Substitution qualified as Substitution
2223
import Booster.Pattern.Util (sortOfTerm)
2324
import Data.Map (Map)
2425
import Data.Map qualified as Map
@@ -35,7 +36,7 @@ externalisePattern ::
3536
externalisePattern Internal.Pattern{term = term, constraints, ceilConditions, substitution = ensuredSubstitution} inputSubstitution =
3637
-- need a sort for the predicates in external format
3738
let sort = externaliseSort $ sortOfTerm term
38-
substitutions = ensuredSubstitution <> inputSubstitution -- TODO ensuredSubstitution takes priority. Do we even need inputSubstitution?
39+
substitutions = inputSubstitution <> (ensuredSubstitution `Substitution.compose` inputSubstitution)
3940
externalisedSubstitution =
4041
if null substitutions
4142
then Nothing

booster/library/Booster/Syntax/Json/Internalise.hs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ module Booster.Syntax.Json.Internalise (
3535
pattern CheckSubsorts,
3636
pattern IgnoreSubsorts,
3737
logPatternError,
38+
-- substitution mining
39+
extractSubsitution,
3840
-- for test only
3941
InternalisedPredicate (..),
4042
) where
@@ -52,7 +54,7 @@ import Data.Coerce (coerce)
5254
import Data.Foldable ()
5355
import Data.Generics (extQ)
5456
import Data.Graph (SCC (..), stronglyConnComp)
55-
import Data.List (foldl1', nub)
57+
import Data.List (foldl', foldl1', nub)
5658
import Data.Map (Map)
5759
import Data.Map qualified as Map
5860
import Data.Set (Set)
@@ -508,6 +510,25 @@ mbSubstitution = \case
508510
where
509511
boolPred = BoolPred . Internal.Predicate
510512

513+
extractSubsitution ::
514+
[Internal.Predicate] -> (Map Internal.Variable Internal.Term, Set Internal.Predicate)
515+
extractSubsitution ps =
516+
let (potentialSubstituion, otherPreds) = partitionSubstitutionPreds . map mbSubstitution . coerce $ ps
517+
(newSubstitution, leftoverPreds) = mkSubstitution potentialSubstituion
518+
in (newSubstitution, Set.fromList $ leftoverPreds <> map unsafeFromBoolPred otherPreds)
519+
where
520+
partitionSubstitutionPreds = foldl' accumulate ([], [])
521+
where
522+
accumulate (accSubst, accOther) = \case
523+
pSubst@SubstitutionPred{} -> (pSubst : accSubst, accOther)
524+
pOther -> (accSubst, pOther : accOther)
525+
526+
-- this conversion is safe withing this function since we pass Internal.Predicate as input
527+
unsafeFromBoolPred :: InternalisedPredicate -> Internal.Predicate
528+
unsafeFromBoolPred = \case
529+
BoolPred p -> coerce p
530+
_ -> error "extractSubsitution.unsafeFromBoolPred: impossible case"
531+
511532
internalisePred ::
512533
Flag "alias" ->
513534
Flag "subsorts" ->

0 commit comments

Comments
 (0)