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
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   423
        mk_i_fun b (n - 1) (fn ty => Type ("fun", [ind_type, acc ty]))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   424
  in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   425
    if const_exists config thy const_name then thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   426
    else
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   427
      snd (declare_constant config const_name
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   428
           (mk_i_fun value_type n_args I) thy)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   429
  end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   430
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   431
(*Next batch of functions give info about Isabelle/HOL types*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   432
fun is_fun (Type ("fun", _)) = true
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   433
  | is_fun _ = false
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   434
fun is_prod (Type ("Product_Type.prod", _)) = true
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   435
  | is_prod _ = false
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   436
fun dom_type (Type ("fun", [ty1, _])) = ty1
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   437
fun is_prod_typed thy config symb =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   438
  let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   439
    fun symb_type const_name =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   440
      Sign.the_const_type thy (full_name thy config const_name)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   441
  in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   442
    case symb of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   443
       Uninterpreted const_name =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   444
         if is_fun (symb_type const_name) then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   445
           symb_type const_name |> dom_type |> is_prod
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   446
         else false
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   447
     | _ => false
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   448
   end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   449
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   450
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   451
(*
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   452
 Information needed to be carried around:
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   453
 - constant mapping: maps constant names to Isabelle terms with fully-qualified
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   454
    names. This is fixed, and it is determined by declaration lines earlier
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   455
    in the script (i.e. constants must be declared before appearing in terms.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   456
 - type context: maps bound variables to their Isabelle type. This is discarded
47515
e84838b78b6d tuned comments
sultana
parents: 47514
diff changeset
   457
    after each call of interpret_term since variables' cannot be bound across
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   458
    terms.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   459
*)
47510
sultana
parents: 47411
diff changeset
   460
fun interpret_term formula_level config language thy const_map var_types type_map
sultana
parents: 47411
diff changeset
   461
 tptp_t =
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   462
  case tptp_t of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   463
    Term_Func (symb, tptp_ts) =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   464
       let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   465
         val thy' = FO_const_types config formula_level type_map tptp_t thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   466
         fun typeof_const const_name = Sign.the_const_type thy'
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   467
             (Sign.full_name thy' (mk_binding config const_name))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   468
       in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   469
         case symb of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   470
           Interpreted_ExtraLogic Apply =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   471
             (*apply the head of the argument list to the tail*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   472
             (mapply
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   473
               (map (interpret_term false config language thy' const_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   474
                var_types type_map #> fst) (tl tptp_ts))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   475
               (interpret_term formula_level config language thy' const_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   476
                var_types type_map (hd tptp_ts) |> fst),
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   477
              thy')
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   478
           | _ =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   479
              (*apply symb to tptp_ts*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   480
              if is_prod_typed thy' config symb then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   481
                (interpret_symbol config thy' language const_map symb $
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   482
                  mtimes thy'
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   483
                  (map (interpret_term false config language thy' const_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   484
                   var_types type_map #> fst) (tl tptp_ts))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   485
                  ((interpret_term false config language thy' const_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   486
                   var_types type_map #> fst) (hd tptp_ts)),
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   487
                 thy')
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   488
              else
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   489
                (mapply
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   490
                  (map (interpret_term false config language thy' const_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   491
                   var_types type_map #> fst) tptp_ts)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   492
                  (interpret_symbol config thy' language const_map symb),
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   493
                 thy')
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   494
       end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   495
  | Term_Var n =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   496
     (if language = THF orelse language = TFF then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   497
        (case AList.lookup (op =) var_types n of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   498
           SOME ty =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   499
             (case ty of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   500
                SOME ty => Free (n, ty)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   501
              | NONE => Free (n, Term.dummyT) (*to infer the variable's type*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   502
             )
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   503
         | NONE =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   504
             raise MISINTERPRET_TERM ("Could not type variable", tptp_t))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   505
      else (*variables range over individuals*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   506
        Free (n, interpret_type config thy type_map (Defined_type Type_Ind)),
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   507
      thy)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   508
  | Term_Conditional (tptp_formula, tptp_t1, tptp_t2) =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   509
      (mk_fun @{const_name If}, thy)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   510
  | Term_Num (number_kind, num) =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   511
      let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   512
        val num_term =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   513
          if number_kind = Int_num then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   514
            HOLogic.mk_number @{typ "int"} (the (Int.fromString num))
47360
sultana
parents: 47359
diff changeset
   515
          else dummy_term () (*FIXME: not yet supporting rationals and reals*)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   516
      in (num_term, thy) end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   517
  | Term_Distinct_Object str =>
47514
0a870584145f improved handling of quoted names in tptp import
sultana
parents: 47513
diff changeset
   518
      declare_constant config (alphanumerated_name "ds_" str)
0a870584145f improved handling of quoted names in tptp import
sultana
parents: 47513
diff changeset
   519
        (interpret_type config thy type_map (Defined_type Type_Ind)) thy
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   520
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   521
(*Given a list of "'a option", then applies a function to each element if that
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   522
element is SOME value, otherwise it leaves it as NONE.*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   523
fun map_opt f xs =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   524
  fold
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   525
  (fn x => fn y =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   526
    (if Option.isSome x then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   527
       SOME (f (Option.valOf x))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   528
     else NONE) :: y
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   529
  ) xs []
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   530
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   531
fun interpret_formula config language const_map var_types type_map tptp_fmla thy =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   532
  case tptp_fmla of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   533
      Pred app =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   534
        interpret_term true config language thy const_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   535
         var_types type_map (Term_Func app)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   536
    | Fmla (symbol, tptp_formulas) =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   537
       (case symbol of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   538
          Interpreted_ExtraLogic Apply =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   539
            let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   540
              val (args, thy') = (fold_map (interpret_formula config language
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   541
               const_map var_types type_map) (tl tptp_formulas) thy)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   542
              val (func, thy') = interpret_formula config language const_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   543
               var_types type_map (hd tptp_formulas) thy'
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   544
            in (mapply args func, thy') end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   545
        | Uninterpreted const_name =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   546
            let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   547
              val (args, thy') = (fold_map (interpret_formula config language
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   548
               const_map var_types type_map) tptp_formulas thy)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   549
              val thy' = symb_const_types config type_map true const_name
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   550
               (length tptp_formulas) thy'
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   551
            in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   552
              (if is_prod_typed thy' config symbol then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   553
                 mtimes thy' args (interpret_symbol config thy' language
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   554
                  const_map symbol)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   555
               else
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   556
                mapply args
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   557
                 (interpret_symbol config thy' language const_map symbol),
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   558
              thy')
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   559
            end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   560
        | _ =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   561
            let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   562
              val (args, thy') =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   563
                fold_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   564
                 (interpret_formula config language
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   565
                  const_map var_types type_map)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   566
                 tptp_formulas thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   567
            in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   568
              (if is_prod_typed thy' config symbol then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   569
                 mtimes thy' args (interpret_symbol config thy' language
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   570
                  const_map symbol)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   571
               else
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   572
                 mapply args
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   573
                  (interpret_symbol config thy' language const_map symbol),
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   574
               thy')
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   575
            end)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   576
    | Sequent _ =>
47510
sultana
parents: 47411
diff changeset
   577
        (*FIXME unsupported*)
sultana
parents: 47411
diff changeset
   578
        raise MISINTERPRET_FORMULA ("'Sequent' unsupported", tptp_fmla)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   579
    | Quant (quantifier, bindings, tptp_formula) =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   580
        let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   581
          val (bound_vars, bound_var_types) = ListPair.unzip bindings
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   582
          val bound_var_types' : typ option list =
47510
sultana
parents: 47411
diff changeset
   583
            (map_opt : (tptp_type -> typ) ->
sultana
parents: 47411
diff changeset
   584
             (tptp_type option list) -> typ option list)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   585
            (interpret_type config thy type_map) bound_var_types
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   586
          val var_types' =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   587
            ListPair.zip (bound_vars, List.rev bound_var_types')
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   588
            |> List.rev
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   589
          fun fold_bind f =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   590
            fold
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   591
              (fn (n, ty) => fn t =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   592
                 case ty of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   593
                   NONE =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   594
                     f (n,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   595
                        if language = THF then Term.dummyT
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   596
                        else
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   597
                          interpret_type config thy type_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   598
                           (Defined_type Type_Ind),
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   599
                        t)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   600
                 | SOME ty => f (n, ty, t)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   601
              )
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   602
              var_types'
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   603
        in case quantifier of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   604
          Forall =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   605
            interpret_formula config language const_map (var_types' @ var_types)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   606
             type_map tptp_formula thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   607
            |>> fold_bind HOLogic.mk_all
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   608
        | Exists =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   609
            interpret_formula config language const_map (var_types' @ var_types)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   610
             type_map tptp_formula thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   611
            |>> fold_bind HOLogic.mk_exists
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   612
        | Lambda =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   613
            interpret_formula config language const_map (var_types' @ var_types)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   614
             type_map tptp_formula thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   615
            |>> fold_bind (fn (n, ty, rest) => lambda (Free (n, ty)) rest)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   616
        | Epsilon =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   617
            let val (t, thy') =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   618
              interpret_formula config language const_map var_types type_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   619
               (Quant (Lambda, bindings, tptp_formula)) thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   620
            in ((HOLogic.choice_const Term.dummyT) $ t, thy') end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   621
        | Iota =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   622
            let val (t, thy') =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   623
              interpret_formula config language const_map var_types type_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   624
               (Quant (Lambda, bindings, tptp_formula)) thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   625
            in (Const (@{const_name The}, Term.dummyT) $ t, thy') end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   626
        | Dep_Prod =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   627
            raise MISINTERPRET_FORMULA ("Unsupported", tptp_fmla)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   628
        | Dep_Sum =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   629
            raise MISINTERPRET_FORMULA ("Unsupported", tptp_fmla)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   630
        end
47359
5a1ff6bcf3dc added interpretation for formula conditional;
sultana
parents: 47332
diff changeset
   631
    | Conditional (fmla1, fmla2, fmla3) =>
5a1ff6bcf3dc added interpretation for formula conditional;
sultana
parents: 47332
diff changeset
   632
        let
5a1ff6bcf3dc added interpretation for formula conditional;
sultana
parents: 47332
diff changeset
   633
          val interp = interpret_formula config language const_map var_types type_map
5a1ff6bcf3dc added interpretation for formula conditional;
sultana
parents: 47332
diff changeset
   634
          val (((fmla1', fmla2'), fmla3'), thy') =
5a1ff6bcf3dc added interpretation for formula conditional;
sultana
parents: 47332
diff changeset
   635
            interp fmla1 thy
5a1ff6bcf3dc added interpretation for formula conditional;
sultana
parents: 47332
diff changeset
   636
            ||>> interp fmla2
5a1ff6bcf3dc added interpretation for formula conditional;
sultana
parents: 47332
diff changeset
   637
            ||>> interp fmla3
5a1ff6bcf3dc added interpretation for formula conditional;
sultana
parents: 47332
diff changeset
   638
        in (HOLogic.mk_conj (HOLogic.mk_imp (fmla1', fmla2'),
5a1ff6bcf3dc added interpretation for formula conditional;
sultana
parents: 47332
diff changeset
   639
                             HOLogic.mk_imp (HOLogic.mk_not fmla1', fmla3')),
5a1ff6bcf3dc added interpretation for formula conditional;
sultana
parents: 47332
diff changeset
   640
            thy')
5a1ff6bcf3dc added interpretation for formula conditional;
sultana
parents: 47332
diff changeset
   641
        end
5a1ff6bcf3dc added interpretation for formula conditional;
sultana
parents: 47332
diff changeset
   642
    | Let (tptp_let_list, tptp_formula) => (*FIXME not yet implemented*)
5a1ff6bcf3dc added interpretation for formula conditional;
sultana
parents: 47332
diff changeset
   643
        raise MISINTERPRET_FORMULA ("'Let' not yet implemented", tptp_fmla)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   644
    | Atom tptp_atom =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   645
        (case tptp_atom of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   646
          TFF_Typed_Atom (symbol, tptp_type_opt) =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   647
            (*FIXME ignoring type info*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   648
            (interpret_symbol config thy language const_map symbol, thy)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   649
        | THF_Atom_term tptp_term =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   650
            interpret_term true config language thy const_map var_types
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   651
             type_map tptp_term
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   652
        | THF_Atom_conn_term symbol =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   653
            (interpret_symbol config thy language const_map symbol, thy))
47510
sultana
parents: 47411
diff changeset
   654
    | Type_fmla _ =>
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   655
         raise MISINTERPRET_FORMULA
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   656
          ("Cannot interpret types as formulas", tptp_fmla)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   657
    | THF_typing (tptp_formula, _) => (*FIXME ignoring type info*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   658
        interpret_formula config language
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   659
         const_map var_types type_map tptp_formula thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   660
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   661
(*Extract the type from a typing*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   662
local
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   663
  fun extract_type tptp_type =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   664
    case tptp_type of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   665
        Fmla_type typ => fmlatype_to_type typ
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   666
      | _ => tptp_type
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   667
in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   668
  fun typeof_typing (THF_typing (_, tptp_type)) = extract_type tptp_type
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   669
  fun typeof_tff_typing (Atom (TFF_Typed_Atom (_, SOME tptp_type))) =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   670
    extract_type tptp_type
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   671
end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   672
fun nameof_typing
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   673
  (THF_typing
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   674
     ((Atom (THF_Atom_term (Term_Func (Uninterpreted str, [])))), _)) = str
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   675
fun nameof_tff_typing (Atom (TFF_Typed_Atom (Uninterpreted str, _))) = str
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   676
47511
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   677
fun interpret_line config inc_list type_map const_map path_prefix line thy =
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   678
  case line of
47569
fce9d97a3258 exceptions related to interpreting tptp problems now mention the relevant position in the tptp file;
sultana
parents: 47558
diff changeset
   679
     Include (_, quoted_path, inc_list) =>
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   680
       interpret_file'
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   681
        config
47511
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   682
        inc_list
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   683
        path_prefix
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   684
        (Path.append
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   685
          path_prefix
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   686
          (quoted_path
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   687
           |> unenclose
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   688
           |> Path.explode))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   689
        type_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   690
        const_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   691
        thy
47569
fce9d97a3258 exceptions related to interpreting tptp problems now mention the relevant position in the tptp file;
sultana
parents: 47558
diff changeset
   692
   | Annotated_Formula (_, lang, label, role, tptp_formula, annotation_opt) =>
47511
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   693
       (*interpret a line only if "label" is in "inc_list", or if "inc_list" is
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   694
          empty (in which case interpret all lines)*)
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   695
       (*FIXME could work better if inc_list were sorted*)
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   696
       if null inc_list orelse is_some (List.find (fn x => x = label) inc_list) then
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   697
         case role of
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   698
           Role_Type =>
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   699
             let
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   700
               val thy_name = Context.theory_name thy
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   701
               val (tptp_ty, name) =
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   702
                 if lang = THF then
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   703
                   (typeof_typing tptp_formula (*assuming tptp_formula is a typing*),
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   704
                    nameof_typing tptp_formula (*and that the LHS is a (atom) name*))
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   705
                 else
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   706
                   (typeof_tff_typing tptp_formula,
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   707
                    nameof_tff_typing tptp_formula)
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   708
             in
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   709
               case tptp_ty of
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   710
                 Defined_type Type_Type => (*add new type*)
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   711
                   (*generate an Isabelle/HOL type to interpret this TPTP type,
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   712
                   and add it to both the Isabelle/HOL theory and to the type_map*)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   713
                    let
47511
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   714
                      val (type_map', thy') =
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   715
                        declare_type
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   716
                         config
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   717
                         (Atom_type name, name)
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   718
                         type_map
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   719
                         thy
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   720
                    in ((type_map',
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   721
                         const_map,
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   722
                         []),
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   723
                        thy')
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   724
                    end
47513
50a424b89952 improved naming of 'distinct objects' in tptp import
sultana
parents: 47511
diff changeset
   725
47511
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   726
               | _ => (*declaration of constant*)
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   727
                  (*Here we populate the map from constants to the Isabelle/HOL
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   728
                  terms they map to (which in turn contain their types).*)
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   729
                  let
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   730
                    val ty = interpret_type config thy type_map tptp_ty
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   731
                    (*make sure that the theory contains all the types appearing
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   732
                    in this constant's signature. Exception is thrown if encounter
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   733
                    an undeclared types.*)
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   734
                    val (t, thy') =
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   735
                      let
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   736
                        fun analyse_type thy thf_ty =
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   737
                           if #cautious config then
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   738
                            case thf_ty of
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   739
                               Fn_type (thf_ty1, thf_ty2) =>
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   740
                                 (analyse_type thy thf_ty1;
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   741
                                 analyse_type thy thf_ty2)
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   742
                             | Atom_type ty_name =>
47548
60849d8c457d fixed type interpretation;
sultana
parents: 47520
diff changeset
   743
                                 if type_exists config thy ty_name then ()
47511
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   744
                                 else
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   745
                                  raise MISINTERPRET_TYPE
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   746
                                   ("Type (in signature of " ^
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   747
                                      name ^ ") has not been declared",
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   748
                                     Atom_type ty_name)
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   749
                             | _ => ()
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   750
                           else () (*skip test if we're not being cautious.*)
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   751
                      in
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   752
                        analyse_type thy tptp_ty;
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   753
                        declare_constant config name ty thy
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   754
                      end
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   755
                    (*register a mapping from name to t. Constants' type
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   756
                    declarations should occur at most once, so it's justified to
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   757
                    use "::". Note that here we use a constant's name rather
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   758
                    than the possibly- new one, since all references in the
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   759
                    theory will be to this name.*)
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   760
                    val const_map' = ((name, t) :: const_map)
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   761
                  in ((type_map,(*type_map unchanged, since a constant's
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   762
                                  declaration shouldn't include any new types.*)
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   763
                       const_map',(*typing table of constant was extended*)
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   764
                       []),(*no formulas were interpreted*)
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   765
                      thy')(*theory was extended with new constant*)
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   766
                  end
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   767
             end
47513
50a424b89952 improved naming of 'distinct objects' in tptp import
sultana
parents: 47511
diff changeset
   768
47511
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   769
         | _ => (*i.e. the AF is not a type declaration*)
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   770
             let
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   771
               (*gather interpreted term, and the map of types occurring in that term*)
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   772
               val (t, thy') =
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   773
                 interpret_formula config lang
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   774
                  const_map [] type_map tptp_formula thy
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   775
                 |>> HOLogic.mk_Trueprop
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   776
               (*type_maps grow monotonically, so return the newest value (type_mapped);
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   777
               there's no need to unify it with the type_map parameter.*)
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   778
             in
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   779
              ((type_map, const_map,
47548
60849d8c457d fixed type interpretation;
sultana
parents: 47520
diff changeset
   780
                [(label, role,
47511
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   781
                  Syntax.check_term (Proof_Context.init_global thy') t,
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   782
                  TPTP_Proof.extract_inference_info annotation_opt)]), thy')
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   783
             end
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   784
       else (*do nothing if we're not to includ this AF*)
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   785
         ((type_map, const_map, []), thy)
47569
fce9d97a3258 exceptions related to interpreting tptp problems now mention the relevant position in the tptp file;
sultana
parents: 47558
diff changeset
   786
47519
9c3acd90063a simplified interpretation of '$i';
sultana
parents: 47515
diff changeset
   787
and interpret_problem config inc_list path_prefix lines type_map const_map thy =
47511
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   788
  let
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   789
    val thy_name = Context.theory_name thy
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   790
  in
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   791
    fold (fn line =>
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   792
           fn ((type_map, const_map, lines), thy) =>
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   793
             let
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   794
               (*process the line, ignoring the type-context for variables*)
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   795
               val ((type_map', const_map', l'), thy') =
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   796
                 interpret_line config inc_list type_map const_map path_prefix line thy
47569
fce9d97a3258 exceptions related to interpreting tptp problems now mention the relevant position in the tptp file;
sultana
parents: 47558
diff changeset
   797
                   handle
fce9d97a3258 exceptions related to interpreting tptp problems now mention the relevant position in the tptp file;
sultana
parents: 47558
diff changeset
   798
                     (*package all exceptions to include position information,
fce9d97a3258 exceptions related to interpreting tptp problems now mention the relevant position in the tptp file;
sultana
parents: 47558
diff changeset
   799
                       even relating to multiple levels of "include"ed files*)
fce9d97a3258 exceptions related to interpreting tptp problems now mention the relevant position in the tptp file;
sultana
parents: 47558
diff changeset
   800
                       (*FIXME "exn" contents may appear garbled due to markup
fce9d97a3258 exceptions related to interpreting tptp problems now mention the relevant position in the tptp file;
sultana
parents: 47558
diff changeset
   801
                         FIXME this appears as ML source position *)
fce9d97a3258 exceptions related to interpreting tptp problems now mention the relevant position in the tptp file;
sultana
parents: 47558
diff changeset
   802
                       MISINTERPRET (pos_list, exn)  =>
fce9d97a3258 exceptions related to interpreting tptp problems now mention the relevant position in the tptp file;
sultana
parents: 47558
diff changeset
   803
                         raise MISINTERPRET
fce9d97a3258 exceptions related to interpreting tptp problems now mention the relevant position in the tptp file;
sultana
parents: 47558
diff changeset
   804
                           (TPTP_Syntax.pos_of_line line :: pos_list, exn)
fce9d97a3258 exceptions related to interpreting tptp problems now mention the relevant position in the tptp file;
sultana
parents: 47558
diff changeset
   805
                     | exn => raise MISINTERPRET
fce9d97a3258 exceptions related to interpreting tptp problems now mention the relevant position in the tptp file;
sultana
parents: 47558
diff changeset
   806
                         ([TPTP_Syntax.pos_of_line line], exn)
47511
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   807
             in
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   808
               ((type_map',
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   809
                 const_map',
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   810
                 l' @ lines),(*append is sufficient, union would be overkill*)
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   811
                thy')
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   812
             end)
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   813
         lines (*lines of the problem file*)
47519
9c3acd90063a simplified interpretation of '$i';
sultana
parents: 47515
diff changeset
   814
         ((type_map, const_map, []), thy) (*initial values*)
47511
016ce79deb01 enforced 'include' restrictions
sultana
parents: 47510
diff changeset
   815
  end
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   816
47519
9c3acd90063a simplified interpretation of '$i';
sultana
parents: 47515
diff changeset
   817
and interpret_file' config inc_list path_prefix file_name =
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   818
  let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   819
    val file_name' = Path.expand file_name
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   820
  in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   821
    if Path.is_absolute file_name' then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   822
      Path.implode file_name
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   823
      |> TPTP_Parser.parse_file
47519
9c3acd90063a simplified interpretation of '$i';
sultana
parents: 47515
diff changeset
   824
      |> interpret_problem config inc_list path_prefix
47510
sultana
parents: 47411
diff changeset
   825
    else error "Could not determine absolute path to file"
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   826
  end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   827
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   828
and interpret_file cautious path_prefix file_name =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   829
  let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   830
    val config =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   831
      {cautious = cautious,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   832
       problem_name =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   833
        SOME (TPTP_Problem_Name.parse_problem_name ((Path.base #> Path.implode)
47520
ef2d04520337 improved exception-handling in tptp;
sultana
parents: 47519
diff changeset
   834
         file_name))}
47519
9c3acd90063a simplified interpretation of '$i';
sultana
parents: 47515
diff changeset
   835
  in interpret_file' config [] path_prefix file_name end
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   836
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   837
fun import_file cautious path_prefix file_name type_map const_map thy =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   838
  let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   839
    val prob_name =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   840
      TPTP_Problem_Name.parse_problem_name (Path.implode (Path.base file_name))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   841
    val (result, thy') =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   842
      interpret_file cautious path_prefix file_name type_map const_map thy
47520
ef2d04520337 improved exception-handling in tptp;
sultana
parents: 47519
diff changeset
   843
  (*FIXME doesn't check if problem has already been interpreted*)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   844
  in TPTP_Data.map (cons ((prob_name, result))) thy' end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   845
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   846
val _ =
46961
5c6955f487e5 outer syntax command definitions based on formal command_spec derived from theory header declarations;
wenzelm
parents: 46951
diff changeset
   847
  Outer_Syntax.improper_command @{command_spec "import_tptp"} "import TPTP problem"
46951
4e032ac36134 more precise TPTP keywords and dependencies;
wenzelm
parents: 46879
diff changeset
   848
    (Parse.path >> (fn path =>
47366
f5a304ca037e improved import_tptp to use standard TPTP directory structure; extended the TPTP testing theory to include an example of using the import_tptp command;
sultana
parents: 47360
diff changeset
   849
      Toplevel.theory (fn thy =>
47558
55b42f9af99d phase out "$TPTP_PROBLEMS_PATH"; prefer "$TPTP" for consistency with CASC setup
blanchet
parents: 47548
diff changeset
   850
       (*NOTE: assumes include files are located at $TPTP/Axioms
55b42f9af99d phase out "$TPTP_PROBLEMS_PATH"; prefer "$TPTP" for consistency with CASC setup
blanchet
parents: 47548
diff changeset
   851
         (which is how TPTP is organised)*)
55b42f9af99d phase out "$TPTP_PROBLEMS_PATH"; prefer "$TPTP" for consistency with CASC setup
blanchet
parents: 47548
diff changeset
   852
       import_file true (Path.explode "$TPTP") path [] [] thy)))
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   853
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   854
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   855
(*Used for debugging. Returns all files contained within a directory or its
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   856
subdirectories. Follows symbolic links, filters away directories.*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   857
fun get_file_list path =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   858
  let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   859
    fun check_file_entry f rest =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   860
      let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   861
        (*NOTE needed since don't have File.is_link and File.read_link*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   862
        val f_str = Path.implode f
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   863
      in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   864
        if File.is_dir f then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   865
          rest (*filter out directories*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   866
        else if OS.FileSys.isLink f_str then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   867
          (*follow links -- NOTE this breaks if links are relative paths*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   868
          check_file_entry (Path.explode (OS.FileSys.readLink f_str)) rest
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   869
        else f :: rest
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   870
      end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   871
  in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   872
    File.read_dir path
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   873
    |> map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   874
        (Path.explode
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   875
        #> Path.append path)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   876
    |> (fn l => fold check_file_entry l [])
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   877
  end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   878
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   879
end