Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
fdcb21a
Overhaul Predicate simplifier: In simplifier
ana-pantilie Jul 21, 2021
4417303
Format with fourmolu
invalid-email-address Jul 21, 2021
2abc1c4
Retrigger workflows
ana-pantilie Jul 23, 2021
ebfcc36
Overhaul Predicate simplifier: Equals, v2
ana-pantilie Jul 26, 2021
58d3aa5
Merge remote-tracking branch 'origin/overhaul-predicate-in' into remo…
ana-pantilie Jul 26, 2021
e0c90c2
Remove the old TermLike simplifier
ana-pantilie Jul 26, 2021
004c324
Format with fourmolu
invalid-email-address Jul 26, 2021
bf3c210
WIP: replace simplifyTermLike with simplifyPattern in MonadSimplify
ana-pantilie Jul 27, 2021
a4264a4
Format with fourmolu
invalid-email-address Jul 27, 2021
22bf881
MonadSimplify: simplifyPattern, simplifyTerm, simplifyCondition
ana-pantilie Jul 28, 2021
97011d9
Format with fourmolu
invalid-email-address Jul 28, 2021
2cfc3f8
Explicit loop in simplifyPattern
ana-pantilie Jul 28, 2021
8a96a85
Merge branch 'remove-old-term-simplifier' of github.com:kframework/ko…
ana-pantilie Jul 28, 2021
26b2a8b
Format with fourmolu
invalid-email-address Jul 28, 2021
17bd41e
WIP: fix Simplified attribute issues
ana-pantilie Jul 29, 2021
b63e185
WIP: experiment, remove Simplified attribute
ana-pantilie Jul 30, 2021
1aeef34
Format with fourmolu
invalid-email-address Jul 30, 2021
3009f26
Revert "WIP: fix Simplified attribute issues"
ana-pantilie Aug 6, 2021
b692b9a
Add failing Floor test
ana-pantilie Aug 10, 2021
7aed8d2
Fix simplification for predicates with term children
ana-pantilie Aug 10, 2021
e73dbd9
Clean-up
ana-pantilie Aug 10, 2021
b58fc80
Format with fourmolu
invalid-email-address Aug 10, 2021
2d0a61b
Merge remote-tracking branch 'origin/fix-predicate-simplifier-term-si…
ana-pantilie Aug 10, 2021
0e18ea3
Format with fourmolu
invalid-email-address Aug 16, 2021
4d9f91a
Add prototype Predicate generator
ana-pantilie Aug 16, 2021
5214637
Format with fourmolu
invalid-email-address Aug 16, 2021
7c2c9e0
Implement Predicate generator, clean-up
ana-pantilie Aug 17, 2021
a98c443
Merge branch 'implement-predicate-generator' of github.com:kframework…
ana-pantilie Aug 17, 2021
9eed316
Format with fourmolu
invalid-email-address Aug 17, 2021
5c88ecb
Remove todo
ana-pantilie Aug 17, 2021
ac73f9a
Merge remote-tracking branch 'origin/implement-predicate-generator' i…
ana-pantilie Aug 17, 2021
4556b54
Fix test data
ana-pantilie Aug 17, 2021
1801482
Format with fourmolu
invalid-email-address Aug 17, 2021
91318f0
kore-test: change to evaluateTerm and evaluatePredicate
ana-pantilie Aug 17, 2021
9adddf3
Merge branch 'remove-old-term-simplifier' of github.com:kframework/ko…
ana-pantilie Aug 17, 2021
3521008
Format with fourmolu
invalid-email-address Aug 17, 2021
fd5c796
Remove unpractical test
ana-pantilie Aug 17, 2021
5229557
Merge branch 'remove-old-term-simplifier' of github.com:kframework/ko…
ana-pantilie Aug 17, 2021
dcfb23a
Merge remote-tracking branch 'origin/master' into remove-old-term-sim…
ana-pantilie Aug 19, 2021
6df5651
Format with fourmolu
invalid-email-address Aug 19, 2021
57c9ddc
Fix unit test
ana-pantilie Aug 19, 2021
c727fd6
Merge branch 'remove-old-term-simplifier' of github.com:kframework/ko…
ana-pantilie Aug 19, 2021
e98df9f
Merge remote-tracking branch 'origin/master' into remove-old-term-sim…
ana-pantilie Sep 2, 2021
3404f75
AddConditionWithReplacements: optimization
ana-pantilie Sep 6, 2021
a311ece
Format with fourmolu
invalid-email-address Sep 6, 2021
749d977
Merge remote-tracking branch 'origin/master' into remove-old-term-sim…
ana-pantilie Sep 6, 2021
992fa2c
Merge branch 'remove-old-term-simplifier' of github.com:kframework/ko…
ana-pantilie Sep 6, 2021
2a5d675
Format with fourmolu
invalid-email-address Sep 6, 2021
88bba44
Retrigger workflows
ana-pantilie Sep 6, 2021
8e5373e
Merge branch 'remove-old-term-simplifier' of github.com:kframework/ko…
ana-pantilie Sep 6, 2021
8596a22
Unit test: remove awkward \and predicate simplification
ana-pantilie Sep 6, 2021
b3c3741
Merge branch 'master' into remove-old-term-simplifier
ana-pantilie Sep 6, 2021
de76e11
Address review comment
Sep 8, 2021
a7d1cd3
Testing git config
ana-pantilie Sep 8, 2021
5f75a23
Merge branch 'master' into remove-old-term-simplifier
ana-pantilie Sep 9, 2021
7b451b4
Merge branch 'master' into remove-old-term-simplifier
ana-pantilie Sep 9, 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
7 changes: 5 additions & 2 deletions kore/src/Kore/Builtin/AssociativeCommutative.hs
Original file line number Diff line number Diff line change
Expand Up @@ -1076,7 +1076,8 @@ unifyEqualsNormalizedAc
TermLike RewritingVariableName ->
unifier (Pattern RewritingVariableName)
simplify term =
lowerLogicT $ simplifyConditionalTerm SideCondition.topTODO term
simplifyPatternScatter SideCondition.topTODO (Pattern.fromTermLike term)
& lowerLogicT

