[英]Using forall in Z3 haskell
我在 haskell 中使用z3
package,但无法从文档中弄清楚如何调用mkForall
我正在尝试实现这一点
(declare-const a (Array Int Int))
(assert (= (select a 0) 10))
(assert (= (select a 1) 7))
(assert (forall ((x Int)) (> (select a x) 5)))
(check-sat)
到目前为止我有这个
do
intSort <- mkIntSort
arraySort <- mkArraySort intSort intSort
a <- mkFreshVar "a" arraySort
_0 <- mkInteger 0
_1 <- mkInteger 1
_10 <- mkInteger 10
_7 <- mkInteger 7
_5 <- mkInteger 5
assert =<< mkEq _10 =<< mkSelect a _0
assert =<< mkEq _7 =<< mkSelect a _1
x <- mkStringSymbol "x"
mkForall [] [x] [intSort] =<< mkLe _5 =<< mkSelect a x
solverCheck
倒数第二行不起作用,因为我没有声明x Int
的 AST
做mkForall
的正确方法是什么?
你只需要在mkForAll
之外为它declare-const
do
intSort <- mkIntSort
arraySort <- mkArraySort intSort intSort
a <- mkFreshVar "a" arraySort
_0 <- mkInteger 0
_1 <- mkInteger 1
_10 <- mkInteger 10
_7 <- mkInteger 7
_5 <- mkInteger 5
assert =<< mkEq _10 =<< mkSelect a _0
assert =<< mkEq _7 =<< mkSelect a _1
x <- mkStringSymbol "x"
xv <- mkVar x intSort
-- ^^^^^ note this line
mkForall [] [x] [intSort] =<< mkLe _5 =<< mkSelect a xv
solverCheck
- - 编辑
尽管做了assert =<< mkForall....
,但我对 forall 的断言似乎并不成立。我认为xv
在mkForall
调用中没有绑定到x
- - 解决了
arg <- mkBound 0 intSort
assert =<< mkForall [] [x] [intSort] =<< mkLe _5 =<< mkSelect a arg
使用 mkBound 获取 deBruijn 索引参数
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.