@@ -10,7 +10,6 @@ Expose concrete execution as a library
10
10
-}
11
11
module Kore.Exec
12
12
( exec
13
- , extractRules
14
13
, mergeAllRules
15
14
, mergeRulesConsecutiveBatches
16
15
, search
@@ -27,19 +26,27 @@ import Control.Concurrent.MVar
27
26
import Control.DeepSeq
28
27
( deepseq
29
28
)
30
- import Control.Error
31
- ( note
32
- )
33
29
import qualified Control.Lens as Lens
34
30
import Control.Monad
35
31
( (>=>)
36
32
)
37
33
import Control.Monad.Catch
38
34
( MonadMask
39
35
)
36
+ import Control.Monad.Trans.Except
37
+ ( ExceptT
38
+ , runExceptT
39
+ , throwE
40
+ )
40
41
import Data.Coerce
41
42
( coerce
42
43
)
44
+ import Data.Generics.Product
45
+ ( field
46
+ )
47
+ import Data.Generics.Wrapped
48
+ ( _Unwrapped
49
+ )
43
50
import qualified Data.Map.Strict as Map
44
51
import Data.Text
45
52
( Text
@@ -95,6 +102,10 @@ import Kore.Internal.TermLike
95
102
import Kore.Log.ErrorRewriteLoop
96
103
( errorRewriteLoop
97
104
)
105
+ import Kore.Log.ErrorRuleMergeDuplicate
106
+ ( errorRuleMergeDuplicateIds
107
+ , errorRuleMergeDuplicateLabels
108
+ )
98
109
import Kore.Log.InfoExecDepth
99
110
import Kore.Log.KoreLogOptions
100
111
( KoreLogOptions (.. )
211
222
-> smt (ExitCode , TermLike VariableName )
212
223
exec breadthLimit verifiedModule strategy initialTerm =
213
224
evalSimplifier verifiedModule' $ do
214
- initialized <- initialize verifiedModule
225
+ initialized <- initializeAndSimplify verifiedModule
215
226
let Initialized { rewriteRules } = initialized
216
227
finals <-
217
228
getFinalConfigsOf $ do
@@ -344,7 +355,7 @@ search
344
355
search breadthLimit verifiedModule strategy termLike searchPattern searchConfig
345
356
=
346
357
evalSimplifier verifiedModule $ do
347
- initialized <- initialize verifiedModule
358
+ initialized <- initializeAndSimplify verifiedModule
348
359
let Initialized { rewriteRules } = initialized
349
360
simplifiedPatterns <-
350
361
Pattern. simplify SideCondition. top
@@ -495,7 +506,7 @@ boundedModelCheck
495
506
-> smt (Bounded. CheckResult (TermLike VariableName ))
496
507
boundedModelCheck breadthLimit depthLimit definitionModule specModule searchOrder =
497
508
evalSimplifier definitionModule $ do
498
- initialized <- initialize definitionModule
509
+ initialized <- initializeAndSimplify definitionModule
499
510
let Initialized { rewriteRules } = initialized
500
511
specClaims = extractImplicationClaims specModule
501
512
assertSomeClaims specClaims
@@ -560,85 +571,68 @@ mergeRules
560
571
-- ^ The list of rules to merge
561
572
-> smt (Either Text [RewriteRule VariableName ])
562
573
mergeRules ruleMerger verifiedModule ruleNames =
563
- evalSimplifier verifiedModule $ do
564
- initialized <- initialize verifiedModule
574
+ evalSimplifier verifiedModule $ runExceptT $ do
575
+ initialized <- initializeWithoutSimplification verifiedModule
565
576
let Initialized { rewriteRules } = initialized
566
-
567
- let nonEmptyRules :: Either Text (NonEmpty (RewriteRule VariableName ))
568
- nonEmptyRules = do
569
- let rewriteRules' = unRewritingRule <$> rewriteRules
570
- rules <- extractRules rewriteRules' ruleNames
571
- case rules of
572
- [] -> Left " Empty rule list."
573
- (r : rs) -> Right (r :| rs)
574
-
575
- case nonEmptyRules of
576
- (Left left) -> return (Left left)
577
- (Right rules) -> Right <$> ruleMerger rules
578
-
579
- extractRules
580
- :: [RewriteRule VariableName ]
577
+ rewriteRules' = unRewritingRule <$> rewriteRules
578
+ rules <- extractAndSimplifyRules rewriteRules' ruleNames
579
+ lift $ ruleMerger rules
580
+
581
+ extractAndSimplifyRules
582
+ :: forall m
583
+ . MonadSimplify m
584
+ => [RewriteRule VariableName ]
581
585
-> [Text ]
582
- -> Either Text [RewriteRule VariableName ]
583
- extractRules rules = foldr addExtractRule (Right [] )
584
- where
585
- addExtractRule
586
- :: Text
587
- -> Either Text [RewriteRule VariableName ]
588
- -> Either Text [RewriteRule VariableName ]
589
- addExtractRule ruleName processedRules =
590
- (:) <$> extractRule ruleName <*> processedRules
591
-
592
- maybeRuleUniqueId :: RewriteRule VariableName -> Maybe Text
593
- maybeRuleUniqueId
594
- (RewriteRule RulePattern
595
- { attributes = Attribute. Axiom
596
- { uniqueId = Attribute. UniqueId maybeName }
597
- }
598
- )
599
- =
600
- maybeName
601
-
602
- maybeRuleLabel :: RewriteRule VariableName -> Maybe Text
603
- maybeRuleLabel
604
- (RewriteRule RulePattern
605
- { attributes = Attribute. Axiom
606
- { label = Attribute. Label maybeName }
607
- }
608
- )
609
- =
610
- maybeName
611
-
612
- idRules :: [RewriteRule VariableName ] -> [(Text , RewriteRule VariableName )]
613
- idRules = mapMaybe namedRule
614
- where
615
- namedRule rule = do
616
- name <- maybeRuleUniqueId rule
617
- return (name, rule)
618
-
619
- labelRules :: [RewriteRule VariableName ] -> [(Text , RewriteRule VariableName )]
620
- labelRules = mapMaybe namedRule
621
- where
622
- namedRule rule = do
623
- name <- maybeRuleLabel rule
624
- return (name, rule)
625
-
626
- rulesByName :: Map. Map Text (RewriteRule VariableName )
627
- rulesByName = Map. union
628
- (Map. fromListWith
629
- (const $ const $ error " duplicate rule" )
630
- (idRules rules)
631
- )
632
- (Map. fromListWith
633
- (const $ const $ error " duplicate rule" )
634
- (labelRules rules)
635
- )
586
+ -> ExceptT Text m (NonEmpty (RewriteRule VariableName ))
587
+ extractAndSimplifyRules rules names = do
588
+ let rulesById = mapMaybe ruleById rules
589
+ rulesByLabel = mapMaybe ruleByLabel rules
590
+ whenDuplicate errorRuleMergeDuplicateIds rulesById
591
+ whenDuplicate errorRuleMergeDuplicateLabels rulesByLabel
592
+ let ruleRegistry = Map. fromList (rulesById <> rulesByLabel)
593
+ extractedRules <-
594
+ traverse (extractRule ruleRegistry >=> simplifyRuleLhs) names
595
+ & fmap (>>= toList)
596
+ case extractedRules of
597
+ [] -> throwE " Empty rule list."
598
+ (r : rs) -> return (r :| rs)
636
599
637
- extractRule :: Text -> Either Text (RewriteRule VariableName )
638
- extractRule ruleName =
639
- note
640
- (" Rule not found: '" <> ruleName <> " '." )
641
- (Map. lookup ruleName rulesByName)
600
+ where
601
+ ruleById = ruleByName (field @ " uniqueId" )
602
+
603
+ ruleByLabel = ruleByName (field @ " label" )
604
+
605
+ ruleByName lens rule = do
606
+ name <-
607
+ Lens. view
608
+ (_Unwrapped . field @ " attributes" . lens . _Unwrapped)
609
+ rule
610
+ return (name, rule)
611
+
612
+ extractRule registry ruleName =
613
+ maybe
614
+ (throwE $ " Rule not found: '" <> ruleName <> " '." )
615
+ return
616
+ (Map. lookup ruleName registry)
617
+
618
+ whenDuplicate logError withNames = do
619
+ let duplicateNames =
620
+ findCollisions . mkMapWithCollisions $ withNames
621
+ unless (null duplicateNames) (logError duplicateNames)
622
+
623
+ mkMapWithCollisions
624
+ :: Ord key
625
+ => [(key , val )]
626
+ -> Map. Map key [val ]
627
+ mkMapWithCollisions pairs =
628
+ Map. fromListWith (<>)
629
+ $ (fmap . fmap ) pure pairs
630
+
631
+ findCollisions :: Map. Map key [val ] -> Map. Map key [val ]
632
+ findCollisions = filter (not . isSingleton)
633
+ where
634
+ isSingleton [_] = True
635
+ isSingleton _ = False
642
636
643
637
assertSingleClaim :: Monad m => [claim ] -> m ()
644
638
assertSingleClaim claims =
@@ -667,13 +661,28 @@ simplifySomeClaim rule = do
667
661
claim' <- Rule. simplifyClaimPattern claim
668
662
return $ Lens. set lensClaimPattern claim' rule
669
663
664
+ initializeAndSimplify
665
+ :: MonadSimplify simplifier
666
+ => VerifiedModule StepperAttributes
667
+ -> simplifier Initialized
668
+ initializeAndSimplify verifiedModule =
669
+ initialize (simplifyRuleLhs >=> Logic. scatter) verifiedModule
670
+
671
+ initializeWithoutSimplification
672
+ :: MonadSimplify simplifier
673
+ => VerifiedModule StepperAttributes
674
+ -> simplifier Initialized
675
+ initializeWithoutSimplification verifiedModule =
676
+ initialize return verifiedModule
677
+
670
678
-- | Collect various rules and simplifiers in preparation to execute.
671
679
initialize
672
680
:: forall simplifier
673
681
. MonadSimplify simplifier
674
- => VerifiedModule StepperAttributes
682
+ => (RewriteRule VariableName -> LogicT simplifier (RewriteRule VariableName ))
683
+ -> VerifiedModule StepperAttributes
675
684
-> simplifier Initialized
676
- initialize verifiedModule = do
685
+ initialize simplificationProcedure verifiedModule = do
677
686
rewriteRules <-
678
687
Logic. observeAllT $ do
679
688
rule <- Logic. scatter (extractRewriteAxioms verifiedModule)
@@ -684,7 +693,7 @@ initialize verifiedModule = do
684
693
:: RewriteRule VariableName
685
694
-> LogicT simplifier (RewriteRule RewritingVariableName )
686
695
initializeRule rule = do
687
- simplRule <- simplifyRuleLhs rule >>= Logic. scatter
696
+ simplRule <- simplificationProcedure rule
688
697
when (lhsEqualsRhs $ getRewriteRule simplRule)
689
698
(errorRewriteLoop simplRule)
690
699
let renamedRule = mkRewritingRule simplRule
@@ -712,7 +721,7 @@ initializeProver
712
721
-> Maybe (VerifiedModule StepperAttributes )
713
722
-> simplifier InitializedProver
714
723
initializeProver definitionModule specModule maybeTrustedModule = do
715
- initialized <- initialize definitionModule
724
+ initialized <- initializeAndSimplify definitionModule
716
725
tools <- Simplifier. askMetadataTools
717
726
let Initialized { rewriteRules } = initialized
718
727
changedSpecClaims :: [MaybeChanged SomeClaim ]
0 commit comments