@@ -70,6 +70,9 @@ import Kore.Step.Strategy hiding
7070 ( transitionRule
7171 )
7272import qualified Kore.Step.Strategy as Strategy
73+ import Kore.TopBottom
74+ ( isBottom
75+ )
7376import 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
120127retractRemaining :: ProgramState a -> Maybe a
121128retractRemaining (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
236242deriveResults
237243 :: Comonad w
238244 => Result. Results (w (RulePattern variable )) a
239245 -> TransitionT (RewriteRule variable ) m (ProgramState a )
240246deriveResults 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
0 commit comments