mirror of
https://github.com/AdaCore/why3.git
synced 2026-02-12 12:34:55 -08:00
429 lines
14 KiB
ReStructuredText
429 lines
14 KiB
ReStructuredText
.. _sec.install:
|
|
|
|
Compilation, Installation
|
|
=========================
|
|
|
|
.. program:: why3
|
|
|
|
Installing Why3
|
|
---------------
|
|
|
|
Installation via Opam
|
|
~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
The simplest way to install Why3 is via Opam, the OCaml package manager. It
|
|
is as simple as
|
|
|
|
::
|
|
|
|
opam install why3
|
|
|
|
Then jump to :numref:`sec.provers` to install external provers.
|
|
|
|
Why3 also provides a graphical user interface (see :numref:`sec.gui`
|
|
and :numref:`sec.ideref`), which can be installed using
|
|
|
|
::
|
|
|
|
opam install why3-ide
|
|
|
|
Finally, the Opam package ``why3-coq`` provides realizations of Why3's
|
|
standard library, which are useful for doing interactive proofs using the
|
|
Coq formal system (see :numref:`chap.itp`).
|
|
|
|
Installation via Docker
|
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Instead of compiling Why3, one can also execute a precompiled version
|
|
(for *amd64* architecture) using Docker. The image containing Why3
|
|
as well as a few provers can be recovered using
|
|
|
|
.. parsed-literal::
|
|
|
|
docker pull registry.gitlab.inria.fr/why3/why3:|release|
|
|
docker tag registry.gitlab.inria.fr/why3/why3:|release| why3
|
|
|
|
Let us suppose that there is a file :file:`foo.mlw` in your current
|
|
directory. If you want to verify it using Z3, you can type
|
|
|
|
.. code-block:: shell
|
|
|
|
docker run --rm --volume `pwd`:/data --workdir /data why3 prove foo.mlw -P z3
|
|
|
|
If you want to verify :file:`foo.mlw` using the graphical user interface,
|
|
the invocation is slightly more complicated as the containerized
|
|
application needs to access your X server:
|
|
|
|
.. code-block:: shell
|
|
|
|
docker run --rm --network host --user `id -u` --volume $HOME/.Xauthority:/home/guest/.Xauthority --env DISPLAY=$DISPLAY --volume `pwd`:/data --workdir /data why3 ide foo.mlw
|
|
|
|
It certainly makes sense to turn this command line into a shell script for easier use:
|
|
|
|
.. code-block:: shell
|
|
|
|
#!/bin/sh
|
|
exec docker run --rm --network host --user `id -u` --volume $HOME/.Xauthority:/home/guest/.Xauthority --env DISPLAY=$DISPLAY --volume `pwd`:/data --workdir /data why3 "$@"
|
|
|
|
It is also possible to run the graphical user interface from within a web
|
|
browser, thus alleviating the need for a X server. To do so, just set the
|
|
environment variable ``WHY3IDE`` to ``web`` and publish port 8080:
|
|
|
|
.. code-block:: shell
|
|
|
|
docker run --rm -p 8080:8080 --env WHY3IDE=web --user `id -u` --volume `pwd`:/data --workdir /data why3 ide foo.mlw
|
|
|
|
You can now point your web browser to http://localhost:8080/. As before,
|
|
this can be turned into a shell script for easier use:
|
|
|
|
.. code-block:: shell
|
|
|
|
#!/bin/sh
|
|
exec docker --rm -p 8080:8080 --env WHY3IDE=web --user `id -u` --volume `pwd`:/data --workdir /data why3 "$@"
|
|
|
|
|
|
Installation from sources
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
In short, installation from sources proceeds as follows.
|
|
|
|
::
|
|
|
|
./configure
|
|
make
|
|
make install
|
|
|
|
After unpacking the distribution, go to the newly created directory
|
|
|whypath|. Compilation must start with a configuration phase which is
|
|
run as
|
|
|
|
::
|
|
|
|
./configure
|
|
|
|
This analyzes your current configuration and checks if requirements
|
|
hold. Compilation requires:
|
|
|
|
- The Objective Caml compiler. It is available as a binary package for
|
|
most Unix distributions. For Debian-based Linux distributions, you
|
|
can install the packages
|
|
|
|
::
|
|
|
|
ocaml ocaml-native-compilers
|
|
|
|
It is also installable from sources, downloadable from the site
|
|
http://caml.inria.fr/ocaml/
|
|
|
|
For some of the Why3 tools, additional OCaml libraries are needed:
|
|
|
|
- For the graphical interface, the LablGtk3 library is needed. It
|
|
provides OCaml bindings of the GTK3 graphical library. For
|
|
Debian-based Linux distributions, you can install the packages
|
|
|
|
::
|
|
|
|
liblablgtk3-ocaml-dev liblablgtksourceview3-ocaml-dev
|
|
|
|
It is also installable from sources, available from the site
|
|
https://garrigue.github.io/lablgtk/
|
|
|
|
If you want to use the Coq realizations (:numref:`sec.realizations`),
|
|
then Coq has to be installed before Why3. Look at the summary printed at
|
|
the end of the configuration script to check if Coq has been detected
|
|
properly. Similarly, in order to use PVS (:numref:`sec.pvs`) or Isabelle
|
|
(:numref:`sec.isabelle`) to discharge proofs, PVS and Isabelle must be
|
|
installed before Why3. You should check that those proof assistants are
|
|
correctly detected by the :file:`configure` script.
|
|
|
|
When configuration is finished, you can compile Why3.
|
|
|
|
::
|
|
|
|
make
|
|
|
|
Installation is performed (as super-user if needed) using
|
|
|
|
::
|
|
|
|
make install
|
|
|
|
Installation can be tested as follows:
|
|
|
|
#. install some external provers (see :numref:`sec.provers` below)
|
|
|
|
#. run :why3:tool:`why3 config`
|
|
|
|
#. run some examples from the distribution, e.g., you should obtain the
|
|
following (provided the required provers are installed on your
|
|
machine):
|
|
|
|
.. code-block:: console
|
|
|
|
$ cd examples
|
|
$ why3 replay logic/scottish-private-club
|
|
1/1 (replay OK)
|
|
$ why3 replay same_fringe
|
|
18/18 (replay OK)
|
|
|
|
Local use, without installation
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
Installing Why3 is not mandatory. It can be configured in a way such that
|
|
it can be used from its compilation directory:
|
|
|
|
::
|
|
|
|
./configure --enable-local
|
|
make
|
|
|
|
The Why3 executable files are then available in the subdirectory :file:`bin/`.
|
|
This directory can be added to your :envvar:`PATH`.
|
|
|
|
.. _sec.installlib:
|
|
|
|
Installation of the Why3 API
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
By default, the Why3 API is not installed. It can be installed using
|
|
|
|
::
|
|
|
|
make byte opt
|
|
make install-lib
|
|
|
|
Beware that if your OCaml installation relies on Opam installed in your
|
|
own user space, then ``make install-lib`` should *not* be run as
|
|
super-user.
|
|
|
|
Removing installation
|
|
^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
Removing installation can be done using
|
|
|
|
::
|
|
|
|
make uninstall
|
|
make uninstall-lib
|
|
|
|
.. _sec.provers:
|
|
|
|
Installing External Provers
|
|
---------------------------
|
|
|
|
Why3 can use a wide range of external theorem provers. These need to be
|
|
installed separately, and then Why3 needs to be configured to use them.
|
|
There is no need to install automatic provers, e.g., SMT solvers, before
|
|
compiling and installing Why3. For installation of external provers,
|
|
please refer to the specific section about provers from
|
|
https://www.why3.org/. (If you have installed Why3 via Opam, note that you can
|
|
install the SMT solver Alt-Ergo via Opam as well.)
|
|
|
|
Once you have installed a prover, or a new version of a prover, you have
|
|
to run the following command:
|
|
|
|
::
|
|
|
|
why3 config
|
|
|
|
It scans your :envvar:`PATH` for provers and updates your configuration file
|
|
(see :numref:`sec.why3config`) accordingly.
|
|
|
|
Multiple versions of the same prover
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Why3 is able to use several versions of the same prover, e.g., it can use both
|
|
CVC4 1.4 and CVC4 1.5 at the same time. The automatic detection of
|
|
provers looks for typical names for their executable command, e.g., :program:`cvc4`
|
|
for CVC3. However, if you install several versions of the same prover it
|
|
is likely that you would use specialized executable names, such as
|
|
:program:`cvc4-1.4` or :program:`cvc4-1.5`. If needed, the command
|
|
:why3:tool:`why3 config add-prover` can be
|
|
used to specify names of prover executables:
|
|
|
|
::
|
|
|
|
why3 config add-prover CVC4 /usr/local/bin/cvc4-dev cvc4-dev
|
|
|
|
The first argument (here ``CVC4``) must be one of the known provers. The
|
|
list of these names can be obtained
|
|
using :why3:tool:`why3 config list-supported-provers`.
|
|
They can also be found in the file :file:`provers-detection-data.conf`,
|
|
typically located in :file:`/usr/local/share/why3` after installation. See
|
|
:numref:`sec.proverdetectiondata` for details.
|
|
|
|
.. _sec.uninstalledprovers:
|
|
|
|
Session update after prover upgrade
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
If you happen to upgrade a prover, e.g., installing CVC4 1.5 in place of CVC4
|
|
1.4, then the proof sessions formerly recorded will still refer to the
|
|
old version of the prover. If you open one such a session with the GUI,
|
|
and replay the proofs, a popup window will show up for asking you to
|
|
choose between three options:
|
|
|
|
- Keep the former proof attempts as they are, with the old prover
|
|
version. They will not be replayed.
|
|
|
|
- Remove the former proof attempts.
|
|
|
|
- Upgrade the former proof attempts to an installed prover (typically
|
|
an upgraded version). The corresponding proof attempts will become
|
|
attached to this new prover, and marked as obsolete, to make their
|
|
replay mandatory. If a proof attempt with this installed prover is
|
|
already present the old proof attempt is just removed. Note that you
|
|
need to invoke again the replay command to replay those proof
|
|
attempts.
|
|
|
|
- Copy the former proofs to an installed prover. This is a combination
|
|
of the actions above: each proof attempt is duplicated, one with the
|
|
former prover version, and one for the new version marked as
|
|
obsolete.
|
|
|
|
Notice that if the prover under consideration is an interactive one,
|
|
then the copy option will duplicate also the edited proof scripts,
|
|
whereas the upgrade-without-copy option will just reuse the former proof
|
|
scripts.
|
|
|
|
Your choice between the three options above will be recorded, one for
|
|
each prover, in the Why3 configuration file. Within the GUI, you can
|
|
discard these choices via the :menuselection:`Files --> Preferences` dialog: just click on one choice to remove
|
|
it.
|
|
|
|
Outside the GUI, the prover upgrades are handled as follows. The
|
|
:why3:tool:`replay` command will take into account any prover upgrade policy
|
|
stored in the configuration. The :why3:tool:`session` command performs move or
|
|
copy operations on proof attempts in a fine-grained way, using filters,
|
|
as detailed in :numref:`sec.why3session`.
|
|
|
|
|
|
.. _sec.installeditormodes:
|
|
|
|
Editing WhyML Sources
|
|
---------------------
|
|
|
|
The Why3 distributions come with some configuration files for Emacs and for Vim.
|
|
These files are typically installed in the shared data directory,
|
|
which is given by :option:`why3 --print-datadir`.
|
|
|
|
Emacs
|
|
~~~~~
|
|
|
|
The Why3 distributions come with a mode for Emacs in a file
|
|
:file:`why3.el`. That file is typically found in sub-directory
|
|
:file:`emacs`. Under OPAM, this file is installed in a shared
|
|
directory :file:`emacs/site-lisp` for all OPAM packages. Here is a
|
|
sample Emacs-Lisp code that can be added to your :file:`.emacs`
|
|
configuration file.
|
|
|
|
.. code-block:: lisp
|
|
|
|
(setq why3-share
|
|
(if (boundp 'why3-share) why3-share
|
|
(ignore-errors (car (process-lines "why3" "--print-datadir")))))
|
|
(setq why3el
|
|
(let ((f (expand-file-name "emacs/why3.elc" why3-share)))
|
|
(if (file-readable-p f) f
|
|
(when (and opam-share (file-directory-p opam-share))
|
|
(let ((f (expand-file-name "emacs/site-lisp/why3.elc" opam-share)))
|
|
(if (file-readable-p f) f nil))))))
|
|
(when why3el (require 'why3 why3el))
|
|
|
|
Notice that the code above checks the presence of the file
|
|
:file:`why3.el` in the OPAM repository using the :file:`opam-share`
|
|
variable, which is supposed to be set before, e.g. using
|
|
|
|
.. code-block:: lisp
|
|
|
|
(setq opam-share (if (boundp 'opam-share) opam-share
|
|
(ignore-errors (car (process-lines "opam" "var" "share")))))
|
|
|
|
More generally, setting up a proper Emacs environment together with
|
|
OPAM can be done by installing the OPAM package :file:`user-setup` (see
|
|
https://opam.ocaml.org/packages/user-setup/).
|
|
|
|
Vim
|
|
~~~
|
|
|
|
Some configuration files are present in the share data directory, under sub-directory :file:`vim`.
|
|
|
|
|
|
.. _sec.installshellmodes:
|
|
|
|
Shells Auto-completion for Why3
|
|
-------------------------------
|
|
|
|
Some configuration files for shells are distributed in the shared data directory,
|
|
which is given by :option:`why3 --print-datadir`.
|
|
|
|
There are configuration files for ``bash`` and ``zsh``.
|
|
|
|
The configuration for ``bash`` can be made from Why3 sources using
|
|
|
|
::
|
|
|
|
sudo make install-bash
|
|
|
|
or directly doing
|
|
|
|
::
|
|
|
|
sudo /usr/bin/install -c `why3 --print-datadir`/bash/why3 /etc/bash_completion.d
|
|
|
|
|
|
.. _sec.installinferloop:
|
|
|
|
Inference of Loop Invariants
|
|
----------------------------
|
|
|
|
This section shows how to install *infer-loop*, an utility based on
|
|
*abstract interpretation* to infer loop invariants
|
|
:cite:`baudin17`. This is still work in progress and many features are
|
|
still very limited.
|
|
|
|
The ``infer-loop`` utility has the following OCaml dependencies.
|
|
|
|
- ``apron``: can be installed using ``opam``.
|
|
|
|
- ``camllib``: can be installed using ``opam``.
|
|
|
|
- ``fixpoint``: follow instructions below.
|
|
|
|
The ``apron`` and ``camllib`` libraries can be installed using
|
|
``opam``. The ``fixpoint`` library is not available in ``opam``, but
|
|
it can be easily compiled and installed using the source code. The
|
|
following commands are just an example of how the library can be
|
|
compiled and installed, and can be performed in any directory.
|
|
|
|
.. code-block:: shell
|
|
|
|
svn co svn://scm.gforge.inria.fr/svnroot/bjeannet/pkg/fixpoint
|
|
cd fixpoint/trunk/
|
|
cp Makefile.config.model Makefile.config
|
|
# if required make modifications to Makefile.config
|
|
make all # compiles
|
|
make install # uses ocamlfind to install the library
|
|
|
|
By default the *infer-loop* mechanism is not compiled and integrated
|
|
with Why3. So, once the dependencies above are installed, the
|
|
configuration script of Why3 should enable the compilation of the
|
|
``infer-loop`` utility. This can be done by passing to the Why3
|
|
configure script the ``--enable-infer`` flag, as follows:
|
|
|
|
.. code-block:: console
|
|
|
|
$ ./configure --enable-infer
|
|
...
|
|
Summary
|
|
-----------------------------------------
|
|
Components
|
|
Invariant inference(exp): yes
|
|
...
|
|
|
|
The line ``Invariant inference(exp)`` indicates whether the
|
|
dependencies are correctly installed and whether the flag mentioned
|
|
above was selected. After the compilation, the loop inference
|
|
mechanism should be available. See :numref:`sec.runwithinferloop` for
|
|
more details.
|