src/HOL/TPTP/TPTP_Parser/tptp_interpret.ML
author sultana
Thu, 19 Apr 2012 07:25:41 +0100
changeset 47569 fce9d97a3258
parent 47558 55b42f9af99d
child 47570 df3c9aa6c9dc
permissions -rw-r--r--
exceptions related to interpreting tptp problems now mention the relevant position in the tptp file;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46879
a8b1236e0837 tuned headers;
wenzelm
parents: 46844
diff changeset
     1
(*  Title:      HOL/TPTP/TPTP_Parser/tptp_interpret.ML
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
     2
    Author:     Nik Sultana, Cambridge University Computer Laboratory
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
     3
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
     4
Interprets TPTP problems in Isabelle/HOL.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
     5
*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
     6
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
     7
signature TPTP_INTERPRET =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
     8
sig
47515
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
     9
  (*Signature extension: typing information for variables and constants*)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    10
  type var_types = (string * typ option) list
47515
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    11
  type const_map = (string * term) list
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    12
47515
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    13
  (*Mapping from TPTP types to Isabelle/HOL types. This map works over all
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    14
  base types. The map must be total wrt TPTP types.*)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    15
  type type_map = (TPTP_Syntax.tptp_type * typ) list
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    16
47515
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    17
  (*Inference info, when available, consists of the name of the inference rule
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    18
  and the names of the inferences involved in the reasoning step.*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    19
  type inference_info = (string * string list) option
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    20
47515
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    21
  (*A parsed annotated formula is represented as a 5-tuple consisting of
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    22
  the formula's label, its role, the TPTP formula, its Isabelle/HOL meaning, and
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    23
  inference info*)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    24
  type tptp_formula_meaning =
47548
60849d8c457d fixed type interpretation;
sultana
parents: 47520
diff changeset
    25
    string * TPTP_Syntax.role * term * inference_info
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    26
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    27
  (*In general, the meaning of a TPTP statement (which, through the Include
47515
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    28
  directive, may include the meaning of an entire TPTP file, is a map from
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    29
  TPTP to Isabelle/HOL types, a map from TPTP constants to their Isabelle/HOL
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    30
  counterparts and their types, and a list of interpreted annotated formulas.*)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    31
  type tptp_general_meaning =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    32
    (type_map * const_map * tptp_formula_meaning list)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    33
47515
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    34
  (*cautious = indicates whether additional checks are made to check
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    35
      that all used types have been declared.
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    36
    problem_name = if given then it is used to qualify types & constants*)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    37
  type config =
47515
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    38
    {cautious : bool,
47548
60849d8c457d fixed type interpretation;
sultana
parents: 47520
diff changeset
    39
     problem_name : TPTP_Problem_Name.problem_name option}
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    40
47515
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    41
  (*Generates a fresh Isabelle/HOL type for interpreting a TPTP type in a theory.*)
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    42
  val declare_type : config -> (TPTP_Syntax.tptp_type * string) -> type_map ->
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    43
    theory -> type_map * theory
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    44
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    45
  (*Map TPTP types to Isabelle/HOL types*)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    46
  val interpret_type : config -> theory -> type_map ->
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    47
    TPTP_Syntax.tptp_type -> typ
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    48
47515
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    49
  (*Map TPTP terms to Isabelle/HOL terms*)
47511
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
    50
  val interpret_term : bool -> config -> TPTP_Syntax.language -> theory ->
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
    51
    const_map -> var_types -> type_map -> TPTP_Syntax.tptp_term ->
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
    52
    term * theory
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
    53
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
    54
  val interpret_formula : config -> TPTP_Syntax.language -> const_map ->
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
    55
    var_types -> type_map -> TPTP_Syntax.tptp_formula -> theory ->
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
    56
    term * theory
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
    57
47515
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    58
  (*Interpret a TPTP line: return a "tptp_general_meaning" for that line,
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    59
  as well as an updated Isabelle theory including any types & constants
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    60
  which were specified in that line.
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    61
  Note that type/constant declarations do not result in any formulas being
47515
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    62
  returned. A typical TPTP line might update the theory, and/or return one or
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    63
  more formulas. For instance, the "include" directive may update the theory
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    64
  and also return a list of formulas from the included file.
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    65
  Arguments:
47515
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    66
    config = (see above)
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    67
    inclusion list = names of annotated formulas to interpret (since "include"
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    68
      directive can be selective wrt to such names)
47360
sultana
parents: 47359
diff changeset
    69
    type_map = mapping of TPTP-types to Isabelle/HOL types. This argument may be
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    70
      given to force a specific mapping: this is usually done for using an
47360
sultana
parents: 47359
diff changeset
    71
      imported TPTP problem in Isar.
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    72
    const_map = as previous, but for constants.
47360
sultana
parents: 47359
diff changeset
    73
    path_prefix = path where TPTP problems etc are located (to help the "include"
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    74
      directive find the files.
47515
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    75
    line = parsed TPTP line
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    76
    thy = theory where interpreted info will be stored.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    77
  *)
47511
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
    78
  val interpret_line : config -> string list -> type_map -> const_map ->
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    79
    Path.T -> TPTP_Syntax.tptp_line -> theory -> tptp_general_meaning * theory
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    80
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    81
  (*Like "interpret_line" above, but works over a whole parsed problem.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    82
    Arguments:
47515
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    83
      config = as previously
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    84
      inclusion list = as previously
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    85
      path_prefix = as previously
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    86
      lines = parsed TPTP syntax
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    87
      type_map = as previously
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    88
      const_map = as previously
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    89
      thy = as previously
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    90
  *)
47519
9c3acd90063a simplified interpretation of '$i';
sultana
parents: 47515
diff changeset
    91
  val interpret_problem : config -> string list -> Path.T ->
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    92
    TPTP_Syntax.tptp_line list -> type_map -> const_map -> theory ->
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    93
    tptp_general_meaning * theory
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    94
47515
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
    95
  (*Like "interpret_problem" above, but it is given a filename rather than
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    96
  a parsed problem.*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    97
  val interpret_file : bool -> Path.T -> Path.T -> type_map -> const_map ->
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    98
    theory -> tptp_general_meaning * theory
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    99
47569
fce9d97a3258 exceptions related to interpreting tptp problems now mention the relevant position in the tptp file;
sultana
parents: 47558
diff changeset
   100
  type position = string * int * int
fce9d97a3258 exceptions related to interpreting tptp problems now mention the relevant position in the tptp file;
sultana
parents: 47558
diff changeset
   101
  exception MISINTERPRET of position list * exn
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   102
  exception MISINTERPRET_FORMULA of string * TPTP_Syntax.tptp_formula
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   103
  exception MISINTERPRET_SYMBOL of string * TPTP_Syntax.symbol
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   104
  exception MISINTERPRET_TERM of string * TPTP_Syntax.tptp_term
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   105
  exception MISINTERPRET_TYPE of string * TPTP_Syntax.tptp_type
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   106
47515
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
   107
  val import_file : bool -> Path.T -> Path.T -> type_map -> const_map ->
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
   108
    theory -> theory
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
   109
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
   110
  (*Imported TPTP files are stored as "manifests" in the theory.*)
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
   111
  type manifest = TPTP_Problem_Name.problem_name * tptp_general_meaning
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
   112
  val get_manifests : theory -> manifest list
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   113
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   114
  (*Returns the list of all files included in a directory and its
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   115
  subdirectories. This is only used for testing the parser/interpreter against
47360
sultana
parents: 47359
diff changeset
   116
  all TPTP problems.*)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   117
  val get_file_list : Path.T -> Path.T list
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   118
end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   119
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   120
structure TPTP_Interpret : TPTP_INTERPRET =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   121
struct
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   122
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   123
open TPTP_Syntax
47569
fce9d97a3258 exceptions related to interpreting tptp problems now mention the relevant position in the tptp file;
sultana
parents: 47558
diff changeset
   124
type position = string * int * int
fce9d97a3258 exceptions related to interpreting tptp problems now mention the relevant position in the tptp file;
sultana
parents: 47558
diff changeset
   125
exception MISINTERPRET of position list * exn
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   126
exception MISINTERPRET_FORMULA of string * TPTP_Syntax.tptp_formula
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   127
exception MISINTERPRET_SYMBOL of string * TPTP_Syntax.symbol
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   128
exception MISINTERPRET_TERM of string * TPTP_Syntax.tptp_term
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   129
exception MISINTERPRET_TYPE of string * TPTP_Syntax.tptp_type
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   130
47515
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
   131
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   132
(* General stuff *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   133
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   134
type config =
47515
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
   135
  {cautious : bool,
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
   136
   problem_name : TPTP_Problem_Name.problem_name option}
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
   137
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   138
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   139
(* Interpretation *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   140
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   141
(** Signatures and other type abbrevations **)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   142
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   143
type const_map = (string * term) list
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   144
type var_types = (string * typ option) list
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   145
type type_map = (TPTP_Syntax.tptp_type * typ) list
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   146
type inference_info = (string * string list) option
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   147
type tptp_formula_meaning =
47548
60849d8c457d fixed type interpretation;
sultana
parents: 47520
diff changeset
   148
  string * TPTP_Syntax.role * term * inference_info
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   149
type tptp_general_meaning =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   150
  (type_map * const_map * tptp_formula_meaning list)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   151
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   152
type manifest = TPTP_Problem_Name.problem_name * tptp_general_meaning
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   153
structure TPTP_Data = Theory_Data
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   154
  (type T = manifest list
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   155
   val empty = []
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   156
   val extend = I
47332
360e080fd13e dealing with SMLNJ errors 'value type in structure doesn't match signature spec' (which originated from lack of type generalisation) and 'unresolved flex record' wrt tptp_interpret
sultana
parents: 46961
diff changeset
   157
   (*SMLNJ complains if non-expanded form used below*)
360e080fd13e dealing with SMLNJ errors 'value type in structure doesn't match signature spec' (which originated from lack of type generalisation) and 'unresolved flex record' wrt tptp_interpret
sultana
parents: 46961
diff changeset
   158
   fun merge v = Library.merge (op =) v)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   159
val get_manifests = TPTP_Data.get
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   160
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   161
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   162
(** Adding types to a signature **)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   163
47514
0a870584145f improved handling of quoted names in tptp import
sultana
parents: 47513
diff changeset
   164
(*transform quoted names into acceptable ASCII strings*)
0a870584145f improved handling of quoted names in tptp import
sultana
parents: 47513
diff changeset
   165
fun alphanumerate c =
0a870584145f improved handling of quoted names in tptp import
sultana
parents: 47513
diff changeset
   166
  let
0a870584145f improved handling of quoted names in tptp import
sultana
parents: 47513
diff changeset
   167
    val c' = ord c
0a870584145f improved handling of quoted names in tptp import
sultana
parents: 47513
diff changeset
   168
    val out_of_range =
0a870584145f improved handling of quoted names in tptp import
sultana
parents: 47513
diff changeset
   169
      ((c' > 64) andalso (c' < 91)) orelse ((c' > 96)
0a870584145f improved handling of quoted names in tptp import
sultana
parents: 47513
diff changeset
   170
       andalso (c' < 123)) orelse ((c' > 47) andalso (c' < 58))
0a870584145f improved handling of quoted names in tptp import
sultana
parents: 47513
diff changeset
   171
  in
0a870584145f improved handling of quoted names in tptp import
sultana
parents: 47513
diff changeset
   172
    if (not out_of_range) andalso (not (c = "_")) then
0a870584145f improved handling of quoted names in tptp import
sultana
parents: 47513
diff changeset
   173
      "_nom_" ^ Int.toString (ord c) ^ "_"
0a870584145f improved handling of quoted names in tptp import
sultana
parents: 47513
diff changeset
   174
    else c
0a870584145f improved handling of quoted names in tptp import
sultana
parents: 47513
diff changeset
   175
  end
0a870584145f improved handling of quoted names in tptp import
sultana
parents: 47513
diff changeset
   176
fun alphanumerated_name prefix name =
0a870584145f improved handling of quoted names in tptp import
sultana
parents: 47513
diff changeset
   177
  prefix ^ (raw_explode #> map alphanumerate #> implode) name
0a870584145f improved handling of quoted names in tptp import
sultana
parents: 47513
diff changeset
   178
47332
360e080fd13e dealing with SMLNJ errors 'value type in structure doesn't match signature spec' (which originated from lack of type generalisation) and 'unresolved flex record' wrt tptp_interpret
sultana
parents: 46961
diff changeset
   179
(*SMLNJ complains if type annotation not used below*)
360e080fd13e dealing with SMLNJ errors 'value type in structure doesn't match signature spec' (which originated from lack of type generalisation) and 'unresolved flex record' wrt tptp_interpret
sultana
parents: 46961
diff changeset
   180
fun mk_binding (config : config) ident =
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   181
  let
47514
0a870584145f improved handling of quoted names in tptp import
sultana
parents: 47513
diff changeset
   182
    val pre_binding = Binding.name (alphanumerated_name "bnd_" ident)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   183
  in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   184
    case #problem_name config of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   185
      NONE => pre_binding
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   186
    | SOME prob =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   187
        Binding.qualify
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   188
         false
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   189
         (TPTP_Problem_Name.mangle_problem_name prob)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   190
         pre_binding
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   191
  end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   192
47548
60849d8c457d fixed type interpretation;
sultana
parents: 47520
diff changeset
   193
fun type_exists config thy ty_name =
60849d8c457d fixed type interpretation;
sultana
parents: 47520
diff changeset
   194
  Sign.declared_tyname thy (Sign.full_name thy (mk_binding config ty_name))
60849d8c457d fixed type interpretation;
sultana
parents: 47520
diff changeset
   195
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   196
(*Returns updated theory and the name of the final type's name -- i.e. if the
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   197
original name is already taken then the function looks for an available
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   198
alternative. It also returns an updated type_map if one has been passed to it.*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   199
fun declare_type (config : config) (thf_type, type_name) ty_map thy =
47548
60849d8c457d fixed type interpretation;
sultana
parents: 47520
diff changeset
   200
  if type_exists config thy type_name then
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   201
    raise MISINTERPRET_TYPE ("Type already exists", Atom_type type_name)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   202
  else
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   203
    let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   204
      val binding = mk_binding config type_name
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   205
      val final_fqn = Sign.full_name thy binding
47510
sultana
parents: 47411
diff changeset
   206
      val thy' =
sultana
parents: 47411
diff changeset
   207
        Typedecl.typedecl_global (mk_binding config type_name, [], NoSyn) thy
sultana
parents: 47411
diff changeset
   208
        |> snd
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   209
      val typ_map_entry = (thf_type, (Type (final_fqn, [])))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   210
      val ty_map' = typ_map_entry :: ty_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   211
    in (ty_map', thy') end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   212
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   213
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   214
(** Adding constants to signature **)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   215
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   216
fun full_name thy config const_name =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   217
  Sign.full_name thy (mk_binding config const_name)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   218
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   219
fun const_exists config thy const_name =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   220
  Sign.declared_const thy (full_name thy config const_name)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   221
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   222
fun declare_constant config const_name ty thy =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   223
  if const_exists config thy const_name then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   224
    raise MISINTERPRET_TERM
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   225
     ("Const already declared", Term_Func (Uninterpreted const_name, []))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   226
  else
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   227
    Theory.specify_const
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   228
     ((mk_binding config const_name, ty), NoSyn) thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   229
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   230
47515
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
   231
(** Interpretation functions **)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   232
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   233
(*Types in THF are encoded as formulas. This function translates them to type form.*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   234
(*FIXME possibly incomplete hack*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   235
fun fmlatype_to_type (Atom (THF_Atom_term (Term_Func (TypeSymbol typ, [])))) =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   236
      Defined_type typ
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   237
  | fmlatype_to_type (Atom (THF_Atom_term (Term_Func (Uninterpreted str, [])))) =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   238
      Atom_type str
47360
sultana
parents: 47359
diff changeset
   239
  | fmlatype_to_type (Type_fmla (Fn_type (ty1, ty2))) =
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   240
      let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   241
        val ty1' = case ty1 of
47360
sultana
parents: 47359
diff changeset
   242
            Fn_type _ => fmlatype_to_type (Type_fmla ty1)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   243
          | Fmla_type ty1 => fmlatype_to_type ty1
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   244
        val ty2' = case ty2 of
47360
sultana
parents: 47359
diff changeset
   245
            Fn_type _ => fmlatype_to_type (Type_fmla ty2)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   246
          | Fmla_type ty2 => fmlatype_to_type ty2
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   247
      in Fn_type (ty1', ty2') end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   248
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   249
fun interpret_type config thy type_map thf_ty =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   250
  let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   251
    fun lookup_type ty_map thf_ty =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   252
      (case AList.lookup (op =) ty_map thf_ty of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   253
          NONE =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   254
            raise MISINTERPRET_TYPE
47510
sultana
parents: 47411
diff changeset
   255
              ("Could not find the interpretation of this TPTP type in the \
sultana
parents: 47411
diff changeset
   256
               \mapping to Isabelle/HOL", thf_ty)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   257
        | SOME ty => ty)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   258
  in
47548
60849d8c457d fixed type interpretation;
sultana
parents: 47520
diff changeset
   259
    case thf_ty of
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   260
       Prod_type (thf_ty1, thf_ty2) =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   261
         Type ("Product_Type.prod",
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   262
          [interpret_type config thy type_map thf_ty1,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   263
           interpret_type config thy type_map thf_ty2])
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   264
     | Fn_type (thf_ty1, thf_ty2) =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   265
         Type ("fun",
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   266
          [interpret_type config thy type_map thf_ty1,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   267
           interpret_type config thy type_map thf_ty2])
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   268
     | Atom_type _ =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   269
         lookup_type type_map thf_ty
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   270
     | Defined_type tptp_base_type =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   271
         (case tptp_base_type of
47519
9c3acd90063a simplified interpretation of '$i';
sultana
parents: 47515
diff changeset
   272
            Type_Ind => @{typ ind}
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   273
          | Type_Bool => HOLogic.boolT
47510
sultana
parents: 47411
diff changeset
   274
          | Type_Type => raise MISINTERPRET_TYPE ("No type interpretation", thf_ty)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   275
          | Type_Int => Type ("Int.int", [])
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   276
         (*FIXME these types are currently unsupported, so they're treated as
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   277
         individuals*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   278
          | Type_Rat =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   279
              interpret_type config thy type_map (Defined_type Type_Ind)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   280
          | Type_Real =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   281
              interpret_type config thy type_map (Defined_type Type_Ind)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   282
          )
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   283
     | Sum_type _ =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   284
         raise MISINTERPRET_TYPE (*FIXME*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   285
          ("No type interpretation (sum type)", thf_ty)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   286
     | Fmla_type tptp_ty =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   287
        fmlatype_to_type tptp_ty
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   288
        |> interpret_type config thy type_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   289
     | Subtype _ =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   290
         raise MISINTERPRET_TYPE (*FIXME*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   291
          ("No type interpretation (subtype)", thf_ty)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   292
  end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   293
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   294
fun the_const config thy language const_map_payload str =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   295
  if language = THF then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   296
    (case AList.lookup (op =) const_map_payload str of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   297
        NONE => raise MISINTERPRET_TERM
47510
sultana
parents: 47411
diff changeset
   298
          ("Could not find the interpretation of this constant in the \
sultana
parents: 47411
diff changeset
   299
            \mapping to Isabelle/HOL", Term_Func (Uninterpreted str, []))
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   300
      | SOME t => t)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   301
  else
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   302
    if const_exists config thy str then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   303
       Sign.mk_const thy ((Sign.full_name thy (mk_binding config str)), [])
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   304
    else raise MISINTERPRET_TERM
47510
sultana
parents: 47411
diff changeset
   305
          ("Could not find the interpretation of this constant in the \
sultana
parents: 47411
diff changeset
   306
            \mapping to Isabelle/HOL", Term_Func (Uninterpreted str, []))
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   307
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   308
(*Eta-expands Isabelle/HOL binary function.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   309
 "str" is the name of a polymorphic constant in Isabelle/HOL*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   310
fun mk_fun str =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   311
  (Const (str, Term.dummyT) $ Bound 1 $ Bound 0)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   312
   |> (Term.absdummy Term.dummyT #> Term.absdummy Term.dummyT)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   313
(*As above, but swaps the function's arguments*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   314
fun mk_swapped_fun str =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   315
  (Const (str, Term.dummyT) $ Bound 0 $ Bound 1)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   316
   |> (Term.absdummy Term.dummyT #> Term.absdummy Term.dummyT)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   317
47360
sultana
parents: 47359
diff changeset
   318
fun dummy_term () =
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   319
  HOLogic.choice_const Term.dummyT $ Term.absdummy Term.dummyT @{term "True"}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   320
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   321
fun interpret_symbol config thy language const_map symb =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   322
  case symb of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   323
     Uninterpreted n =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   324
       (*Constant would have been added to the map at the time of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   325
       declaration*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   326
       the_const config thy language const_map n
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   327
   | Interpreted_ExtraLogic interpreted_symbol =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   328
       (case interpreted_symbol of (*FIXME incomplete,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   329
                                     and doesn't work with $i*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   330
          Sum => mk_fun @{const_name Groups.plus}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   331
        | UMinus =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   332
            (Const (@{const_name Groups.uminus}, Term.dummyT) $ Bound 0)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   333
             |> Term.absdummy Term.dummyT
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   334
        | Difference => mk_fun @{const_name Groups.minus}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   335
        | Product => mk_fun @{const_name Groups.times}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   336
        | Quotient => mk_fun @{const_name Fields.divide}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   337
        | Less => mk_fun @{const_name Orderings.less}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   338
        | LessEq => mk_fun @{const_name Orderings.less_eq}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   339
        | Greater => mk_swapped_fun @{const_name Orderings.less}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   340
          (*FIXME would be nicer to expand "greater"
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   341
            and "greater_eq" abbreviations*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   342
        | GreaterEq => mk_swapped_fun @{const_name Orderings.less_eq}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   343
        (* FIXME todo
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   344
        | Quotient_E | Quotient_T | Quotient_F | Remainder_E | Remainder_T
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   345
        | Remainder_F | Floor | Ceiling | Truncate | Round | To_Int | To_Rat
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   346
        | To_Real | EvalEq | Is_Int | Is_Rat*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   347
        | Apply => raise MISINTERPRET_SYMBOL ("Malformed term?", symb)
47360
sultana
parents: 47359
diff changeset
   348
        | _ => dummy_term ()
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   349
        )
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   350
   | Interpreted_Logic logic_symbol =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   351
       (case logic_symbol of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   352
          Equals => HOLogic.eq_const Term.dummyT
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   353
        | NEquals =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   354
           HOLogic.mk_not (HOLogic.eq_const Term.dummyT $ Bound 1 $ Bound 0)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   355
           |> (Term.absdummy Term.dummyT #> Term.absdummy Term.dummyT)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   356
        | Or => HOLogic.disj
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   357
        | And => HOLogic.conj
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   358
        | Iff => HOLogic.eq_const HOLogic.boolT
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   359
        | If => HOLogic.imp
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   360
        | Fi => @{term "\<lambda> x. \<lambda> y. y \<longrightarrow> x"}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   361
        | Xor =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   362
            @{term
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   363
              "\<lambda> x. \<lambda> y. \<not> (x \<longleftrightarrow> y)"}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   364
        | Nor => @{term "\<lambda> x. \<lambda> y. \<not> (x \<or> y)"}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   365
        | Nand => @{term "\<lambda> x. \<lambda> y. \<not> (x \<and> y)"}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   366
        | Not => HOLogic.Not
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   367
        | Op_Forall => HOLogic.all_const Term.dummyT
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   368
        | Op_Exists => HOLogic.exists_const Term.dummyT
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   369
        | True => @{term "True"}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   370
        | False => @{term "False"}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   371
        )
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   372
   | TypeSymbol _ =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   373
       raise MISINTERPRET_SYMBOL
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   374
        ("Cannot have TypeSymbol in term", symb)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   375
   | System str =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   376
       raise MISINTERPRET_SYMBOL
47510
sultana
parents: 47411
diff changeset
   377
        ("Cannot interpret system symbol", symb)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   378
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   379
(*Apply a function to a list of arguments*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   380
val mapply = fold (fn x => fn y => y $ x)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   381
(*As above, but for products*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   382
fun mtimes thy =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   383
  fold (fn x => fn y =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   384
    Sign.mk_const thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   385
    ("Product_Type.Pair",[Term.dummyT, Term.dummyT]) $ y $ x)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   386
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   387
(*Adds constants to signature in FOL. "formula_level" means that the constants
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   388
are to be interpreted as predicates, otherwise as functions over individuals.*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   389
fun FO_const_types config formula_level type_map tptp_t thy =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   390
  let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   391
    val ind_type = interpret_type config thy type_map (Defined_type Type_Ind)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   392
    val value_type =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   393
      if formula_level then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   394
        interpret_type config thy type_map (Defined_type Type_Bool)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   395
      else ind_type
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   396
  in case tptp_t of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   397
      Term_Func (symb, tptp_ts) =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   398
        let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   399
          val thy' = fold (FO_const_types config false type_map) tptp_ts thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   400
          val ty = fold (fn ty1 => fn ty2 => Type ("fun", [ty1, ty2]))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   401
            (map (fn _ => ind_type) tptp_ts) value_type
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   402
        in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   403
          case symb of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   404
             Uninterpreted const_name =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   405
                 if const_exists config thy' const_name then thy'
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   406
                 else snd (declare_constant config const_name ty thy')
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   407
           | _ => thy'
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   408
        end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   409
     | _ => thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   410
  end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   411
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   412
(*like FO_const_types but works over symbols*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   413
fun symb_const_types config type_map formula_level const_name n_args thy =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   414
  let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   415
    val ind_type = interpret_type config thy type_map (Defined_type Type_Ind)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   416
    val value_type =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   417
      if formula_level then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   418
        interpret_type config thy type_map (Defined_type Type_Bool)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   419
      else interpret_type config thy type_map (Defined_type Type_Ind)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   420
    fun mk_i_fun b n acc =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   421
      if n = 0 then acc b
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   422
      else