src/HOL/Refute.thy
author webertj
Sat, 10 Jan 2004 13:35:10 +0100
changeset 14350 41b32020d0b3
child 14457 6d5d6e78d851
permissions -rw-r--r--
Adding 'refute' to HOL.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14350
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
     1
(*  Title:      HOL/Refute.thy
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
     2
    ID:         $Id$
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
     3
    Author:     Tjark Weber
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
     4
    Copyright   2003-2004
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
     5
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
     6
Basic setup and documentation for the 'refute' (and 'refute_params') command.
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
     7
*)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
     8
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
     9
(* ------------------------------------------------------------------------- *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    10
(* REFUTE                                                                    *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    11
(*                                                                           *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    12
(* We use a SAT solver to search for a (finite) model that refutes a given   *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    13
(* HOL formula.                                                              *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    14
(* ------------------------------------------------------------------------- *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    15
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    16
(* ------------------------------------------------------------------------- *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    17
(* INSTALLATION                                                              *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    18
(*                                                                           *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    19
(* 1. Install a stand-alone SAT solver.  The default parameters in           *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    20
(*    'HOL/Main.thy' assume that ZChaff 2003.12.04 (available for Solaris/   *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    21
(*    Linux/Cygwin/Windows at http://ee.princeton.edu/~chaff/zchaff.php) is  *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    22
(*    installed as '$HOME/bin/zchaff'.  If you want to use a different SAT   *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    23
(*    solver (or install ZChaff to a different location), you will need to   *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    24
(*    modify at least the values for 'command' and (probably) 'success'.     *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    25
(*                                                                           *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    26
(* 2. That's it. You can now use the 'refute' command in your own theories.  *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    27
(* ------------------------------------------------------------------------- *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    28
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    29
(* ------------------------------------------------------------------------- *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    30
(* USAGE                                                                     *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    31
(*                                                                           *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    32
(* See the file 'HOL/ex/Refute_Examples.thy' for examples.  The supported    *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    33
(* parameters are explained below.                                           *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    34
(* ------------------------------------------------------------------------- *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    35
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    36
(* ------------------------------------------------------------------------- *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    37
(* CURRENT LIMITATIONS                                                       *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    38
(*                                                                           *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    39
(* 'refute' currently accepts formulas of higher-order predicate logic (with *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    40
(* equality), including free/bound/schematic variables, lambda abstractions, *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    41
(* sets and set membership.                                                  *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    42
(*                                                                           *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    43
(* NOT (YET) SUPPORTED ARE                                                   *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    44
(*                                                                           *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    45
(* - schematic type variables                                                *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    46
(* - type constructors other than =>, set, unit, and inductive datatypes     *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    47
(* - constants, including constructors of inductive datatypes and recursive  *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    48
(*   functions on inductive datatypes                                        *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    49
(*                                                                           *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    50
(* Unfolding of constants currently needs to be done manually, e.g. using    *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    51
(* 'apply (unfold xxx_def)'.                                                 *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    52
(*                                                                           *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    53
(* For formulas that contain (variables of) an inductive datatype, a         *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    54
(* spurious countermodel may be returned.  Currently no warning is issued in *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    55
(* this case.                                                                *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    56
(* ------------------------------------------------------------------------- *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    57
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    58
(* ------------------------------------------------------------------------- *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    59
(* PARAMETERS                                                                *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    60
(*                                                                           *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    61
(* The following global parameters are currently supported (and required):   *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    62
(*                                                                           *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    63
(* Name          Type    Description                                         *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    64
(*                                                                           *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    65
(* "minsize"     int     Only search for models with size at least           *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    66
(*                       'minsize'.                                          *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    67
(* "maxsize"     int     If >0, only search for models with size at most     *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    68
(*                       'maxsize'.                                          *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    69
(* "maxvars"     int     If >0, use at most 'maxvars' boolean variables      *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    70
(*                       when transforming the term into a propositional     *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    71
(*                       formula.                                            *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    72
(* "satfile"     string  Name of the file used to store the propositional    *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    73
(*                       formula, i.e. the input to the SAT solver.          *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    74
(* "satformat"   string  Format of the SAT solver's input file.  Must be     *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    75
(*                       either "cnf", "defcnf", or "sat".  Since "sat" is   *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    76
(*                       not supported by most SAT solvers, and "cnf" can    *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    77
(*                       cause exponential blowup of the formula, "defcnf"   *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    78
(*                       is recommended.                                     *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    79
(* "resultfile"  string  Name of the file containing the SAT solver's        *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    80
(*                       output.                                             *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    81
(* "success"     string  Part of the line in the SAT solver's output that    *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    82
(*                       precedes a list of integers representing the        *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    83
(*                       satisfying assignment.                              *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    84
(* "command"     string  System command used to execute the SAT solver.      *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    85
(*                       Note that you if you change 'satfile' or            *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    86
(*                       'resultfile', you will also need to change          *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    87
(*                       'command'.                                          *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    88
(* ------------------------------------------------------------------------- *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    89
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    90
(* ------------------------------------------------------------------------- *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    91
(* FILES                                                                     *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    92
(*                                                                           *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    93
(* HOL/Tools/refute.ML        Implementation of the algorithm.               *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    94
(* HOL/Tools/refute_isar.ML   Adds 'refute'/'refute_params' to Isabelle's    *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    95
(*                            syntax.                                        *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    96
(* HOL/Refute.thy             This file. Loads the ML files, basic setup,    *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    97
(*                            documentation.                                 *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    98
(* HOL/Main.thy               Sets default parameters.                       *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
    99
(* HOL/ex/RefuteExamples.thy  Examples.                                      *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
   100
(* ------------------------------------------------------------------------- *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
   101
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
   102
header {* Refute *}
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
   103
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
   104
theory Refute = Map
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
   105
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
   106
files "Tools/refute.ML"
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
   107
      "Tools/refute_isar.ML":
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
   108
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
   109
(* Setting up the 'refute' and 'refute\_params' commands *)
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
   110
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
   111
use "Tools/refute.ML"
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
   112
use "Tools/refute_isar.ML"
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
   113
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
   114
setup Refute.setup
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
   115
41b32020d0b3 Adding 'refute' to HOL.
webertj
parents:
diff changeset
   116
end