src/Pure/Thy/thy_element.scala
author wenzelm
Tue, 17 Nov 2020 22:57:56 +0100
changeset 72638 2a7fc87495e0
parent 69919 7837309d633a
child 75393 87ebf5a50283
permissions -rw-r--r--
refer to command_timings/last_timing via resources;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
68845
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/Thy/thy_element.ML
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
     3
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
     4
Theory elements: statements with optional proof.
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
     5
*/
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
     6
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
     7
package isabelle
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
     8
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
     9
import scala.util.parsing.combinator.Parsers
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    10
import scala.util.parsing.input
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    11
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    12
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    13
object Thy_Element
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    14
{
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    15
  /* datatype element */
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    16
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    17
  type Proof[A] = (List[Element[A]], A)
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    18
  sealed case class Element[A](head: A, proof: Option[Proof[A]])
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    19
  {
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    20
    def iterator: Iterator[A] =
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    21
      Iterator(head) ++
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    22
        (for {
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    23
          (prf, qed) <- proof.iterator
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    24
          b <- (for (elem <- prf.iterator; a <- elem.iterator) yield a) ++ Iterator(qed)
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    25
        } yield b)
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    26
68846
da0cb00a4d6a tuned signature;
wenzelm
parents: 68845
diff changeset
    27
    def outline_iterator: Iterator[A] =
da0cb00a4d6a tuned signature;
wenzelm
parents: 68845
diff changeset
    28
      proof match {
da0cb00a4d6a tuned signature;
wenzelm
parents: 68845
diff changeset
    29
        case None => Iterator(head)
da0cb00a4d6a tuned signature;
wenzelm
parents: 68845
diff changeset
    30
        case Some((_, qed)) => Iterator(head, qed)
da0cb00a4d6a tuned signature;
wenzelm
parents: 68845
diff changeset
    31
      }
da0cb00a4d6a tuned signature;
wenzelm
parents: 68845
diff changeset
    32
69919
7837309d633a tuned signature;
wenzelm
parents: 68846
diff changeset
    33
    def proof_start: Option[A] =
7837309d633a tuned signature;
wenzelm
parents: 68846
diff changeset
    34
      proof match {
7837309d633a tuned signature;
wenzelm
parents: 68846
diff changeset
    35
        case None => None
7837309d633a tuned signature;
wenzelm
parents: 68846
diff changeset
    36
        case Some((Nil, qed)) => Some(qed)
7837309d633a tuned signature;
wenzelm
parents: 68846
diff changeset
    37
        case Some((start :: _, _)) => Some(start.head)
7837309d633a tuned signature;
wenzelm
parents: 68846
diff changeset
    38
      }
7837309d633a tuned signature;
wenzelm
parents: 68846
diff changeset
    39
68845
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    40
    def last: A =
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    41
      proof match {
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    42
        case None => head
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    43
        case Some((_, qed)) => qed
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    44
      }
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    45
  }
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    46
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    47
  def element[A](a: A, b: Proof[A]): Element[A] = Element(a, Some(b))
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    48
  def atom[A](a: A): Element[A] = Element(a, None)
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    49
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    50
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    51
  /* parse elements */
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    52
68846
da0cb00a4d6a tuned signature;
wenzelm
parents: 68845
diff changeset
    53
  type Element_Command = Element[Command]
da0cb00a4d6a tuned signature;
wenzelm
parents: 68845
diff changeset
    54
da0cb00a4d6a tuned signature;
wenzelm
parents: 68845
diff changeset
    55
  def parse_elements(keywords: Keyword.Keywords, commands: List[Command]): List[Element_Command] =
68845
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    56
  {
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    57
    case class Reader(in: List[Command]) extends input.Reader[Command]
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    58
    {
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    59
      def first: Command = in.head
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    60
      def rest: Reader = Reader(in.tail)
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    61
      def pos: input.Position = input.NoPosition
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    62
      def atEnd: Boolean = in.isEmpty
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    63
    }
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    64
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    65
    object Parser extends Parsers
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    66
    {
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    67
      type Elem = Command
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    68
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    69
      def command(pred: Command => Boolean): Parser[Command] =
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    70
        new Parser[Elem] {
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    71
          def apply(in: Input) =
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    72
          {
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    73
            if (in.atEnd) Failure("end of input", in)
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    74
            else {
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    75
              val command = in.first
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    76
              if (pred(command)) Success(command, in.rest)
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    77
              else Failure("bad input", in)
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    78
            }
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    79
          }
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    80
        }
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    81
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    82
      def category(pred: String => Boolean, other: Boolean): Parser[Command] =
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    83
        command(_.span.is_kind(keywords, pred, other))
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    84
68846
da0cb00a4d6a tuned signature;
wenzelm
parents: 68845
diff changeset
    85
      def theory_element: Parser[Element_Command] =
68845
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    86
        category(Keyword.theory_goal, false) ~ proof ^^ { case a ~ b => element(a, b) }
68846
da0cb00a4d6a tuned signature;
wenzelm
parents: 68845
diff changeset
    87
      def proof_element: Parser[Element_Command] =
68845
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    88
        category(Keyword.proof_goal, false) ~ proof ^^ { case a ~ b => element(a, b) } |
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    89
        category(Keyword.proof_body, true) ^^ { case a => atom(a) }
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    90
      def proof: Parser[Proof[Command]] =
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    91
        rep(proof_element) ~ category(Keyword.qed, false) ^^ { case a ~ b => (a, b) }
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    92
68846
da0cb00a4d6a tuned signature;
wenzelm
parents: 68845
diff changeset
    93
      val default_element: Parser[Element_Command] = command(_ => true) ^^ { case a => atom(a) }
68845
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    94
68846
da0cb00a4d6a tuned signature;
wenzelm
parents: 68845
diff changeset
    95
      def apply: List[Element_Command] =
68845
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    96
        rep(theory_element | default_element)(Reader(commands)) match {
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    97
          case Success(result, rest) if rest.atEnd => result
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    98
          case bad => error(bad.toString)
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    99
        }
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
   100
    }
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
   101
    Parser.apply
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
   102
  }
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
   103
}