Skip to content

Do not ignore --strategy all #2231

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 16 commits into from
Nov 5, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
86 changes: 51 additions & 35 deletions kore/src/Kore/Exec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ import Control.DeepSeq
)
import Control.Error
( note
, runMaybeT
)
import qualified Control.Lens as Lens
import Control.Monad
Expand All @@ -41,7 +40,6 @@ import Control.Monad.Catch
import Data.Coerce
( coerce
)
import qualified Data.List as List
import qualified Data.Map.Strict as Map
import Data.Text
( Text
Expand Down Expand Up @@ -76,6 +74,11 @@ import Kore.IndexedModule.Resolvers
( resolveInternalSymbol
)
import qualified Kore.Internal.Condition as Condition
import Kore.Internal.MultiOr
( make
)
import qualified Kore.Internal.MultiOr as MultiOr
import qualified Kore.Internal.OrPattern as OrPattern
import Kore.Internal.Pattern
( Pattern
)
Expand Down Expand Up @@ -146,6 +149,7 @@ import Kore.Step.Search
import qualified Kore.Step.Search as Search
import Kore.Step.Simplification.Data
( MonadProf
, SimplifierT
, evalSimplifier
)
import qualified Kore.Step.Simplification.Data as Simplifier
Expand All @@ -171,6 +175,7 @@ import Log
import qualified Log
import Logic
( LogicT
, observeAllT
)
import qualified Logic
import SMT
Expand All @@ -189,7 +194,8 @@ newtype Initialized = Initialized { rewriteRules :: [Rewrite] }

-- | Symbolic execution
exec
:: ( MonadIO smt
:: forall smt
. ( MonadIO smt
, MonadLog smt
, MonadSMT smt
, MonadMask smt
Expand All @@ -207,8 +213,8 @@ exec breadthLimit verifiedModule strategy initialTerm =
evalSimplifier verifiedModule' $ do
initialized <- initialize verifiedModule
let Initialized { rewriteRules } = initialized
(execDepth, finalConfig) <-
getFinalConfigOf $ do
finals <-
getFinalConfigsOf $ do
initialConfig <-
Pattern.simplify SideCondition.top
(Pattern.fromTermLike initialTerm)
Expand All @@ -234,21 +240,22 @@ exec breadthLimit verifiedModule strategy initialTerm =
( strategy rewriteRules
, (ExecDepth 0, mkRewritingPattern initialConfig)
)
infoExecDepth execDepth
let finalConfig' = getRewritingPattern finalConfig
exitCode <- getExitCode verifiedModule finalConfig'
let finalTerm = forceSort initialSort $ Pattern.toTermLike finalConfig'
let (depths, finalConfigs) = unzip finals
infoExecDepth (maximum depths)
let finalConfigs' = make $ getRewritingPattern <$> finalConfigs
exitCode <- getExitCode verifiedModule finalConfigs'
let finalTerm = forceSort initialSort $ OrPattern.toTermLike finalConfigs'
return (exitCode, finalTerm)
where
dropStrategy = snd
-- Get the first final configuration of an execution graph.
getFinalConfigOf = takeFirstResult >=> orElseBottom
where
takeResult = snd
takeFirstResult act =
Logic.observeT (takeResult <$> lift act) & runMaybeT
orElseBottom =
pure . fromMaybe (ExecDepth 0, mkRewritingPattern (Pattern.bottomOf initialSort))
getFinalConfigsOf
:: LogicT
(SimplifierT smt)
( [Strategy (Prim (RewriteRule RewritingVariableName))]
, (ExecDepth, Pattern RewritingVariableName)
)
-> SimplifierT smt [(ExecDepth, Pattern RewritingVariableName)]
getFinalConfigsOf act = observeAllT $ fmap snd act
verifiedModule' =
IndexedModule.mapPatterns
-- TODO (thomas.tuegel): Move this into Kore.Builtin
Expand Down Expand Up @@ -277,33 +284,42 @@ trackExecDepth transit prim (execDepth, execState) = do

-- | Project the value of the exit cell, if it is present.
getExitCode
:: (MonadIO simplifier, MonadSimplify simplifier)
:: forall simplifier
. (MonadIO simplifier, MonadSimplify simplifier)
=> VerifiedModule StepperAttributes
-- ^ The main module
-> Pattern VariableName
-> OrPattern.OrPattern VariableName
Copy link
Contributor

Choose a reason for hiding this comment

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

Because this type was changed, let's change the name of the argument to configs instead.

-- ^ The final configuration(s) of execution
-> simplifier ExitCode
getExitCode indexedModule finalConfig =
getExitCode indexedModule configs =
takeExitCode $ \mkExitCodeSymbol -> do
let mkGetExitCode t = mkApplySymbol (mkExitCodeSymbol []) [t]
exitCodePattern <-
Pattern.simplifyTopConfiguration (mkGetExitCode <$> finalConfig)
>>= Logic.scatter
case Pattern.term exitCodePattern of
Builtin_ (Domain.BuiltinInt (Domain.InternalInt _ exit))
| exit == 0 -> return ExitSuccess
| otherwise -> return $ ExitFailure $ fromInteger exit
_ -> return $ ExitFailure 111
exitCodePatterns <-
do
config <- Logic.scatter configs
Pattern.simplifyTopConfiguration (mkGetExitCode <$> config)
>>= Logic.scatter
& MultiOr.observeAllT
let exitCode =
case toList (MultiOr.map Pattern.term exitCodePatterns) of
[exitTerm] -> extractExit exitTerm
_ -> ExitFailure 111
return exitCode
where
extractExit = \case
Builtin_ (Domain.BuiltinInt (Domain.InternalInt _ exit))
| exit == 0 -> ExitSuccess
| otherwise -> ExitFailure (fromInteger exit)
_ -> ExitFailure 111

resolve = resolveInternalSymbol indexedModule . noLocationId

takeExitCode
:: (([Sort] -> Symbol) -> simplifier ExitCode)
-> simplifier ExitCode
takeExitCode act =
case resolve "LblgetExitCode" of
Nothing -> pure ExitSuccess
Just mkGetExitCodeSymbol -> do
exitCodes <- Logic.observeAllT (act mkGetExitCodeSymbol)
case List.nub exitCodes of
[exit] -> pure exit
_ -> pure $ ExitFailure 111
resolve "LblgetExitCode"
& maybe (pure ExitSuccess) act

-- | Symbolic search
search
Expand Down
4 changes: 2 additions & 2 deletions kore/src/Kore/Internal/MultiOr.hs
Original file line number Diff line number Diff line change
Expand Up @@ -266,8 +266,8 @@ The result is simplified with the 'filterOr' function.

-}
mergeAll
:: (Ord term, TopBottom term)
=> [MultiOr term]
:: (Ord term, TopBottom term, Foldable f)
=> f (MultiOr term)
-> MultiOr term
mergeAll ors =
filterOr (foldl' mergeGeneric (make []) ors)
Expand Down
4 changes: 2 additions & 2 deletions test/imp/imp.k
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ argument, because we want to give it a short-circuit semantics. */

syntax AExp ::= Int | Id | "?Int"
| "-" Int [format(%1%2)]
| AExp "/" AExp [left, strict, color(pink)]
> AExp "+" AExp [left, strict, color(pink)]
| AExp "/" AExp [left, seqstrict, color(pink)]
> AExp "+" AExp [left, seqstrict, color(pink)]
| "(" AExp ")" [bracket]
syntax BExp ::= Bool
| AExp "<=" AExp [seqstrict, latex({#1}\leq{#2}), color(pink)]
Expand Down
49 changes: 33 additions & 16 deletions test/imp/impossible-branch.imp.out.golden
Original file line number Diff line number Diff line change
@@ -1,16 +1,33 @@
<T>
<k>
.
</k>
<state>
r |-> 0
x |-> ?I:Int
y |-> ?I0:Int
</state>
</T>
#And
{
false
#Equals
?I <=Int ?I0
}
<T>
<k>
.
</k>
<state>
r |-> 0
x |-> ?I:Int
y |-> ?I0:Int
</state>
</T>
#And
{
false
#Equals
?I <=Int ?I0
}
#Or
<T>
<k>
.
</k>
<state>
r |-> 0
x |-> ?I:Int
y |-> ?I0:Int
</state>
</T>
#And
{
true
#Equals
?I <=Int ?I0
}
118 changes: 95 additions & 23 deletions test/imp/max-symbolic.imp.out.golden
Original file line number Diff line number Diff line change
@@ -1,23 +1,95 @@
<T>
<k>
.
</k>
<state>
max |-> ?I:Int
x |-> ?I:Int
y |-> ?I0:Int
z |-> ?I1:Int
</state>
</T>
#And
{
false
#Equals
?I <=Int ?I0
}
#And
{
false
#Equals
?I <=Int ?I1
}
<T>
<k>
.
</k>
<state>
max |-> ?I0:Int
x |-> ?I:Int
y |-> ?I0:Int
z |-> ?I1:Int
</state>
</T>
#And
{
false
#Equals
?I0 <=Int ?I1
}
#And
{
true
#Equals
?I <=Int ?I0
}
#Or
<T>
<k>
.
</k>
<state>
max |-> ?I1:Int
x |-> ?I:Int
y |-> ?I0:Int
z |-> ?I1:Int
</state>
</T>
#And
{
false
#Equals
?I <=Int ?I0
}
#And
{
true
#Equals
?I <=Int ?I1
}
#Or
<T>
<k>
.
</k>
<state>
max |-> ?I1:Int
x |-> ?I:Int
y |-> ?I0:Int
z |-> ?I1:Int
</state>
</T>
#And
{
true
#Equals
?I0 <=Int ?I1
}
#And
{
true
#Equals
?I <=Int ?I0
}
#Or
<T>
<k>
.
</k>
<state>
max |-> ?I:Int
x |-> ?I:Int
y |-> ?I0:Int
z |-> ?I1:Int
</state>
</T>
#And
{
false
#Equals
?I <=Int ?I0
}
#And
{
false
#Equals
?I <=Int ?I1
}
28 changes: 19 additions & 9 deletions test/issue-2010/1.test.out.golden
Original file line number Diff line number Diff line change
@@ -1,9 +1,19 @@
<k>
I:Int ~> .
</k>
#And
{
Some I
#Equals
f ( )
}
<k>
I:Int ~> .
</k>
#And
{
Some I
#Equals
f ( )
}
#Or
<k>
true ~> .
</k>
#And
{
None
#Equals
f ( )
}
10 changes: 7 additions & 3 deletions test/search/initial.search.out.golden
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
<k>
final2 ~> .
</k>
<k>
final1 ~> .
</k>
#Or
<k>
final2 ~> .
</k>