simplifyPair ::
( TermLike RewritingVariableName
Expand Down Expand Up @@ -1119,11 +1120,13 @@ unifyEqualsNormalizedAc
`andCondition` simplifiedValueCondition
)
where
-- TODO: can this be rewritten?
simplifyTermLike' ::
TermLike RewritingVariableName ->
unifier (Pattern RewritingVariableName)
simplifyTermLike' term =
lowerLogicT $ simplifyConditionalTerm SideCondition.topTODO term
simplifyPatternScatter SideCondition.topTODO (Pattern.fromTermLike term)
& lowerLogicT

buildResultFromUnifiers ::
forall normalized unifier variable.
Expand Down
7 changes: 7 additions & 0 deletions kore/src/Kore/Internal/OrPattern.hs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ License : BSD-3-Clause
module Kore.Internal.OrPattern (
OrPattern,
coerceSort,
markSimplified,
isSimplified,
hasSimplifiedChildren,
hasSimplifiedChildrenIgnoreConditions,
Expand Down Expand Up @@ -81,6 +82,12 @@ import Prelude.Kore
-- | The disjunction of 'Pattern'.
type OrPattern variable = MultiOr (Pattern variable)

markSimplified ::
InternalVariable variable =>
OrPattern variable ->
OrPattern variable
markSimplified = MultiOr.map Pattern.markSimplified

isSimplified :: SideCondition.Representation -> OrPattern variable -> Bool
isSimplified sideCondition = all (Pattern.isSimplified sideCondition)

Expand Down
46 changes: 33 additions & 13 deletions kore/src/Kore/Internal/SideCondition.hs
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,23 @@ addAssumptions predicates sideCondition =
predicates <> assumedTrue sideCondition
}

areIncludedIn ::
Eq variable =>
Foldable f =>
f (Predicate variable) ->
SideCondition variable ->
Bool
areIncludedIn predicates sideCondition =
all (flip isIncludedIn sideCondition) predicates
Copy link
Contributor

Choose a reason for hiding this comment

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

If isIncludedIn is only used here, does it make sense to flip the arguments here instead of simply flipping the arguments in the definition? Of course the name would need to be modified.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I wanted it to be similar to the elem function, so that the order of the arguments is intuitive.


isIncludedIn ::
Eq variable =>
Predicate variable ->
SideCondition variable ->
Bool
isIncludedIn predicate SideCondition{assumedTrue} =
predicate `elem` assumedTrue

