Skip to content

Commit 14a7f15

Browse files
authored
Rename free rule variables at initialization (#1794)
* Kore.Exec: Remove ToRulePattern * Kore.HasPriority * Kore.Step: Remove ToRulePattern * HasAttributes * Kore.Repl: Remove type parameters * Kore.Repl: Remove ReplState type parameter * Kore.Repl: Remove Config type parameter * instance From _ SourceLocation * instance From _ Label, instance From _ RuleIndex * ReachabilityRule: Remove type parameter * OnePathRule: Remove type parameter * AllPathRule: Remove type parameter * Kore.Strategies.Goal: Formatting * Kore.Strategies.Goal.ProofState: Require fewer type parameters * Generalize signature of getPriorityOfAxiom * Kore.Strategies.Goal.removeDestination: Specify signature * Kore.Strategies.Goal.removeDestination: Remove ToRulePattern * leftPattern: Obey Lens laws * Kore.Step.RulePattern: Initialize predicate sorts correctly * Test.Kore.Strategies.OnePath.Step: Initialize rule sorts correctly * Kore.Strategies.Goal: Preserve proof goal sorts * Test.Kore.Step.Rule.Simplify: Preserve sorts * simplifyClaimRule: Apply simplification substitution * instance From (Conditional _ _) (Predicate _): Preserve predicate sort * removeDestination: Remove nested if statements * Kore.Strategies.Goal.simplify: Remove ToRulePattern * Refactor Kore.Strategies.Goal.simplify * Kore.Strategies.Goal.isTriviallyValid: Remove ToRulePattern * Kore.Strategies.Goal.isTrusted: Remove ToRulePattern * Kore.Strategies.Goal.deriveWith: Remove constraint ToRulePattern * Kore.Strategies.Goal.deriveResults: Remove constraint FromRulePattern * Kore.Strategies.Goal: Remove constraints ToRulePattern, FromRulePattern * Kore.Strategies.Verification: Specialize to ReachabilityRule * Kore.Strategies.Verification.verifyHelper: Specialize to ReachabilityRule * Kore.Strategies.Verification.Stuck: Specialize type * Kore.Strategies.Verification.verifyClaim: Specialize type to ReachabilityRule * Kore.Strategies.Verification.verifyClaimStep: Specialize type to ReachabilityRule * Kore.Strategies.Verification.transitionRule': Specialize type to ReachabilityRule * Kore.Strategies.Verification: Clean up * Remove type Kore.Strategies.Verification.Claim * Kore.Strategies.Verification: TODO * Kore.Strategies.Goal: Remove ToRulePattern * Remove function Kore.Strategies.Goal.configurationDestinationToRule * Kore.Strategies.Rule: Remove instances of ToRulePattern and FromRulePattern * Revert "Kore.Strategies.Rule: Remove instances of ToRulePattern and FromRulePattern" This reverts commit 4260645. * Kore.Repl: Remove constraint ToRulePattern * Kore.Strategies.Rule: Remove instances of FromRulePattern * Kore.Repl: Remove use of function ruleToGoal * Remove member ruleToGoal of class Goal * Rename free rule variables at initialization Instead of renaming the variables of each semantic rule as it is attempted, the free variables of each rule are renamed at initialization. The former behavior exhibits poor performance: the work of renaming is substantially duplicated because every semantic rule is attempted at every step. There is a small amount of work to rename the free variables of each _applied_ semantic rule, but the number of applied rules is small, and this work is not really duplicated. * Kore.Exec: Undo CPS transformations * Kore.Exec: Use Compose * extractClaim: Do not return attributes used to construct claim The attributes can be accessed from the claim itself, there is no need to return a tuple of attributes and claim. * PROF OPTIONS_GHC -fno-prof-auto * ruleAllPathToRuleReachability: Use coerce * fixup! PROF OPTIONS_GHC -fno-prof-auto * Kore.Exec: Lint * Kore.Exec: Lint * Kore.Strategies.Goal: Remove duplicate withConfiguration'
1 parent 41ab29c commit 14a7f15

File tree

21 files changed

+277
-306
lines changed

21 files changed

+277
-306
lines changed

kore/src/Branch.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ License : NCSA
66

77
{-# LANGUAGE UndecidableInstances #-}
88

9+
{-# OPTIONS_GHC -fno-prof-auto #-}
10+
911
module Branch
1012
( BranchT (..)
1113
, mapBranchT

kore/src/Kore/Debug.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{-# OPTIONS_GHC -Wno-unused-top-binds #-}
2+
{-# OPTIONS_GHC -fno-prof-auto #-}
23

34
{- |
45
Copyright : (c) Runtime Verification, 2018

kore/src/Kore/Exec.hs

Lines changed: 86 additions & 156 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,6 @@ import Control.Monad.Catch
3434
import Control.Monad.Trans.Except
3535
( runExceptT
3636
)
37-
import qualified Data.Bifunctor as Bifunctor
38-
( second
39-
)
4037
import Data.Coerce
4138
( coerce
4239
)
@@ -110,6 +107,7 @@ import qualified Kore.Profiler.Profile as Profiler
110107
)
111108
import qualified Kore.Repl as Repl
112109
import qualified Kore.Repl.Data as Repl.Data
110+
import Kore.Rewriting.RewritingVariable
113111
import Kore.Step
114112
import Kore.Step.Rule
115113
( extractImplicationClaims
@@ -126,9 +124,7 @@ import Kore.Step.Rule.Simplify
126124
( SimplifyRuleLHS (..)
127125
)
128126
import Kore.Step.RulePattern
129-
( AllPathRule (..)
130-
, ImplicationRule (..)
131-
, OnePathRule (..)
127+
( ImplicationRule (..)
132128
, ReachabilityRule (..)
133129
, RewriteRule (RewriteRule)
134130
, RulePattern (RulePattern)
@@ -329,10 +325,14 @@ prove
329325
depthLimit
330326
definitionModule
331327
specModule
332-
maybeAlreadyProvenModule
328+
trustedModule
333329
=
334-
evalProver definitionModule specModule maybeAlreadyProvenModule
335-
$ \initialized -> do
330+
evalSimplifier definitionModule $ do
331+
initialized <-
332+
initializeProver
333+
definitionModule
334+
specModule
335+
trustedModule
336336
let InitializedProver { axioms, claims, alreadyProven } = initialized
337337
verify
338338
breadthLimit
@@ -373,16 +373,20 @@ proveWithRepl
373373
proveWithRepl
374374
definitionModule
375375
specModule
376-
maybeAlreadyProvenModule
376+
trustedModule
377377
mvar
378378
replScript
379379
replMode
380380
scriptModeOutput
381381
outputFile
382382
mainModuleName
383383
=
384-
evalProver definitionModule specModule maybeAlreadyProvenModule
385-
$ \initialized -> do
384+
evalSimplifier definitionModule $ do
385+
initialized <-
386+
initializeProver
387+
definitionModule
388+
specModule
389+
trustedModule
386390
let InitializedProver { axioms, claims } = initialized
387391
Repl.runRepl
388392
axioms
@@ -410,8 +414,8 @@ boundedModelCheck
410414
-> Strategy.GraphSearchOrder
411415
-> smt (Bounded.CheckResult (TermLike Variable))
412416
boundedModelCheck breadthLimit depthLimit definitionModule specModule searchOrder =
413-
evalSimplifier definitionModule $ initialize definitionModule
414-
$ \initialized -> do
417+
evalSimplifier definitionModule $ do
418+
initialized <- initialize definitionModule
415419
let Initialized { rewriteRules } = initialized
416420
specClaims = extractImplicationClaims specModule
417421
assertSomeClaims specClaims
@@ -473,9 +477,8 @@ mergeRules
473477
-- ^ The list of rules to merge
474478
-> smt (Either Text [RewriteRule Variable])
475479
mergeRules ruleMerger verifiedModule ruleNames =
476-
evalSimplifier verifiedModule
477-
$ initialize verifiedModule
478-
$ \initialized -> do
480+
evalSimplifier verifiedModule $ do
481+
initialized <- initialize verifiedModule
479482
let Initialized { rewriteRules } = initialized
480483

481484
let nonEmptyRules :: Either Text (NonEmpty (RewriteRule Variable))
@@ -565,29 +568,19 @@ assertSomeClaims claims =
565568
++ "Possible explanation: the frontend and the backend don't agree "
566569
++ "on the representation of claims."
567570

568-
makeReachabilityRule
569-
:: (Attribute.Axiom Symbol Variable, ReachabilityRule)
570-
-> ReachabilityRule
571-
makeReachabilityRule (attributes, reachabilityRule) =
572-
case reachabilityRule of
573-
OnePath (OnePathRule rulePattern) ->
574-
OnePath (OnePathRule rulePattern { attributes })
575-
AllPath (AllPathRule rulePattern) ->
576-
AllPath (AllPathRule rulePattern { attributes })
577-
578571
makeImplicationRule
579572
:: (Attribute.Axiom Symbol Variable, ImplicationRule Variable)
580573
-> ImplicationRule Variable
581574
makeImplicationRule (attributes, ImplicationRule rulePattern) =
582575
ImplicationRule rulePattern { attributes }
583576

584-
simplifyRuleOnSecond
577+
simplifyReachabilityRule
585578
:: MonadSimplify simplifier
586-
=> (Attribute.Axiom Symbol variable, ReachabilityRule)
587-
-> simplifier (Attribute.Axiom Symbol variable, ReachabilityRule)
588-
simplifyRuleOnSecond (atts, rule) = do
579+
=> ReachabilityRule
580+
-> simplifier ReachabilityRule
581+
simplifyReachabilityRule rule = do
589582
rule' <- Rule.simplifyRewriteRule (RewriteRule . toRulePattern $ rule)
590-
return (atts, Goal.fromRulePattern rule . getRewriteRule $ rule')
583+
return (Goal.fromRulePattern rule . getRewriteRule $ rule')
591584

592585
-- | Construct an execution graph for the given input pattern.
593586
execute
@@ -600,39 +593,37 @@ execute
600593
-> TermLike Variable
601594
-- ^ The input pattern
602595
-> simplifier Execution
603-
execute breadthLimit verifiedModule strategy inputPattern =
604-
initialize verifiedModule $ \initialized -> do
605-
let Initialized { rewriteRules } = initialized
606-
simplifier <- Simplifier.askSimplifierTermLike
607-
axiomIdToSimplifier <- Simplifier.askSimplifierAxioms
608-
simplifiedPatterns <-
609-
Pattern.simplify
610-
SideCondition.top
611-
(Pattern.fromTermLike inputPattern)
612-
let
613-
initialPattern =
614-
case MultiOr.extractPatterns simplifiedPatterns of
615-
[] -> Pattern.bottomOf patternSort
616-
(config : _) -> config
617-
where
618-
patternSort = termLikeSort inputPattern
619-
runStrategy' =
620-
runStrategy breadthLimit transitionRule (strategy rewriteRules)
621-
executionGraph <- runStrategy' initialPattern
622-
return Execution
623-
{ simplifier
624-
, axiomIdToSimplifier
625-
, executionGraph
626-
}
596+
execute breadthLimit verifiedModule strategy inputPattern = do
597+
initialized <- initialize verifiedModule
598+
let Initialized { rewriteRules } = initialized
599+
simplifier <- Simplifier.askSimplifierTermLike
600+
axiomIdToSimplifier <- Simplifier.askSimplifierAxioms
601+
simplifiedPatterns <-
602+
Pattern.simplify SideCondition.top
603+
$ Pattern.fromTermLike inputPattern
604+
let
605+
initialPattern =
606+
case MultiOr.extractPatterns simplifiedPatterns of
607+
[] -> Pattern.bottomOf patternSort
608+
(config : _) -> config
609+
where
610+
patternSort = termLikeSort inputPattern
611+
runStrategy' =
612+
runStrategy breadthLimit transitionRule (strategy rewriteRules)
613+
executionGraph <- runStrategy' initialPattern
614+
return Execution
615+
{ simplifier
616+
, axiomIdToSimplifier
617+
, executionGraph
618+
}
627619

628620
-- | Collect various rules and simplifiers in preparation to execute.
629621
initialize
630-
:: forall a simplifier
622+
:: forall simplifier
631623
. MonadSimplify simplifier
632624
=> VerifiedModule StepperAttributes
633-
-> (Initialized -> simplifier a)
634-
-> simplifier a
635-
initialize verifiedModule within = do
625+
-> simplifier Initialized
626+
initialize verifiedModule = do
636627
let rewriteRules = extractRewriteAxioms verifiedModule
637628
simplifyToList
638629
:: SimplifyRuleLHS rule
@@ -646,9 +637,7 @@ initialize verifiedModule within = do
646637
$ find (lhsEqualsRhs . getRewriteRule) rewriteRules
647638
rewriteAxioms <- Profiler.initialization "simplifyRewriteRule" $
648639
mapM simplifyToList rewriteRules
649-
--let axioms = coerce (concat simplifiedRewrite)
650-
let initialized = Initialized { rewriteRules = concat rewriteAxioms }
651-
within initialized
640+
pure Initialized { rewriteRules = concat rewriteAxioms }
652641

653642
data InitializedProver =
654643
InitializedProver
@@ -665,79 +654,44 @@ fromMaybeChanged (Unchanged a) = a
665654

666655
-- | Collect various rules and simplifiers in preparation to execute.
667656
initializeProver
668-
:: forall simplifier a
657+
:: forall simplifier
669658
. MonadSimplify simplifier
670659
=> VerifiedModule StepperAttributes
671660
-> VerifiedModule StepperAttributes
672661
-> Maybe (VerifiedModule StepperAttributes)
673-
-> (InitializedProver -> simplifier a)
674-
-> simplifier a
675-
initializeProver definitionModule specModule maybeAlreadyProvenModule within =
676-
initialize definitionModule
677-
$ \initialized -> do
678-
tools <- Simplifier.askMetadataTools
679-
let Initialized { rewriteRules } = initialized
680-
changedSpecClaims
681-
:: [ ( Attribute.Axiom Symbol Variable
682-
, MaybeChanged ReachabilityRule
683-
)
684-
]
685-
changedSpecClaims =
686-
map
687-
(Bifunctor.second $ expandClaim tools)
688-
(Goal.extractClaims specModule)
689-
mapMSecond
690-
:: Monad m
691-
=> (rule -> m [rule'])
692-
-> (attributes, rule) -> m [(attributes, rule')]
693-
mapMSecond f (attribute, rule) = do
694-
simplified <- f rule
695-
return (map ((,) attribute) simplified)
696-
simplifyToList
697-
:: SimplifyRuleLHS rule
698-
=> rule
699-
-> simplifier [rule]
700-
simplifyToList rule = do
701-
simplified <- simplifyRuleLhs rule
702-
return (MultiAnd.extractPatterns simplified)
703-
704-
maybeClaimsAlreadyProven
705-
:: Maybe
706-
[ ( Attribute.Axiom Symbol Variable
707-
, ReachabilityRule
708-
)
709-
]
710-
maybeClaimsAlreadyProven =
711-
Goal.extractClaims <$> maybeAlreadyProvenModule
712-
claimsAlreadyProven
713-
:: [ (Attribute.Axiom Symbol Variable
714-
, ReachabilityRule
715-
)
716-
]
717-
claimsAlreadyProven = fromMaybe [] maybeClaimsAlreadyProven
718-
719-
mapM_ (logChangedClaim . snd) changedSpecClaims
720-
721-
let specClaims
722-
:: [ ( Attribute.Axiom Symbol Variable
723-
, ReachabilityRule
724-
)
725-
]
726-
specClaims =
727-
map (Bifunctor.second fromMaybeChanged) changedSpecClaims
728-
-- This assertion should come before simplifying the claims,
729-
-- since simplification should remove all trivial claims.
730-
assertSomeClaims specClaims
731-
simplifiedSpecClaims <-
732-
mapM (mapMSecond simplifyToList) specClaims
733-
specAxioms <- Profiler.initialization "simplifyRuleOnSecond"
734-
$ traverse simplifyRuleOnSecond (concat simplifiedSpecClaims)
735-
let claims = fmap makeReachabilityRule specAxioms
736-
axioms = coerce rewriteRules
737-
alreadyProven = fmap makeReachabilityRule claimsAlreadyProven
738-
initializedProver =
739-
InitializedProver {axioms, claims, alreadyProven}
740-
within initializedProver
662+
-> simplifier InitializedProver
663+
initializeProver definitionModule specModule maybeTrustedModule = do
664+
initialized <- initialize definitionModule
665+
tools <- Simplifier.askMetadataTools
666+
let Initialized { rewriteRules } = initialized
667+
changedSpecClaims :: [MaybeChanged ReachabilityRule]
668+
changedSpecClaims =
669+
expandClaim tools <$> Goal.extractClaims specModule
670+
simplifyToList
671+
:: SimplifyRuleLHS rule
672+
=> rule
673+
-> simplifier [rule]
674+
simplifyToList rule = do
675+
simplified <- simplifyRuleLhs rule
676+
return (MultiAnd.extractPatterns simplified)
677+
678+
trustedClaims :: [ReachabilityRule]
679+
trustedClaims =
680+
fmap Goal.extractClaims maybeTrustedModule & fromMaybe []
681+
682+
mapM_ logChangedClaim changedSpecClaims
683+
684+
let specClaims :: [ReachabilityRule]
685+
specClaims = map fromMaybeChanged changedSpecClaims
686+
-- This assertion should come before simplifying the claims,
687+
-- since simplification should remove all trivial claims.
688+
assertSomeClaims specClaims
689+
simplifiedSpecClaims <- mapM simplifyToList specClaims
690+
claims <- Profiler.initialization "simplifyRuleOnSecond"
691+
$ traverse simplifyReachabilityRule (concat simplifiedSpecClaims)
692+
let axioms = coerce . mkRewritingRule <$> rewriteRules
693+
alreadyProven = trustedClaims
694+
pure InitializedProver { axioms, claims, alreadyProven }
741695
where
742696
expandClaim
743697
:: SmtMetadataTools attributes
@@ -756,27 +710,3 @@ initializeProver definitionModule specModule maybeAlreadyProvenModule within =
756710
logChangedClaim (Changed claim) =
757711
Log.logInfo ("Claim variables were expanded:\n" <> unparseToText claim)
758712
logChangedClaim (Unchanged _) = return ()
759-
760-
evalProver
761-
:: forall smt a
762-
. ( Log.WithLog Log.LogMessage smt
763-
, MonadProfiler smt
764-
, MonadIO smt
765-
, MonadSMT smt
766-
)
767-
=> VerifiedModule StepperAttributes
768-
-- ^ The main module
769-
-> VerifiedModule StepperAttributes
770-
-- ^ The spec module
771-
-> Maybe (VerifiedModule StepperAttributes)
772-
-- ^ The module containing the claims that were proven in a previous run.
773-
-> (InitializedProver -> Simplifier.SimplifierT smt a)
774-
-- The prover
775-
-> smt a
776-
evalProver definitionModule specModule maybeAlreadyProvenModule prover =
777-
evalSimplifier definitionModule
778-
$ initializeProver
779-
definitionModule
780-
specModule
781-
maybeAlreadyProvenModule
782-
prover

kore/src/Kore/Internal/Conditional.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ Representation of conditional terms.
66
77
-}
88

9+
{-# OPTIONS_GHC -fno-prof-auto #-}
10+
911
module Kore.Internal.Conditional
1012
( Conditional (..)
1113
, withoutTerm

kore/src/Kore/Log/DebugProofState.hs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@ import Data.Text.Prettyprint.Doc
1414
)
1515
import qualified Data.Text.Prettyprint.Doc as Pretty
1616

17-
import Kore.Internal.TermLike
18-
( Variable
19-
)
17+
import Kore.Rewriting.RewritingVariable
2018
import Kore.Step.RulePattern
2119
( ReachabilityRule (..)
2220
, RewriteRule (..)
@@ -30,7 +28,7 @@ import Log
3028
data DebugProofState =
3129
DebugProofState
3230
{ proofState :: ProofState ReachabilityRule
33-
, transition :: Prim (RewriteRule Variable)
31+
, transition :: Prim (RewriteRule RewritingVariable)
3432
, result :: Maybe (ProofState ReachabilityRule)
3533
}
3634

kore/src/Kore/Profiler/Data.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
Copyright : (c) Runtime Verification, 2019
33
License : NCSA
44
-}
5+
{-# OPTIONS_GHC -fno-prof-auto #-}
56
module Kore.Profiler.Data
67
( MonadProfiler (..)
78
, profileEvent

0 commit comments

Comments
 (0)