src/Pure/Tools/quickcheck.ML
author haftmann
Wed, 17 Sep 2008 07:32:04 +0200
changeset 28256 4e7f7d52f855
child 28309 c24bc53c815c
permissions -rw-r--r--
added quickcheck.ML
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
28256
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
     1
(*  Title:      Pure/Tools/quickcheck.ML
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
     2
    ID:         $Id$
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
     3
    Author:     Stefan Berghofer, Florian Haftmann, TU Muenchen
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
     4
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
     5
Generic counterexample search engine.
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
     6
*)
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
     7
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
     8
signature QUICKCHECK =
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
     9
sig
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    10
  (*val test: Proof.context -> int -> int -> term -> (string * term) list option
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    11
  val test_select: string -> Proof.context -> int -> int -> term -> (string * term) list option
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    12
  val test_cmd: string option -> string list -> string -> Toplevel.state -> unit*)
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    13
  val add_generator: string * (Proof.context -> term -> int -> term list option) -> theory -> theory
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    14
end;
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    15
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    16
structure Quickcheck : QUICKCHECK =
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    17
struct
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    18
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    19
structure Generator = TheoryDataFun(
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    20
  type T = (string * (Proof.context -> term -> int -> term list option)) list;
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    21
  val empty = [];
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    22
  val copy = I;
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    23
  val extend = I;
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    24
  fun merge pp = AList.merge (op =) (K true);
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    25
)
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    26
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    27
val add_generator = Generator.map o AList.update (op =);
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    28
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    29
(*fun value_select name ctxt =
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    30
  case AList.lookup (op =) (Evaluator.get (ProofContext.theory_of ctxt)) name
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    31
   of NONE => error ("No such evaluator: " ^ name)
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    32
    | SOME f => f ctxt;
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    33
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    34
fun value ctxt t = let val evaluators = Evaluator.get (ProofContext.theory_of ctxt)
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    35
  in if null evaluators then error "No evaluators"
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    36
  else let val (evaluators, (_, evaluator)) = split_last evaluators
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    37
    in case get_first (fn (_, f) => try (f ctxt) t) evaluators
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    38
     of SOME t' => t'
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    39
      | NONE => evaluator ctxt t
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    40
  end end;
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    41
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    42
fun value_cmd some_name modes raw_t state =
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    43
  let
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    44
    val ctxt = Toplevel.context_of state;
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    45
    val t = Syntax.read_term ctxt raw_t;
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    46
    val t' = case some_name
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    47
     of NONE => value ctxt t
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    48
      | SOME name => value_select name ctxt t;
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    49
    val ty' = Term.type_of t';
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    50
    val ctxt' = Variable.auto_fixes t ctxt;
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    51
    val p = PrintMode.with_modes modes (fn () =>
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    52
      Pretty.block [Pretty.quote (Syntax.pretty_term ctxt' t'), Pretty.fbrk,
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    53
        Pretty.str "::", Pretty.brk 1, Pretty.quote (Syntax.pretty_typ ctxt' ty')]) ();
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    54
  in Pretty.writeln p end;*)
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    55
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    56
(*local structure P = OuterParse and K = OuterKeyword in
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    57
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    58
val opt_modes = Scan.optional (P.$$$ "(" |-- P.!!! (Scan.repeat1 P.xname --| P.$$$ ")")) [];
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    59
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    60
val _ = OuterSyntax.improper_command "value" "evaluate and print term" K.diag
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    61
  (Scan.option (P.$$$ "[" |-- P.xname --| P.$$$ "]") -- opt_modes -- P.term
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    62
    >> (fn ((some_name, modes), t) => Toplevel.no_timing o Toplevel.keep
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    63
        (value_cmd some_name modes t)));
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    64
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    65
end; (*local*)*)
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    66
4e7f7d52f855 added quickcheck.ML
haftmann
parents:
diff changeset
    67
end;