@@ -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 )
3938import 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
4143import Kore.Internal.Predicate
4244 ( Predicate
4345 )
46+ import qualified Kore.Internal.Predicate as Predicate
4447import Kore.Internal.SideCondition.SideCondition as SideCondition
4548import Kore.Internal.Variable
4649 ( InternalVariable
@@ -65,10 +68,11 @@ other purposes, say, to remove redundant parts of the result predicate.
6568-}
6669newtype 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
102103instance 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
121117instance
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
128124instance
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
140148topTODO = top
141149
142150andCondition
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
153165assumeTrueCondition = fromCondition
154166
155167assumeTruePredicate
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
160173toPredicate
161174 :: InternalVariable variable
162175 => SideCondition variable
163176 -> Predicate variable
164177toPredicate 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+
169188mapVariables
170189 :: (InternalVariable variable1 , InternalVariable variable2 )
171190 => AdjSomeVariableName (variable1 -> variable2 )
172191 -> SideCondition variable1
173192 -> SideCondition variable2
174193mapVariables 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
186205toRepresentation
187206 :: InternalVariable variable
@@ -190,6 +209,3 @@ toRepresentation
190209toRepresentation =
191210 mkRepresentation
192211 . mapVariables @ _ @ VariableName (pure toVariableName)
193-
194- isNormalized :: forall variable . Ord variable => SideCondition variable -> Bool
195- isNormalized = Conditional. isNormalized . from @ _ @ (Condition variable )
0 commit comments