11{-# LANGUAGE UndecidableInstances #-}
22
33{- |
4- Module : Kore.Simplify.Data
4+ Module : Kore.Simplify.API
55Description : Data structures used for term simplification.
66Copyright : (c) Runtime Verification, 2018-2021
77License : BSD-3-Clause
88Maintainer : virgil.serbanuta@runtimeverification.com
99Stability : experimental
1010Portability : portable
1111-}
12- module Kore.Simplify.Data (
13- Simplifier ,
14- TermSimplifier ,
15- Env (.. ),
16- runSimplifier ,
17- runSimplifierBranch ,
12+ module Kore.Simplify.API (
1813 evalSimplifier ,
1914 evalSimplifierProofs ,
2015
2116 -- * Re-exports
17+ Env (.. ),
18+ Simplifier ,
19+ runSimplifier ,
20+ runSimplifierBranch ,
21+ TermSimplifier ,
2222 MonadSimplify (.. ),
23+ askMetadataTools ,
24+ simplifyPattern ,
25+ simplifyTerm ,
26+ askSimplifierAxioms ,
27+ askInjSimplifier ,
28+ askOverloadSimplifier ,
29+ getCache ,
30+ putCache ,
31+ askSimplifierXSwitch ,
2332 InternalVariable ,
2433 MonadProf ,
2534) where
2635
27- import Control.Monad.Catch (
28- MonadCatch ,
29- MonadMask ,
30- MonadThrow ,
31- )
3236import Control.Monad.Reader
33- import Control.Monad.State.Strict
3437import Data.Map.Strict (
3538 Map ,
3639 )
@@ -82,40 +85,13 @@ import Kore.Simplify.TermLike qualified as TermLike
8285import Kore.Syntax.Variable (
8386 VariableName ,
8487 )
85- import Logic
8688import Prelude.Kore
8789import Pretty qualified
8890import Prof
8991import SMT (
9092 SMT ,
9193 )
9294
93- -- * Simplifier
94-
95- data Env = Env
96- { metadataTools :: ! (SmtMetadataTools Attribute. Symbol )
97- , simplifierCondition :: ! (ConditionSimplifier Simplifier )
98- , simplifierAxioms :: ! BuiltinAndAxiomSimplifierMap
99- , memo :: ! (Memo. Self Simplifier )
100- , injSimplifier :: ! InjSimplifier
101- , overloadSimplifier :: ! OverloadSimplifier
102- , simplifierXSwitch :: ! SimplifierXSwitch
103- }
104-
105- {- | @Simplifier@ represents a simplification action.
106-
107- A @Simplifier@ can send constraints to the SMT solver through 'MonadSMT'.
108-
109- A @Simplifier@ can write to the log through 'HasLog'.
110- -}
111- newtype Simplifier a
112- = Simplifier (StateT SimplifierCache (ReaderT Env SMT ) a )
113- deriving newtype (Functor , Applicative , Monad )
114- deriving newtype (MonadSMT , MonadLog , MonadProf )
115- deriving newtype (MonadIO , MonadCatch , MonadThrow , MonadMask )
116- deriving newtype (MonadReader Env )
117- deriving newtype (MonadState SimplifierCache )
118-
11995traceProfSimplify ::
12096 MonadProf prof =>
12197 Pattern RewritingVariableName ->
@@ -131,66 +107,6 @@ traceProfSimplify (Pattern.toTermLike -> termLike) =
131107 . Pretty. pretty
132108 <$> matchAxiomIdentifier termLike
133109
134- instance MonadSimplify Simplifier where
135- askMetadataTools = asks metadataTools
136- {-# INLINE askMetadataTools #-}
137-
138- simplifyPattern sideCondition patt =
139- traceProfSimplify patt (Pattern. makeEvaluate sideCondition patt)
140- {-# INLINE simplifyPattern #-}
141-
142- simplifyTerm = TermLike. simplify
143- {-# INLINE simplifyTerm #-}
144-
145- simplifyCondition topCondition conditional = do
146- ConditionSimplifier simplify <- asks simplifierCondition
147- simplify topCondition conditional
148- {-# INLINE simplifyCondition #-}
149-
150- askSimplifierAxioms = asks simplifierAxioms
151- {-# INLINE askSimplifierAxioms #-}
152-
153- localSimplifierAxioms locally =
154- local $ \ env@ Env {simplifierAxioms} ->
155- env{simplifierAxioms = locally simplifierAxioms}
156- {-# INLINE localSimplifierAxioms #-}
157-
158- askMemo = asks memo
159- {-# INLINE askMemo #-}
160-
161- askInjSimplifier = asks injSimplifier
162- {-# INLINE askInjSimplifier #-}
163-
164- askOverloadSimplifier = asks overloadSimplifier
165- {-# INLINE askOverloadSimplifier #-}
166-
167- getCache = get
168- {-# INLINE getCache #-}
169-
170- putCache = put
171- {-# INLINE putCache #-}
172-
173- askSimplifierXSwitch = asks simplifierXSwitch
174- {-# INLINE askSimplifierXSwitch #-}
175-
176- -- | Run a simplification, returning the results along all branches.
177- runSimplifierBranch ::
178- Env ->
179- -- | simplifier computation
180- LogicT Simplifier a ->
181- SMT [a ]
182- runSimplifierBranch env = runSimplifier env . observeAllT
183-
184- {- | Run a simplification, returning the result of only one branch.
185-
186- __Warning__: @runSimplifier@ calls 'error' if the 'Simplifier' does not contain
187- exactly one branch. Use 'evalSimplifierBranch' to evaluation simplifications
188- that may branch.
189- -}
190- runSimplifier :: Env -> Simplifier a -> SMT a
191- runSimplifier env (Simplifier simplifier) =
192- runReaderT (evalStateT simplifier initCache) env
193-
194110mkSimplifierEnv ::
195111 SimplifierXSwitch ->
196112 VerifiedModuleSyntax Attribute. Symbol ->
@@ -207,6 +123,8 @@ mkSimplifierEnv simplifierXSwitch verifiedModule sortGraph overloadGraph metadat
207123 Env
208124 { metadataTools = metadataTools
209125 , simplifierCondition
126+ , simplifierPattern
127+ , simplifierTerm
210128 , simplifierAxioms = earlySimplifierAxioms
211129 , memo = Memo. forgetful
212130 , injSimplifier
@@ -222,6 +140,12 @@ mkSimplifierEnv simplifierXSwitch verifiedModule sortGraph overloadGraph metadat
222140 simplifierCondition =
223141 {-# SCC "evalSimplifier/simplifierCondition" #-}
224142 Condition. create substitutionSimplifier
143+ simplifierPattern sideCondition patt =
144+ {-# SCC "evalSimplifier/simplifierPattern" #-}
145+ traceProfSimplify patt (Pattern. makeEvaluate sideCondition patt)
146+ simplifierTerm =
147+ {-# SCC "evalSimplifier/simplifierTerm" #-}
148+ TermLike. simplify
225149 -- Initialize without any builtin or axiom simplifiers.
226150 earlySimplifierAxioms = Map. empty
227151
@@ -259,6 +183,8 @@ mkSimplifierEnv simplifierXSwitch verifiedModule sortGraph overloadGraph metadat
259183 Env
260184 { metadataTools
261185 , simplifierCondition
186+ , simplifierPattern
187+ , simplifierTerm
262188 , simplifierAxioms
263189 , memo
264190 , injSimplifier
0 commit comments