isac-java/src/java/isac/gui/mawen/syntax/isabelle/term.scala
author Walther Neuper <walther.neuper@jku.at>
Fri, 26 Mar 2021 10:45:05 +0100
changeset 5239 b4e3883d7b66
parent 5229 6bf0e95981e3
permissions -rw-r--r--
reset mathematics-engine to Isabelle2015

note: for this version libisabelle was available,
which connects front-end (Java) and back-end (Isabelle/ML)
wneuper@5051
     1
/*  THIS IS A COMPLETE COPY OF Isabelle2016-1 ...
wneuper@5050
     2
    Title:      Pure/term.scala
wneuper@5050
     3
    Author:     Makarius
wneuper@5050
     4
    ... WITH ADDITIONS AFTER "/---..---\"
wneuper@5050
     5
wneuper@5050
     6
Lambda terms, types, sorts.
wneuper@5050
     7
wneuper@5050
     8
Note: Isabelle/ML is the primary environment for logical operations.
wneuper@5050
     9
*/
wneuper@5050
    10
wneuper@5050
    11
package isac.gui.mawen.syntax.isabelle
wneuper@5050
    12
walther@5239
    13
import edu.tum.cs.isabelle.pure._
wneuper@5050
    14
wneuper@5055
    15
object XTerm
wneuper@5050
    16
{
walther@5239
    17
  /* //---------- this would overwrite edu.tum.cs.isabelle.pure._ ----------\\
wneuper@5053
    18
  
wneuper@5050
    19
  type Indexname = (String, Int)
wneuper@5050
    20
wneuper@5050
    21
  type Sort = List[String]
wneuper@5050
    22
  val dummyS: Sort = List("")
wneuper@5050
    23
wneuper@5050
    24
  sealed abstract class Typ
wneuper@5050
    25
  case class Type(name: String, args: List[Typ] = Nil) extends Typ
wneuper@5050
    26
  case class TFree(name: String, sort: Sort = dummyS) extends Typ
wneuper@5050
    27
  case class TVar(name: Indexname, sort: Sort = dummyS) extends Typ
wneuper@5050
    28
  val dummyT = Type("dummy")
wneuper@5050
    29
wneuper@5050
    30
  sealed abstract class Term
wneuper@5050
    31
  case class Const(name: String, typ: Typ = dummyT) extends Term
wneuper@5050
    32
  case class Free(name: String, typ: Typ = dummyT) extends Term
wneuper@5050
    33
  case class Var(name: Indexname, typ: Typ = dummyT) extends Term
wneuper@5050
    34
  case class Bound(index: Int) extends Term
wneuper@5050
    35
  case class Abs(name: String, typ: Typ = dummyT, body: Term) extends Term
wneuper@5050
    36
  case class App(fun: Term, arg: Term) extends Term
wneuper@5053
    37
  
walther@5239
    38
  \\---------- this would overwrite edu.tum.cs.isabelle.pure._ ----------// */
wneuper@5050
    39
wneuper@5050
    40
//----------------- ADDITIONS TO Isabelle2016-1 FOR ISAC -----------------\\
wneuper@5050
    41
  // see ~~/src/Pure/General/symbol.scala: is digit
wneuper@5050
    42
  def is_digit(sym: String): Boolean = sym.length == 1 && '0' <= sym(0) && sym(0) <= '9'
wneuper@5050
    43
  
wneuper@5050
    44
  /* display variables */
wneuper@5053
    45
  def string_of_vname (xi : Indexname): String = 
wneuper@5053
    46
  { 
wneuper@5053
    47
    val (x, i) = xi
wneuper@5055
    48
    val idx = XLibrary.string_of_int(i.intValue)
wneuper@5050
    49
    val dot = idx.toList match {
wneuper@5050
    50
      case  _ :: /*?HOW HANDLE THIS CHAR: "⇩" ::*/ _ => false
wneuper@5075
    51
      //case  c :: _ => XSymbol.is_digit(c)             //unreachable --^^
wneuper@5050
    52
      case _ => true      
wneuper@5050
    53
    }
wneuper@5050
    54
    if (dot) "?" ++ x ++ "." ++ idx
wneuper@5050
    55
    else {
wneuper@5050
    56
      if (i != 0) "?" ++ x ++ idx
wneuper@5050
    57
      else "?" ++ x
wneuper@5050
    58
    }
wneuper@5050
    59
  }
wneuper@5053
    60
  /*maps   f(t1,...,tn)  to  (f, [t1,...,tn]) ; naturally tail-recursive*/
wneuper@5053
    61
  def strip_comb(u : Term) : (Term, List[Term]) =
wneuper@5053
    62
  {
wneuper@5053
    63
    def stripc (u : Term, ts : List[Term]) : (Term, List[Term]) =
wneuper@5053
    64
    u match {
wneuper@5053
    65
      case App(f, t) => stripc (f, t::ts)
wneuper@5053
    66
      case _ => (u, ts)
wneuper@5053
    67
    }
wneuper@5053
    68
    stripc(u, List())
wneuper@5053
    69
  }
wneuper@5053
    70
  
wneuper@5050
    71
}
wneuper@5050
    72