src/Pure/Thy/thy_element.scala
author wenzelm
Fri, 01 Apr 2022 17:06:10 +0200
changeset 75393 87ebf5a50283
parent 69919 7837309d633a
child 75405 b13ab7d11b90
permissions -rw-r--r--
clarified formatting, for the sake of scala3;
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
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 69919
diff changeset
    13
object Thy_Element {
68845
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    14
  /* datatype element */
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    15
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    16
  type Proof[A] = (List[Element[A]], A)
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 69919
diff changeset
    17
  sealed case class Element[A](head: A, proof: Option[Proof[A]]) {
68845
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    18
    def iterator: Iterator[A] =
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    19
      Iterator(head) ++
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    20
        (for {
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    21
          (prf, qed) <- proof.iterator
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    22
          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
    23
        } yield b)
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    24
68846
da0cb00a4d6a tuned signature;
wenzelm
parents: 68845
diff changeset
    25
    def outline_iterator: Iterator[A] =
da0cb00a4d6a tuned signature;
wenzelm
parents: 68845
diff changeset
    26
      proof match {
da0cb00a4d6a tuned signature;
wenzelm
parents: 68845
diff changeset
    27
        case None => Iterator(head)
da0cb00a4d6a tuned signature;
wenzelm
parents: 68845
diff changeset
    28
        case Some((_, qed)) => Iterator(head, qed)
da0cb00a4d6a tuned signature;
wenzelm
parents: 68845
diff changeset
    29
      }
da0cb00a4d6a tuned signature;
wenzelm
parents: 68845
diff changeset
    30
69919
7837309d633a tuned signature;
wenzelm
parents: 68846
diff changeset
    31
    def proof_start: Option[A] =
7837309d633a tuned signature;
wenzelm
parents: 68846
diff changeset
    32
      proof match {
7837309d633a tuned signature;
wenzelm
parents: 68846
diff changeset
    33
        case None => None
7837309d633a tuned signature;
wenzelm
parents: 68846
diff changeset
    34
        case Some((Nil, qed)) => Some(qed)
7837309d633a tuned signature;
wenzelm
parents: 68846
diff changeset
    35
        case Some((start :: _, _)) => Some(start.head)
7837309d633a tuned signature;
wenzelm
parents: 68846
diff changeset
    36
      }
7837309d633a tuned signature;
wenzelm
parents: 68846
diff changeset
    37
68845
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    38
    def last: A =
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    39
      proof match {
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    40
        case None => head
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    41
        case Some((_, qed)) => qed
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    42
      }
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    43
  }
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
  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
    46
  def atom[A](a: A): Element[A] = Element(a, None)
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    47
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    48
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    49
  /* parse elements */
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    50
68846
da0cb00a4d6a tuned signature;
wenzelm
parents: 68845
diff changeset
    51
  type Element_Command = Element[Command]
da0cb00a4d6a tuned signature;
wenzelm
parents: 68845
diff changeset
    52
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 69919
diff changeset
    53
  def parse_elements(keywords: Keyword.Keywords, commands: List[Command]): List[Element_Command] = {
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 69919
diff changeset
    54
    case class Reader(in: List[Command]) extends input.Reader[Command] {
68845
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    55
      def first: Command = in.head
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    56
      def rest: Reader = Reader(in.tail)
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    57
      def pos: input.Position = input.NoPosition
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    58
      def atEnd: Boolean = in.isEmpty
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    59
    }
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    60
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 69919
diff changeset
    61
    object Parser extends Parsers {
68845
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    62
      type Elem = Command
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
      def command(pred: Command => Boolean): Parser[Command] =
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    65
        new Parser[Elem] {
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 69919
diff changeset
    66
          def apply(in: Input) = {
68845
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    67
            if (in.atEnd) Failure("end of input", in)
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    68
            else {
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    69
              val command = in.first
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    70
              if (pred(command)) Success(command, in.rest)
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    71
              else Failure("bad input", in)
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
          }
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    74
        }
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    75
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    76
      def category(pred: String => Boolean, other: Boolean): Parser[Command] =
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    77
        command(_.span.is_kind(keywords, pred, other))
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    78
68846
da0cb00a4d6a tuned signature;
wenzelm
parents: 68845
diff changeset
    79
      def theory_element: Parser[Element_Command] =
68845
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    80
        category(Keyword.theory_goal, false) ~ proof ^^ { case a ~ b => element(a, b) }
68846
da0cb00a4d6a tuned signature;
wenzelm
parents: 68845
diff changeset
    81
      def proof_element: Parser[Element_Command] =
68845
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    82
        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
    83
        category(Keyword.proof_body, true) ^^ { case a => atom(a) }
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    84
      def proof: Parser[Proof[Command]] =
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    85
        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
    86
68846
da0cb00a4d6a tuned signature;
wenzelm
parents: 68845
diff changeset
    87
      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
    88
68846
da0cb00a4d6a tuned signature;
wenzelm
parents: 68845
diff changeset
    89
      def apply: List[Element_Command] =
68845
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    90
        rep(theory_element | default_element)(Reader(commands)) match {
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    91
          case Success(result, rest) if rest.atEnd => result
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    92
          case bad => error(bad.toString)
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    93
        }
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    94
    }
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    95
    Parser.apply
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    96
  }
3b2daa7bf9f4 support Thy_Element in Scala, following ML version;
wenzelm
parents:
diff changeset
    97
}