{- | Assumes a 'Condition' to be true in the context of another
'SideCondition' and recalculates the term replacements table
from the combined predicate.
Expand All @@ -292,19 +309,22 @@ addConditionWithReplacements ::
SideCondition variable
addConditionWithReplacements
(from @(Condition _) @(MultiAnd _) -> newCondition)
sideCondition =
let combinedConditions = oldCondition <> newCondition
(assumedTrue, assumptions) =
simplifyConjunctionByAssumption combinedConditions
& extract
Assumptions replacementsTermLike replacementsPredicate = assumptions
in SideCondition
{ assumedTrue
, replacementsTermLike
, replacementsPredicate
, definedTerms
, simplifiedFunctions
}
sideCondition
| newCondition `areIncludedIn` sideCondition =
sideCondition
| otherwise =
let combinedConditions = oldCondition <> newCondition
(assumedTrue, assumptions) =
simplifyConjunctionByAssumption combinedConditions
& extract
Assumptions replacementsTermLike replacementsPredicate = assumptions
in SideCondition
{ assumedTrue
, replacementsTermLike
, replacementsPredicate
, definedTerms
, simplifiedFunctions
}
where
SideCondition
{ assumedTrue = oldCondition
Expand Down
18 changes: 1 addition & 17 deletions kore/src/Kore/Rewrite/Function/Evaluator.hs
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ maybeEvaluatePattern
| toSimplify == unchangedPatt =
return (OrPattern.fromPattern unchangedPatt)
| otherwise =
reevaluateFunctions sideCondition toSimplify
simplifyPattern sideCondition toSimplify

evaluateSortInjection ::
InternalVariable variable =>
Expand Down Expand Up @@ -323,22 +323,6 @@ sortInjectionSorts symbol =
, "should have two sort parameters."
]

{- | 'reevaluateFunctions' re-evaluates functions after a user-defined function
was evaluated.
-}
reevaluateFunctions ::
MonadSimplify simplifier =>
SideCondition RewritingVariableName ->
-- | Function evaluation result.
Pattern RewritingVariableName ->
simplifier (OrPattern RewritingVariableName)
reevaluateFunctions sideCondition rewriting = do
let (rewritingTerm, rewritingCondition) = Pattern.splitTerm rewriting
OrPattern.observeAllT $ do
simplifiedTerm <- simplifyConditionalTerm sideCondition rewritingTerm
simplifyCondition sideCondition $
Pattern.andCondition simplifiedTerm rewritingCondition

-- | Ands the given condition-substitution to the given function evaluation.
mergeWithConditionAndSubstitution ::
MonadSimplify simplifier =>
Expand Down
22 changes: 10 additions & 12 deletions kore/src/Kore/Simplify/Data.hs
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,8 @@ import Kore.IndexedModule.MetadataTools (
import qualified Kore.IndexedModule.MetadataToolsBuilder as MetadataTools
import qualified Kore.IndexedModule.OverloadGraph as OverloadGraph
import qualified Kore.IndexedModule.SortGraph as SortGraph
import Kore.Internal.TermLike (
TermLike,
)
import Kore.Internal.Pattern (Pattern)
import qualified Kore.Internal.Pattern as Pattern
import qualified Kore.Rewrite.Axiom.EvaluationStrategy as Axiom.EvaluationStrategy
import Kore.Rewrite.Axiom.Identifier (
matchAxiomIdentifier,
Expand All @@ -66,6 +65,7 @@ import Kore.Rewrite.RewritingVariable (
import qualified Kore.Simplify.Condition as Condition
import Kore.Simplify.InjSimplifier
import Kore.Simplify.OverloadSimplifier
import qualified Kore.Simplify.Pattern as Pattern
import Kore.Simplify.Simplify
import qualified Kore.Simplify.SubstitutionSimplifier as SubstitutionSimplifier
import qualified Kore.Simplify.TermLike as TermLike
Expand Down Expand Up @@ -117,10 +117,10 @@ instance (MonadMask prof, MonadProf prof) => MonadProf (SimplifierT prof) where

traceProfSimplify ::
MonadProf prof =>
TermLike RewritingVariableName ->
Pattern RewritingVariableName ->
prof a ->
prof a
traceProfSimplify termLike =
traceProfSimplify (Pattern.toTermLike -> termLike) =
maybe id traceProf ident
where
ident =
Expand All @@ -137,14 +137,12 @@ instance
askMetadataTools = asks metadataTools
{-# INLINE askMetadataTools #-}

simplifyTermLike sideCondition termLike =
traceProfSimplify termLike (TermLike.simplify sideCondition termLike)
{-# INLINE simplifyTermLike #-}
simplifyPattern sideCondition patt =
traceProfSimplify patt (Pattern.makeEvaluate sideCondition patt)
{-# INLINE simplifyPattern #-}

simplifyTermLikeOnly sideCondition termLike =
(traceProfSimplify termLike)
(TermLike.simplifyOnly sideCondition termLike)
{-# INLINE simplifyTermLikeOnly #-}
simplifyTerm = TermLike.simplify
{-# INLINE simplifyTerm #-}

simplifyCondition topCondition conditional = do
ConditionSimplifier simplify <- asks simplifierCondition
Expand Down
6 changes: 2 additions & 4 deletions kore/src/Kore/Simplify/Exists.hs
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,6 @@ import Kore.Rewrite.RewritingVariable (
import qualified Kore.Simplify.AndPredicates as And (
simplifyEvaluatedMultiPredicate,
)
import qualified Kore.Simplify.Pattern as Pattern (
makeEvaluate,
)
import Kore.Simplify.Simplify
import Kore.Substitute
import qualified Kore.TopBottom as TopBottom
Expand Down Expand Up @@ -308,7 +305,8 @@ makeEvaluateBoundLeft sideCondition variable boundTerm normalized =
Conditional.predicate normalized
}
orPattern <-
lift $ Pattern.makeEvaluate sideCondition substituted
simplifyPattern sideCondition substituted
& lift
Logic.scatter (toList orPattern)
where
someVariableName = inject (variableName variable)
Expand Down
45 changes: 30 additions & 15 deletions kore/src/Kore/Simplify/Pattern.hs
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,10 @@ import Kore.Rewrite.RewritingVariable (
import Kore.Simplify.Simplify (
MonadSimplify,
simplifyCondition,
simplifyConditionalTerm,
simplifyTerm,
)
import Kore.Substitute
import qualified Logic
import Prelude.Kore

-- | Simplifies the 'Pattern' and removes the exists quantifiers at the top.
Expand Down Expand Up @@ -110,21 +111,35 @@ This should only be used when it's certain that the
the 'Pattern'.
-}
makeEvaluate ::
forall simplifier.
MonadSimplify simplifier =>
SideCondition RewritingVariableName ->
Pattern RewritingVariableName ->
simplifier (OrPattern RewritingVariableName)
makeEvaluate sideCondition pattern' =
OrPattern.observeAllT $ do
withSimplifiedCondition <- simplifyCondition sideCondition pattern'
let (term, simplifiedCondition) =
Conditional.splitTerm withSimplifiedCondition
term' = substitute (toMap $ substitution simplifiedCondition) term
termSideCondition =
SideCondition.addConditionWithReplacements
simplifiedCondition
sideCondition
simplifiedTerm <- simplifyConditionalTerm termSideCondition term'
let simplifiedPattern =
Conditional.andCondition simplifiedTerm simplifiedCondition
simplifyCondition sideCondition simplifiedPattern
makeEvaluate sideCondition =
loop . OrPattern.fromPattern
where
loop input = do
output <-
OrPattern.traverse worker input
& fmap OrPattern.flatten
if input == output
then pure output
else loop output

worker pattern' =
OrPattern.observeAllT $ do
withSimplifiedCondition <- simplifyCondition sideCondition pattern'
let (term, simplifiedCondition) =
Conditional.splitTerm withSimplifiedCondition
term' = substitute (toMap $ substitution simplifiedCondition) term
termSideCondition =
SideCondition.addConditionWithReplacements
simplifiedCondition
sideCondition
simplifiedTerm <-
simplifyTerm termSideCondition term'
>>= Logic.scatter
let simplifiedPattern =
Conditional.andCondition simplifiedTerm simplifiedCondition
simplifyCondition sideCondition simplifiedPattern
14 changes: 7 additions & 7 deletions kore/src/Kore/Simplify/Predicate.hs
Original file line number Diff line number Diff line change
Expand Up @@ -133,14 +133,14 @@ simplify sideCondition original =
replacePredicate = SideCondition.replacePredicate sideCondition

-- If the child 'TermLike' is a term representing a predicate,
-- 'simplifyTermLikeOnly' will not attempt to simplify it, so
-- 'simplifyTerm' will not attempt to simplify it, so
-- it should be transformed into a 'Predicate' and simplified
-- accordingly.
simplifyTerm term
simplifyTerm' term
| Right predicate <- Predicate.makePredicate term =
toOrPattern (termLikeSort term) <$> worker predicate
| otherwise =
simplifyTermLikeOnly sideCondition term
simplifyTerm sideCondition term

repr = SideCondition.toRepresentation sideCondition

Expand All @@ -167,10 +167,10 @@ simplify sideCondition original =
ImpliesF impliesF -> simplifyImplies =<< traverse worker impliesF
IffF iffF -> simplifyIff =<< traverse worker iffF
CeilF ceilF ->
simplifyCeil sideCondition =<< traverse simplifyTerm ceilF
simplifyCeil sideCondition =<< traverse simplifyTerm' ceilF
FloorF floorF@(Floor _ _ child) ->
simplifyFloor (termLikeSort child) sideCondition
=<< traverse simplifyTerm floorF
=<< traverse simplifyTerm' floorF
ExistsF existsF ->
traverse worker (Exists.refreshExists avoid existsF)
>>= simplifyExists sideCondition
Expand All @@ -179,9 +179,9 @@ simplify sideCondition original =
>>= simplifyForall sideCondition
EqualsF equalsF@(Equals _ _ term _) ->
simplifyEquals sideCondition (termLikeSort term)
=<< traverse simplifyTerm equalsF
=<< traverse simplifyTerm' equalsF
InF inF ->
simplifyIn sideCondition =<< traverse simplifyTerm inF
simplifyIn sideCondition =<< traverse simplifyTerm' inF
where
_ :< predicateF = Recursive.project predicate
~avoid = freeVariableNames sideCondition
Expand Down
14 changes: 8 additions & 6 deletions kore/src/Kore/Simplify/Rule.hs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import Kore.Internal.Predicate (
pattern PredicateTrue,
)
import qualified Kore.Internal.Predicate as Predicate
import qualified Kore.Internal.SideCondition as SideCondition
import qualified Kore.Internal.Substitution as Substitution
import Kore.Internal.TermLike (
TermLike,
Expand All @@ -34,7 +35,6 @@ import Kore.Rewrite.RewritingVariable (
RewritingVariableName,
)
import Kore.Rewrite.RulePattern
import qualified Kore.Simplify.Pattern as Pattern
import Kore.Simplify.Simplify (
MonadSimplify,
)
Expand Down Expand Up @@ -64,7 +64,7 @@ simplifyRulePattern ::
simplifier (RulePattern RewritingVariableName)
simplifyRulePattern rule = do
let RulePattern{left} = rule
simplifiedLeft <- simplifyPattern left
simplifiedLeft <- simplifyPattern' left
case OrPattern.toPatterns simplifiedLeft of
[Conditional{term, predicate, substitution}]
| PredicateTrue <- predicate -> do
Expand Down Expand Up @@ -109,7 +109,7 @@ simplifyClaimPattern ::
simplifier ClaimPattern
simplifyClaimPattern claim = do
let ClaimPattern{left} = claim
simplifiedLeft <- simplifyPattern (Pattern.term left)
simplifiedLeft <- simplifyPattern' (Pattern.term left)
case OrPattern.toPatterns simplifiedLeft of
[Conditional{term, predicate, substitution}]
| PredicateTrue <- predicate ->
Expand All @@ -132,10 +132,12 @@ simplifyClaimPattern claim = do
return claim

-- | Simplify a 'TermLike' using only matching logic rules.
simplifyPattern ::
simplifyPattern' ::
MonadSimplify simplifier =>
TermLike RewritingVariableName ->
simplifier (OrPattern RewritingVariableName)
simplifyPattern termLike =
simplifyPattern' termLike =
Simplifier.localSimplifierAxioms (const mempty) $
Pattern.simplify (Pattern.fromTermLike termLike)
Simplifier.simplifyPattern
SideCondition.top
(Pattern.fromTermLike termLike)
Loading