Skip to content

Simplify side conditions #2393

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 25 commits into from
Mar 2, 2021
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
6279d8b
Add side condition simplifier
ana-pantilie Feb 8, 2021
e2712ad
Do not simplify conditions with themselves as the side condition
ana-pantilie Feb 8, 2021
019ece4
Move SideCondition simplification to Pattern simplifier
ana-pantilie Feb 10, 2021
10a3da1
Remove unused import
ana-pantilie Feb 10, 2021
827bc7e
Remove unused instance
ana-pantilie Feb 11, 2021
3772fc7
Use condition simplifier in side condition simplifier
ana-pantilie Feb 11, 2021
e8e9b03
Add integration test from frontend suite
ana-pantilie Feb 11, 2021
39391a3
Move side condition simplifier to pattern simplifier
ana-pantilie Feb 11, 2021
d270511
Add simple tests for simplifySideCondition
ana-pantilie Feb 11, 2021
4f6745b
Add export
ana-pantilie Feb 11, 2021
13b511a
New pattern condition is simplified side condition; add unit test
ana-pantilie Feb 12, 2021
0aa413a
Side condition simplifier simplifies Conditions
ana-pantilie Feb 16, 2021
4b59413
Move to Condition simplifier, mark final conjunction as simplified
ana-pantilie Feb 19, 2021
2baa22a
Fix unit tests
ana-pantilie Feb 22, 2021
d7a6535
Temp: some clean-up with debugging traces
ana-pantilie Feb 22, 2021
610243c
TermLike.simplify: assertion only checks for Fully simplified, ignore…
ana-pantilie Feb 23, 2021
a24c331
Integration test changes
ana-pantilie Feb 23, 2021
c577433
Some clean-up
ana-pantilie Feb 23, 2021
c662a65
Merge remote-tracking branch 'origin/master' into side-condition-simp…
ana-pantilie Feb 24, 2021
d07845f
General clean-up
ana-pantilie Feb 24, 2021
68062ca
Add simple unit tests
ana-pantilie Feb 24, 2021
70d955b
Add documentation
ana-pantilie Feb 24, 2021
ed69643
Update kore/src/Kore/Attribute/Pattern/Simplified.hs
ana-pantilie Mar 2, 2021
fe45338
Review: rename isSimplified... functions
ana-pantilie Mar 2, 2021
494bb21
Merge branch 'master' into side-condition-simplification
ana-pantilie Mar 2, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions kore/src/Kore/Equation/Simplification.hs
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,6 @@ import Kore.Internal.Pattern
)
import qualified Kore.Internal.Pattern as Pattern
import qualified Kore.Internal.Predicate as Predicate
import qualified Kore.Internal.SideCondition as SideCondition
( top
)
import qualified Kore.Internal.Substitution as Substitution
import qualified Kore.Internal.TermLike as TermLike
import qualified Kore.Step.Simplification.Pattern as Pattern
Expand Down Expand Up @@ -134,4 +131,4 @@ simplifyPattern
-> simplifier (OrPattern variable)
simplifyPattern patt =
Simplifier.localSimplifierAxioms (const mempty)
$ Pattern.simplify SideCondition.top patt
$ Pattern.simplify patt
11 changes: 3 additions & 8 deletions kore/src/Kore/Exec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -92,9 +92,6 @@ import Kore.Internal.Predicate
, makeMultipleOrPredicate
)
import qualified Kore.Internal.SideCondition as SideCondition
( top
, topTODO
)
import Kore.Internal.TermLike
import Kore.Log.ErrorRewriteLoop
( errorRewriteLoop
Expand Down Expand Up @@ -224,8 +221,7 @@ exec depthLimit breadthLimit verifiedModule strategy initialTerm =
finals <-
getFinalConfigsOf $ do
initialConfig <-
Pattern.simplify SideCondition.top
(Pattern.fromTermLike initialTerm)
Pattern.simplify (Pattern.fromTermLike initialTerm)
>>= Logic.scatter
let
updateQueue = \as ->
Expand Down Expand Up @@ -372,8 +368,7 @@ search depthLimit breadthLimit verifiedModule termLike searchPattern searchConfi
initialized <- initializeAndSimplify verifiedModule
let Initialized { rewriteRules } = initialized
simplifiedPatterns <-
Pattern.simplify SideCondition.top
$ Pattern.fromTermLike termLike
Pattern.simplify $ Pattern.fromTermLike termLike
let
initialPattern =
case toList simplifiedPatterns of
Expand Down Expand Up @@ -401,7 +396,7 @@ search depthLimit breadthLimit verifiedModule termLike searchPattern searchConfi
searchGraph
searchConfig
(match
SideCondition.topTODO
SideCondition.top
(mkRewritingPattern searchPattern)
)
executionGraph
Expand Down
15 changes: 6 additions & 9 deletions kore/src/Kore/Reachability/Claim.hs
Original file line number Diff line number Diff line change
Expand Up @@ -130,9 +130,6 @@ import Kore.Step.Simplification.Data
)
import qualified Kore.Step.Simplification.Exists as Exists
import qualified Kore.Step.Simplification.Not as Not
import Kore.Step.Simplification.OrPattern
( simplifyConditionsWithSmt
)
import Kore.Step.Simplification.Pattern
( simplifyTopConfiguration
)
Expand Down Expand Up @@ -521,9 +518,9 @@ checkImplicationWorker (ClaimPattern.refreshExistentials -> claimPattern) =
$ from $ makeCeilPredicate leftTerm
let configs' = MultiOr.map (definedConfig <*) removal
stuck <-
simplifyConditionsWithSmt sideCondition configs'
>>= Logic.scatter
>>= Pattern.simplify sideCondition
Logic.scatter configs'
>>= Pattern.simplify
>>= SMT.Evaluator.filterMultiOr
>>= Logic.scatter
pure (examine anyUnified stuck)
& elseImplied
Expand Down Expand Up @@ -552,12 +549,12 @@ checkImplicationWorker (ClaimPattern.refreshExistentials -> claimPattern) =
unified <-
mkIn sort leftTerm rightTerm
& Pattern.fromTermLike
& Pattern.simplify sideCondition
& Pattern.simplify
& (>>= Logic.scatter)
didUnify
removed <-
Pattern.andCondition unified rightCondition
& Pattern.simplify sideCondition
& Pattern.simplify
& (>>= Logic.scatter)
Exists.makeEvaluate sideCondition existentials removed
>>= Logic.scatter
Expand Down Expand Up @@ -626,7 +623,7 @@ simplifyRightHandSide lensClaimPattern sideCondition =
Lens.traverseOf (lensClaimPattern . field @"right") $ \dest ->
OrPattern.observeAllT
$ Logic.scatter dest
>>= Pattern.simplify sideCondition . Pattern.requireDefined
>>= Pattern.makeEvaluate sideCondition . Pattern.requireDefined
>>= SMT.Evaluator.filterMultiOr
>>= Logic.scatter

