src/Pure/Isar/proof_history.ML
author wenzelm
Wed, 13 Jul 2005 16:07:36 +0200
changeset 16814 b829a6c9a87a
parent 16490 e10b0d5fa33a
child 17073 dc1040419645
permissions -rw-r--r--
export previous;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5827
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/Isar/proof_history.ML
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
     3
    Author:     Markus Wenzel, TU Muenchen
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
     4
16490
wenzelm
parents: 15531
diff changeset
     5
Histories of proof states, with undo / redo and backtracking.
5827
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
     6
*)
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
     7
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
     8
signature PROOF_HISTORY =
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
     9
sig
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    10
  type T
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    11
  exception FAIL of string
6902
5f126c495771 removed nesting (unused);
wenzelm
parents: 6684
diff changeset
    12
  val position: T -> int
6684
4f859545bd92 adapted to History changes;
wenzelm
parents: 6374
diff changeset
    13
  val init: int option -> Proof.state -> T
4f859545bd92 adapted to History changes;
wenzelm
parents: 6374
diff changeset
    14
  val is_initial: T -> bool
5827
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    15
  val current: T -> Proof.state
16814
b829a6c9a87a export previous;
wenzelm
parents: 16490
diff changeset
    16
  val previous: T -> Proof.state option
7731
51d59734743d clear: int argument;
wenzelm
parents: 7366
diff changeset
    17
  val clear: int -> T -> T
5827
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    18
  val undo: T -> T
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    19
  val redo: T -> T
7366
22a64baa7013 back: recur flag;
wenzelm
parents: 6902
diff changeset
    20
  val back: bool -> T -> T
5827
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    21
  val applys: (Proof.state -> Proof.state Seq.seq) -> T -> T
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    22
  val apply: (Proof.state -> Proof.state) -> T -> T
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    23
end;
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    24
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    25
structure ProofHistory: PROOF_HISTORY =
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    26
struct
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    27
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    28
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    29
(* datatype proof history *)
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    30
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    31
type node =
16490
wenzelm
parents: 15531
diff changeset
    32
  Proof.state *                 (*first result*)
wenzelm
parents: 15531
diff changeset
    33
  Proof.state Seq.seq;          (*alternative results*)
5827
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    34
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    35
type proof = node * node list;
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    36
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    37
datatype T = ProofHistory of proof History.T;
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    38
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    39
exception FAIL of string;
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    40
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    41
fun app f (ProofHistory x) = ProofHistory (f x);
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    42
fun hist_app f = app (History.apply f);
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    43
6902
5f126c495771 removed nesting (unused);
wenzelm
parents: 6684
diff changeset
    44
fun position (ProofHistory prf) = length (snd (History.current prf));
5f126c495771 removed nesting (unused);
wenzelm
parents: 6684
diff changeset
    45
5827
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    46
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    47
(* generic history operations *)
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    48
6902
5f126c495771 removed nesting (unused);
wenzelm
parents: 6684
diff changeset
    49
fun init lim st = ProofHistory (History.init lim ((st, Seq.empty), []));
6684
4f859545bd92 adapted to History changes;
wenzelm
parents: 6374
diff changeset
    50
fun is_initial (ProofHistory prf) = History.is_initial prf;
6902
5f126c495771 removed nesting (unused);
wenzelm
parents: 6684
diff changeset
    51
fun current (ProofHistory prf) = fst (fst (History.current prf));
16814
b829a6c9a87a export previous;
wenzelm
parents: 16490
diff changeset
    52
fun previous (ProofHistory prf) = Option.map (fst o fst) (History.previous prf);
7731
51d59734743d clear: int argument;
wenzelm
parents: 7366
diff changeset
    53
val clear = app o History.clear;
5827
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    54
val undo = app History.undo;
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    55
val redo = app History.redo;
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    56
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    57
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    58
(* backtrack *)
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    59
16490
wenzelm
parents: 15531
diff changeset
    60
fun backtrack recur ((_, stq), nodes) =
5827
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    61
  (case Seq.pull stq of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 14981
diff changeset
    62
    NONE =>
7366
22a64baa7013 back: recur flag;
wenzelm
parents: 6902
diff changeset
    63
      if recur andalso not (null nodes) then
16490
wenzelm
parents: 15531
diff changeset
    64
        (writeln "back: trying previous proof state ..."; backtrack recur (hd nodes, tl nodes))
7366
22a64baa7013 back: recur flag;
wenzelm
parents: 6902
diff changeset
    65
      else raise FAIL "back: no alternatives"
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 14981
diff changeset
    66
  | SOME result => (result, nodes));
5827
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    67
16490
wenzelm
parents: 15531
diff changeset
    68
val back = hist_app o backtrack;
5827
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    69
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    70
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    71
(* apply transformer *)
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    72
6902
5f126c495771 removed nesting (unused);
wenzelm
parents: 6684
diff changeset
    73
fun applys f = hist_app (fn (node as (st, _), nodes) =>
5827
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    74
  (case Seq.pull (f st) of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 14981
diff changeset
    75
    NONE => raise FAIL "empty result sequence -- proof command failed"
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 14981
diff changeset
    76
  | SOME results => (results, node :: nodes)));
5827
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    77
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    78
fun apply f = applys (Seq.single o f);
6902
5f126c495771 removed nesting (unused);
wenzelm
parents: 6684
diff changeset
    79
5827
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    80
77071ac7c7b5 Histories of proof states, with undo / redo and prev / back.
wenzelm
parents:
diff changeset
    81
end;