Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
91c6427
Concrete implementation of ==K
ana-pantilie Mar 30, 2020
be19564
Builtin simplification rules for Bool and KEqual
ana-pantilie Apr 2, 2020
f8d13f1
WIP: remove/fix tests
ana-pantilie Apr 3, 2020
80b9f5f
Fixes + remove unit tests
ana-pantilie Apr 8, 2020
e663933
Update K release + fix imp specs
ana-pantilie Apr 8, 2020
e95961d
Re-generate evm-semantics regression tests
ana-pantilie Apr 8, 2020
0961fba
Fix + commented debugging traces
ana-pantilie Apr 10, 2020
7734c81
Fix
ana-pantilie Apr 13, 2020
a4dcb4a
Remove new evm-semantics regression tests
ana-pantilie Apr 13, 2020
c2a1362
Merge remote-tracking branch 'upstream/master' into no-branch-kequals
ana-pantilie Apr 13, 2020
439042b
Add test inspired by evm-semantics
ana-pantilie Apr 13, 2020
62de1dc
Add new evm-semantics regression tests
ana-pantilie Apr 13, 2020
bb8c735
Remove old evm-semantics regression tests
ana-pantilie Apr 13, 2020
db7b34d
Remove unused import
ana-pantilie Apr 13, 2020
eb8e3d0
Fix golden for pop1
ana-pantilie Apr 14, 2020
2cc4ad6
Remove wasm-semantics loops and memory-symbolic
ana-pantilie Apr 14, 2020
f48efef
Clean-up
ana-pantilie Apr 14, 2020
75298d8
Add another internal simplification rule
ana-pantilie Apr 15, 2020
cc5b659
Merge remote-tracking branch 'upstream/master' into no-branch-kequals
ana-pantilie Apr 15, 2020
6ef6bf7
Merge remote-tracking branch 'upstream/master' into no-branch-kequals
ana-pantilie Apr 21, 2020
404fbbe
Partially address review comments
ana-pantilie Apr 21, 2020
4c859a6
Add and remove semantics
ana-pantilie Apr 21, 2020
6653664
Review
ana-pantilie Apr 21, 2020
7e2ca0b
Remove accidentally added files
ana-pantilie Apr 21, 2020
b4bbbd1
Update kwasm with local frontend and no local semantics modifs
ana-pantilie Apr 21, 2020
4f9b9fa
Revert "Update kwasm with local frontend and no local semantics modifs"
ana-pantilie Apr 21, 2020
f0fb54d
Kwasm update
ana-pantilie Apr 21, 2020
d35c660
Fix KEqual unit tests
ana-pantilie Apr 21, 2020
8599de5
Revert remove tests
ana-pantilie Apr 21, 2020
a612075
Clean-up
ana-pantilie Apr 21, 2020
23557be
Rename wasm-semantics test directory
ana-pantilie Apr 21, 2020
7ab36ba
Revert imp changes
ana-pantilie Apr 21, 2020
6dfcb4c
Part of review
ana-pantilie Apr 23, 2020
b9c76dc
WIP dependency inversion, stuck at Simplification.Condition.create
ana-pantilie Apr 24, 2020
700f267
WIP dependency inversion, stuck at MonadSimplify.simplifyCondition
ana-pantilie Apr 24, 2020
35fbef6
WIP: redo refactoring
ana-pantilie Apr 27, 2020
cdc421f
Refactoring now compiles
ana-pantilie Apr 27, 2020
a41fe55
UnifierT with ReaderT ConditionSimplifier
ana-pantilie Apr 27, 2020
334630e
Remove undefineds
ana-pantilie Apr 28, 2020
db6d22b
Fix bug
ana-pantilie Apr 28, 2020
91d1b36
WIP clean-up: KEqual src and test
ana-pantilie Apr 28, 2020
ef956b5
WIP clean-up: AndTerms
ana-pantilie Apr 28, 2020
aeed1f9
General clean-up
ana-pantilie Apr 28, 2020
3873059
UnifierT: factor out evaluating the ReaderT
ana-pantilie Apr 28, 2020
5eed3ad
KEqual: Bug fix
ana-pantilie Apr 28, 2020
b208a45
Merge remote-tracking branch 'upstream/master' into no-branch-kequals
ana-pantilie Apr 28, 2020
1221789
Lint
ana-pantilie Apr 28, 2020
d6cef3f
Remove changes related to KEqual
ana-pantilie Apr 28, 2020
29d2bb3
Revert kwasm update
ana-pantilie Apr 28, 2020
a86b55b
Remove test related to KEqual
ana-pantilie Apr 28, 2020
d13b79f
Minor change
ana-pantilie Apr 28, 2020
5165153
Update kore/src/Kore/Repl/Data.hs
ana-pantilie Apr 28, 2020
2e8e67f
Merge branch 'master' into not-simplifier-dependency-inversion
ana-pantilie Apr 28, 2020
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
6 changes: 4 additions & 2 deletions kore/src/Kore/Builtin/KEqual.hs
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,8 @@ evalKEq true (valid :< app) =

