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 |
|