Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
ebd41e1
Symbolic rules for SET.in
andreiburdusa Aug 17, 2020
dc2720d
Merge remote-tracking branch 'upstream/master' into symbolic-rules-SE…
andreiburdusa Aug 19, 2020
f4739c5
wip: Test
andreiburdusa Aug 19, 2020
e0e3eb7
Test
andreiburdusa Aug 19, 2020
87c4320
Stylish
andreiburdusa Aug 19, 2020
ceb1260
Hook symbol
andreiburdusa Aug 19, 2020
640ee3c
Use Mock.builtinMap []
andreiburdusa Aug 19, 2020
9f0e784
Merge remote-tracking branch 'upstream/master' into test-for-symbolic…
andreiburdusa Aug 20, 2020
03d6052
Use simplifyEquals in test and make it pass
andreiburdusa Aug 20, 2020
f7074c9
Small cleanup
andreiburdusa Aug 20, 2020
9814276
Add passing test
andreiburdusa Aug 20, 2020
8a213ea
Add failing test: map wiith two elements
andreiburdusa Aug 20, 2020
793966d
Some cleanup
andreiburdusa Aug 20, 2020
54b32cf
Lint
andreiburdusa Aug 20, 2020
ef9d6a8
Fix test
andreiburdusa Aug 20, 2020
12d01b6
Add test. It doesn't look exacly right
andreiburdusa Aug 20, 2020
ae5ad31
Remove extra newlines
andreiburdusa Aug 20, 2020
8340caf
Revert the "fix" for the first test
andreiburdusa Aug 20, 2020
f7ce7a8
Stylish
andreiburdusa Aug 20, 2020
9916257
Find better fix
andreiburdusa Aug 20, 2020
f43223f
Addressed comments
andreiburdusa Aug 20, 2020
41cce14
Merge remote-tracking branch 'upstream/master' into test-for-symbolic…
andreiburdusa Aug 20, 2020
182faf6
Merge remote-tracking branch 'upstream/master' into symbolic-rules-SE…
andreiburdusa Aug 21, 2020
d9cd0da
Merge branch 'test-for-symbolic-Map.in_keys' of github.com:andreiburd…
andreiburdusa Aug 21, 2020
87e7f11
Empty set test + fix
andreiburdusa Aug 21, 2020
51aab5d
Add tests
andreiburdusa Aug 21, 2020
1633696
Fix test names
andreiburdusa Aug 21, 2020
900a2d8
Merge branch 'test-for-symbolic-Map.in_keys' of github.com:andreiburd…
andreiburdusa Aug 21, 2020
a974656
Fix test group name
andreiburdusa Aug 21, 2020
698038c
Rename In to InSet
andreiburdusa Aug 24, 2020
c03dc03
Merge remote-tracking branch 'upstream/master' into symbolic-rules-SE…
andreiburdusa Aug 24, 2020
d2ddb6b
Add tests: opaque
andreiburdusa Aug 24, 2020
7f5214e
unifyNotInKeys: Use one lift
ttuegel Aug 25, 2020
d7f74af
unifyNotInKeys: Refactor
ttuegel Aug 25, 2020
446ec13
Merge branch 'master' into symbolic-rules-SET.in
ttuegel Aug 25, 2020
73d13f1
Merge branch 'master' into symbolic-rules-SET.in
ttuegel Aug 26, 2020
306bab4
Revert "unifyNotInKeys: Refactor"
ttuegel Aug 26, 2020
a0f688e
unifyNotInKeys: Refactor opaqueConditions
ttuegel Aug 26, 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
110 changes: 17 additions & 93 deletions kore/src/Kore/Builtin/Map.hs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ import Control.Error
, runMaybeT
)
import qualified Control.Monad as Monad
import qualified Data.Foldable as Foldable
import qualified Data.HashMap.Strict as HashMap
import Data.Map.Strict
( Map
Expand Down Expand Up @@ -64,25 +63,21 @@ import qualified Kore.Builtin.Builtin as Builtin
import qualified Kore.Builtin.Int as Int
import qualified Kore.Builtin.List as Builtin.List
import qualified Kore.Builtin.Map.Map as Map
import qualified Kore.Builtin.Set as Builtin.Set
import qualified Kore.Builtin.Set as Set
import qualified Kore.Domain.Builtin as Domain
import Kore.IndexedModule.MetadataTools
( SmtMetadataTools
)
import qualified Kore.Internal.Condition as Condition
import qualified Kore.Internal.OrPattern as OrPattern
import Kore.Internal.Pattern
( Condition
, Pattern
( Pattern
)
import qualified Kore.Internal.Pattern as Pattern
import Kore.Internal.Predicate
( makeCeilPredicate
)
import qualified Kore.Internal.SideCondition as SideCondition
import Kore.Internal.Symbol
( Symbol (..)
, symbolHook
( symbolHook
)
import Kore.Internal.TermLike
( pattern App_
Expand All @@ -94,7 +89,6 @@ import qualified Kore.Internal.TermLike as TermLike
import Kore.Sort
( Sort
)
import qualified Kore.Sort as Sort
import Kore.Step.Simplification.NotSimplifier
import Kore.Step.Simplification.Simplify as Simplifier
import Kore.Syntax.Sentence
Expand All @@ -103,7 +97,6 @@ import Kore.Syntax.Sentence
import Kore.Unification.Unify
( MonadUnify
)
import qualified Kore.Unification.Unify as Unify
import qualified Kore.Unification.Unify as Monad.Unify
import Kore.Variables.Fresh

Expand Down Expand Up @@ -193,7 +186,7 @@ symbolVerifiers =
, Builtin.verifySymbol Bool.assertSort [acceptAnySort, assertSort]
)
, ( Map.keysKey
, Builtin.verifySymbol Builtin.Set.assertSort [assertSort]
, Builtin.verifySymbol Set.assertSort [assertSort]
)
, ( Map.keys_listKey
, Builtin.verifySymbol Builtin.List.assertSort [assertSort]
Expand All @@ -202,7 +195,7 @@ symbolVerifiers =
, Builtin.verifySymbol assertSort [assertSort, acceptAnySort]
)
, ( Map.removeAllKey
, Builtin.verifySymbol assertSort [assertSort, Builtin.Set.assertSort]
, Builtin.verifySymbol assertSort [assertSort, Set.assertSort]
)
, ( Map.sizeKey
, Builtin.verifySymbol Int.assertSort [assertSort]
Expand Down Expand Up @@ -391,7 +384,7 @@ evalKeys :: Builtin.Function
evalKeys resultSort [_map] = do
_map <- expectConcreteBuiltinMap Map.keysKey _map
fmap (const Domain.SetValue) _map
& Builtin.Set.returnConcreteSet resultSort
& Set.returnConcreteSet resultSort
evalKeys _ _ = Builtin.wrongArity Map.keysKey

evalKeysList :: Builtin.Function
Expand Down Expand Up @@ -427,7 +420,7 @@ evalRemoveAll resultSort [_map, _set] = do
bothConcrete = do
_map <- expectConcreteBuiltinMap Map.removeAllKey _map
_set <-
Builtin.Set.expectConcreteBuiltinSet
Set.expectConcreteBuiltinSet
Map.removeAllKey
_set
Map.difference _map _set
Expand Down Expand Up @@ -575,30 +568,26 @@ unifyEquals unifyEqualsChildren first second = do
:: Ac.NormalizedOrBottom Domain.NormalizedMap variable
normalizedOrBottom = Ac.toNormalized patt

data InKeys term =
InKeys
{ symbol :: !Symbol
, keyTerm, mapTerm :: !term
}
newtype InKeys term = InKeys { getInKeys :: Set.InKeys term }

instance
InternalVariable variable
=> Injection (TermLike variable) (InKeys (TermLike variable))
where
inject InKeys { symbol, keyTerm, mapTerm } =
inject ( InKeys Set.InKeys { symbol, keyTerm, mapTerm } ) =
TermLike.mkApplySymbol symbol [keyTerm, mapTerm]

retract (App_ symbol [keyTerm, mapTerm]) = do
hook2 <- (getHook . symbolHook) symbol
Monad.guard (hook2 == Map.in_keysKey)
return InKeys { symbol, keyTerm, mapTerm }
return $ InKeys Set.InKeys { symbol, keyTerm, mapTerm }
retract _ = empty

matchInKeys
:: InternalVariable variable
=> TermLike variable
-> Maybe (InKeys (TermLike variable))
matchInKeys = retract
-> Maybe (Set.InKeys (TermLike variable))
matchInKeys = fmap getInKeys . retract

unifyNotInKeys
:: forall variable unifier
Expand All @@ -609,73 +598,8 @@ unifyNotInKeys
-> TermLike variable
-> TermLike variable
-> MaybeT unifier (Pattern variable)
unifyNotInKeys unifyChildren (NotSimplifier notSimplifier) a b =
worker a b <|> worker b a
where
normalizedOrBottom
:: TermLike variable
-> Ac.NormalizedOrBottom Domain.NormalizedMap variable
normalizedOrBottom = Ac.toNormalized

defineTerm :: TermLike variable -> MaybeT unifier (Condition variable)
defineTerm termLike =
makeEvaluateTermCeil SideCondition.topTODO Sort.predicateSort termLike
>>= Unify.scatter
& lift

eraseTerm =
Pattern.fromCondition_ . Pattern.withoutTerm

unifyAndNegate t1 t2 = do
-- Erasing the unified term is valid here because
-- the terms are all wrapped in \ceil below.
unificationSolutions <-
fmap eraseTerm
<$> Unify.gather (unifyChildren t1 t2)
notSimplifier
SideCondition.top
(OrPattern.fromPatterns unificationSolutions)
>>= Unify.scatter

collectConditions terms =
Foldable.fold terms
& Pattern.fromCondition_

worker
:: TermLike variable
-> TermLike variable
-> MaybeT unifier (Pattern variable)
worker termLike1 termLike2
| Just boolValue <- Bool.matchBool termLike1
, not boolValue
, Just inKeys@InKeys { keyTerm, mapTerm } <- matchInKeys termLike2
, Ac.Normalized normalizedMap <- normalizedOrBottom mapTerm
= do
let symbolicKeys = Domain.getSymbolicKeysOfAc normalizedMap
concreteKeys =
TermLike.fromConcrete
<$> Domain.getConcreteKeysOfAc normalizedMap
mapKeys = symbolicKeys <> concreteKeys
opaqueElements = Domain.opaque . Domain.unwrapAc $ normalizedMap
if null mapKeys && null opaqueElements then
return Pattern.top
else do
Monad.guard (not (null mapKeys) || (length opaqueElements > 1))
-- Concrete keys are constructor-like, therefore they are defined
TermLike.assertConstructorLikeKeys concreteKeys $ return ()
definedKey <- defineTerm keyTerm
definedMap <- defineTerm mapTerm
keyConditions <- lift $ traverse (unifyAndNegate keyTerm) mapKeys

let keyInKeysOpaque =
(\term -> inject @(TermLike _) inKeys { mapTerm = term })
<$> opaqueElements

opaqueConditions <-
lift $ traverse (unifyChildren termLike1) keyInKeysOpaque
let conditions =
fmap Pattern.withoutTerm (keyConditions <> opaqueConditions)
<> [definedKey, definedMap]
return $ collectConditions conditions

worker _ _ = empty
unifyNotInKeys =
Set.unifyNotInKeys
(Ac.toNormalized @Domain.NormalizedMap)
matchInKeys
(inject . InKeys)
Loading