Why3 无法通过 cygwin 在 windows 上 运行 证明

Why3 is unable to run prover on windows via cygwin

我正在尝试在 Windows 环境中通过 Why3cvc4 证明器与 Frama-c wp 插件一起使用。我的系统上安装了 frama-cwhy3。 Why3 被正确配置为包含 cvc4 作为证明者:

$ why3 --list-provers
Known provers:
Alt-Ergo (0.95.2)
CVC4 (1.4)

我使用 frama-c Wp 插件通过以下命令生成与我的 .c 文件(具有 ACSL 规范的 C 源文件)对应的 why3 格式 (.why) 文件:

frama-c -wp -wp-print -wp-proof-trace -wp-out C:/Users/user/temp -wp-prover cvc4 swap.c

以上命令在 C:/Users/user/temp/typed 目录中生成一个文件 swap_Why3_ide.why

当我尝试使用 why3cvc4 作为证明者来证明生成的 swap_Why3_ide.why 文件中的理论时,它失败并出现以下错误:

$ why3 prove -P cvc4 -L C:/cygwin/usr/local/share/frama-c/wp/why3 temp/typed/swap_Why3_ide.why

temp/typed/swap_Why3_ide.why VCswap_post WP : HighFailure (0.02s)
Prover exit status: exited with status 1

Prover output:
/usr/local/lib/why3/why3-cpulimit: Error: failed when launching <"/cygdrive/c/cvc4-1.4-win32-opt.exe" "--lang=smt2" "/tmp/why_29ba75_swap_Why3_ide-T-WP.smt2">
Fatal: CreateProcess failed with error 0: The operation completed successfully.

我在 linux 环境中执行了相同的步骤并且 why3 能够执行证明:

why3 prove -P cvc4 -L /usr/local/share/frama-c/wp/why3/ temp/typed/swap_Why3_ide.why
temp/typed/swap_Why3_ide.why VCswap_post WP : Valid (0.05s) 

谁能建议如何在 windows 上执行 Why3?

似乎没有人在 Windows 上使用 why3。但是无论如何,对于将来尝试在 windows 上使用 Why3 的​​任何人,这里是我对 运行 .why 文件中的理论证明者执行的步骤:

1) 在Windows,即使安装了provers,执行why3 config --detect也不会添加provers。因此,在执行 why3 config --detect --add-prover cvc4 path_to_executable_in_Windows_format 时,确保可执行文件的路径为 windows 格式(例如 C:\provers\cvc4-1.4-win32-opt.exe)

如果路径不是 windows 格式,将抛出以下错误:

/usr/local/lib/why3/why3-cpulimit: Error: failed when launching <"/cygdrive/c/cvc4-1.4-win32-opt.exe" "--lang=smt2" "/tmp/why_29ba75_swap_Why3_ide-T-WP.smt2">
Fatal: CreateProcess failed with error 0: The operation completed successfully.

2) 正确设置provers路径后,尝试执行why3如下:

why3 prove -P cvc4 -L C:/cygwin/usr/local/share/frama-c/wp/why3 C:/temp/typed/swap_Why3_ide.why

这将引发以下错误:

C:/temp/typed/swap_Why3_ide.why VCswap_post WP : HighFailure (0.03s)
Prover exit status: exited with status 1
Prover output:
(error "Couldn't open file: /tmp/why_727ef8_swap_Why3_ide-T-WP.smt2")
why3cpulimit cpu time: 0.015625s wall time: 0.015625s

发生此错误是因为 why3 在 cygwin tmp 目录 (/tmp) 中生成 *.smt2 文件,并且当通过这些文件调用证明者时未提供这些文件的完整路径并且证明者抱怨它 Couldn't open file /tmp/XX.smt2

为了解决这个问题,我必须更新 .why3.conf 中对 运行 证明程序执行的命令,如下所示:

[prover]
command = "%l/why3-cpulimit %t %m -s C:/provers/cvc4-1.4-win32-opt.exe --lang=smt2 C:/cygwin%f
driver = "/usr/local/share/why3/drivers/cvc4.drv"
editor = ""
in_place = false
interactive = false
name = "CVC4"
shortcut = "cvc4"
version = "1.4"

请注意,我将文件格式从 %f 更改为 C:/cygwin%f,即 windows 到 /tmp 目录的路径