Skip to content

Commit 6a07860

Browse files
Make SideCondition a MultiAnd of Predicate (#2282)
Co-authored-by: Thomas Tuegel <[email protected]> Co-authored-by: Thomas Tuegel <[email protected]>
1 parent 6f89cee commit 6a07860

File tree

5 files changed

+92
-123
lines changed

5 files changed

+92
-123
lines changed

kore/src/Kore/Internal/MultiAnd.hs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,14 @@ import qualified Data.Traversable as Traversable
3838
import qualified Generics.SOP as SOP
3939
import qualified GHC.Exts as GHC
4040
import qualified GHC.Generics as GHC
41+
import Kore.Attribute.Pattern.FreeVariables
42+
( HasFreeVariables (..)
43+
)
4144

4245
import Debug
46+
import Kore.Internal.Condition
47+
( Condition
48+
)
4349
import Kore.Internal.Predicate
4450
( Predicate
4551
, getMultiAndPredicate
@@ -83,6 +89,11 @@ instance TopBottom child => TopBottom (MultiAnd child) where
8389
isBottom (MultiAnd [child]) = isBottom child
8490
isBottom _ = False
8591

92+
instance (Ord variable, HasFreeVariables a variable) =>
93+
HasFreeVariables (MultiAnd a) variable
94+
where
95+
freeVariables = foldMap' freeVariables
96+
8697
instance Debug child => Debug (MultiAnd child)
8798

8899
instance (Debug child, Diff child) => Diff (MultiAnd child)
@@ -109,6 +120,13 @@ instance
109120
from = fromPredicate
110121
{-# INLINE from #-}
111122

123+
instance
124+
InternalVariable variable
125+
=> From (Condition variable) (MultiAnd (Predicate variable))
126+
where
127+
from = fromPredicate . from @_ @(Predicate _)
128+
{-# INLINE from #-}
129+
112130
instance
113131
InternalVariable variable
114132
=> From (TermLike variable) (MultiAnd (TermLike variable))

kore/src/Kore/Internal/SideCondition.hs

Lines changed: 62 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ module Kore.Internal.SideCondition
1717
, top
1818
, topTODO
1919
, toPredicate
20-
, isNormalized
2120
, toRepresentation
2221
) where
2322

@@ -37,10 +36,14 @@ import Kore.Internal.Condition
3736
( Condition
3837
)
3938
import qualified Kore.Internal.Condition as Condition
40-
import qualified Kore.Internal.Conditional as Conditional
39+
import Kore.Internal.MultiAnd
40+
( MultiAnd
41+
)
42+
import qualified Kore.Internal.MultiAnd as MultiAnd
4143
import Kore.Internal.Predicate
4244
( Predicate
4345
)
46+
import qualified Kore.Internal.Predicate as Predicate
4447
import Kore.Internal.SideCondition.SideCondition as SideCondition
4548
import Kore.Internal.Variable
4649
( InternalVariable
@@ -65,10 +68,11 @@ other purposes, say, to remove redundant parts of the result predicate.
6568
-}
6669
newtype SideCondition variable =
6770
SideCondition
68-
{ assumedTrue :: Condition variable
71+
{ assumedTrue :: MultiAnd (Predicate variable)
6972
}
7073
deriving (Eq, Ord, Show)
7174
deriving (GHC.Generic)
75+
deriving newtype (Semigroup, Monoid)
7276
deriving anyclass (Hashable, NFData)
7377
deriving anyclass (SOP.Generic, SOP.HasDatatypeInfo)
7478
deriving anyclass (Debug)
@@ -91,97 +95,112 @@ instance TopBottom (SideCondition variable) where
9195
where
9296
SideCondition {assumedTrue} = sideCondition
9397

94-
instance InternalVariable variable
95-
=> HasFreeVariables (SideCondition variable) variable
98+
instance Ord variable => HasFreeVariables (SideCondition variable) variable
9699
where
97-
freeVariables sideCondition@(SideCondition _) =
98-
freeVariables assumedTrue
99-
where
100-
SideCondition {assumedTrue} = sideCondition
100+
freeVariables (SideCondition multiAnd) =
101+
freeVariables multiAnd
101102

102103
instance InternalVariable variable => Unparse (SideCondition variable) where
103-
unparse sideCondition@(SideCondition _) =
104-
unparse assumedTrue
105-
where
106-
SideCondition {assumedTrue} = sideCondition
107-
108-
unparse2 sideCondition@(SideCondition _) =
109-
unparse2 assumedTrue
110-
where
111-
SideCondition {assumedTrue} = sideCondition
104+
unparse = unparse . toPredicate
105+
unparse2 = unparse2 . toPredicate
112106

113-
instance From (Condition variable) (SideCondition variable)
107+
instance From (SideCondition variable) (MultiAnd (Predicate variable))
114108
where
115-
from = SideCondition
109+
from condition@(SideCondition _) = assumedTrue condition
110+
{-# INLINE from #-}
116111

117-
instance From (SideCondition variable) (Condition variable) where
118-
from = assumedTrue
112+
instance From (MultiAnd (Predicate variable)) (SideCondition variable)
113+
where
114+
from = SideCondition
119115
{-# INLINE from #-}
120116

121117
instance
122118
InternalVariable variable
123119
=> From (SideCondition variable) (Predicate variable)
124120
where
125-
from = from @(Condition variable) . from @(SideCondition variable)
121+
from = toPredicate
126122
{-# INLINE from #-}
127123

128124
instance
129125
InternalVariable variable
130126
=> From (Predicate variable) (SideCondition variable)
131127
where
132-
from = from @(Condition variable) . from @(Predicate variable)
128+
from = fromPredicate
129+
{-# INLINE from #-}
130+
131+
instance InternalVariable variable =>
132+
From (Condition variable) (SideCondition variable)
133+
where
134+
from = fromCondition
135+
{-# INLINE from #-}
136+
137+
instance InternalVariable variable =>
138+
From (SideCondition variable) (Condition variable)
139+
where
140+
from = Condition.fromPredicate . toPredicate
133141
{-# INLINE from #-}
134142

135-
top :: InternalVariable variable => SideCondition variable
136-
top = fromCondition Condition.top
143+
top :: SideCondition variable
144+
top = SideCondition MultiAnd.top
137145

138146
-- | A 'top' 'Condition' for refactoring which should eventually be removed.
139-
topTODO :: InternalVariable variable => SideCondition variable
147+
topTODO :: SideCondition variable
140148
topTODO = top
141149

142150
andCondition
143151
:: InternalVariable variable
144152
=> SideCondition variable
145153
-> Condition variable
146154
-> SideCondition variable
147-
andCondition SideCondition { assumedTrue } newCondition =
148-
SideCondition merged
149-
where
150-
merged = assumedTrue `Condition.andCondition` newCondition
155+
andCondition
156+
sideCondition
157+
(from @(Condition _) @(SideCondition _) -> newSideCondition)
158+
=
159+
newSideCondition <> sideCondition
151160

152-
assumeTrueCondition :: Condition variable -> SideCondition variable
161+
assumeTrueCondition
162+
:: InternalVariable variable
163+
=> Condition variable
164+
-> SideCondition variable
153165
assumeTrueCondition = fromCondition
154166

155167
assumeTruePredicate
156-
:: InternalVariable variable => Predicate variable -> SideCondition variable
157-
assumeTruePredicate predicate =
158-
assumeTrueCondition (Condition.fromPredicate predicate)
168+
:: InternalVariable variable
169+
=> Predicate variable
170+
-> SideCondition variable
171+
assumeTruePredicate = fromPredicate
159172

160173
toPredicate
161174
:: InternalVariable variable
162175
=> SideCondition variable
163176
-> Predicate variable
164177
toPredicate condition@(SideCondition _) =
165-
Condition.toPredicate assumedTrue
178+
MultiAnd.toPredicate assumedTrue
166179
where
167180
SideCondition { assumedTrue } = condition
168181

182+
fromPredicate
183+
:: InternalVariable variable
184+
=> Predicate variable
185+
-> SideCondition variable
186+
fromPredicate = SideCondition . MultiAnd.fromPredicate
187+
169188
mapVariables
170189
:: (InternalVariable variable1, InternalVariable variable2)
171190
=> AdjSomeVariableName (variable1 -> variable2)
172191
-> SideCondition variable1
173192
-> SideCondition variable2
174193
mapVariables adj condition@(SideCondition _) =
175-
fromCondition (Condition.mapVariables adj assumedTrue)
194+
MultiAnd.map (Predicate.mapVariables adj) assumedTrue
195+
& SideCondition
176196
where
177197
SideCondition { assumedTrue } = condition
178198

179-
fromCondition :: Condition variable -> SideCondition variable
180-
fromCondition = from
181-
182-
fromPredicate
183-
:: InternalVariable variable => Predicate variable -> SideCondition variable
184-
fromPredicate = fromCondition . from
199+
fromCondition
200+
:: InternalVariable variable
201+
=> Condition variable
202+
-> SideCondition variable
203+
fromCondition = fromPredicate . Condition.toPredicate
185204

186205
toRepresentation
187206
:: InternalVariable variable
@@ -190,6 +209,3 @@ toRepresentation
190209
toRepresentation =
191210
mkRepresentation
192211
. mapVariables @_ @VariableName (pure toVariableName)
193-
194-
isNormalized :: forall variable. Ord variable => SideCondition variable -> Bool
195-
isNormalized = Conditional.isNormalized . from @_ @(Condition variable)

kore/test/Test/Kore/Step/Rule/Simplify.hs

Lines changed: 2 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,6 @@ import Prelude.Kore
88

99
import Test.Tasty
1010

11-
import Control.Applicative
12-
( ZipList (..)
13-
)
1411
import qualified Control.Lens as Lens
1512
import Control.Monad.Morph
1613
( MFunctor (..)
@@ -28,11 +25,8 @@ import Data.Generics.Product
2825

2926
import Kore.Internal.Condition
3027
( Condition
31-
, Conditional (..)
3228
)
3329
import qualified Kore.Internal.Condition as Condition
34-
import qualified Kore.Internal.MultiAnd as MultiAnd
35-
import qualified Kore.Internal.MultiOr as MultiOr
3630
import qualified Kore.Internal.OrPattern as OrPattern
3731
import qualified Kore.Internal.Pattern as Pattern
3832
import Kore.Internal.Predicate
@@ -45,7 +39,6 @@ import Kore.Internal.Predicate
4539
)
4640
import qualified Kore.Internal.Predicate as Predicate
4741
import qualified Kore.Internal.SideCondition as SideCondition
48-
import qualified Kore.Internal.Substitution as Substitution
4942
import Kore.Internal.TermLike
5043
( AdjSomeVariableName
5144
, InternalVariable
@@ -65,9 +58,6 @@ import Kore.Rewriting.RewritingVariable
6558
( RewritingVariableName
6659
, getRewritingVariable
6760
)
68-
import Kore.Sort
69-
( predicateSort
70-
)
7161
import Kore.Step.ClaimPattern
7262
( ClaimPattern (..)
7363
, mkClaimPattern
@@ -465,13 +455,7 @@ test_simplifyClaimRule =
465455
-- Test simplifyClaimRule through the OnePathClaim instance.
466456
testCase name $ do
467457
actual <- run (simplifyRuleLhs input) & fmap toList
468-
-- Equivalent under associativity of \\and
469-
let checkEquivalence
470-
(fmap getOnePathClaim -> claims1)
471-
(fmap getOnePathClaim -> claims2)
472-
=
473-
and (areEquivalent <$> ZipList claims1 <*> ZipList claims2)
474-
assertEqual "" True (checkEquivalence expect actual)
458+
assertEqual "" expect actual
475459
where
476460
run =
477461
runSimplifierSMT env
@@ -517,15 +501,9 @@ instance MonadSimplify m => MonadSimplify (TestSimplifierT m) where
517501
(Condition.toPredicate requires)
518502
(makeCeilPredicate sort leftTerm)
519503
& liftPredicate
520-
& Predicate.coerceSort predicateSort
521504
& Condition.fromPredicate
522505
& SideCondition.fromCondition
523-
-- Equivalent under associativity of \\and
524-
checkEquivalence cond1 cond2 =
525-
(==)
526-
(cond1 & SideCondition.toPredicate & MultiAnd.fromPredicate)
527-
(cond2 & SideCondition.toPredicate & MultiAnd.fromPredicate)
528-
satisfied = checkEquivalence sideCondition expectSideCondition
506+
satisfied = sideCondition == expectSideCondition
529507
return
530508
. OrPattern.fromTermLike
531509
. (if satisfied then applyReplacements replacements else id)
@@ -569,46 +547,3 @@ instance MonadSimplify m => MonadSimplify (TestSimplifierT m) where
569547
=> AdjSomeVariableName (RewritingVariableName -> variable)
570548
liftRewritingVariable =
571549
pure (.) <*> pure fromVariableName <*> getRewritingVariable
572-
573-
-- | The terms of the implication are equivalent in respect to
574-
-- the associativity, commutativity, and idempotence of \\and.
575-
--
576-
-- Warning: this should only be used when the distinction between the
577-
-- predicate and substitution of a pattern is not of importance.
578-
areEquivalent
579-
:: ClaimPattern
580-
-> ClaimPattern
581-
-> Bool
582-
areEquivalent
583-
ClaimPattern
584-
{ left = left1
585-
, right = right1
586-
, existentials = existentials1
587-
, attributes = attributes1
588-
}
589-
ClaimPattern
590-
{ left = left2
591-
, right = right2
592-
, existentials = existentials2
593-
, attributes = attributes2
594-
}
595-
=
596-
let leftsAreEquivalent =
597-
toConjunctionOfTerms left1
598-
== toConjunctionOfTerms left2
599-
rightsAreEquivalent =
600-
MultiOr.map toConjunctionOfTerms right1
601-
== MultiOr.map toConjunctionOfTerms right2
602-
in leftsAreEquivalent
603-
&& rightsAreEquivalent
604-
&& existentials1 == existentials2
605-
&& attributes1 == attributes2
606-
where
607-
toConjunctionOfTerms Conditional { term, predicate, substitution } =
608-
MultiAnd.fromTermLike term
609-
<> MultiAnd.fromTermLike (Predicate.unwrapPredicate predicate)
610-
<> MultiAnd.fromTermLike
611-
( Predicate.unwrapPredicate
612-
. Substitution.toPredicate
613-
$ substitution
614-
)

test/issue-1872/1.test.out.golden

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#Not ( {
2-
1
3-
#Equals
42
'QuesUnds'0 %Int 2
3+
#Equals
4+
1
55
} )
66
#And
77
<generatedTop>
@@ -23,7 +23,7 @@
2323
</generatedTop>
2424
#And
2525
{
26-
1
27-
#Equals
2826
'QuesUnds'0 %Int 2
27+
#Equals
28+
1
2929
}

0 commit comments

Comments
 (0)