HOL4 Metis Library Documentation

Quick Guide to Using the HOL4 Metis Library

At the top of your proof script, write

  load "metisLib";
  open metisLib;

Opening the Metis library makes available the automatic provers

    METIS_TAC : thm list -> tactic
  METIS_PROVE : thm list -> term -> thm

which both take a list of theorems that are used to prove the subgoal.

Examples

prove (``?x. x``, METIS_TAC []);

prove (``!x. ~(x = 0) ==> ?!y. x = SUC y``,
       METIS_TAC [numTheory.INV_SUC, arithmeticTheory.num_CASES]);

METIS_PROVE [prim_recTheory.LESS_SUC_REFL, arithmeticTheory.num_CASES]
``(!P. (!n. (!m. m < n ==> P m) ==> P n) ==> !n. P n) ==>
  !P. P 0 /\ (!n. P n ==> P (SUC n)) ==> !n. P n``;

How It Works

This is how METIS_TAC proves a HOL subgoal:

  1. First some HOL conversions and tactics simplify the subgoal and convert it to conjunctive normal form.
  2. The normalized problem is mapped to first-order syntax.
  3. The Metis first-order prover attacks the first-order problem, hopefully deriving a refutation.
  4. The first-order refutation is translated to a HOL proof of the original subgoal.

For more details on the interface please refer to the System Description. To find out more about the Metis first-order prover (including performance information) you can visit its own web page.

Comparison with MESON_TAC

METIS_TAC is generally slower than MESON_TAC on simple problems, but has better coverage. For example, MESON_TAC cannot prove the following theorems:

  METIS_PROVE [] ``?x. x``;
  METIS_PROVE [] ``p (\x. x) /\ q ==> q /\ p (\y. y)``;

The combination of model elimination and resolution calculi in METIS_TAC allows some hard theorems to be proved that are too deep for the HOL version of MESON_TAC, such as the GILMORE_9 and STEAM_ROLLER problems. Also, the ordered paramodulation used by the resolution component of METIS_TAC allows it to prove harder equality problems. An example to illustrate this is the following theorem:

  METIS_PROVE []
  ``(!x y. x * y = y * x) /\ (!x y z. x * y * z = x * (y * z)) ==>
   a * b * c * d * e * f = f * e * d * c * b * a``;

Known Bugs

At the present time all the bugs are unknown.

Credits

The HOL4 Metis library was written by Joe Hurd, based on John Harrison's implementation of MESON_TAC. The library has been much improved by feedback from HOL4 users, especially Michael Norrish, Konrad Slind and Mike Gordon.

Change Log

Version 1.5: 14 January 2004

Subgoals proved by MESON_TAC when HOL is built .......... 2010
Proved by METIS_TAC within 10s .......................... 1998

Between Versions 1.4 and 1.5

Version 1.4: 2 October 2003

Subgoals proved by MESON_TAC when HOL is built .......... 1982
Proved by METIS_TAC within 10s .......................... 1977

Between Versions 1.3 and 1.4

Version 1.3: 18 June 2003

Subgoals proved by MESON_TAC when HOL is built .......... 1976
Proved by METIS_TAC within 10s .......................... 1971

Between Versions 1.2 and 1.3

Version 1.2: 19 November 2002

Subgoals proved by MESON_TAC when HOL is built .......... 1779
Proved by METIS_TAC within 10s .......................... 1774

Between Versions 1.1 and 1.2

Version 1.1: 21 September 2002

Subgoals proved by MESON_TAC when HOL is built .......... 1745
Proved by FO_METIS_TAC within 10s ....................... 1485
Proved by HO_METIS_TAC within 10s ....................... 1698
Proved by one of {FO|HO}_METIS_TAC within 10s ........... 1717

Between Versions 1.0 and 1.1

Version 1.0: 18 July 2002

Subgoals proved by MESON_TAC when HOL is built .......... 1435
Proved by FO_METIS_TAC within 10s ....................... 1240
Proved by HO_METIS_TAC within 10s ....................... 1346
Proved by one of {FO|HO}_METIS_TAC within 10s ........... 1389

Metis the moon of Jupiter