| author | wenzelm | 
| Sat, 15 Feb 2025 14:37:41 +0100 | |
| changeset 82181 | a0d1d772ccab | 
| 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: 
70559diff
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: 
80295diff
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: 
80295diff
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: 
80295diff
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: 
80295diff
changeset | 66 |         { case (List(a), b) => OFCLASS(typ(b), a) }))
 | 
| 70533 
031620901fcd
support for (fully reconstructed) proof terms in Scala;
 wenzelm parents: 
43779diff
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: 
70842diff
changeset | 69 | def env_type(x: String, t: Typ): Typ = | 
| 
cc987440d776
more compact XML: separate environment for free variables;
 wenzelm parents: 
70842diff
changeset | 70 | if (t == dummyT && env.isDefinedAt(x)) env(x) else t | 
| 
cc987440d776
more compact XML: separate environment for free variables;
 wenzelm parents: 
70842diff
changeset | 71 | |
| 
cc987440d776
more compact XML: separate environment for free variables;
 wenzelm parents: 
70842diff
changeset | 72 | def term: T[Term] = | 
| 
cc987440d776
more compact XML: separate environment for free variables;
 wenzelm parents: 
70842diff
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: 
80295diff
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: 
80295diff
changeset | 80 |           { case (List(a), b) => OFCLASS(typ(b), a) }))
 | 
| 70843 
cc987440d776
more compact XML: separate environment for free variables;
 wenzelm parents: 
70842diff
changeset | 81 | term | 
| 
cc987440d776
more compact XML: separate environment for free variables;
 wenzelm parents: 
70842diff
changeset | 82 | } | 
| 
cc987440d776
more compact XML: separate environment for free variables;
 wenzelm parents: 
70842diff
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: 
70842diff
changeset | 85 | val term = term_env(env) | 
| 
cc987440d776
more compact XML: separate environment for free variables;
 wenzelm parents: 
70842diff
changeset | 86 | def proof: T[Proof] = | 
| 
cc987440d776
more compact XML: separate environment for free variables;
 wenzelm parents: 
70842diff
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: 
75436diff
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: 
75436diff
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: 
75436diff
changeset | 100 | })) | 
| 70843 
cc987440d776
more compact XML: separate environment for free variables;
 wenzelm parents: 
70842diff
changeset | 101 | proof | 
| 
cc987440d776
more compact XML: separate environment for free variables;
 wenzelm parents: 
70842diff
changeset | 102 | } | 
| 
cc987440d776
more compact XML: separate environment for free variables;
 wenzelm parents: 
70842diff
changeset | 103 | |
| 
cc987440d776
more compact XML: separate environment for free variables;
 wenzelm parents: 
70842diff
changeset | 104 | val proof: T[Proof] = proof_env(Map.empty) | 
| 43779 | 105 | } | 
| 106 | } |