@@ -87,38 +87,23 @@ A ceil(or) is equal to or(ceil). We also take into account that
8787simplify ::
8888 MonadSimplify simplifier =>
8989 SideCondition RewritingVariableName ->
90- Ceil Sort (OrPattern RewritingVariableName ) ->
91- simplifier (OrPattern RewritingVariableName )
90+ Ceil sort (OrPattern RewritingVariableName ) ->
91+ simplifier (OrCondition RewritingVariableName )
9292simplify
9393 sideCondition
9494 Ceil {ceilChild = child} =
9595 simplifyEvaluated sideCondition child
9696
9797{- | 'simplifyEvaluated' evaluates a ceil given its child, see 'simplify'
9898for details.
99- -}
100-
101- {- TODO (virgil): Preserve pattern sorts under simplification.
102-
103- One way to preserve the required sort annotations is to make 'simplifyEvaluated'
104- take an argument of type
105-
106- > CofreeF (Ceil Sort) (Attribute.Pattern variable) (OrPattern variable)
107-
108- instead of an 'OrPattern' argument. The type of 'makeEvaluate' may
109- be changed analogously. The 'Attribute.Pattern' annotation will eventually cache
110- information besides the pattern sort, which will make it even more useful to
111- carry around.
112-
11399-}
114100simplifyEvaluated ::
115101 MonadSimplify simplifier =>
116102 SideCondition RewritingVariableName ->
117103 OrPattern RewritingVariableName ->
118- simplifier (OrPattern RewritingVariableName )
104+ simplifier (OrCondition RewritingVariableName )
119105simplifyEvaluated sideCondition child =
120- OrPattern. flatten
121- <$> OrPattern. traverse (makeEvaluate sideCondition) child
106+ OrPattern. traverseOr (makeEvaluate sideCondition) child
122107
123108{- | Evaluates a ceil given its child as an Pattern, see 'simplify'
124109for details.
@@ -127,33 +112,18 @@ makeEvaluate ::
127112 MonadSimplify simplifier =>
128113 SideCondition RewritingVariableName ->
129114 Pattern RewritingVariableName ->
130- simplifier (OrPattern RewritingVariableName )
115+ simplifier (OrCondition RewritingVariableName )
131116makeEvaluate sideCondition child
132- | Pattern. isTop child = return OrPattern. top
133- | Pattern. isBottom child = return OrPattern. bottom
134- | otherwise = makeEvaluateNonBoolCeil sideCondition child
135-
136- makeEvaluateNonBoolCeil ::
137- MonadSimplify simplifier =>
138- SideCondition RewritingVariableName ->
139- Pattern RewritingVariableName ->
140- simplifier (OrPattern RewritingVariableName )
141- makeEvaluateNonBoolCeil sideCondition patt@ Conditional {term}
142- | isTop term =
143- return $
144- OrPattern. fromPattern
145- patt{term = mkTop_} -- erase the term's sort.
117+ | Pattern. isTop child = return OrCondition. top
118+ | Pattern. isBottom child = return OrCondition. bottom
119+ | isTop term = return $ OrCondition. fromCondition condition
146120 | otherwise = do
147121 termCeil <- makeEvaluateTerm sideCondition term
148- result <-
149- And. simplifyEvaluatedMultiPredicate
150- sideCondition
151- ( MultiAnd. make
152- [ MultiOr. make [Condition. eraseConditionalTerm patt]
153- , termCeil
154- ]
155- )
156- return (OrPattern. map Pattern. fromCondition_ result)
122+ And. simplifyEvaluatedMultiPredicate
123+ sideCondition
124+ (MultiAnd. make [MultiOr. make [condition], termCeil])
125+ where
126+ (term, condition) = Pattern. splitTerm child
157127
158128-- TODO: Ceil(function) should be an and of all the function's conditions, both
159129-- implicit and explicit.
0 commit comments