src/Tools/value.ML
author wenzelm
Thu, 27 May 2010 18:10:37 +0200
changeset 37146 f652333bbf8e
parent 36960 01594f816e3a
child 37744 3daaf23b9ab4
permissions -rw-r--r--
renamed structure PrintMode to Print_Mode, keeping the old name as legacy alias for some time;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
28227
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
     1
(*  Title:      Pure/Tools/value.ML
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
     2
    Author:     Florian Haftmann, TU Muenchen
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
     3
28952
15a4b2cf8c34 made repository layout more coherent with logical distribution structure; stripped some $Id$s
haftmann
parents: 28227
diff changeset
     4
Generic value command for arbitrary evaluators.
28227
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
     5
*)
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
     6
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
     7
signature VALUE =
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
     8
sig
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
     9
  val value: Proof.context -> term -> term
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    10
  val value_select: string -> Proof.context -> term -> term
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    11
  val value_cmd: string option -> string list -> string -> Toplevel.state -> unit
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    12
  val add_evaluator: string * (Proof.context -> term -> term) -> theory -> theory
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    13
end;
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    14
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    15
structure Value : VALUE =
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    16
struct
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    17
33522
737589bb9bb8 adapted Theory_Data;
wenzelm
parents: 31218
diff changeset
    18
structure Evaluator = Theory_Data
737589bb9bb8 adapted Theory_Data;
wenzelm
parents: 31218
diff changeset
    19
(
28227
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    20
  type T = (string * (Proof.context -> term -> term)) list;
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    21
  val empty = [];
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    22
  val extend = I;
33522
737589bb9bb8 adapted Theory_Data;
wenzelm
parents: 31218
diff changeset
    23
  fun merge data : T = AList.merge (op =) (K true) data;
28227
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    24
)
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    25
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    26
val add_evaluator = Evaluator.map o AList.update (op =);
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    27
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    28
fun value_select name ctxt =
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    29
  case AList.lookup (op =) (Evaluator.get (ProofContext.theory_of ctxt)) name
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    30
   of NONE => error ("No such evaluator: " ^ name)
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    31
    | SOME f => f ctxt;
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    32
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    33
fun value ctxt t = let val evaluators = Evaluator.get (ProofContext.theory_of ctxt)
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    34
  in if null evaluators then error "No evaluators"
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    35
  else let val (evaluators, (_, evaluator)) = split_last evaluators
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    36
    in case get_first (fn (_, f) => try (f ctxt) t) evaluators
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    37
     of SOME t' => t'
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    38
      | NONE => evaluator ctxt t
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    39
  end end;
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    40
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    41
fun value_cmd some_name modes raw_t state =
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    42
  let
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    43
    val ctxt = Toplevel.context_of state;
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    44
    val t = Syntax.read_term ctxt raw_t;
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    45
    val t' = case some_name
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    46
     of NONE => value ctxt t
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    47
      | SOME name => value_select name ctxt t;
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    48
    val ty' = Term.type_of t';
31218
fa54c1e614df fixed typo
haftmann
parents: 29288
diff changeset
    49
    val ctxt' = Variable.auto_fixes t' ctxt;
37146
f652333bbf8e renamed structure PrintMode to Print_Mode, keeping the old name as legacy alias for some time;
wenzelm
parents: 36960
diff changeset
    50
    val p = Print_Mode.with_modes modes (fn () =>
28227
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    51
      Pretty.block [Pretty.quote (Syntax.pretty_term ctxt' t'), Pretty.fbrk,
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    52
        Pretty.str "::", Pretty.brk 1, Pretty.quote (Syntax.pretty_typ ctxt' ty')]) ();
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    53
  in Pretty.writeln p end;
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    54
36960
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 33522
diff changeset
    55
val opt_modes =
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 33522
diff changeset
    56
  Scan.optional (Parse.$$$ "(" |-- Parse.!!! (Scan.repeat1 Parse.xname --| Parse.$$$ ")")) [];
28227
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    57
36960
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 33522
diff changeset
    58
val _ =
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 33522
diff changeset
    59
  Outer_Syntax.improper_command "value" "evaluate and print term" Keyword.diag
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 33522
diff changeset
    60
    (Scan.option (Parse.$$$ "[" |-- Parse.xname --| Parse.$$$ "]") -- opt_modes -- Parse.term
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 33522
diff changeset
    61
      >> (fn ((some_name, modes), t) => Toplevel.no_timing o Toplevel.keep
01594f816e3a prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
wenzelm
parents: 33522
diff changeset
    62
          (value_cmd some_name modes t)));
28227
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    63
77221ee0f7b9 generic value command
haftmann
parents:
diff changeset
    64
end;