defined1 <- Ceil.makeEvaluate sideCondition pattern1
defined2 <- Ceil.makeEvaluate sideCondition pattern2
defined <- And.simplifyEvaluated sideCondition defined1 defined2
defined <-
And.simplifyEvaluated Not.notSimplifier sideCondition defined1 defined2

equalTerms <-
Equals.makeEvaluateTermsToPredicate
Expand All @@ -162,7 +163,8 @@ evalKEq true (valid :< app) =
falsePatterns = Pattern.withCondition falseTerm <$> notEqualTerms

let undefinedResults = Or.simplifyEvaluated truePatterns falsePatterns
results <- And.simplifyEvaluated sideCondition defined undefinedResults
results <-
And.simplifyEvaluated Not.notSimplifier sideCondition defined undefinedResults
pure $ Applied AttemptedAxiomResults
{ results
, remainders = OrPattern.bottom
Expand Down
17 changes: 14 additions & 3 deletions kore/src/Kore/Repl/Data.hs
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,9 @@ import Kore.Profiler.Data
( MonadProfiler
)
import Kore.Step.Simplification.Data
( MonadSimplify
( MonadSimplify (..)
)
import qualified Kore.Step.Simplification.Not as Not
import qualified Kore.Step.Strategy as Strategy
import Kore.Strategies.Goal
import Kore.Strategies.Verification
Expand Down Expand Up @@ -494,14 +495,24 @@ deriving instance MonadSMT m => MonadSMT (UnifierWithExplanation m)

deriving instance MonadProfiler m => MonadProfiler (UnifierWithExplanation m)

instance MonadTrans UnifierWithExplanation where
lift = UnifierWithExplanation . lift . lift
{-# INLINE lift #-}

instance MonadLog m => MonadLog (UnifierWithExplanation m) where
logEntry entry = UnifierWithExplanation $ logEntry entry
{-# INLINE logEntry #-}
logWhile entry ma =
UnifierWithExplanation $ logWhile entry (getUnifierWithExplanation ma)
{-# INLINE logWhile #-}

deriving instance MonadSimplify m => MonadSimplify (UnifierWithExplanation m)
instance MonadSimplify m => MonadSimplify (UnifierWithExplanation m) where
Copy link
Contributor

Choose a reason for hiding this comment

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

Why can't we use the default implementations anymore?

Copy link
Contributor Author

@ana-pantilie ana-pantilie Apr 28, 2020

Choose a reason for hiding this comment

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

When trying to derive the implementation, the compiler error is:

        Couldn't match type ‘UnifierWithExplanation m’
                     with ‘UnifierT (AccumT (First ReplOutput) m)’
        arising from a use of ‘ghc-prim-0.5.3:GHC.Prim.coerce’

Do you know how this could be fixed? I can post the entire error if needed.

localSimplifierTermLike locally (UnifierWithExplanation unifierT) =
UnifierWithExplanation
$ localSimplifierTermLike locally unifierT
localSimplifierAxioms locally (UnifierWithExplanation unifierT) =
UnifierWithExplanation
$ localSimplifierAxioms locally unifierT

instance MonadSimplify m => MonadUnify (UnifierWithExplanation m) where
throwUnificationError =
Expand Down Expand Up @@ -570,7 +581,7 @@ runUnifierWithExplanation (UnifierWithExplanation unifier) =
unificationResults =
fmap (\(r, ex) -> flip (,) ex <$> r)
. flip runAccumT mempty
. Monad.Unify.runUnifierT
. Monad.Unify.runUnifierT Not.notSimplifier
$ unifier
explainError = Left . makeAuxReplOutput . show . Pretty.pretty
failWithExplanation
Expand Down
3 changes: 2 additions & 1 deletion kore/src/Kore/Step/Search.hs
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ import qualified Kore.Internal.Pattern as Conditional
import Kore.Internal.SideCondition
( SideCondition
)
import qualified Kore.Step.Simplification.Not as Not
import Kore.Step.Simplification.Simplify
import qualified Kore.Step.SMT.Evaluator as SMT.Evaluator
( evaluate
Expand Down Expand Up @@ -138,7 +139,7 @@ matchWith
-> MaybeT m (OrCondition variable)
matchWith sideCondition e1 e2 = do
eitherUnifiers <-
lift $ Unifier.runUnifierT
lift $ Unifier.runUnifierT Not.notSimplifier
$ unificationProcedureWorker sideCondition t1 t2
let
maybeUnifiers :: Maybe [Condition variable]
Expand Down
72 changes: 40 additions & 32 deletions kore/src/Kore/Step/Simplification/And.hs
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,7 @@ module Kore.Step.Simplification.And
import Prelude.Kore

import Control.Error
( fromMaybe
, runMaybeT
( runMaybeT
)
import Control.Monad
( foldM
Expand Down Expand Up @@ -111,13 +110,12 @@ import qualified Kore.Internal.TermLike as TermLike
import Kore.Step.Simplification.AndTerms
( maybeTermAnd
)
import Kore.Step.Simplification.NotSimplifier
import Kore.Step.Simplification.Simplify
import qualified Kore.Step.Substitution as Substitution
import Kore.Unification.UnifierT
( runUnifierT
)
import Kore.Unification.Unify
( MonadUnify
( UnifierT (..)
, runUnifierT
)
import Kore.Unparser
( unparse
Expand Down Expand Up @@ -164,12 +162,14 @@ Also, we have
the same for two string literals and two chars
-}
simplify
:: (InternalVariable variable, MonadSimplify simplifier)
=> SideCondition variable
:: InternalVariable variable
=> MonadSimplify simplifier
=> NotSimplifier (UnifierT simplifier)
-> SideCondition variable
-> And Sort (OrPattern variable)
-> simplifier (OrPattern variable)
simplify sideCondition And { andFirst = first, andSecond = second } =
simplifyEvaluated sideCondition first second
simplify notSimplifier sideCondition And { andFirst = first, andSecond = second } =
simplifyEvaluated notSimplifier sideCondition first second

{-| simplifies an And given its two 'OrPattern' children.

Expand All @@ -189,12 +189,14 @@ to carry around.

-}
simplifyEvaluated
:: (InternalVariable variable, MonadSimplify simplifier)
=> SideCondition variable
:: InternalVariable variable
=> MonadSimplify simplifier
=> NotSimplifier (UnifierT simplifier)
-> SideCondition variable
-> OrPattern variable
-> OrPattern variable
-> simplifier (OrPattern variable)
simplifyEvaluated sideCondition first second
simplifyEvaluated notSimplifier sideCondition first second
| OrPattern.isFalse first = return OrPattern.bottom
| OrPattern.isFalse second = return OrPattern.bottom
| OrPattern.isTrue first = return second
Expand All @@ -204,17 +206,19 @@ simplifyEvaluated sideCondition first second
gather $ do
first1 <- scatter first
second1 <- scatter second
makeEvaluate sideCondition first1 second1
makeEvaluate notSimplifier sideCondition first1 second1
return (OrPattern.fromPatterns result)

simplifyEvaluatedMultiple
:: (InternalVariable variable, MonadSimplify simplifier)
=> SideCondition variable
:: InternalVariable variable
=> MonadSimplify simplifier
=> NotSimplifier (UnifierT simplifier)
-> SideCondition variable
-> [OrPattern variable]
-> simplifier (OrPattern variable)
simplifyEvaluatedMultiple _ [] = return OrPattern.top
simplifyEvaluatedMultiple sideCondition (pat : patterns) =
foldM (simplifyEvaluated sideCondition) pat patterns
simplifyEvaluatedMultiple _ _ [] = return OrPattern.top
simplifyEvaluatedMultiple notSimplifier sideCondition (pat : patterns) =
foldM (simplifyEvaluated notSimplifier sideCondition) pat patterns

{-|'makeEvaluate' simplifies an 'And' of 'Pattern's.

Expand All @@ -225,31 +229,34 @@ makeEvaluate
, HasCallStack
, MonadSimplify simplifier
)
=> SideCondition variable
=> NotSimplifier (UnifierT simplifier)
-> SideCondition variable
-> Pattern variable
-> Pattern variable
-> BranchT simplifier (Pattern variable)
makeEvaluate sideCondition first second
makeEvaluate notSimplifier sideCondition first second
| Pattern.isBottom first || Pattern.isBottom second = empty
| Pattern.isTop first = return second
| Pattern.isTop second = return first
| otherwise = makeEvaluateNonBool sideCondition first second
| otherwise = makeEvaluateNonBool notSimplifier sideCondition first second

makeEvaluateNonBool
:: ( InternalVariable variable
, HasCallStack
, MonadSimplify simplifier
)
=> SideCondition variable
=> NotSimplifier (UnifierT simplifier)
-> SideCondition variable
-> Pattern variable
-> Pattern variable
-> BranchT simplifier (Pattern variable)
makeEvaluateNonBool
notSimplifier
sideCondition
first@Conditional { term = firstTerm }
second@Conditional { term = secondTerm }
= do
terms <- termAnd firstTerm secondTerm
terms <- termAnd notSimplifier firstTerm secondTerm
let firstCondition = Conditional.withoutTerm first
secondCondition = Conditional.withoutTerm second
initialConditions = firstCondition <> secondCondition
Expand Down Expand Up @@ -433,23 +440,24 @@ The comment for 'simplify' describes all the special cases handled by this.
-}
termAnd
:: forall variable simplifier
. (InternalVariable variable, MonadSimplify simplifier)
. InternalVariable variable
=> MonadSimplify simplifier
=> HasCallStack
=> TermLike variable
=> NotSimplifier (UnifierT simplifier)
-> TermLike variable
-> TermLike variable
-> BranchT simplifier (Pattern variable)
termAnd p1 p2 =
termAnd notSimplifier p1 p2 =
either (const andTerm) BranchT.scatter
=<< (lift . runUnifierT) (termAndWorker p1 p2)
=<< (lift . runUnifierT notSimplifier) (termAndWorker p1 p2)
where
andTerm = return $ Pattern.fromTermLike (mkAnd p1 p2)
termAndWorker
:: MonadUnify unifier
=> TermLike variable
:: TermLike variable
-> TermLike variable
-> unifier (Pattern variable)
-> UnifierT simplifier (Pattern variable)
termAndWorker first second = do
let maybeTermAnd' = maybeTermAnd termAndWorker first second
let maybeTermAnd' = maybeTermAnd notSimplifier termAndWorker first second
patt <- runMaybeT maybeTermAnd'
return $ fromMaybe andPattern patt
where
Expand Down
44 changes: 28 additions & 16 deletions kore/src/Kore/Step/Simplification/AndTerms.hs
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ import Kore.Step.Simplification.ExpandAlias
)
import Kore.Step.Simplification.InjSimplifier
import Kore.Step.Simplification.NoConfusion
import Kore.Step.Simplification.NotSimplifier
import Kore.Step.Simplification.Overloading
import Kore.Step.Simplification.SimplificationType
( SimplificationType
Expand Down Expand Up @@ -114,10 +115,11 @@ termUnification
. InternalVariable variable
=> MonadUnify unifier
=> HasCallStack
=> TermLike variable
=> NotSimplifier unifier
-> TermLike variable
-> TermLike variable
-> unifier (Pattern variable)
termUnification =
termUnification notSimplifier =
termUnificationWorker
where
termUnificationWorker
Expand All @@ -127,7 +129,8 @@ termUnification =
termUnificationWorker pat1 pat2 = do
let
maybeTermUnification :: MaybeT unifier (Pattern variable)
maybeTermUnification = maybeTermAnd termUnificationWorker pat1 pat2
maybeTermUnification =
maybeTermAnd notSimplifier termUnificationWorker pat1 pat2
unsupportedPatternsError =
throwUnificationError
(unsupportedPatterns
Expand All @@ -141,32 +144,38 @@ maybeTermEquals
:: InternalVariable variable
=> MonadUnify unifier
=> HasCallStack
=> TermSimplifier variable unifier
=> NotSimplifier unifier
-> TermSimplifier variable unifier
-- ^ Used to simplify subterm "and".
-> TermLike variable
-> TermLike variable
-> MaybeT unifier (Pattern variable)
maybeTermEquals = maybeTransformTerm equalsFunctions
maybeTermEquals notSimplifier =
maybeTransformTerm (equalsFunctions notSimplifier)

maybeTermAnd
:: InternalVariable variable
=> MonadUnify unifier
=> HasCallStack
=> TermSimplifier variable unifier
=> NotSimplifier unifier
-> TermSimplifier variable unifier
-- ^ Used to simplify subterm "and".
-> TermLike variable
-> TermLike variable
-> MaybeT unifier (Pattern variable)
maybeTermAnd = maybeTransformTerm andFunctions
maybeTermAnd notSimplifier =
maybeTransformTerm (andFunctions notSimplifier)

andFunctions
:: forall variable unifier
. InternalVariable variable
=> MonadUnify unifier
=> HasCallStack
=> [TermTransformationOld variable unifier]
andFunctions =
map (forAnd . snd) (filter appliesToAnd andEqualsFunctions)
=> NotSimplifier unifier
-> [TermTransformationOld variable unifier]
andFunctions notSimplifier =
forAnd . snd
<$> filter appliesToAnd (andEqualsFunctions notSimplifier)
where
appliesToAnd :: (SimplificationTarget, a) -> Bool
appliesToAnd (AndT, _) = True
Expand All @@ -183,9 +192,11 @@ equalsFunctions
. InternalVariable variable
=> MonadUnify unifier
=> HasCallStack
=> [TermTransformationOld variable unifier]
equalsFunctions =
map (forEquals . snd) (filter appliesToEquals andEqualsFunctions)
=> NotSimplifier unifier
-> [TermTransformationOld variable unifier]
equalsFunctions notSimplifier =
forEquals . snd
<$> filter appliesToEquals (andEqualsFunctions notSimplifier)
where
appliesToEquals :: (SimplificationTarget, a) -> Bool
appliesToEquals (AndT, _) = False
Expand All @@ -202,9 +213,10 @@ andEqualsFunctions
. InternalVariable variable
=> MonadUnify unifier
=> HasCallStack
=> [(SimplificationTarget, TermTransformation variable unifier)]
andEqualsFunctions = fmap mapEqualsFunctions
[ (AndT, \_ _ s -> expandAlias (maybeTermAnd s), "expandAlias")
=> NotSimplifier unifier
-> [(SimplificationTarget, TermTransformation variable unifier)]
andEqualsFunctions notSimplifier = fmap mapEqualsFunctions
[ (AndT, \_ _ s -> expandAlias (maybeTermAnd notSimplifier s), "expandAlias")
, (AndT, \_ _ _ -> boolAnd, "boolAnd")
, (BothT, \_ _ _ -> equalAndEquals, "equalAndEquals")
, (BothT, \_ _ _ -> bytesDifferent, "bytesDifferent")
Expand Down
Loading