Skip to content

Commit 252ff7b

Browse files
ttuegelrv-jenkins
andauthored
Use new Ceil simplifier (#2653)
* OrPattern: Add fromOrCondition * OrCondition: Add fromPredicates * Ceil: Return OrCondition instead of OrPattern * Equals: Return OrCondition instead of OrPattern * Add Kore.Step.Simplification.TermLike.simplyOnly * Test.Kore.Step.Simplification.Predicate: Add Ceil tests * Add Test.Kore.Step.Simplification.TermLike.simplifyOnly * Clean up Kore.Step.Simplification.Application * Clean up Kore.Step.Simplification.Condition * Clean up Kore.Step.Function.Evaluator * Add instance Pretty (MultiAnd _) * Add instance Pretty (Conditional _ (TermLike _)) * Add simplifyTermLikeOnly to MonadSimplify * Move Ceil simplifier to new Predicate simplifier * TermLike.simplifyOnly: Do not simplify Rewrites * Refactor evaluateInj * Clean up simplifyOnly * Inj.simplify: Mark terms simplified * Predicate.simplify: Skip simplified Predicates * TermLike.simplifyOnly: Skip simplified TermLikes * Warn when predicates are not simplified * Kore.Step.Simplification.Condition.simplify: Remove redundant argument Co-authored-by: rv-jenkins <[email protected]>
1 parent f4d56bd commit 252ff7b

30 files changed

+942
-616
lines changed

kore/kore.cabal

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,7 @@ library
335335
Kore.Log.DebugSolver
336336
Kore.Log.DebugSubstitutionSimplifier
337337
Kore.Log.DebugUnification
338+
Kore.Log.DebugUnifyBottom
338339
Kore.Log.ErrorBottomTotalFunction
339340
Kore.Log.ErrorDecidePredicateUnknown
340341
Kore.Log.ErrorException
@@ -360,7 +361,7 @@ library
360361
Kore.Log.WarnStuckClaimState
361362
Kore.Log.WarnSymbolSMTRepresentation
362363
Kore.Log.WarnTrivialClaim
363-
Kore.Log.DebugUnifyBottom
364+
Kore.Log.WarnUnsimplifiedPredicate
364365
Kore.ModelChecker.Bounded
365366
Kore.ModelChecker.Simplification
366367
Kore.ModelChecker.Step

kore/src/Kore/Internal/Conditional.hs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,12 @@ instance
346346
Substitution.singleSubstitutionToPredicate
347347
<$> Substitution.unwrap substitution
348348

349+
instance
350+
InternalVariable variable =>
351+
Pretty (Conditional variable (TermLike variable))
352+
where
353+
pretty = unparse
354+
349355
instance
350356
( InternalVariable variable
351357
, SQL.Column term

kore/src/Kore/Internal/MultiAnd.hs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,17 @@ import Kore.Internal.Variable
5656
import Kore.TopBottom (
5757
TopBottom (..),
5858
)
59+
import Kore.Unparser (
60+
unparseAssoc',
61+
)
5962
import qualified Logic
6063
import Prelude.Kore hiding (
6164
map,
6265
traverse,
6366
)
67+
import Pretty (
68+
Pretty (..),
69+
)
6470

6571
-- | 'MultiAnd' is a Matching logic and of its children
6672

@@ -97,6 +103,10 @@ instance Debug child => Debug (MultiAnd child)
97103

98104
instance (Debug child, Diff child) => Diff (MultiAnd child)
99105

106+
instance Pretty child => Pretty (MultiAnd child) where
107+
pretty = unparseAssoc' "\\and{_}" "\\top{_}()" . (<$>) pretty . getMultiAnd
108+
{-# INLINE pretty #-}
109+
100110
instance (Ord child, TopBottom child) => Semigroup (MultiAnd child) where
101111
(MultiAnd []) <> b = b
102112
a <> (MultiAnd []) = a

kore/src/Kore/Internal/OrCondition.hs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ module Kore.Internal.OrCondition (
99
fromConditions,
1010
fromCondition,
1111
fromPredicate,
12+
fromPredicates,
1213
MultiOr.gather,
1314
MultiOr.observeAllT,
1415
bottom,
@@ -64,6 +65,12 @@ fromPredicate ::
6465
OrCondition variable
6566
fromPredicate = fromCondition . Condition.fromPredicate
6667

68+
fromPredicates ::
69+
InternalVariable variable =>
70+
[Predicate variable] ->
71+
OrCondition variable
72+
fromPredicates = fromConditions . map Condition.fromPredicate
73+
6774
{- | @\\bottom@
6875
6976
@

kore/src/Kore/Internal/OrPattern.hs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ module Kore.Internal.OrPattern (
1212
fromPatterns,
1313
toPatterns,
1414
fromPattern,
15+
fromOrCondition,
1516
fromTermLike,
1617
bottom,
1718
isFalse,
@@ -28,6 +29,7 @@ module Kore.Internal.OrPattern (
2829
MultiOr.observeAllT,
2930
MultiOr.map,
3031
MultiOr.traverse,
32+
MultiOr.traverseOr,
3133
) where
3234

3335
import Kore.Internal.Condition (
@@ -42,6 +44,9 @@ import Kore.Internal.MultiOr (
4244
MultiOr,
4345
)
4446
import qualified Kore.Internal.MultiOr as MultiOr
47+
import Kore.Internal.OrCondition (
48+
OrCondition,
49+
)
4550
import Kore.Internal.Pattern (
4651
Pattern,
4752
)
@@ -69,6 +74,7 @@ import Kore.Variables.Target (
6974
mkElementTarget,
7075
targetIfEqual,
7176
)
77+
import qualified Logic
7278
import Prelude.Kore
7379

7480
-- | The disjunction of 'Pattern'.
@@ -120,6 +126,14 @@ fromPatterns = from . toList
120126
toPatterns :: OrPattern variable -> [Pattern variable]
121127
toPatterns = from
122128

129+
fromOrCondition ::
130+
InternalVariable variable =>
131+
Sort ->
132+
OrCondition variable ->
133+
OrPattern variable
134+
fromOrCondition sort conditions =
135+
MultiOr.observeAll $ Pattern.fromCondition sort <$> Logic.scatter conditions
136+
123137
{- | A "disjunction" of one 'TermLike'.
124138
125139
See also: 'fromPattern'

kore/src/Kore/Log/Registry.hs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,9 @@ import Kore.Log.WarnSymbolSMTRepresentation (
127127
import Kore.Log.WarnTrivialClaim (
128128
WarnTrivialClaim,
129129
)
130+
import Kore.Log.WarnUnsimplifiedPredicate (
131+
WarnUnsimplifiedPredicate,
132+
)
130133
import Log (
131134
Entry (..),
132135
LogMessage,
@@ -202,6 +205,7 @@ entryHelpDocsErr, entryHelpDocsNoErr :: [Pretty.Doc ()]
202205
, mk $ Proxy @InfoProofDepth
203206
, mk $ Proxy @InfoExecDepth
204207
, mk $ Proxy @DebugProven
208+
, mk $ Proxy @WarnUnsimplifiedPredicate
205209
]
206210
,
207211
[ mk $ Proxy @ErrorBottomTotalFunction
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
{- |
2+
Copyright : (c) Runtime Verification, 2021
3+
License : NCSA
4+
-}
5+
module Kore.Log.WarnUnsimplifiedPredicate (
6+
WarnUnsimplifiedPredicate (..),
7+
warnUnsimplifiedPredicate,
8+
) where
9+
10+
import Kore.Internal.MultiAnd (
11+
MultiAnd,
12+
)
13+
import Kore.Internal.MultiOr (
14+
MultiOr,
15+
)
16+
import Kore.Internal.Predicate (
17+
Predicate,
18+
)
19+
import Kore.Rewriting.RewritingVariable
20+
import Log
21+
import Prelude.Kore
22+
import Pretty (
23+
Pretty,
24+
)
25+
import qualified Pretty
26+
27+
data WarnUnsimplifiedPredicate = WarnUnsimplifiedPredicate
28+
{ limit :: !Int
29+
, original :: !(Predicate RewritingVariableName)
30+
, output :: !(MultiOr (MultiAnd (Predicate RewritingVariableName)))
31+
}
32+
deriving stock (Show)
33+
34+
instance Pretty WarnUnsimplifiedPredicate where
35+
pretty WarnUnsimplifiedPredicate{original, output, limit} =
36+
Pretty.vsep
37+
[ Pretty.hsep
38+
[ "Predicate not simplified after"
39+
, Pretty.pretty limit
40+
, "rounds."
41+
]
42+
, "Original predicate:"
43+
, (Pretty.indent 4) (Pretty.pretty original)
44+
, Pretty.hsep
45+
[ "Output after"
46+
, Pretty.pretty limit
47+
, "rounds:"
48+
]
49+
, (Pretty.indent 4) (Pretty.pretty output)
50+
]
51+
52+
instance Entry WarnUnsimplifiedPredicate where
53+
entrySeverity _ = Warning
54+
helpDoc _ = "warn when a predicate is not simplified"
55+
56+
warnUnsimplifiedPredicate ::
57+
MonadLog log =>
58+
Int ->
59+
Predicate RewritingVariableName ->
60+
MultiOr (MultiAnd (Predicate RewritingVariableName)) ->
61+
log ()
62+
warnUnsimplifiedPredicate limit original output =
63+
logEntry WarnUnsimplifiedPredicate{limit, original, output}

kore/src/Kore/Step/Function/Evaluator.hs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,8 @@ import qualified Pretty
7373
-- to add memoization to a function evaluator.
7474
evaluateApplication ::
7575
forall simplifier.
76-
( MonadSimplify simplifier
77-
, MonadThrow simplifier
78-
) =>
76+
MonadSimplify simplifier =>
77+
MonadThrow simplifier =>
7978
-- | The predicate from the configuration
8079
SideCondition RewritingVariableName ->
8180
-- | Aggregated children predicate and substitution.

kore/src/Kore/Step/Simplification/Application.hs

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,8 @@ predicates ans substitutions, applying functions on the Application(terms),
6262
then merging everything into an Pattern.
6363
-}
6464
simplify ::
65-
( MonadSimplify simplifier
66-
, MonadThrow simplifier
67-
) =>
65+
MonadSimplify simplifier =>
66+
MonadThrow simplifier =>
6867
SideCondition RewritingVariableName ->
6968
Application Symbol (OrPattern RewritingVariableName) ->
7069
simplifier (OrPattern RewritingVariableName)
@@ -86,9 +85,8 @@ simplify sideCondition application = do
8685
MultiOr.distributeApplication application
8786

8887
makeAndEvaluateApplications ::
89-
( MonadSimplify simplifier
90-
, MonadThrow simplifier
91-
) =>
88+
MonadSimplify simplifier =>
89+
MonadThrow simplifier =>
9290
SideCondition RewritingVariableName ->
9391
Symbol ->
9492
[Pattern RewritingVariableName] ->
@@ -97,9 +95,8 @@ makeAndEvaluateApplications =
9795
makeAndEvaluateSymbolApplications
9896

9997
makeAndEvaluateSymbolApplications ::
100-
( MonadSimplify simplifier
101-
, MonadThrow simplifier
102-
) =>
98+
MonadSimplify simplifier =>
99+
MonadThrow simplifier =>
103100
SideCondition RewritingVariableName ->
104101
Symbol ->
105102
[Pattern RewritingVariableName] ->
@@ -119,9 +116,8 @@ makeAndEvaluateSymbolApplications sideCondition symbol children = do
119116
as much as possible inside the current rewrite step.
120117
-}
121118
evaluateApplicationFunction ::
122-
( MonadSimplify simplifier
123-
, MonadThrow simplifier
124-
) =>
119+
MonadSimplify simplifier =>
120+
MonadThrow simplifier =>
125121
-- | The predicate from the configuration
126122
SideCondition RewritingVariableName ->
127123
-- | The pattern to be evaluated

kore/src/Kore/Step/Simplification/Ceil.hs

Lines changed: 13 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -87,38 +87,23 @@ A ceil(or) is equal to or(ceil). We also take into account that
8787
simplify ::
8888
MonadSimplify simplifier =>
8989
SideCondition RewritingVariableName ->
90-
Ceil Sort (OrPattern RewritingVariableName) ->
91-
simplifier (OrPattern RewritingVariableName)
90+
Ceil sort (OrPattern RewritingVariableName) ->
91+
simplifier (OrCondition RewritingVariableName)
9292
simplify
9393
sideCondition
9494
Ceil{ceilChild = child} =
9595
simplifyEvaluated sideCondition child
9696

9797
{- | 'simplifyEvaluated' evaluates a ceil given its child, see 'simplify'
9898
for details.
99-
-}
100-
101-
{- TODO (virgil): Preserve pattern sorts under simplification.
102-
103-
One way to preserve the required sort annotations is to make 'simplifyEvaluated'
104-
take an argument of type
105-
106-
> CofreeF (Ceil Sort) (Attribute.Pattern variable) (OrPattern variable)
107-
108-
instead of an 'OrPattern' argument. The type of 'makeEvaluate' may
109-
be changed analogously. The 'Attribute.Pattern' annotation will eventually cache
110-
information besides the pattern sort, which will make it even more useful to
111-
carry around.
112-
11399
-}
114100
simplifyEvaluated ::
115101
MonadSimplify simplifier =>
116102
SideCondition RewritingVariableName ->
117103
OrPattern RewritingVariableName ->
118-
simplifier (OrPattern RewritingVariableName)
104+
simplifier (OrCondition RewritingVariableName)
119105
simplifyEvaluated sideCondition child =
120-
OrPattern.flatten
121-
<$> OrPattern.traverse (makeEvaluate sideCondition) child
106+
OrPattern.traverseOr (makeEvaluate sideCondition) child
122107

123108
{- | Evaluates a ceil given its child as an Pattern, see 'simplify'
124109
for details.
@@ -127,33 +112,18 @@ makeEvaluate ::
127112
MonadSimplify simplifier =>
128113
SideCondition RewritingVariableName ->
129114
Pattern RewritingVariableName ->
130-
simplifier (OrPattern RewritingVariableName)
115+
simplifier (OrCondition RewritingVariableName)
131116
makeEvaluate sideCondition child
132-
| Pattern.isTop child = return OrPattern.top
133-
| Pattern.isBottom child = return OrPattern.bottom
134-
| otherwise = makeEvaluateNonBoolCeil sideCondition child
135-
136-
makeEvaluateNonBoolCeil ::
137-
MonadSimplify simplifier =>
138-
SideCondition RewritingVariableName ->
139-
Pattern RewritingVariableName ->
140-
simplifier (OrPattern RewritingVariableName)
141-
makeEvaluateNonBoolCeil sideCondition patt@Conditional{term}
142-
| isTop term =
143-
return $
144-
OrPattern.fromPattern
145-
patt{term = mkTop_} -- erase the term's sort.
117+
| Pattern.isTop child = return OrCondition.top
118+
| Pattern.isBottom child = return OrCondition.bottom
119+
| isTop term = return $ OrCondition.fromCondition condition
146120
| otherwise = do
147121
termCeil <- makeEvaluateTerm sideCondition term
148-
result <-
149-
And.simplifyEvaluatedMultiPredicate
150-
sideCondition
151-
( MultiAnd.make
152-
[ MultiOr.make [Condition.eraseConditionalTerm patt]
153-
, termCeil
154-
]
155-
)
156-
return (OrPattern.map Pattern.fromCondition_ result)
122+
And.simplifyEvaluatedMultiPredicate
123+
sideCondition
124+
(MultiAnd.make [MultiOr.make [condition], termCeil])
125+
where
126+
(term, condition) = Pattern.splitTerm child
157127

158128
-- TODO: Ceil(function) should be an and of all the function's conditions, both
159129
-- implicit and explicit.

0 commit comments

Comments
 (0)