在 Haskell 中使用 Z3.Monad 时求解 x=2 失败

Solving for x=2 fails when using Z3.Monad in Haskell

我正在尝试使用 Haskell 中的 Z3.Monad 界面做一个非常基本的示例。不幸的是,这个包没有列出一个简单的、有效的例子,所以我从头开始。我也检查过,软件包中列出的示例对我有用,所以我的 Z3 安装应该没有潜在问题。

我在做什么

这是在 运行 时失败的函数:

import Z3.Monad

computeTwo = evalZ3 $ do
    x <- mkFreshIntVar "x"
    _2 <- mkInteger 2
    assert =<< mkEq x _2
    fmap snd $ withModel $ \m -> fromJust <$> evalInt m x

我得到的错误如下:

uncaught exception: ErrorCall
Z3.Base.toBool: illegal `Z3_bool' value
CallStack (from HasCallStack):
  error, called at src/Z3/Base.hs:3197:23 in z3-4.3.1- 
JxhFvE2Tmnm1VKrfgyob6s:Z3.Base

期待什么答案

模型应检查 x=2。

我还尝试过哪些其他方法

等效示例适用于 Z3 online checker

(declare-const x Int)
(assert (= x 2))
(check-sat)
(get-model)

生成答案:

sat
(model 
  (define-fun x () Int
    2)
)

修复者:

1) 正在更新 XCode

使用 App Store。

2) 重新安装 z3

 brew uninstall z3
 brew install z3
 echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile
 echo 'export LDFLAGS="-L/usr/local/opt/openssl/lib"' >> ~/.bash_profile
 echo 'export CPPFLAGS="-I/usr/local/opt/openssl/include"' >> ~/.bash_profile

最后三个是 brew install 流程的具体说明。

感谢大家的帮助。