Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
96 commits
Select commit Hold shift + click to select a range
65018f4
Prelude.Kore: Export Data.Functor.(<&>)
ttuegel May 21, 2021
932ba49
Prelude.Kore: Export Data.Functor.void
ttuegel May 21, 2021
d9375b9
initial work on substituting out old functions
emarzion May 6, 2021
c3a7a61
Format with fourmolu
invalid-email-address May 6, 2021
1393181
Committing current progress.
emarzion May 10, 2021
eae61bd
pushing test failure
emarzion May 10, 2021
df91cbd
Changing type signatures and splitting up unifyInj
emarzion May 11, 2021
ac34584
Fixed sortInjectionAndEquals
emarzion May 11, 2021
2490906
Format with fourmolu
invalid-email-address May 11, 2021
2cd35c9
Refactoring constructorAndEqualsAssumesDifferentHeads
emarzion May 11, 2021
c44ecfc
Format with fourmolu
invalid-email-address May 11, 2021
8eeff4a
near fix for overloadedConstructorSortInjectionAndEquals
emarzion May 13, 2021
61613e4
Format with fourmolu
invalid-email-address May 13, 2021
00524a4
More progress and reverting overloadedConstructor...
emarzion May 14, 2021
65e3d6a
Format with fourmolu
invalid-email-address May 14, 2021
c4a6e53
trigger build
emarzion May 14, 2021
2b506be
Using named field puns
emarzion May 16, 2021
eb6c82e
Format with fourmolu
invalid-email-address May 16, 2021
7d2e4a3
Cleaning up code based on review suggestions
emarzion May 16, 2021
3d3f2bd
Format with fourmolu
invalid-email-address May 16, 2021
c3c67b2
Misc. cleanup.
emarzion May 17, 2021
c193a1c
Adding inj args to InjUnify
emarzion May 17, 2021
f8ce65c
Format with fourmolu
invalid-email-address May 17, 2021
6b0a406
adding missing strict field annotations
emarzion May 17, 2021
4e1715c
documentation for matches + minor code fixes
emarzion May 18, 2021
8453e9f
Format with fourmolu
invalid-email-address May 18, 2021
2bbf1ba
reverting the removal of assertions
emarzion May 19, 2021
1dff14b
Fixing documentation + removal of unncess. type annotation
emarzion May 20, 2021
41ae18b
Format with fourmolu
invalid-email-address May 20, 2021
b130fca
changing matchBytesDifferent to matchBytes
emarzion May 20, 2021
c9ad599
Format with fourmolu
invalid-email-address May 20, 2021
ff9315d
Apply worker-wrapper transformation
ttuegel May 21, 2021
e46c199
sortInjectionAndEquals: Remove extra argument
ttuegel May 21, 2021
2d585b7
Remove AndEquals terminology around sort injections
ttuegel May 21, 2021
1651292
Format with fourmolu
invalid-email-address May 21, 2021
f9b41c8
unifyInjs: Simplify signature
ttuegel May 21, 2021
9eb5fac
Clean up injection simplifier
ttuegel May 21, 2021
4ed1d11
Format with fourmolu
invalid-email-address May 21, 2021
f32365c
Test.Kore.Builtin.KEqual: Clean up
ttuegel Jun 4, 2021
1dd4f5c
Test.Kore.Builtin.Int: Clean up
ttuegel Jun 4, 2021
59c19df
Test.Kore.Builtin.Bool: Clean up
ttuegel Jun 4, 2021
9b7c740
Kore.Step.Simplification.ExpandAlias: Clean up
ttuegel Jun 4, 2021
47a592d
Extract Bytes unifier to Kore.Builtin.InternalBytes
ttuegel Jun 4, 2021
83ca369
Clean up UnifyStringLiteral
ttuegel Jun 4, 2021
6cbce09
Clean up variableFunctionAnd
ttuegel Jun 4, 2021
c6d79cf
Separate matchVariables and matchVariableFunction
ttuegel Jun 4, 2021
241b84e
trigger build
emarzion May 14, 2021
2610080
More progress in unification refactor
emarzion May 21, 2021
f6219ac
Format with fourmolu
invalid-email-address May 21, 2021
3edcd1c
More progress on refactoring unification functions
ttuegel Jun 8, 2021
9b69f53
Format with fourmolu
invalid-email-address May 25, 2021
8d7a383
Revert "Format with fourmolu"
emarzion May 26, 2021
65eb5ea
Revert "More progress on refactoring unification functions"
emarzion May 26, 2021
1ebe910
Updating dVAndConstructorErrors
emarzion May 26, 2021
dbb331a
Format with fourmolu
invalid-email-address May 26, 2021
29b5db9
Updating functionAnd
emarzion May 26, 2021
8d0a675
Updating unifyEqualsList
emarzion May 26, 2021
97d9d42
Format with fourmolu
invalid-email-address May 26, 2021
78ae583
Updating unifyNotInKeys
emarzion May 26, 2021
5f4cd5b
Format with fourmolu
invalid-email-address May 26, 2021
30dcbb8
Updating UnifyEquals functions for Map and Set
emarzion May 28, 2021
0d6037e
Format with fourmolu
invalid-email-address May 28, 2021
5f15b7a
Work toward fixing Overloading code
emarzion Jun 1, 2021
00846d5
Format with fourmolu
invalid-email-address Jun 1, 2021
5dc55a8
Fixing tests for unifyoverloading
emarzion Jun 2, 2021
31b7b2e
Documentation
emarzion Jun 3, 2021
df3e56d
Format with fourmolu
invalid-email-address Jun 3, 2021
a0905ac
Removing stray comments.
emarzion Jun 15, 2021
520042c
Cleaning up constructor names + error message
emarzion Jun 15, 2021
9e59ccf
Format with fourmolu
invalid-email-address Jun 15, 2021
fab12ec
Adding missing documentation for matchUnifyStringEq
emarzion Jun 15, 2021
e75704e
Format with fourmolu
invalid-email-address Jun 15, 2021
3b51e4b
Merge branch 'master' into unification-refactor3
emarzion Jun 17, 2021
badea94
Fixing merge
emarzion Jun 17, 2021
7f21495
Adding bangs and explanations.
emarzion Jun 18, 2021
3a1c208
Format with fourmolu
invalid-email-address Jun 18, 2021
1b51dcd
adding missing bang
emarzion Jun 28, 2021
3168352
symmetrizing match functions
emarzion Jun 30, 2021
0503e7e
Format with fourmolu
invalid-email-address Jun 30, 2021
15d2cae
Adding symmetry to documentation
emarzion Jul 1, 2021
bb8637b
moving term args into records
emarzion Jul 7, 2021
030bf0a
Format with fourmolu
invalid-email-address Jul 7, 2021
9039cdf
adding documentation, cleaning up some match/unification code
emarzion Jul 15, 2021
eca65c0
Format with fourmolu
invalid-email-address Jul 15, 2021
beb46ba
fixing merge conflicts
emarzion Jul 19, 2021
2c6b748
adding back missing calls and making matchUnifyStringEq symmetric again
emarzion Jul 20, 2021
5d163b5
Format with fourmolu
invalid-email-address Jul 20, 2021
1bcb332
trigger build
emarzion Jul 20, 2021
96d4669
Merge branch 'master' into unification-refactor3
ana-pantilie Jul 20, 2021
713dbfe
Merge branch 'master' into unification-refactor3
ana-pantilie Jul 21, 2021
da07984
Merge branch 'master' into unification-refactor3
emarzion Jul 28, 2021
215676a
Merge branch 'master' into unification-refactor3
emarzion Jul 28, 2021
6209fe8
Merge branch 'master' into unification-refactor3
emarzion Jul 30, 2021
2db77d9
Merge branch 'master' into unification-refactor3
ana-pantilie Aug 4, 2021
9c7905a
Merge branch 'master' into unification-refactor3
emarzion Aug 5, 2021
6e60321
Merge branch 'master' into unification-refactor3
ana-pantilie Aug 5, 2021
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
329 changes: 222 additions & 107 deletions kore/src/Kore/Builtin/AssociativeCommutative.hs

Large diffs are not rendered by default.

96 changes: 64 additions & 32 deletions kore/src/Kore/Builtin/Bool.hs
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,7 @@ builtinFunctions =

data UnifyBool = UnifyBool
{ bool1, bool2 :: !InternalBool
, term1, term2 :: !(TermLike RewritingVariableName)
}

{- | Matches
Expand All @@ -187,31 +188,34 @@ matchBools ::
TermLike RewritingVariableName ->
TermLike RewritingVariableName ->
Maybe UnifyBool
matchBools first second
| InternalBool_ bool1 <- first
, InternalBool_ bool2 <- second =
Just UnifyBool{bool1, bool2}
matchBools term1 term2
| InternalBool_ bool1 <- term2
, InternalBool_ bool2 <- term1 =
Just UnifyBool{bool1, bool2, term1, term2}
| otherwise = Nothing
{-# INLINE matchBools #-}

-- | When bool values are equal, returns first term; otherwise returns bottom.
unifyBool ::
forall unifier.
MonadUnify unifier =>
TermLike RewritingVariableName ->
TermLike RewritingVariableName ->
UnifyBool ->
unifier (Pattern RewritingVariableName)
unifyBool termLike1 termLike2 unifyData
unifyBool unifyData
| bool1 == bool2 =
return (Pattern.fromTermLike termLike1)
return (Pattern.fromTermLike term1)
| otherwise =
debugUnifyBottomAndReturnBottom
"different Bool domain values"
termLike1
termLike2
term1
term2
where
UnifyBool{bool1, bool2} = unifyData
UnifyBool{bool1, bool2, term1, term2} = unifyData

data UnifyBoolAnd = UnifyBoolAnd
{ term :: !(TermLike RewritingVariableName)
, boolAnd :: !BoolAnd
}

{- | Matches

Expand All @@ -222,18 +226,24 @@ unifyBool termLike1 termLike2 unifyData
and

@
\\and{_}(\\dv{Bool}("true"), andBool(_,_))
\\and{_}(\\dv{Bool}("true"), andBool(_,_)),
@

symmetric in the two arguments.
-}
matchUnifyBoolAnd ::
TermLike RewritingVariableName ->
TermLike RewritingVariableName ->
Maybe BoolAnd
Maybe UnifyBoolAnd
matchUnifyBoolAnd first second
| Just True <- matchBool first
, Just boolAnd <- matchBoolAnd second
, isFunctionPattern second =
Just boolAnd
Just $ UnifyBoolAnd{term = first, boolAnd}
| Just True <- matchBool second
, Just boolAnd <- matchBoolAnd first
, isFunctionPattern first =
Just $ UnifyBoolAnd{term = second, boolAnd}
| otherwise =
Nothing
{-# INLINE matchUnifyBoolAnd #-}
Expand All @@ -242,12 +252,12 @@ unifyBoolAnd ::
forall unifier.
MonadUnify unifier =>
TermSimplifier RewritingVariableName unifier ->
TermLike RewritingVariableName ->
BoolAnd ->
UnifyBoolAnd ->
unifier (Pattern RewritingVariableName)
unifyBoolAnd unifyChildren term boolAnd =
unifyBoolAnd unifyChildren unifyData =
unifyBothWith unifyChildren term operand1 operand2
where
UnifyBoolAnd{term, boolAnd} = unifyData
BoolAnd{operand1, operand2} = boolAnd

{- |Takes a (function-like) pattern and unifies it against two other patterns.
Expand Down Expand Up @@ -275,6 +285,11 @@ unifyBothWith unify termLike1 operand1 operand2 = do
unify' term1 term2 =
Pattern.withoutTerm <$> unify term1 term2

data UnifyBoolOr = UnifyBoolOr
{ term :: !(TermLike RewritingVariableName)
, boolOr :: !BoolOr
}

{- | Matches

@
Expand All @@ -284,36 +299,42 @@ unifyBothWith unify termLike1 operand1 operand2 = do
and

@
\\and{_}(\\dv{Bool}("false"), boolOr(_,_))
\\and{_}(\\dv{Bool}("false"), boolOr(_,_)),
@

symmetric in the two arguments.
-}
matchUnifyBoolOr ::
TermLike RewritingVariableName ->
TermLike RewritingVariableName ->
Maybe BoolOr
Maybe UnifyBoolOr
matchUnifyBoolOr first second
| Just False <- matchBool first
, Just boolOr <- matchBoolOr second
, isFunctionPattern second =
Just boolOr
Just UnifyBoolOr{term = first, boolOr}
| Just False <- matchBool second
, Just boolOr <- matchBoolOr first
, isFunctionPattern first =
Just UnifyBoolOr{term = second, boolOr}
| otherwise = Nothing
{-# INLINE matchUnifyBoolOr #-}

unifyBoolOr ::
forall unifier.
MonadUnify unifier =>
TermSimplifier RewritingVariableName unifier ->
TermLike RewritingVariableName ->
BoolOr ->
UnifyBoolOr ->
unifier (Pattern RewritingVariableName)
unifyBoolOr unifyChildren termLike boolOr =
unifyBothWith unifyChildren termLike operand1 operand2
unifyBoolOr unifyChildren unifyData =
unifyBothWith unifyChildren term operand1 operand2
where
UnifyBoolOr{term, boolOr} = unifyData
BoolOr{operand1, operand2} = boolOr

data UnifyBoolNot = UnifyBoolNot
{ boolNot :: BoolNot
, value :: Bool
{ boolNot :: !BoolNot
, value :: !InternalBool
}

{- | Matches
Expand All @@ -325,8 +346,10 @@ data UnifyBoolNot = UnifyBoolNot
and

@
\\and{_}(notBool(_), \\dv{Bool}(_))
\\and{_}(notBool(_), \\dv{Bool}(_)),
@

symmetric in the two arguments.
-}
matchUnifyBoolNot ::
TermLike RewritingVariableName ->
Expand All @@ -335,24 +358,33 @@ matchUnifyBoolNot ::
matchUnifyBoolNot first second
| Just boolNot <- matchBoolNot first
, isFunctionPattern first
, Just value <- matchBool second =
Just $ UnifyBoolNot boolNot value
, Just value <- matchInternalBool second =
Just UnifyBoolNot{boolNot, value}
| Just boolNot <- matchBoolNot second
, isFunctionPattern second
, Just value <- matchInternalBool first =
Just UnifyBoolNot{boolNot, value}
| otherwise = Nothing
{-# INLINE matchUnifyBoolNot #-}

unifyBoolNot ::
forall unifier.
TermSimplifier RewritingVariableName unifier ->
TermLike RewritingVariableName ->
UnifyBoolNot ->
unifier (Pattern RewritingVariableName)
unifyBoolNot unifyChildren term unifyData =
let notValue = asInternal (termLikeSort term) (not value)
unifyBoolNot unifyChildren unifyData =
let notValue = asInternal internalBoolSort (not internalBoolValue)
in unifyChildren notValue operand
where
UnifyBoolNot{boolNot, value} = unifyData
InternalBool{internalBoolValue, internalBoolSort} = value
BoolNot{operand} = boolNot

matchInternalBool :: TermLike variable -> Maybe InternalBool
matchInternalBool (InternalBool_ internalBool) =
Just internalBool
matchInternalBool _ = Nothing

-- | Match a @BOOL.Bool@ builtin value.
matchBool :: TermLike variable -> Maybe Bool
matchBool (InternalBool_ InternalBool{internalBoolValue}) =
Expand Down
44 changes: 29 additions & 15 deletions kore/src/Kore/Builtin/Endianness.hs
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,10 @@ module Kore.Builtin.Endianness (
littleEndianKey,
bigEndianKey,
unifyEquals,
matchUnifyEqualsEndianness,
module Kore.Builtin.Endianness.Endianness,
) where

import Control.Error (
MaybeT,
)
import Data.Functor.Const
import qualified Data.HashMap.Strict as HashMap
import Data.String (
Expand All @@ -31,6 +29,7 @@ import Kore.Internal.TermLike
import Kore.Log.DebugUnifyBottom (
debugUnifyBottomAndReturnBottom,
)
import Kore.Rewrite.RewritingVariable
import Kore.Unification.Unify (
MonadUnify,
)
Expand Down Expand Up @@ -77,18 +76,33 @@ littleEndianVerifier = endiannessVerifier LittleEndian
bigEndianVerifier :: ApplicationVerifier Verified.Pattern
bigEndianVerifier = endiannessVerifier BigEndian

data UnifyEqualsEndianness = UnifyEqualsEndianness
{ end1, end2 :: !Endianness
, term1, term2 :: !(TermLike RewritingVariableName)
}

-- | Matches two terms having the Endianness constructor.
matchUnifyEqualsEndianness ::
TermLike RewritingVariableName ->
TermLike RewritingVariableName ->
Maybe UnifyEqualsEndianness
matchUnifyEqualsEndianness term1 term2
| Endianness_ end1 <- term1
, Endianness_ end2 <- term2 =
Just UnifyEqualsEndianness{end1, end2, term1, term2}
| otherwise = Nothing
{-# INLINE matchUnifyEqualsEndianness #-}

unifyEquals ::
InternalVariable variable =>
MonadUnify unifier =>
TermLike variable ->
TermLike variable ->
MaybeT unifier (Pattern variable)
unifyEquals termLike1@(Endianness_ end1) termLike2@(Endianness_ end2)
| end1 == end2 = return (Pattern.fromTermLike termLike1)
UnifyEqualsEndianness ->
unifier (Pattern RewritingVariableName)
unifyEquals unifyData
| end1 == end2 = return (Pattern.fromTermLike term1)
| otherwise =
lift $
debugUnifyBottomAndReturnBottom
"Cannot unify distinct constructors."
termLike1
termLike2
unifyEquals _ _ = empty
debugUnifyBottomAndReturnBottom
"Cannot unify distinct constructors."
term1
term2
where
UnifyEqualsEndianness{end1, end2, term1, term2} = unifyData
22 changes: 8 additions & 14 deletions kore/src/Kore/Builtin/EqTerm.hs
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,7 @@ module Kore.Builtin.EqTerm (
unifyEqTerm,
) where

import Control.Error (
MaybeT,
)
import qualified Control.Monad as Monad
import qualified Kore.Builtin.Bool as Bool
import qualified Kore.Internal.MultiOr as MultiOr
import qualified Kore.Internal.OrPattern as OrPattern
import Kore.Internal.Pattern (
Expand Down Expand Up @@ -61,16 +57,14 @@ unifyEqTerm ::
TermSimplifier RewritingVariableName unifier ->
NotSimplifier unifier ->
EqTerm (TermLike RewritingVariableName) ->
TermLike RewritingVariableName ->
MaybeT unifier (Pattern RewritingVariableName)
unifyEqTerm unifyChildren (NotSimplifier notSimplifier) eqTerm termLike2
| Just value2 <- Bool.matchBool termLike2 =
lift $ do
solution <- unifyChildren operand1 operand2 & OrPattern.gather
let solution' = MultiOr.map eraseTerm solution
(if value2 then pure else notSimplifier SideCondition.top) solution'
>>= Unify.scatter
| otherwise = empty
Bool ->
unifier (Pattern RewritingVariableName)
unifyEqTerm unifyChildren (NotSimplifier notSimplifier) eqTerm value =
do
solution <- unifyChildren operand1 operand2 & OrPattern.gather
let solution' = MultiOr.map eraseTerm solution
(if value then pure else notSimplifier SideCondition.top) solution'
>>= Unify.scatter
where
EqTerm{operand1, operand2} = eqTerm
eraseTerm = Pattern.fromCondition_ . Pattern.withoutTerm
23 changes: 14 additions & 9 deletions kore/src/Kore/Builtin/Int.hs
Original file line number Diff line number Diff line change
Expand Up @@ -435,6 +435,7 @@ matchIntEqual =

data UnifyInt = UnifyInt
{ int1, int2 :: !InternalInt
, term1, term2 :: !(TermLike RewritingVariableName)
}

{- | Matches
Expand All @@ -453,25 +454,23 @@ matchInt ::
TermLike RewritingVariableName ->
TermLike RewritingVariableName ->
Maybe UnifyInt
matchInt first second
| InternalInt_ int1 <- first
, InternalInt_ int2 <- second =
Just UnifyInt{int1, int2}
matchInt term1 term2
| InternalInt_ int1 <- term1
, InternalInt_ int2 <- term2 =
Just UnifyInt{int1, int2, term1, term2}
| otherwise = Nothing
{-# INLINE matchInt #-}

-- | When int values are equal, returns first term; otherwise returns bottom.
unifyInt ::
forall unifier.
MonadUnify unifier =>
TermLike RewritingVariableName ->
TermLike RewritingVariableName ->
UnifyInt ->
unifier (Pattern RewritingVariableName)
unifyInt term1 term2 unifyData =
unifyInt unifyData =
assert (on (==) internalIntSort int1 int2) worker
where
UnifyInt{int1, int2} = unifyData
UnifyInt{int1, int2, term1, term2} = unifyData
worker :: unifier (Pattern RewritingVariableName)
worker
| on (==) internalIntValue int1 int2 =
Expand All @@ -486,8 +485,10 @@ data UnifyIntEq = UnifyIntEq

{- | Matches
@
\\equals{_, _}(eqInt{_}(_, _), \\dv{Bool}(_))
\\equals{_, _}(eqInt{_}(_, _), \\dv{Bool}(_)),
@

symmetric in the two arguments.
-}
matchUnifyIntEq ::
TermLike RewritingVariableName ->
Expand All @@ -498,6 +499,10 @@ matchUnifyIntEq first second
, isFunctionPattern first
, InternalBool_ internalBool <- second =
Just UnifyIntEq{eqTerm, internalBool}
| Just eqTerm <- matchIntEqual second
, isFunctionPattern second
, InternalBool_ internalBool <- first =
Just UnifyIntEq{eqTerm, internalBool}
| otherwise = Nothing
{-# INLINE matchUnifyIntEq #-}

Expand Down
Loading