@@ -139,7 +139,9 @@ translatePredicateWith translateTerm predicate =
139139 translatePredicateExists exists'
140140 <|> translateUninterpreted SMT. tBool pat
141141 FloorF _ -> translateUninterpreted SMT. tBool pat
142- ForallF _ -> translateUninterpreted SMT. tBool pat
142+ ForallF forall' ->
143+ translatePredicateForall forall'
144+ <|> translateUninterpreted SMT. tBool pat
143145 InF _ -> translateUninterpreted SMT. tBool pat
144146
145147 -- Invalid: no translation, should not occur in predicates
@@ -258,34 +260,38 @@ translatePredicateWith translateTerm predicate =
258260 translatePredicateExists
259261 :: Exists Sort variable p -> Translator m variable SExpr
260262 translatePredicateExists Exists { existsVariable, existsChild } =
261- existsBuiltinSort <|> existsConstructorSort
262- where
263- existsBuiltinSort = case getHook of
264- Just builtinSort
265- | builtinSort == Builtin.Bool. sort
266- -> translateExists SMT. tBool existsVariable existsChild
267- | builtinSort == Builtin.Int. sort
268- -> translateExists SMT. tInt existsVariable existsChild
269- _ -> empty
270- existsConstructorSort = do
271- smtSort <- hoistMaybe $ translateSort varSort
272- translateExists smtSort existsVariable existsChild
273- varSort = variableSort existsVariable
274- tools :: SmtMetadataTools Attribute. Symbol
275- tools = given
276- Attribute. Sort { hook = Hook { getHook } } =
277- sortAttributes tools varSort
278-
279- translateExists
280- :: SExpr -> ElementVariable variable -> p -> Translator m variable SExpr
281- translateExists varSort var predTerm
282- = do
263+ translateQuantifier SMT. existsQ existsVariable existsChild
264+
265+ translatePredicateForall
266+ :: Forall Sort variable p -> Translator m variable SExpr
267+ translatePredicateForall Forall { forallVariable, forallChild } =
268+ translateQuantifier SMT. forallQ forallVariable forallChild
269+
270+ translateQuantifier
271+ :: ([SExpr ] -> SExpr -> SExpr )
272+ -> ElementVariable variable
273+ -> p
274+ -> Translator m variable SExpr
275+ translateQuantifier quantifier var predTerm = do
276+ smtSort <- translateVariableSort
283277 oldVar <- State. gets (Map. lookup var . quantifiedVars)
284- smtVar <- translateTerm varSort (QuantifiedVariable var)
278+ smtVar <- translateTerm smtSort (QuantifiedVariable var)
285279 smtPred <- translatePredicatePattern predTerm
286280 field @ " quantifiedVars" Lens. %=
287281 maybe (Map. delete var) (Map. insert var) oldVar
288- return $ SMT. existsQ [SMT. List [smtVar, varSort]] smtPred
282+ return $ quantifier [SMT. List [smtVar, smtSort]] smtPred
283+ where
284+ Variable { variableSort } = var
285+ translateVariableSort =
286+ case getHook of
287+ Just builtinSort
288+ | builtinSort == Builtin.Bool. sort -> pure SMT. tBool
289+ | builtinSort == Builtin.Int. sort -> pure SMT. tInt
290+ _ -> translateSort variableSort & hoistMaybe
291+ tools :: SmtMetadataTools Attribute. Symbol
292+ tools = given
293+ Attribute. Sort { hook = Hook { getHook } } =
294+ sortAttributes tools variableSort
289295
290296 translatePattern :: Sort -> p -> Translator m variable SExpr
291297 translatePattern sort pat =
0 commit comments