繁体   English   中英

在 Z3 haskell 中使用 forall

[英]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 的断言似乎并不成立。我认为xvmkForall调用中没有绑定到x

- - 解决了

  arg <- mkBound 0 intSort
  assert =<< mkForall [] [x] [intSort] =<< mkLe _5 =<< mkSelect a arg

使用 mkBound 获取 deBruijn 索引参数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM