src/Pure/Tools/simplifier_trace.scala
author wenzelm
Thu, 03 Apr 2014 13:46:18 +0200
changeset 56385 76acce58aeab
parent 56372 fadb0fef09d7
child 56387 d92eb5c3960d
permissions -rw-r--r--
more general prover operations;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
54730
de2d99b459b3 skeleton for Simplifier trace by Lars Hupel;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/Tools/simplifier_trace.scala
55316
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
     2
    Author:     Lars Hupel
54730
de2d99b459b3 skeleton for Simplifier trace by Lars Hupel;
wenzelm
parents:
diff changeset
     3
de2d99b459b3 skeleton for Simplifier trace by Lars Hupel;
wenzelm
parents:
diff changeset
     4
Interactive Simplifier trace.
de2d99b459b3 skeleton for Simplifier trace by Lars Hupel;
wenzelm
parents:
diff changeset
     5
*/
de2d99b459b3 skeleton for Simplifier trace by Lars Hupel;
wenzelm
parents:
diff changeset
     6
de2d99b459b3 skeleton for Simplifier trace by Lars Hupel;
wenzelm
parents:
diff changeset
     7
package isabelle
de2d99b459b3 skeleton for Simplifier trace by Lars Hupel;
wenzelm
parents:
diff changeset
     8
55553
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
     9
55316
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    10
import scala.actors.Actor._
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    11
import scala.annotation.tailrec
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    12
import scala.collection.immutable.SortedMap
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    13
54730
de2d99b459b3 skeleton for Simplifier trace by Lars Hupel;
wenzelm
parents:
diff changeset
    14
de2d99b459b3 skeleton for Simplifier trace by Lars Hupel;
wenzelm
parents:
diff changeset
    15
object Simplifier_Trace
de2d99b459b3 skeleton for Simplifier trace by Lars Hupel;
wenzelm
parents:
diff changeset
    16
{
55553
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    17
  /* trace items from the prover */
55316
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    18
55553
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    19
  val TEXT = "text"
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    20
  val Text = new Properties.String(TEXT)
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    21
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    22
  val PARENT = "parent"
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    23
  val Parent = new Properties.Long(PARENT)
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    24
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    25
  val SUCCESS = "success"
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    26
  val Success = new Properties.Boolean(SUCCESS)
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    27
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    28
  val MEMORY = "memory"
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    29
  val Memory = new Properties.Boolean(MEMORY)
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    30
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    31
  object Item
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    32
  {
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    33
    case class Data(
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    34
      serial: Long, markup: String, text: String,
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    35
      parent: Long, props: Properties.T, content: XML.Body)
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    36
    {
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    37
      def memory: Boolean = Memory.unapply(props) getOrElse true
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    38
    }
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    39
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    40
    def unapply(tree: XML.Tree): Option[(String, Data)] =
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    41
      tree match {
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    42
        case XML.Elem(Markup(Markup.RESULT, Markup.Serial(serial)),
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    43
          List(XML.Elem(Markup(markup, props), content)))
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    44
        if markup.startsWith("simp_trace_") =>  // FIXME proper comparison of string constants
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    45
          (props, props) match {
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    46
            case (Text(text), Parent(parent)) =>
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    47
              Some((markup, Data(serial, markup, text, parent, props, content)))
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    48
            case _ => None
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    49
          }
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    50
        case _ => None
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    51
      }
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    52
  }
55316
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    53
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    54
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    55
  /* replies to the prover */
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    56
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    57
  case class Answer private[Simplifier_Trace](val name: String, val string: String)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    58
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    59
  object Answer
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    60
  {
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    61
    object step
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    62
    {
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    63
      val skip = Answer("skip", "Skip")
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    64
      val continue = Answer("continue", "Continue")
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    65
      val continue_trace = Answer("continue_trace", "Continue (with full trace)")
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    66
      val continue_passive = Answer("continue_passive", "Continue (without asking)")
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    67
      val continue_disable = Answer("continue_disable", "Continue (without any trace)")
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    68
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    69
      val default = skip
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    70
      val all = List(continue, continue_trace, continue_passive, continue_disable, skip)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    71
    }
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    72
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    73
    object hint_fail
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    74
    {
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    75
      val exit = Answer("exit", "Exit")
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    76
      val redo = Answer("redo", "Redo")
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    77
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    78
      val default = exit
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    79
      val all = List(redo, exit)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    80
    }
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    81
  }
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    82
55555
9c16317c91d1 prefer concrete list append;
wenzelm
parents: 55553
diff changeset
    83
  val all_answers: List[Answer] = Answer.step.all ::: Answer.hint_fail.all
55316
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    84
55553
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    85
  object Active
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    86
  {
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    87
    def unapply(tree: XML.Tree): Option[(Long, Answer)] =
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    88
      tree match {
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    89
        case XML.Elem(Markup(Markup.SIMP_TRACE, props), _) =>
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    90
          (props, props) match {
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    91
            case (Markup.Serial(serial), Markup.Name(name)) =>
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    92
              all_answers.find(_.name == name).map((serial, _))
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    93
            case _ => None
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    94
          }
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    95
        case _ => None
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    96
      }
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    97
  }
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
    98
55316
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
    99
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   100
  /* GUI interaction */
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   101
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   102
  case object Event
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   103
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   104
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   105
  /* manager actor */
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   106
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   107
  private case class Handle_Results(session: Session, id: Document_ID.Command, results: Command.Results)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   108
  private case class Generate_Trace(results: Command.Results)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   109
  private case class Cancel(serial: Long)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   110
  private object Clear_Memory
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   111
  private object Stop
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   112
  case class Reply(session: Session, serial: Long, answer: Answer)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   113
55553
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
   114
  case class Question(data: Item.Data, answers: List[Answer], default_answer: Answer)
55316
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   115
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   116
  case class Context(
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   117
    last_serial: Long = 0L,
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   118
    questions: SortedMap[Long, Question] = SortedMap.empty
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   119
  )
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   120
  {
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   121
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   122
    def +(q: Question): Context =
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   123
      copy(questions = questions + ((q.data.serial, q)))
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   124
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   125
    def -(s: Long): Context =
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   126
      copy(questions = questions - s)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   127
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   128
    def with_serial(s: Long): Context =
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   129
      copy(last_serial = Math.max(last_serial, s))
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   130
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   131
  }
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   132
55553
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
   133
  case class Trace(entries: List[Item.Data])
55316
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   134
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   135
  case class Index(text: String, content: XML.Body)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   136
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   137
  object Index
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   138
  {
55553
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
   139
    def of_data(data: Item.Data): Index =
55316
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   140
      Index(data.text, data.content)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   141
  }
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   142
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   143
  def handle_results(session: Session, id: Document_ID.Command, results: Command.Results): Context =
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   144
    (manager !? Handle_Results(session, id, results)).asInstanceOf[Context]
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   145
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   146
  def generate_trace(results: Command.Results): Trace =
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   147
    (manager !? Generate_Trace(results)).asInstanceOf[Trace]
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   148
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   149
  def clear_memory() =
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   150
    manager ! Clear_Memory
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   151
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   152
  def send_reply(session: Session, serial: Long, answer: Answer) =
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   153
    manager ! Reply(session, serial, answer)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   154
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   155
  private val manager = actor {
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   156
    var contexts = Map.empty[Document_ID.Command, Context]
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   157
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   158
    var memory_children = Map.empty[Long, Set[Long]]
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   159
    var memory = Map.empty[Index, Answer]
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   160
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   161
    def find_question(serial: Long): Option[(Document_ID.Command, Question)] =
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   162
      contexts collectFirst {
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   163
        case (id, context) if context.questions contains serial =>
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   164
          (id, context.questions(serial))
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   165
      }
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   166
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   167
    def do_cancel(serial: Long, id: Document_ID.Command)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   168
    {
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   169
      // To save memory, we could try to remove empty contexts at this point.
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   170
      // However, if a new serial gets attached to the same command_id after we deleted
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   171
      // its context, its last_serial counter will start at 0 again, and we'll think the
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   172
      // old serials are actually new
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   173
      contexts += (id -> (contexts(id) - serial))
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   174
    }
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   175
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   176
    def do_reply(session: Session, serial: Long, answer: Answer)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   177
    {
55553
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
   178
      session.protocol_command("Simplifier_Trace.reply", Properties.Value.Long(serial), answer.name)
55316
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   179
    }
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   180
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   181
    loop {
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   182
      react {
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   183
        case Handle_Results(session, id, results) =>
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   184
          var new_context = contexts.getOrElse(id, Context())
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   185
          var new_serial = new_context.last_serial
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   186
56372
fadb0fef09d7 more explicit iterator terminology, in accordance to Scala 2.8 library;
wenzelm
parents: 55771
diff changeset
   187
          for ((serial, result) <- results.iterator if serial > new_context.last_serial)
55316
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   188
          {
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   189
            result match {
55553
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
   190
              case Item(markup, data) =>
55316
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   191
                memory_children += (data.parent -> (memory_children.getOrElse(data.parent, Set.empty) + serial))
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   192
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   193
                markup match {
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   194
55553
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
   195
                  case Markup.SIMP_TRACE_STEP =>
55316
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   196
                    val index = Index.of_data(data)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   197
                    memory.get(index) match {
55390
36550a4eac5e "no_memory" option for the simplifier trace to bypass memoization
Lars Hupel <lars.hupel@mytum.de>
parents: 55316
diff changeset
   198
                      case Some(answer) if data.memory =>
36550a4eac5e "no_memory" option for the simplifier trace to bypass memoization
Lars Hupel <lars.hupel@mytum.de>
parents: 55316
diff changeset
   199
                        do_reply(session, serial, answer)
36550a4eac5e "no_memory" option for the simplifier trace to bypass memoization
Lars Hupel <lars.hupel@mytum.de>
parents: 55316
diff changeset
   200
                      case _ =>
55316
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   201
                        new_context += Question(data, Answer.step.all, Answer.step.default)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   202
                    }
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   203
55553
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
   204
                  case Markup.SIMP_TRACE_HINT =>
55316
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   205
                    data.props match {
55553
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
   206
                      case Success(false) =>
55316
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   207
                        results.get(data.parent) match {
55553
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
   208
                          case Some(Item(Markup.SIMP_TRACE_STEP, _)) =>
55316
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   209
                            new_context += Question(data, Answer.hint_fail.all, Answer.hint_fail.default)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   210
                          case _ =>
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   211
                            // unknown, better send a default reply
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   212
                            do_reply(session, data.serial, Answer.hint_fail.default)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   213
                        }
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   214
                      case _ =>
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   215
                    }
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   216
55553
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
   217
                  case Markup.SIMP_TRACE_IGNORE =>
55316
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   218
                    // At this point, we know that the parent of this 'IGNORE' entry is a 'STEP'
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   219
                    // entry, and that that 'STEP' entry is about to be replayed. Hence, we need
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   220
                    // to selectively purge the replies which have been memorized, going down from
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   221
                    // the parent to all leaves.
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   222
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   223
                    @tailrec
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   224
                    def purge(queue: Vector[Long]): Unit =
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   225
                      queue match {
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   226
                        case s +: rest =>
55553
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
   227
                          for (Item(Markup.SIMP_TRACE_STEP, data) <- results.get(s))
55316
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   228
                            memory -= Index.of_data(data)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   229
                          val children = memory_children.getOrElse(s, Set.empty)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   230
                          memory_children -= s
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   231
                          purge(rest ++ children.toVector)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   232
                        case _ =>
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   233
                      }
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   234
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   235
                    purge(Vector(data.parent))
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   236
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   237
                  case _ =>
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   238
                }
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   239
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   240
              case _ =>
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   241
            }
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   242
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   243
            new_serial = serial
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   244
          }
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   245
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   246
          new_context = new_context.with_serial(new_serial)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   247
          contexts += (id -> new_context)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   248
          reply(new_context)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   249
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   250
        case Generate_Trace(results) =>
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   251
          // Since there are potentially lots of trace messages, we do not cache them here again.
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   252
          // Instead, everytime the trace is being requested, we re-assemble it based on the
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   253
          // current results.
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   254
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   255
          val items =
56372
fadb0fef09d7 more explicit iterator terminology, in accordance to Scala 2.8 library;
wenzelm
parents: 55771
diff changeset
   256
            (for { (_, Item(_, data)) <- results.iterator }
fadb0fef09d7 more explicit iterator terminology, in accordance to Scala 2.8 library;
wenzelm
parents: 55771
diff changeset
   257
              yield data).toList
55316
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   258
56372
fadb0fef09d7 more explicit iterator terminology, in accordance to Scala 2.8 library;
wenzelm
parents: 55771
diff changeset
   259
          reply(Trace(items))
55316
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   260
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   261
        case Cancel(serial) =>
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   262
          find_question(serial) match {
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   263
            case Some((id, _)) =>
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   264
              do_cancel(serial, id)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   265
            case None =>
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   266
          }
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   267
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   268
        case Clear_Memory =>
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   269
          memory_children = Map.empty
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   270
          memory = Map.empty
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   271
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   272
        case Stop =>
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   273
          contexts = Map.empty
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   274
          exit("Simplifier_Trace: manager actor stopped")
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   275
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   276
        case Reply(session, serial, answer) =>
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   277
          find_question(serial) match {
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   278
            case Some((id, Question(data, _, _))) =>
55553
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
   279
              if (data.markup == Markup.SIMP_TRACE_STEP && data.memory)
55316
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   280
              {
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   281
                val index = Index.of_data(data)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   282
                memory += (index -> answer)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   283
              }
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   284
              do_cancel(serial, id)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   285
            case None =>
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   286
              System.err.println("send_reply: unknown serial " + serial)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   287
          }
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   288
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   289
          do_reply(session, serial, answer)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   290
          session.trace_events.event(Event)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   291
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   292
        case bad =>
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   293
          System.err.println("context_manager: bad message " + bad)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   294
      }
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   295
    }
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   296
  }
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   297
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   298
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   299
  /* protocol handler */
54730
de2d99b459b3 skeleton for Simplifier trace by Lars Hupel;
wenzelm
parents:
diff changeset
   300
de2d99b459b3 skeleton for Simplifier trace by Lars Hupel;
wenzelm
parents:
diff changeset
   301
  class Handler extends Session.Protocol_Handler
de2d99b459b3 skeleton for Simplifier trace by Lars Hupel;
wenzelm
parents:
diff changeset
   302
  {
56385
76acce58aeab more general prover operations;
wenzelm
parents: 56372
diff changeset
   303
    private def cancel(prover: Session.Prover, msg: Prover.Protocol_Output): Boolean =
55316
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   304
      msg.properties match {
55553
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
   305
        case Markup.Simp_Trace_Cancel(serial) =>
55316
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   306
          manager ! Cancel(serial)
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   307
          true
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   308
        case _ =>
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   309
          false
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   310
      }
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   311
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   312
    override def stop(prover: Session.Prover) =
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   313
    {
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   314
      manager ! Clear_Memory
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   315
      manager ! Stop
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   316
    }
885500f4aa6a interactive simplifier trace: new panel in Isabelle/jEdit to inspect and modify simplification state
Lars Hupel <lars.hupel@mytum.de>
parents: 54730
diff changeset
   317
55553
99409ccbe04a more standard names for protocol and markup elements;
wenzelm
parents: 55390
diff changeset
   318
    val functions = Map(Markup.SIMP_TRACE_CANCEL -> cancel _)
54730
de2d99b459b3 skeleton for Simplifier trace by Lars Hupel;
wenzelm
parents:
diff changeset
   319
  }
de2d99b459b3 skeleton for Simplifier trace by Lars Hupel;
wenzelm
parents:
diff changeset
   320
}