Expand Down
34 changes: 1 addition & 33 deletions kore/src/Kore/Step/Rule/Simplify.hs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import Kore.Internal.MultiAnd
( MultiAnd
)
import qualified Kore.Internal.MultiAnd as MultiAnd
import qualified Kore.Internal.OrPattern as OrPattern
import Kore.Internal.Pattern
( Pattern
)
Expand All @@ -38,7 +37,7 @@ import Kore.Rewriting.RewritingVariable
( RewritingVariableName
)
import Kore.Step.ClaimPattern
( ClaimPattern (ClaimPattern)
( ClaimPattern
)
import qualified Kore.Step.ClaimPattern as ClaimPattern
import Kore.Step.RulePattern
Expand Down Expand Up @@ -100,37 +99,6 @@ instance InternalVariable variable => SimplifyRuleLHS (RulePattern variable)
makeAndPredicate predicate requires'
}

instance SimplifyRuleLHS ClaimPattern
where
simplifyRuleLhs rule@(ClaimPattern _ _ _ _) = do
simplifiedTerms <-
Pattern.simplifyTopConfiguration left
fullySimplified <-
SMT.Evaluator.filterMultiOr simplifiedTerms
let rules =
setRuleLeft rule
<$> OrPattern.toPatterns fullySimplified
return (MultiAnd.make rules)
where
ClaimPattern { left } = rule

