| author | paulson <lp15@cam.ac.uk> | 
| Thu, 10 Apr 2025 17:07:18 +0100 | |
| changeset 82470 | 785615e37846 | 
| parent 80589 | 7849b6370425 | 
| permissions | -rw-r--r-- | 
| 43779 | 1  | 
/* Title: Pure/term_xml.scala  | 
2  | 
Author: Makarius  | 
|
3  | 
||
4  | 
XML data representation of lambda terms.  | 
|
5  | 
*/  | 
|
6  | 
||
7  | 
package isabelle  | 
|
8  | 
||
9  | 
||
| 75393 | 10  | 
object Term_XML {
 | 
| 43779 | 11  | 
import Term._  | 
12  | 
||
| 75393 | 13  | 
  object Encode {
 | 
| 43779 | 14  | 
import XML.Encode._  | 
15  | 
||
| 70828 | 16  | 
val indexname: P[Indexname] =  | 
17  | 
      { case Indexname(a, 0) => List(a)
 | 
|
18  | 
case Indexname(a, b) => List(a, int_atom(b)) }  | 
|
19  | 
||
| 43779 | 20  | 
val sort: T[Sort] = list(string)  | 
21  | 
||
| 70842 | 22  | 
def typ: T[Typ] =  | 
| 43779 | 23  | 
variant[Typ](List(  | 
| 70842 | 24  | 
        { case Type(a, b) => (List(a), list(typ)(b)) },
 | 
| 43779 | 25  | 
        { case TFree(a, b) => (List(a), sort(b)) },
 | 
| 70828 | 26  | 
        { case TVar(a, b) => (indexname(a), sort(b)) }))
 | 
27  | 
||
| 80589 | 28  | 
private val var_type: T[Typ] = (t: Typ) => if (t == dummyT) Nil else typ(t)  | 
| 43779 | 29  | 
|
30  | 
def term: T[Term] =  | 
|
31  | 
variant[Term](List(  | 
|
| 
70784
 
799437173553
Term_XML.Encode/Decode.term uses Const "typargs";
 
wenzelm 
parents: 
70559 
diff
changeset
 | 
32  | 
        { case Const(a, b) => (List(a), list(typ)(b)) },
 | 
| 80589 | 33  | 
        { case Free(a, b) => (List(a), var_type(b)) },
 | 
34  | 
        { case Var(a, b) => (indexname(a), var_type(b)) },
 | 
|
| 70844 | 35  | 
        { case Bound(a) => (Nil, int(a)) },
 | 
| 43779 | 36  | 
        { case Abs(a, b, c) => (List(a), pair(typ, term)(b, c)) },
 | 
| 
80566
 
446b887e23c7
clarified data representation: prefer explicit OFCLASS constructor, following datatype zterm;
 
wenzelm 
parents: 
80295 
diff
changeset
 | 
37  | 
        { case App(a, b) => (Nil, pair(term, term)(a, b)) },
 | 
| 
 
446b887e23c7
clarified data representation: prefer explicit OFCLASS constructor, following datatype zterm;
 
wenzelm 
parents: 
80295 
diff
changeset
 | 
38  | 
        { case OFCLASS(a, b) => (List(b), typ(a)) }))
 | 
| 43779 | 39  | 
}  | 
40  | 
||
| 75393 | 41  | 
  object Decode {
 | 
| 43779 | 42  | 
import XML.Decode._  | 
43  | 
||
| 70828 | 44  | 
val indexname: P[Indexname] =  | 
45  | 
      { case List(a) => Indexname(a, 0)
 | 
|
46  | 
case List(a, b) => Indexname(a, int_atom(b)) }  | 
|
47  | 
||
| 43779 | 48  | 
val sort: T[Sort] = list(string)  | 
49  | 
||
| 70842 | 50  | 
def typ: T[Typ] =  | 
| 43779 | 51  | 
variant[Typ](List(  | 
| 75436 | 52  | 
        { case (List(a), b) => Type(a, list(typ)(b)) },
 | 
53  | 
        { case (List(a), b) => TFree(a, sort(b)) },
 | 
|
| 75427 | 54  | 
        { case (a, b) => TVar(indexname(a), sort(b)) }))
 | 
| 70828 | 55  | 
|
| 80589 | 56  | 
    private val var_type: T[Typ] = { case Nil => dummyT case body => typ(body) }
 | 
| 43779 | 57  | 
|
58  | 
def term: T[Term] =  | 
|
59  | 
variant[Term](List(  | 
|
| 75436 | 60  | 
        { case (List(a), b) => Const(a, list(typ)(b)) },
 | 
| 80589 | 61  | 
        { case (List(a), b) => Free(a, var_type(b)) },
 | 
62  | 
        { case (a, b) => Var(indexname(a), var_type(b)) },
 | 
|
| 75436 | 63  | 
        { case (Nil, a) => Bound(int(a)) },
 | 
64  | 
        { case (List(a), b) => val (c, d) = pair(typ, term)(b); Abs(a, c, d) },
 | 
|
| 
80566
 
446b887e23c7
clarified data representation: prefer explicit OFCLASS constructor, following datatype zterm;
 
wenzelm 
parents: 
80295 
diff
changeset
 | 
65  | 
        { case (Nil, a) => val (b, c) = pair(term, term)(a); App(b, c) },
 | 
| 
 
446b887e23c7
clarified data representation: prefer explicit OFCLASS constructor, following datatype zterm;
 
wenzelm 
parents: 
80295 
diff
changeset
 | 
66  | 
        { case (List(a), b) => OFCLASS(typ(b), a) }))
 | 
| 
70533
 
031620901fcd
support for (fully reconstructed) proof terms in Scala;
 
wenzelm 
parents: 
43779 
diff
changeset
 | 
67  | 
|
| 75393 | 68  | 
    def term_env(env: Map[String, Typ]): T[Term] = {
 | 
| 
70843
 
cc987440d776
more compact XML: separate environment for free variables;
 
wenzelm 
parents: 
70842 
diff
changeset
 | 
69  | 
def env_type(x: String, t: Typ): Typ =  | 
| 
 
cc987440d776
more compact XML: separate environment for free variables;
 
wenzelm 
parents: 
70842 
diff
changeset
 | 
70  | 
if (t == dummyT && env.isDefinedAt(x)) env(x) else t  | 
| 
 
cc987440d776
more compact XML: separate environment for free variables;
 
wenzelm 
parents: 
70842 
diff
changeset
 | 
71  | 
|
| 
 
cc987440d776
more compact XML: separate environment for free variables;
 
wenzelm 
parents: 
70842 
diff
changeset
 | 
72  | 
def term: T[Term] =  | 
| 
 
cc987440d776
more compact XML: separate environment for free variables;
 
wenzelm 
parents: 
70842 
diff
changeset
 | 
73  | 
variant[Term](List(  | 
| 75436 | 74  | 
          { case (List(a), b) => Const(a, list(typ)(b)) },
 | 
| 80589 | 75  | 
          { case (List(a), b) => Free(a, env_type(a, var_type(b))) },
 | 
76  | 
          { case (a, b) => Var(indexname(a), var_type(b)) },
 | 
|
| 75436 | 77  | 
          { case (Nil, a) => Bound(int(a)) },
 | 
78  | 
          { case (List(a), b) => val (c, d) = pair(typ, term)(b); Abs(a, c, d) },
 | 
|
| 
80566
 
446b887e23c7
clarified data representation: prefer explicit OFCLASS constructor, following datatype zterm;
 
wenzelm 
parents: 
80295 
diff
changeset
 | 
79  | 
          { case (Nil, a) => val (b, c) = pair(term, term)(a); App(b, c) },
 | 
| 
 
446b887e23c7
clarified data representation: prefer explicit OFCLASS constructor, following datatype zterm;
 
wenzelm 
parents: 
80295 
diff
changeset
 | 
80  | 
          { case (List(a), b) => OFCLASS(typ(b), a) }))
 | 
| 
70843
 
cc987440d776
more compact XML: separate environment for free variables;
 
wenzelm 
parents: 
70842 
diff
changeset
 | 
81  | 
term  | 
| 
 
cc987440d776
more compact XML: separate environment for free variables;
 
wenzelm 
parents: 
70842 
diff
changeset
 | 
82  | 
}  | 
| 
 
cc987440d776
more compact XML: separate environment for free variables;
 
wenzelm 
parents: 
70842 
diff
changeset
 | 
83  | 
|
| 75393 | 84  | 
    def proof_env(env: Map[String, Typ]): T[Proof] = {
 | 
| 
70843
 
cc987440d776
more compact XML: separate environment for free variables;
 
wenzelm 
parents: 
70842 
diff
changeset
 | 
85  | 
val term = term_env(env)  | 
| 
 
cc987440d776
more compact XML: separate environment for free variables;
 
wenzelm 
parents: 
70842 
diff
changeset
 | 
86  | 
def proof: T[Proof] =  | 
| 
 
cc987440d776
more compact XML: separate environment for free variables;
 
wenzelm 
parents: 
70842 
diff
changeset
 | 
87  | 
variant[Proof](List(  | 
| 75436 | 88  | 
          { case (Nil, Nil) => MinProof },
 | 
89  | 
          { case (Nil, a) => PBound(int(a)) },
 | 
|
90  | 
          { case (List(a), b) => val (c, d) = pair(typ, proof)(b); Abst(a, c, d) },
 | 
|
91  | 
          { case (List(a), b) => val (c, d) = pair(term, proof)(b); AbsP(a, c, d) },
 | 
|
92  | 
          { case (Nil, a) => val (b, c) = pair(proof, term)(a); Appt(b, c) },
 | 
|
93  | 
          { case (Nil, a) => val (b, c) = pair(proof, proof)(a); AppP(b, c) },
 | 
|
94  | 
          { case (Nil, a) => Hyp(term(a)) },
 | 
|
95  | 
          { case (List(a), b) => PAxm(a, list(typ)(b)) },
 | 
|
96  | 
          { case (List(a), b) => PClass(typ(b), a) },
 | 
|
97  | 
          { case (List(a), b) => val (c, d) = pair(term, list(typ))(b); Oracle(a, c, d) },
 | 
|
| 
80295
 
8a9588ffc133
more accurate Thm_Name.T for PThm / Thm.name_derivation / Thm.derivation_name;
 
wenzelm 
parents: 
75436 
diff
changeset
 | 
98  | 
          { case (List(a, b, c, d), e) =>
 | 
| 
 
8a9588ffc133
more accurate Thm_Name.T for PThm / Thm.name_derivation / Thm.derivation_name;
 
wenzelm 
parents: 
75436 
diff
changeset
 | 
99  | 
PThm(long_atom(a), b, Thm_Name(c, int_atom(d)), list(typ)(e))  | 
| 
 
8a9588ffc133
more accurate Thm_Name.T for PThm / Thm.name_derivation / Thm.derivation_name;
 
wenzelm 
parents: 
75436 
diff
changeset
 | 
100  | 
}))  | 
| 
70843
 
cc987440d776
more compact XML: separate environment for free variables;
 
wenzelm 
parents: 
70842 
diff
changeset
 | 
101  | 
proof  | 
| 
 
cc987440d776
more compact XML: separate environment for free variables;
 
wenzelm 
parents: 
70842 
diff
changeset
 | 
102  | 
}  | 
| 
 
cc987440d776
more compact XML: separate environment for free variables;
 
wenzelm 
parents: 
70842 
diff
changeset
 | 
103  | 
|
| 
 
cc987440d776
more compact XML: separate environment for free variables;
 
wenzelm 
parents: 
70842 
diff
changeset
 | 
104  | 
val proof: T[Proof] = proof_env(Map.empty)  | 
| 43779 | 105  | 
}  | 
106  | 
}  |