Skip to content

Commit 0427fae

Browse files
Distinguish \bottom from stuck states (#2451)
* WIP * Test * Undo: Dockerfile * Format with stylish-haskell * Remove Strict pragma * Test: --search-final * Test: --search-final (also add 2.test and 2.test.golden) * Use isBottom instead of comparing to mempty * Format with stylish-haskell * Rebuild Co-authored-by: andreiburdusa <andreiburdusa@users.noreply.github.com> Co-authored-by: rv-jenkins <admin@runtimeverification.com>
1 parent f0d93ac commit 0427fae

File tree

8 files changed

+53
-28
lines changed

8 files changed

+53
-28
lines changed

kore/src/Kore/Exec.hs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ import Control.Concurrent.MVar
2828
import Control.DeepSeq
2929
( deepseq
3030
)
31+
import Control.Error
32+
( hoistMaybe
33+
)
3134
import qualified Control.Lens as Lens
3235
import Control.Monad
3336
( (>=>)
@@ -259,6 +262,7 @@ exec
259262
infoExecDepth (maximum depths)
260263
let finalConfigs' =
261264
MultiOr.make
265+
$ catMaybes
262266
$ extractProgramState
263267
<$> finalConfigs
264268
exitCode <- getExitCode verifiedModule finalConfigs'
@@ -407,11 +411,9 @@ search
407411
executionGraph <-
408412
runStrategy' (Start initialPattern)
409413
let
410-
match target config1 config2 =
411-
Search.matchWith
412-
target
413-
config1
414-
(extractProgramState config2)
414+
match target config1 config2 = do
415+
extracted <- hoistMaybe $ extractProgramState config2
416+
Search.matchWith target config1 extracted
415417
solutionsLists <-
416418
searchGraph
417419
searchConfig

kore/src/Kore/Step.hs

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ import Kore.Step.Strategy hiding
7070
( transitionRule
7171
)
7272
import qualified Kore.Step.Strategy as Strategy
73+
import Kore.TopBottom
74+
( isBottom
75+
)
7376
import Kore.Unparser
7477
( Unparse (..)
7578
)
@@ -89,6 +92,8 @@ data ProgramState a
8992
| Remaining !a
9093
-- ^ The configuration is a remainder resulting
9194
-- from rewrite rule application.
95+
| Bottom
96+
-- ^ The execution step yields no children
9297
deriving (Eq, Ord, Show)
9398
deriving (Functor)
9499
deriving (GHC.Generic)
@@ -111,11 +116,13 @@ instance Unparse a => Pretty (ProgramState a) where
111116
[ "remaining:"
112117
, Pretty.indent 4 $ unparse a
113118
]
119+
pretty Bottom = "\\bottom"
114120

115-
extractProgramState :: ProgramState a -> a
116-
extractProgramState (Rewritten a) = a
117-
extractProgramState (Remaining a) = a
118-
extractProgramState (Start a) = a
121+
extractProgramState :: ProgramState a -> Maybe a
122+
extractProgramState (Rewritten a) = Just a
123+
extractProgramState (Remaining a) = Just a
124+
extractProgramState (Start a) = Just a
125+
extractProgramState Bottom = Nothing
119126

120127
retractRemaining :: ProgramState a -> Maybe a
121128
retractRemaining (Remaining a) = Just a
@@ -184,61 +191,62 @@ transitionRule rewriteGroups = transitionRuleWorker
184191
transitionRuleWorker _ Begin (Rewritten a) = pure $ Start a
185192
transitionRuleWorker _ Begin (Remaining _) = empty
186193
transitionRuleWorker _ Begin state@(Start _) = pure state
194+
transitionRuleWorker _ Begin Bottom = empty
187195

188196
transitionRuleWorker _ Simplify (Rewritten patt) =
189-
Rewritten <$> transitionSimplify patt
197+
transitionSimplify Rewritten patt
190198
transitionRuleWorker _ Simplify (Remaining patt) =
191-
Remaining <$> transitionSimplify patt
199+
transitionSimplify Remaining patt
192200
transitionRuleWorker _ Simplify (Start patt) =
193-
Start <$> transitionSimplify patt
201+
transitionSimplify Start patt
202+
transitionRuleWorker _ Simplify Bottom =
203+
empty
194204

195205
transitionRuleWorker mode Rewrite (Remaining patt) =
196206
transitionRewrite mode patt
197207
transitionRuleWorker mode Rewrite (Start patt) =
198208
transitionRewrite mode patt
199209
transitionRuleWorker _ Rewrite state@(Rewritten _) =
200210
pure state
211+
transitionRuleWorker _ Rewrite Bottom =
212+
empty
201213

202-
transitionSimplify config = do
214+
transitionSimplify prim config = do
203215
configs <- lift $ Pattern.simplifyTopConfiguration config
204216
filteredConfigs <- SMT.Evaluator.filterMultiOr configs
205-
asum (pure <$> toList filteredConfigs)
217+
if isBottom filteredConfigs
218+
then pure Bottom
219+
else prim <$> asum (pure <$> toList filteredConfigs)
206220

207-
transitionRewrite All patt =
208-
transitionAllRewrite patt
209-
transitionRewrite Any patt =
210-
transitionAnyRewrite patt
221+
transitionRewrite All patt = transitionAllRewrite patt
222+
transitionRewrite Any patt = transitionAnyRewrite patt
211223

212224
transitionAllRewrite config =
213225
foldM transitionRewrite' (Remaining config) rewriteGroups
214226
where
215227
transitionRewrite' applied rewrites
216228
| Just config' <- retractRemaining applied =
217-
Step.applyRewriteRulesParallel
218-
rewrites
219-
config'
229+
Step.applyRewriteRulesParallel rewrites config'
220230
& lift
221231
>>= deriveResults
222232
>>= simplifyRemainder
223233
| otherwise = pure applied
224-
simplifyRemainder (Remaining p) =
225-
Remaining <$> transitionSimplify p
234+
simplifyRemainder (Remaining p) = transitionSimplify Remaining p
226235
simplifyRemainder p = return p
227236

228237
transitionAnyRewrite config = do
229238
let rules = concat rewriteGroups
230-
results <-
231-
Step.applyRewriteRulesSequence
232-
config
233-
rules
239+
results <- Step.applyRewriteRulesSequence config rules
234240
deriveResults results
235241

236242
deriveResults
237243
:: Comonad w
238244
=> Result.Results (w (RulePattern variable)) a
239245
-> TransitionT (RewriteRule variable) m (ProgramState a)
240246
deriveResults Result.Results { results, remainders } =
241-
addResults results <|> addRemainders remainders
247+
if null results && null remainders
248+
then pure Bottom
249+
else addResults results <|> addRemainders remainders
242250
where
243251
addResults results' = asum (addResult <$> results')
244252
addResult Result.Result { appliedRule, result } = do

test/issue-2445/1.test

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
1

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#Bottom

test/issue-2445/2.test

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
1

test/issue-2445/2.test.out.golden

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#Bottom

test/issue-2445/Makefile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
DEF = test
2+
include $(CURDIR)/../include.mk
3+
4+
2.test.out: \
5+
KRUN_OPTS += --search-final

test/issue-2445/test.k

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module TEST
2+
imports INT
3+
syntax FOO ::= "foo"
4+
configuration <k> foo ~> $PGM:Int </k>
5+
rule <k> foo => #Bottom ... </k>
6+
endmodule

0 commit comments

Comments
 (0)