setRuleLeft
:: ClaimPattern
-> Pattern RewritingVariableName
-> ClaimPattern
setRuleLeft
claimPattern@ClaimPattern { left = left' }
patt@Conditional { substitution }
=
ClaimPattern.applySubstitution
substitution
claimPattern
{ ClaimPattern.left =
Condition.andCondition
patt
(Condition.eraseConditionalTerm left')
}

instance SimplifyRuleLHS (RewriteRule VariableName) where
simplifyRuleLhs =
fmap (MultiAnd.map RewriteRule)
Expand Down
4 changes: 2 additions & 2 deletions kore/src/Kore/Step/Simplification/Exists.hs
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ import qualified Kore.Step.Simplification.AndPredicates as And
( simplifyEvaluatedMultiPredicate
)
import qualified Kore.Step.Simplification.Pattern as Pattern
( simplify
( makeEvaluate
)
import Kore.Step.Simplification.Simplify
import qualified Kore.TopBottom as TopBottom
Expand Down Expand Up @@ -303,7 +303,7 @@ makeEvaluateBoundLeft sideCondition variable boundTerm normalized
$ Conditional.predicate normalized
}
orPattern <-
lift $ Pattern.simplify sideCondition substituted
lift $ Pattern.makeEvaluate sideCondition substituted
Logic.scatter (toList orPattern)
where
someVariableName = inject (variableName variable)
Expand Down
64 changes: 60 additions & 4 deletions kore/src/Kore/Step/Simplification/Pattern.hs
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,24 @@ License : NCSA
module Kore.Step.Simplification.Pattern
( simplifyTopConfiguration
, simplify
, makeEvaluate
-- For testing
, simplifySideCondition
) where

import Prelude.Kore

import Control.Monad.State.Strict
( StateT
)
import qualified Control.Monad.State.Strict as State

import qualified Kore.Internal.Condition as Condition
import qualified Kore.Internal.Conditional as Conditional
import Kore.Internal.MultiAnd
( MultiAnd
)
import qualified Kore.Internal.MultiAnd as MultiAnd
import Kore.Internal.OrPattern
( OrPattern
)
Expand All @@ -21,12 +32,15 @@ import Kore.Internal.Pattern
( Conditional (..)
, Pattern
)
import Kore.Internal.Predicate
( Predicate
)
import Kore.Internal.SideCondition
( SideCondition
)
import qualified Kore.Internal.SideCondition as SideCondition
( andCondition
, topTODO
, top
)
import Kore.Internal.Substitution
( toMap
Expand All @@ -43,6 +57,7 @@ import Kore.Step.Simplification.Simplify
import Kore.Substitute
( substitute
)
import Logic

{-| Simplifies the pattern without a side-condition (i.e. it's top)
and removes the exists quantifiers at the top.
Expand All @@ -54,7 +69,7 @@ simplifyTopConfiguration
=> Pattern variable
-> simplifier (OrPattern variable)
simplifyTopConfiguration patt = do
simplified <- simplify SideCondition.topTODO patt
simplified <- simplify patt
return (OrPattern.map removeTopExists simplified)
where
removeTopExists :: Pattern variable -> Pattern variable
Expand All @@ -65,12 +80,24 @@ simplifyTopConfiguration patt = do
{-| Simplifies an 'Pattern', returning an 'OrPattern'.
-}
simplify
:: InternalVariable variable
=> MonadSimplify simplifier
=> Pattern variable
-> simplifier (OrPattern variable)
simplify = makeEvaluate SideCondition.top

{- | Simplifies a 'Pattern' with a custom 'SideCondition'.
This should only be used when it's certain that the
'SideCondition' was not created from the 'Condition' of
the 'Pattern'.
-}
makeEvaluate
:: InternalVariable variable
=> MonadSimplify simplifier
=> SideCondition variable
-> Pattern variable
-> simplifier (OrPattern variable)
simplify sideCondition pattern' =
makeEvaluate sideCondition pattern' =
OrPattern.observeAllT $ do
withSimplifiedCondition <- simplifyCondition sideCondition pattern'
let (term, simplifiedCondition) =
Expand All @@ -89,7 +116,36 @@ simplify sideCondition pattern' =
& Condition.fromPredicate
termSideCondition =
sideCondition `SideCondition.andCondition` simplifiedCondition'
simplifiedTerm <- simplifyConditionalTerm termSideCondition term'
simplifiedSideCondition <-
simplifySideCondition termSideCondition
simplifiedTerm <- simplifyConditionalTerm simplifiedSideCondition term'
let simplifiedPattern =
Conditional.andCondition simplifiedTerm simplifiedCondition
simplifyCondition sideCondition simplifiedPattern

-- | Simplify each condition in the 'SideCondition' with the assumption that
-- the other conditions are true.
simplifySideCondition
:: forall variable simplifier
. InternalVariable variable
=> MonadSimplify simplifier
=> SideCondition variable
-> LogicT simplifier (SideCondition variable)
simplifySideCondition (toList . from @_ @(MultiAnd _) -> predicates) =
State.execStateT (worker predicates) SideCondition.top
where
worker
:: [Predicate variable]
-> StateT
(SideCondition variable)
(LogicT simplifier)
()
worker [] = return ()
worker (pred' : rest) = do
sideCondition <- State.get
let otherConds = sideCondition <> from (MultiAnd.make rest)
result <-
simplifyCondition otherConds (Condition.fromPredicate pred')
& lift
State.put (SideCondition.andCondition sideCondition result)
worker rest
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let me make sure I understand this correctly: The SideCondition comprised of all simplified Predicates is held in the State. At each step, we combine that with the SideCondition from all (other) un-simplified Predicates, and use the combination to simplify the current Predicate. Then we update the stored SideCondition. Is that right?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's right.

5 changes: 1 addition & 4 deletions kore/src/Kore/Step/Simplification/Rule.hs
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,6 @@ import Kore.Internal.Predicate
( pattern PredicateTrue
)
import qualified Kore.Internal.Predicate as Predicate
import qualified Kore.Internal.SideCondition as SideCondition
( topTODO
)
import qualified Kore.Internal.Substitution as Substitution
import Kore.Internal.TermLike
( TermLike
Expand Down Expand Up @@ -144,4 +141,4 @@ simplifyPattern
-> simplifier (OrPattern variable)
simplifyPattern termLike =
Simplifier.localSimplifierAxioms (const mempty)
$ Pattern.simplify SideCondition.topTODO (Pattern.fromTermLike termLike)
$ Pattern.simplify (Pattern.fromTermLike termLike)
7 changes: 2 additions & 5 deletions kore/test/Test/Kore/Step/Axiom/Registry.hs
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,6 @@ import qualified Kore.IndexedModule.MetadataToolsBuilder as MetadataTools
( build
)
import Kore.Internal.Pattern as Pattern
import qualified Kore.Internal.SideCondition as SideCondition
( top
)
import Kore.Internal.Symbol as Symbol
import Kore.Internal.TermLike
import qualified Kore.Step.Axiom.Identifier as AxiomIdentifier
Expand Down Expand Up @@ -449,15 +446,15 @@ test_functionRegistry =
let expect = mkApplySymbol sHead []
simplified <-
runSimplifier testEnv
$ Pattern.simplify SideCondition.top
$ Pattern.simplify
$ makePattern $ mkApplySymbol gHead []
let actual = Pattern.term $ head $ toList simplified
assertEqual "" expect actual
, testCase "Checking that evaluator simplifies correctly" $ do
let expect = mkApplySymbol tHead []
simplified <-
runSimplifier testEnv
$ Pattern.simplify SideCondition.top
$ Pattern.simplify
$ makePattern $ mkApplySymbol pHead []
let actual = Pattern.term $ head $ toList simplified
assertEqual "" expect actual
Expand Down
4 changes: 2 additions & 2 deletions kore/test/Test/Kore/Step/Simplification/Integration.hs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ import Kore.Step.Axiom.Registry
( mkEvaluatorRegistry
)
import qualified Kore.Step.Simplification.Pattern as Pattern
( simplify
( makeEvaluate
)
import Kore.Step.Simplification.Simplify

Expand Down Expand Up @@ -1405,7 +1405,7 @@ evaluateConditionalWithAxioms
-> TestPattern
-> IO OrTestPattern
evaluateConditionalWithAxioms axioms sideCondition =
runSimplifierSMT env . Pattern.simplify sideCondition
runSimplifierSMT env . Pattern.makeEvaluate sideCondition
where
env = Mock.env { simplifierAxioms }
simplifierAxioms :: BuiltinAndAxiomSimplifierMap
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,9 +114,7 @@ test_regressionGeneratedTerms =
)
)
simplified <-
Pattern.simplify
SideCondition.top
(Pattern.fromTermLike term)
Pattern.simplify (Pattern.fromTermLike term)
& runSimplifier Mock.env
assertEqual "" True (OrPattern.isSimplified sideRepresentation simplified)
]
Expand All @@ -135,7 +133,7 @@ evaluateWithAxioms
-> Pattern VariableName
-> SMT.NoSMT (OrPattern VariableName)
evaluateWithAxioms axioms =
Simplification.runSimplifier env . Pattern.simplify SideCondition.top
Simplification.runSimplifier env . Pattern.simplify
where
env = Mock.env { simplifierAxioms }
simplifierAxioms :: BuiltinAndAxiomSimplifierMap
Expand Down
Loading