Skip to content

Commit 015cdb8

Browse files
Do not ignore --strategy all (#2231)
* Use LogicT instead of MaybeT * Exit code * Stylish * Use seqstrict * Update two golden files * Update a golden file * Update golden * Import Foldable * Move import Foldable * Use gather * Remove ObserveAllT * Addressed comments * Compile
1 parent 9a77ee5 commit 015cdb8

File tree

7 files changed

+209
-90
lines changed

7 files changed

+209
-90
lines changed

kore/src/Kore/Exec.hs

Lines changed: 51 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import Control.DeepSeq
2929
)
3030
import Control.Error
3131
( note
32-
, runMaybeT
3332
)
3433
import qualified Control.Lens as Lens
3534
import Control.Monad
@@ -41,7 +40,6 @@ import Control.Monad.Catch
4140
import Data.Coerce
4241
( coerce
4342
)
44-
import qualified Data.List as List
4543
import qualified Data.Map.Strict as Map
4644
import Data.Text
4745
( Text
@@ -76,6 +74,11 @@ import Kore.IndexedModule.Resolvers
7674
( resolveInternalSymbol
7775
)
7876
import qualified Kore.Internal.Condition as Condition
77+
import Kore.Internal.MultiOr
78+
( make
79+
)
80+
import qualified Kore.Internal.MultiOr as MultiOr
81+
import qualified Kore.Internal.OrPattern as OrPattern
7982
import Kore.Internal.Pattern
8083
( Pattern
8184
)
@@ -146,6 +149,7 @@ import Kore.Step.Search
146149
import qualified Kore.Step.Search as Search
147150
import Kore.Step.Simplification.Data
148151
( MonadProf
152+
, SimplifierT
149153
, evalSimplifier
150154
)
151155
import qualified Kore.Step.Simplification.Data as Simplifier
@@ -171,6 +175,7 @@ import Log
171175
import qualified Log
172176
import Logic
173177
( LogicT
178+
, observeAllT
174179
)
175180
import qualified Logic
176181
import SMT
@@ -189,7 +194,8 @@ newtype Initialized = Initialized { rewriteRules :: [Rewrite] }
189194

190195
-- | Symbolic execution
191196
exec
192-
:: ( MonadIO smt
197+
:: forall smt
198+
. ( MonadIO smt
193199
, MonadLog smt
194200
, MonadSMT smt
195201
, MonadMask smt
@@ -207,8 +213,8 @@ exec breadthLimit verifiedModule strategy initialTerm =
207213
evalSimplifier verifiedModule' $ do
208214
initialized <- initialize verifiedModule
209215
let Initialized { rewriteRules } = initialized
210-
(execDepth, finalConfig) <-
211-
getFinalConfigOf $ do
216+
finals <-
217+
getFinalConfigsOf $ do
212218
initialConfig <-
213219
Pattern.simplify SideCondition.top
214220
(Pattern.fromTermLike initialTerm)
@@ -234,21 +240,22 @@ exec breadthLimit verifiedModule strategy initialTerm =
234240
( strategy rewriteRules
235241
, (ExecDepth 0, mkRewritingPattern initialConfig)
236242
)
237-
infoExecDepth execDepth
238-
let finalConfig' = getRewritingPattern finalConfig
239-
exitCode <- getExitCode verifiedModule finalConfig'
240-
let finalTerm = forceSort initialSort $ Pattern.toTermLike finalConfig'
243+
let (depths, finalConfigs) = unzip finals
244+
infoExecDepth (maximum depths)
245+
let finalConfigs' = make $ getRewritingPattern <$> finalConfigs
246+
exitCode <- getExitCode verifiedModule finalConfigs'
247+
let finalTerm = forceSort initialSort $ OrPattern.toTermLike finalConfigs'
241248
return (exitCode, finalTerm)
242249
where
243250
dropStrategy = snd
244-
-- Get the first final configuration of an execution graph.
245-
getFinalConfigOf = takeFirstResult >=> orElseBottom
246-
where
247-
takeResult = snd
248-
takeFirstResult act =
249-
Logic.observeT (takeResult <$> lift act) & runMaybeT
250-
orElseBottom =
251-
pure . fromMaybe (ExecDepth 0, mkRewritingPattern (Pattern.bottomOf initialSort))
251+
getFinalConfigsOf
252+
:: LogicT
253+
(SimplifierT smt)
254+
( [Strategy (Prim (RewriteRule RewritingVariableName))]
255+
, (ExecDepth, Pattern RewritingVariableName)
256+
)
257+
-> SimplifierT smt [(ExecDepth, Pattern RewritingVariableName)]
258+
getFinalConfigsOf act = observeAllT $ fmap snd act
252259
verifiedModule' =
253260
IndexedModule.mapPatterns
254261
-- TODO (thomas.tuegel): Move this into Kore.Builtin
@@ -277,33 +284,42 @@ trackExecDepth transit prim (execDepth, execState) = do
277284

278285
-- | Project the value of the exit cell, if it is present.
279286
getExitCode
280-
:: (MonadIO simplifier, MonadSimplify simplifier)
287+
:: forall simplifier
288+
. (MonadIO simplifier, MonadSimplify simplifier)
281289
=> VerifiedModule StepperAttributes
282290
-- ^ The main module
283-
-> Pattern VariableName
291+
-> OrPattern.OrPattern VariableName
284292
-- ^ The final configuration(s) of execution
285293
-> simplifier ExitCode
286-
getExitCode indexedModule finalConfig =
294+
getExitCode indexedModule configs =
287295
takeExitCode $ \mkExitCodeSymbol -> do
288296
let mkGetExitCode t = mkApplySymbol (mkExitCodeSymbol []) [t]
289-
exitCodePattern <-
290-
Pattern.simplifyTopConfiguration (mkGetExitCode <$> finalConfig)
291-
>>= Logic.scatter
292-
case Pattern.term exitCodePattern of
293-
Builtin_ (Domain.BuiltinInt (Domain.InternalInt _ exit))
294-
| exit == 0 -> return ExitSuccess
295-
| otherwise -> return $ ExitFailure $ fromInteger exit
296-
_ -> return $ ExitFailure 111
297+
exitCodePatterns <-
298+
do
299+
config <- Logic.scatter configs
300+
Pattern.simplifyTopConfiguration (mkGetExitCode <$> config)
301+
>>= Logic.scatter
302+
& MultiOr.observeAllT
303+
let exitCode =
304+
case toList (MultiOr.map Pattern.term exitCodePatterns) of
305+
[exitTerm] -> extractExit exitTerm
306+
_ -> ExitFailure 111
307+
return exitCode
297308
where
309+
extractExit = \case
310+
Builtin_ (Domain.BuiltinInt (Domain.InternalInt _ exit))
311+
| exit == 0 -> ExitSuccess
312+
| otherwise -> ExitFailure (fromInteger exit)
313+
_ -> ExitFailure 111
314+
298315
resolve = resolveInternalSymbol indexedModule . noLocationId
316+
317+
takeExitCode
318+
:: (([Sort] -> Symbol) -> simplifier ExitCode)
319+
-> simplifier ExitCode
299320
takeExitCode act =
300-
case resolve "LblgetExitCode" of
301-
Nothing -> pure ExitSuccess
302-
Just mkGetExitCodeSymbol -> do
303-
exitCodes <- Logic.observeAllT (act mkGetExitCodeSymbol)
304-
case List.nub exitCodes of
305-
[exit] -> pure exit
306-
_ -> pure $ ExitFailure 111
321+
resolve "LblgetExitCode"
322+
& maybe (pure ExitSuccess) act
307323

308324
-- | Symbolic search
309325
search

kore/src/Kore/Internal/MultiOr.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -266,8 +266,8 @@ The result is simplified with the 'filterOr' function.
266266
267267
-}
268268
mergeAll
269-
:: (Ord term, TopBottom term)
270-
=> [MultiOr term]
269+
:: (Ord term, TopBottom term, Foldable f)
270+
=> f (MultiOr term)
271271
-> MultiOr term
272272
mergeAll ors =
273273
filterOr (foldl' mergeGeneric (make []) ors)

test/imp/imp.k

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ argument, because we want to give it a short-circuit semantics. */
2727

2828
syntax AExp ::= Int | Id | "?Int"
2929
| "-" Int [format(%1%2)]
30-
| AExp "/" AExp [left, strict, color(pink)]
31-
> AExp "+" AExp [left, strict, color(pink)]
30+
| AExp "/" AExp [left, seqstrict, color(pink)]
31+
> AExp "+" AExp [left, seqstrict, color(pink)]
3232
| "(" AExp ")" [bracket]
3333
syntax BExp ::= Bool
3434
| AExp "<=" AExp [seqstrict, latex({#1}\leq{#2}), color(pink)]
Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,33 @@
1-
<T>
2-
<k>
3-
.
4-
</k>
5-
<state>
6-
r |-> 0
7-
x |-> ?I:Int
8-
y |-> ?I0:Int
9-
</state>
10-
</T>
11-
#And
12-
{
13-
false
14-
#Equals
15-
?I <=Int ?I0
16-
}
1+
<T>
2+
<k>
3+
.
4+
</k>
5+
<state>
6+
r |-> 0
7+
x |-> ?I:Int
8+
y |-> ?I0:Int
9+
</state>
10+
</T>
11+
#And
12+
{
13+
false
14+
#Equals
15+
?I <=Int ?I0
16+
}
17+
#Or
18+
<T>
19+
<k>
20+
.
21+
</k>
22+
<state>
23+
r |-> 0
24+
x |-> ?I:Int
25+
y |-> ?I0:Int
26+
</state>
27+
</T>
28+
#And
29+
{
30+
true
31+
#Equals
32+
?I <=Int ?I0
33+
}

test/imp/max-symbolic.imp.out.golden

Lines changed: 95 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,95 @@
1-
<T>
2-
<k>
3-
.
4-
</k>
5-
<state>
6-
max |-> ?I:Int
7-
x |-> ?I:Int
8-
y |-> ?I0:Int
9-
z |-> ?I1:Int
10-
</state>
11-
</T>
12-
#And
13-
{
14-
false
15-
#Equals
16-
?I <=Int ?I0
17-
}
18-
#And
19-
{
20-
false
21-
#Equals
22-
?I <=Int ?I1
23-
}
1+
<T>
2+
<k>
3+
.
4+
</k>
5+
<state>
6+
max |-> ?I0:Int
7+
x |-> ?I:Int
8+
y |-> ?I0:Int
9+
z |-> ?I1:Int
10+
</state>
11+
</T>
12+
#And
13+
{
14+
false
15+
#Equals
16+
?I0 <=Int ?I1
17+
}
18+
#And
19+
{
20+
true
21+
#Equals
22+
?I <=Int ?I0
23+
}
24+
#Or
25+
<T>
26+
<k>
27+
.
28+
</k>
29+
<state>
30+
max |-> ?I1:Int
31+
x |-> ?I:Int
32+
y |-> ?I0:Int
33+
z |-> ?I1:Int
34+
</state>
35+
</T>
36+
#And
37+
{
38+
false
39+
#Equals
40+
?I <=Int ?I0
41+
}
42+
#And
43+
{
44+
true
45+
#Equals
46+
?I <=Int ?I1
47+
}
48+
#Or
49+
<T>
50+
<k>
51+
.
52+
</k>
53+
<state>
54+
max |-> ?I1:Int
55+
x |-> ?I:Int
56+
y |-> ?I0:Int
57+
z |-> ?I1:Int
58+
</state>
59+
</T>
60+
#And
61+
{
62+
true
63+
#Equals
64+
?I0 <=Int ?I1
65+
}
66+
#And
67+
{
68+
true
69+
#Equals
70+
?I <=Int ?I0
71+
}
72+
#Or
73+
<T>
74+
<k>
75+
.
76+
</k>
77+
<state>
78+
max |-> ?I:Int
79+
x |-> ?I:Int
80+
y |-> ?I0:Int
81+
z |-> ?I1:Int
82+
</state>
83+
</T>
84+
#And
85+
{
86+
false
87+
#Equals
88+
?I <=Int ?I0
89+
}
90+
#And
91+
{
92+
false
93+
#Equals
94+
?I <=Int ?I1
95+
}

test/issue-2010/1.test.out.golden

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,19 @@
1-
<k>
2-
I:Int ~> .
3-
</k>
4-
#And
5-
{
6-
Some I
7-
#Equals
8-
f ( )
9-
}
1+
<k>
2+
I:Int ~> .
3+
</k>
4+
#And
5+
{
6+
Some I
7+
#Equals
8+
f ( )
9+
}
10+
#Or
11+
<k>
12+
true ~> .
13+
</k>
14+
#And
15+
{
16+
None
17+
#Equals
18+
f ( )
19+
}

test/search/initial.search.out.golden

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1-
<k>
2-
final2 ~> .
3-
</k>
1+
<k>
2+
final1 ~> .
3+
</k>
4+
#Or
5+
<k>
6+
final2 ~> .
7+
</k>

0 commit comments

Comments
 (0)