Skip to content

Commit ca5fd2c

Browse files
Unsatisfiable side condition involving \forall: add translatePredicateForall (#2181)
* translateQuantifier * translatePredicateForall * Add test * Remove smt-transcript * Use $KORE_EXEC in the test * rename symbol * remove smt-transcript * Check K definition and spec instead * Actually add files * Change spec * Add parentheses * Remove p * translatePredicateWith: Move sort translation into translateQuantifier Co-authored-by: Thomas Tuegel <thomas.tuegel@runtimeverification.com>
1 parent 7ec6841 commit ca5fd2c

File tree

5 files changed

+64
-25
lines changed

5 files changed

+64
-25
lines changed

kore/src/Kore/Step/SMT/Translate.hs

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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 =

test/issue-2138/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
include $(CURDIR)/../include.mk

test/issue-2138/issue-2138-spec.k

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
module VERIFICATION
2+
import TEST
3+
endmodule
4+
5+
module ISSUE-2138-SPEC
6+
import VERIFICATION
7+
8+
rule
9+
<k> #assert i ( 1 , 0 ) ==Int 0 => . </k>
10+
requires true #And ( #Forall X. { i ( X, 0 ) #Equals 0 } )
11+
12+
endmodule
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#Top

test/issue-2138/test.k

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
module TEST
2+
imports BOOL
3+
imports INT
4+
5+
syntax Exp ::= Int | Bool
6+
| pair(Int, Int) [klabel(pair), symbol]
7+
8+
syntax KItem ::= "#assume" Exp [klabel(assume), symbol]
9+
rule #assume true => .K
10+
rule #assume false => #Bottom
11+
12+
syntax KItem ::= "#assert" Exp [klabel(assert), symbol]
13+
| "#fail"
14+
rule #assert true => .K
15+
rule #assert false => #fail
16+
17+
// Uninterpreted functions
18+
syntax Int ::= i(Int, Int) [function, functional, no-evaluators, smtlib(fi), klabel(i)]
19+
endmodule

0 commit comments

Comments
 (0)