src/HOL/TPTP/TPTP_Parser/tptp_interpret.ML
author sultana
Tue, 10 Apr 2012 06:45:15 +0100
changeset 47411 7df9a4f320a5
parent 47366 f5a304ca037e
child 47510 6062bc362a95
permissions -rw-r--r--
moved non-interpret-specific code to different module
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
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
     9
  (*signature extension: typing information for variables and constants
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    10
  (note that the former isn't really part of the signature, but it's bundled
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    11
  along for more configurability -- though it's probably useless and could be
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    12
  dropped in the future.*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    13
  type const_map = (string * term) list
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    14
  type var_types = (string * typ option) list
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    15
47360
sultana
parents: 47359
diff changeset
    16
  (*mapping from TPTP types to Isabelle/HOL types. This map works over all
sultana
parents: 47359
diff changeset
    17
  base types (i.e. TPTP functions must be interpreted as Isabelle/HOL functions).
sultana
parents: 47359
diff changeset
    18
  The map must be total wrt TPTP types. Later on there could be a configuration
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    19
  option to make a map extensible.*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    20
  type type_map = (TPTP_Syntax.tptp_type * typ) list
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    21
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    22
  (*inference info, when available, consists of the name of the inference rule
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    23
  and the names of the inferences involved in the reasoning step.*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    24
  type inference_info = (string * string list) option
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    25
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    26
  (*a parsed annotated formula is represented as a triple consisting of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    27
  the formula's label, its role, and a constant function to its Isabelle/HOL
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    28
  term meaning*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    29
  type tptp_formula_meaning =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    30
    string * TPTP_Syntax.role * TPTP_Syntax.tptp_formula * term * inference_info
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    31
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    32
  (*In general, the meaning of a TPTP statement (which, through the Include
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    33
  directive, may include the meaning of an entire TPTP file, is an extended
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    34
  Isabelle/HOL theory, an explicit map from constants to their Isabelle/HOL
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    35
  counterparts and their types, the meaning of any TPTP formulas encountered
47360
sultana
parents: 47359
diff changeset
    36
  while interpreting that statement, and a map from TPTP to Isabelle/HOL types
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    37
  (these types would have been added to the theory returned in the first position
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    38
  of the tuple). The last value is NONE when the function which produced the
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    39
  whole tptp_general_meaning value was given a type_map argument -- since
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    40
  this means that the type_map is already known, and it has not been changed.*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    41
  type tptp_general_meaning =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    42
    (type_map * const_map * tptp_formula_meaning list)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    43
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    44
  (*if problem_name is given then it is used to qualify types & constants*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    45
  type config =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    46
    {(*init_type_map : type_map with_origin,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    47
     init_const_map : type_map with_origin,*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    48
     cautious : bool,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    49
     problem_name : TPTP_Problem_Name.problem_name option
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    50
     (*dont_build_maps : bool,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    51
     extend_given_type_map : bool,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    52
     extend_given_const_map : bool,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    53
     generative_type_interpretation : bool,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    54
     generative_const_interpretation : bool*)}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    55
47360
sultana
parents: 47359
diff changeset
    56
  (*map types form TPTP to Isabelle/HOL*)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    57
  val interpret_type : config -> theory -> type_map ->
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    58
    TPTP_Syntax.tptp_type -> typ
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    59
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    60
  (*interpret a TPTP line: return an updated theory including the
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    61
  types & constants which were specified in that formula, a map from
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    62
  constant names to their types, and a map from constant names to Isabelle/HOL
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    63
  constants; and a list possible formulas resulting from that line.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    64
  Note that type/constant declarations do not result in any formulas being
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    65
  returned. A typical TPTP line might update the theory, or return a single
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    66
  formula. The sole exception is the "include" directive which may update the
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    67
  theory and also return a list of formulas from the included file.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    68
  Arguments:
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    69
    cautious = indicates whether additional checks are made to check
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    70
      that all used types have been declared.
47360
sultana
parents: 47359
diff changeset
    71
    type_map = mapping of TPTP-types to Isabelle/HOL types. This argument may be
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    72
      given to force a specific mapping: this is usually done for using an
47360
sultana
parents: 47359
diff changeset
    73
      imported TPTP problem in Isar.
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    74
    const_map = as previous, but for constants.
47360
sultana
parents: 47359
diff changeset
    75
    path_prefix = path where TPTP problems etc are located (to help the "include"
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    76
      directive find the files.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    77
    thy = theory where interpreted info will be stored.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    78
  *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    79
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    80
  (*map terms form TPTP to Isabelle/HOL*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    81
  val interpret_term : bool -> config -> TPTP_Syntax.language -> theory ->
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    82
    const_map -> var_types -> type_map -> TPTP_Syntax.tptp_term ->
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    83
    term * theory
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    84
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    85
  val interpret_formula : config -> TPTP_Syntax.language -> const_map ->
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    86
    var_types -> type_map -> TPTP_Syntax.tptp_formula -> theory ->
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    87
    term * theory
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    88
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    89
  val interpret_line : config -> type_map -> const_map ->
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    90
    Path.T -> TPTP_Syntax.tptp_line -> theory -> tptp_general_meaning * theory
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    91
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    92
  (*Like "interpret_line" above, but works over a whole parsed problem.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    93
    Arguments:
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    94
      new_basic_types = indicates whether interpretations of $i and $o
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    95
        types are to be added to the type map (unless it is Given).
47360
sultana
parents: 47359
diff changeset
    96
        This is "true" if we are running this over a fresh TPTP problem, but
sultana
parents: 47359
diff changeset
    97
        "false" if we are calling this _during_ the interpretation of a TPTP file
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    98
        (i.e. when interpreting an "include" directive.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
    99
      config = config
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   100
      path_prefix = " "
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   101
      contents = parsed TPTP syntax
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   102
      type_map = see "interpret_line"
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   103
      const_map = " "
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   104
      thy = " "
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   105
  *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   106
  val interpret_problem : bool -> config -> Path.T ->
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   107
    TPTP_Syntax.tptp_line list -> type_map -> const_map -> theory ->
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   108
    tptp_general_meaning * theory
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   109
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   110
  (*Like "interpret_problem" above, but it's given a filename rather than
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   111
  a parsed problem.*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   112
  val interpret_file : bool -> Path.T -> Path.T -> type_map -> const_map ->
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   113
    theory -> tptp_general_meaning * theory
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   114
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   115
  (*General exception for this signature.*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   116
  exception MISINTERPRET_FORMULA of string * TPTP_Syntax.tptp_formula
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   117
  exception MISINTERPRET_SYMBOL of string * TPTP_Syntax.symbol
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   118
  exception MISINTERPRET_TERM of string * TPTP_Syntax.tptp_term
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   119
  exception MISINTERPRET_TYPE of string * TPTP_Syntax.tptp_type
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   120
47360
sultana
parents: 47359
diff changeset
   121
  (*Generates a fresh Isabelle/HOL type for interpreting a TPTP type in a theory.*)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   122
  val declare_type : config -> (TPTP_Syntax.tptp_type * string) -> type_map ->
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   123
    theory -> type_map * theory
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   124
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   125
  (*Returns the list of all files included in a directory and its
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   126
  subdirectories. This is only used for testing the parser/interpreter against
47360
sultana
parents: 47359
diff changeset
   127
  all TPTP problems.*)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   128
  val get_file_list : Path.T -> Path.T list
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   129
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   130
  type manifest = TPTP_Problem_Name.problem_name * tptp_general_meaning
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   131
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   132
  val get_manifests : theory -> manifest list
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   133
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   134
  val import_file : bool -> Path.T -> Path.T -> type_map -> const_map ->
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   135
    theory -> theory
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   136
end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   137
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   138
structure TPTP_Interpret : TPTP_INTERPRET =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   139
struct
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   140
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   141
open TPTP_Syntax
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   142
exception MISINTERPRET_FORMULA of string * TPTP_Syntax.tptp_formula
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   143
exception MISINTERPRET_SYMBOL of string * TPTP_Syntax.symbol
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   144
exception MISINTERPRET_TERM of string * TPTP_Syntax.tptp_term
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   145
exception MISINTERPRET_TYPE of string * TPTP_Syntax.tptp_type
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   146
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   147
(* General stuff *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   148
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   149
type config =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   150
  {(*init_type_map : type_map with_origin,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   151
   init_const_map : type_map with_origin,*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   152
   cautious : bool,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   153
   problem_name : TPTP_Problem_Name.problem_name option
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   154
   (*dont_build_maps : bool,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   155
   extend_given_type_map : bool,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   156
   extend_given_const_map : bool,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   157
   generative_type_interpretation : bool,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   158
   generative_const_interpretation : bool*)}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   159
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   160
(* Interpretation *)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   161
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   162
(** Signatures and other type abbrevations **)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   163
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   164
type const_map = (string * term) list
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   165
type var_types = (string * typ option) list
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   166
type type_map = (TPTP_Syntax.tptp_type * typ) list
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   167
type inference_info = (string * string list) option
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   168
type tptp_formula_meaning =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   169
  string * TPTP_Syntax.role * TPTP_Syntax.tptp_formula * term * inference_info
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   170
type tptp_general_meaning =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   171
  (type_map * const_map * tptp_formula_meaning list)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   172
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   173
type manifest = TPTP_Problem_Name.problem_name * tptp_general_meaning
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   174
structure TPTP_Data = Theory_Data
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   175
  (type T = manifest list
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   176
   val empty = []
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   177
   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
   178
   (*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
   179
   fun merge v = Library.merge (op =) v)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   180
val get_manifests = TPTP_Data.get
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   181
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   182
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   183
(** Adding types to a signature **)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   184
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   185
fun type_exists thy ty_name =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   186
  Sign.declared_tyname thy (Sign.full_bname thy ty_name)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   187
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   188
val IND_TYPE = "ind"
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   189
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
   190
(*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
   191
fun mk_binding (config : config) ident =
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   192
  let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   193
    val pre_binding = Binding.name ident
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   194
  in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   195
    case #problem_name config of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   196
      NONE => pre_binding
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   197
    | SOME prob =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   198
        Binding.qualify
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   199
         false
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   200
         (TPTP_Problem_Name.mangle_problem_name prob)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   201
         pre_binding
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   202
  end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   203
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   204
(*Returns updated theory and the name of the final type's name -- i.e. if the
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   205
original name is already taken then the function looks for an available
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   206
alternative. It also returns an updated type_map if one has been passed to it.*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   207
fun declare_type (config : config) (thf_type, type_name) ty_map thy =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   208
  if type_exists thy type_name then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   209
    raise MISINTERPRET_TYPE ("Type already exists", Atom_type type_name)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   210
  else
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   211
    let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   212
      val binding = mk_binding config type_name
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   213
      val final_fqn = Sign.full_name thy binding
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   214
      val thy' = Typedecl.typedecl_global (mk_binding config type_name, [], NoSyn) thy |> snd
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   215
      val typ_map_entry = (thf_type, (Type (final_fqn, [])))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   216
      val ty_map' = typ_map_entry :: ty_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   217
    in (ty_map', thy') end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   218
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   219
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   220
(** Adding constants to signature **)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   221
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   222
fun full_name thy config const_name =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   223
  Sign.full_name thy (mk_binding config const_name)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   224
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   225
fun const_exists config thy const_name =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   226
  Sign.declared_const thy (full_name thy config const_name)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   227
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   228
fun declare_constant config const_name ty thy =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   229
  if const_exists config thy const_name then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   230
    raise MISINTERPRET_TERM
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   231
     ("Const already declared", Term_Func (Uninterpreted const_name, []))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   232
  else
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   233
    Theory.specify_const
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   234
     ((mk_binding config const_name, ty), NoSyn) thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   235
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   236
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   237
(** Interpretation **)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   238
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   239
(*Types in THF are encoded as formulas. This function translates them to type form.*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   240
(*FIXME possibly incomplete hack*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   241
fun fmlatype_to_type (Atom (THF_Atom_term (Term_Func (TypeSymbol typ, [])))) =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   242
      Defined_type typ
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   243
  | fmlatype_to_type (Atom (THF_Atom_term (Term_Func (Uninterpreted str, [])))) =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   244
      Atom_type str
47360
sultana
parents: 47359
diff changeset
   245
  | fmlatype_to_type (Type_fmla (Fn_type (ty1, ty2))) =
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   246
      let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   247
        val ty1' = case ty1 of
47360
sultana
parents: 47359
diff changeset
   248
            Fn_type _ => fmlatype_to_type (Type_fmla ty1)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   249
          | Fmla_type ty1 => fmlatype_to_type ty1
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   250
        val ty2' = case ty2 of
47360
sultana
parents: 47359
diff changeset
   251
            Fn_type _ => fmlatype_to_type (Type_fmla ty2)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   252
          | Fmla_type ty2 => fmlatype_to_type ty2
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   253
      in Fn_type (ty1', ty2') end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   254
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   255
fun interpret_type config thy type_map thf_ty =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   256
  let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   257
    fun lookup_type ty_map thf_ty =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   258
      (case AList.lookup (op =) ty_map thf_ty of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   259
          NONE =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   260
            raise MISINTERPRET_TYPE
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   261
              ("Could not find the interpretation of this TPTP type in the " ^
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   262
               "mapping to Isabelle/HOL", thf_ty)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   263
        | SOME ty => ty)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   264
  in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   265
    case thf_ty of (*FIXME make tail*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   266
       Prod_type (thf_ty1, thf_ty2) =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   267
         Type ("Product_Type.prod",
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   268
          [interpret_type config thy type_map thf_ty1,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   269
           interpret_type config thy type_map thf_ty2])
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   270
     | Fn_type (thf_ty1, thf_ty2) =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   271
         Type ("fun",
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   272
          [interpret_type config thy type_map thf_ty1,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   273
           interpret_type config thy type_map thf_ty2])
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   274
     | Atom_type _ =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   275
         lookup_type type_map thf_ty
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   276
     | Defined_type tptp_base_type =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   277
         (case tptp_base_type of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   278
            Type_Ind =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   279
              lookup_type type_map thf_ty
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   280
          | Type_Bool => HOLogic.boolT
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   281
          | Type_Type =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   282
              raise MISINTERPRET_TYPE
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   283
               ("No type interpretation", thf_ty)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   284
          | Type_Int => Type ("Int.int", [])
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   285
         (*FIXME these types are currently unsupported, so they're treated as
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   286
         individuals*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   287
          | Type_Rat =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   288
              interpret_type config thy type_map (Defined_type Type_Ind)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   289
          | Type_Real =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   290
              interpret_type config thy type_map (Defined_type Type_Ind)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   291
          )
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   292
     | Sum_type _ =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   293
         raise MISINTERPRET_TYPE (*FIXME*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   294
          ("No type interpretation (sum type)", thf_ty)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   295
     | Fmla_type tptp_ty =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   296
        fmlatype_to_type tptp_ty
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   297
        |> interpret_type config thy type_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   298
     | Subtype _ =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   299
         raise MISINTERPRET_TYPE (*FIXME*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   300
          ("No type interpretation (subtype)", thf_ty)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   301
  end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   302
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   303
fun the_const config thy language const_map_payload str =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   304
  if language = THF then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   305
    (case AList.lookup (op =) const_map_payload str of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   306
        NONE => raise MISINTERPRET_TERM
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   307
          ("Could not find the interpretation of this constant in the " ^
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   308
          "mapping to Isabelle/HOL", Term_Func (Uninterpreted str, []))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   309
      | SOME t => t)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   310
  else
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   311
    if const_exists config thy str then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   312
       Sign.mk_const thy ((Sign.full_name thy (mk_binding config str)), [])
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   313
    else raise MISINTERPRET_TERM
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   314
          ("Could not find the interpretation of this constant in the " ^
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   315
          "mapping to Isabelle/HOL: ", Term_Func (Uninterpreted str, []))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   316
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   317
(*Eta-expands Isabelle/HOL binary function.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   318
 "str" is the name of a polymorphic constant in Isabelle/HOL*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   319
fun mk_fun str =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   320
  (Const (str, Term.dummyT) $ Bound 1 $ Bound 0)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   321
   |> (Term.absdummy Term.dummyT #> Term.absdummy Term.dummyT)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   322
(*As above, but swaps the function's arguments*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   323
fun mk_swapped_fun str =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   324
  (Const (str, Term.dummyT) $ Bound 0 $ Bound 1)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   325
   |> (Term.absdummy Term.dummyT #> Term.absdummy Term.dummyT)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   326
47360
sultana
parents: 47359
diff changeset
   327
fun dummy_term () =
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   328
  HOLogic.choice_const Term.dummyT $ Term.absdummy Term.dummyT @{term "True"}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   329
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   330
fun interpret_symbol config thy language const_map symb =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   331
  case symb of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   332
     Uninterpreted n =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   333
       (*Constant would have been added to the map at the time of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   334
       declaration*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   335
       the_const config thy language const_map n
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   336
   | Interpreted_ExtraLogic interpreted_symbol =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   337
       (case interpreted_symbol of (*FIXME incomplete,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   338
                                     and doesn't work with $i*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   339
          Sum => mk_fun @{const_name Groups.plus}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   340
        | UMinus =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   341
            (Const (@{const_name Groups.uminus}, Term.dummyT) $ Bound 0)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   342
             |> Term.absdummy Term.dummyT
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   343
        | Difference => mk_fun @{const_name Groups.minus}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   344
        | Product => mk_fun @{const_name Groups.times}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   345
        | Quotient => mk_fun @{const_name Fields.divide}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   346
        | Less => mk_fun @{const_name Orderings.less}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   347
        | LessEq => mk_fun @{const_name Orderings.less_eq}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   348
        | Greater => mk_swapped_fun @{const_name Orderings.less}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   349
          (*FIXME would be nicer to expand "greater"
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   350
            and "greater_eq" abbreviations*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   351
        | GreaterEq => mk_swapped_fun @{const_name Orderings.less_eq}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   352
        (* FIXME todo
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   353
        | Quotient_E | Quotient_T | Quotient_F | Remainder_E | Remainder_T
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   354
        | Remainder_F | Floor | Ceiling | Truncate | Round | To_Int | To_Rat
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   355
        | To_Real | EvalEq | Is_Int | Is_Rat*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   356
        | Apply => raise MISINTERPRET_SYMBOL ("Malformed term?", symb)
47360
sultana
parents: 47359
diff changeset
   357
        | _ => dummy_term ()
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   358
        )
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   359
   | Interpreted_Logic logic_symbol =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   360
       (case logic_symbol of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   361
          Equals => HOLogic.eq_const Term.dummyT
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   362
        | NEquals =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   363
           HOLogic.mk_not (HOLogic.eq_const Term.dummyT $ Bound 1 $ Bound 0)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   364
           |> (Term.absdummy Term.dummyT #> Term.absdummy Term.dummyT)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   365
        | Or => HOLogic.disj
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   366
        | And => HOLogic.conj
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   367
        | Iff => HOLogic.eq_const HOLogic.boolT
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   368
        | If => HOLogic.imp
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   369
        | Fi => @{term "\<lambda> x. \<lambda> y. y \<longrightarrow> x"}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   370
        | Xor =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   371
            @{term
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   372
              "\<lambda> x. \<lambda> y. \<not> (x \<longleftrightarrow> y)"}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   373
        | Nor => @{term "\<lambda> x. \<lambda> y. \<not> (x \<or> y)"}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   374
        | Nand => @{term "\<lambda> x. \<lambda> y. \<not> (x \<and> y)"}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   375
        | Not => HOLogic.Not
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   376
        | Op_Forall => HOLogic.all_const Term.dummyT
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   377
        | Op_Exists => HOLogic.exists_const Term.dummyT
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   378
        | True => @{term "True"}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   379
        | False => @{term "False"}
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   380
        )
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   381
   | TypeSymbol _ =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   382
       raise MISINTERPRET_SYMBOL
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   383
        ("Cannot have TypeSymbol in term", symb)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   384
   | System str =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   385
       raise MISINTERPRET_SYMBOL
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   386
        ("How to interpret system terms?", symb)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   387
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   388
(*Apply a function to a list of arguments*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   389
val mapply = fold (fn x => fn y => y $ x)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   390
(*As above, but for products*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   391
fun mtimes thy =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   392
  fold (fn x => fn y =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   393
    Sign.mk_const thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   394
    ("Product_Type.Pair",[Term.dummyT, Term.dummyT]) $ y $ x)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   395
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   396
(*Adds constants to signature in FOL. "formula_level" means that the constants
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   397
are to be interpreted as predicates, otherwise as functions over individuals.*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   398
fun FO_const_types config formula_level type_map tptp_t thy =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   399
  let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   400
    val ind_type = interpret_type config thy type_map (Defined_type Type_Ind)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   401
    val value_type =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   402
      if formula_level then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   403
        interpret_type config thy type_map (Defined_type Type_Bool)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   404
      else ind_type
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   405
  in case tptp_t of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   406
      Term_Func (symb, tptp_ts) =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   407
        let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   408
          val thy' = fold (FO_const_types config false type_map) tptp_ts thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   409
          val ty = fold (fn ty1 => fn ty2 => Type ("fun", [ty1, ty2]))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   410
            (map (fn _ => ind_type) tptp_ts) value_type
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   411
        in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   412
          case symb of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   413
             Uninterpreted const_name =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   414
                 if const_exists config thy' const_name then thy'
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   415
                 else snd (declare_constant config const_name ty thy')
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   416
           | _ => thy'
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   417
        end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   418
     | _ => thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   419
  end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   420
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   421
(*like FO_const_types but works over symbols*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   422
fun symb_const_types config type_map formula_level const_name n_args thy =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   423
  let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   424
    val ind_type = interpret_type config thy type_map (Defined_type Type_Ind)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   425
    val value_type =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   426
      if formula_level then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   427
        interpret_type config thy type_map (Defined_type Type_Bool)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   428
      else interpret_type config thy type_map (Defined_type Type_Ind)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   429
    fun mk_i_fun b n acc =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   430
      if n = 0 then acc b
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   431
      else
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   432
        mk_i_fun b (n - 1) (fn ty => Type ("fun", [ind_type, acc ty]))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   433
  in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   434
    if const_exists config thy const_name then thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   435
    else
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   436
      snd (declare_constant config const_name
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   437
           (mk_i_fun value_type n_args I) thy)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   438
  end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   439
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   440
(*Next batch of functions give info about Isabelle/HOL types*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   441
fun is_fun (Type ("fun", _)) = true
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   442
  | is_fun _ = false
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   443
fun is_prod (Type ("Product_Type.prod", _)) = true
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   444
  | is_prod _ = false
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   445
fun dom_type (Type ("fun", [ty1, _])) = ty1
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   446
fun is_prod_typed thy config symb =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   447
  let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   448
    fun symb_type const_name =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   449
      Sign.the_const_type thy (full_name thy config const_name)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   450
  in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   451
    case symb of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   452
       Uninterpreted const_name =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   453
         if is_fun (symb_type const_name) then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   454
           symb_type const_name |> dom_type |> is_prod
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   455
         else false
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   456
     | _ => false
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   457
   end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   458
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   459
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   460
(*
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   461
 Information needed to be carried around:
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   462
 - constant mapping: maps constant names to Isabelle terms with fully-qualified
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   463
    names. This is fixed, and it is determined by declaration lines earlier
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   464
    in the script (i.e. constants must be declared before appearing in terms.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   465
 - type context: maps bound variables to their Isabelle type. This is discarded
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   466
    after each call of interpret_term since variables' can't be bound across
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   467
    terms.
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   468
*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   469
fun interpret_term formula_level config language thy const_map var_types type_map tptp_t =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   470
  case tptp_t of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   471
    Term_Func (symb, tptp_ts) =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   472
       let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   473
         val thy' = FO_const_types config formula_level type_map tptp_t thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   474
         fun typeof_const const_name = Sign.the_const_type thy'
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   475
             (Sign.full_name thy' (mk_binding config const_name))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   476
       in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   477
         case symb of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   478
           Interpreted_ExtraLogic Apply =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   479
             (*apply the head of the argument list to the tail*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   480
             (mapply
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   481
               (map (interpret_term false config language thy' const_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   482
                var_types type_map #> fst) (tl tptp_ts))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   483
               (interpret_term formula_level config language thy' const_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   484
                var_types type_map (hd tptp_ts) |> fst),
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   485
              thy')
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   486
           | _ =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   487
              (*apply symb to tptp_ts*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   488
              if is_prod_typed thy' config symb then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   489
                (interpret_symbol config thy' language const_map symb $
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   490
                  mtimes thy'
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   491
                  (map (interpret_term false config language thy' const_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   492
                   var_types type_map #> fst) (tl tptp_ts))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   493
                  ((interpret_term false config language thy' const_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   494
                   var_types type_map #> fst) (hd tptp_ts)),
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   495
                 thy')
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   496
              else
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   497
                (mapply
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   498
                  (map (interpret_term false config language thy' const_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   499
                   var_types type_map #> fst) tptp_ts)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   500
                  (interpret_symbol config thy' language const_map symb),
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   501
                 thy')
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   502
       end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   503
  | Term_Var n =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   504
     (if language = THF orelse language = TFF then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   505
        (case AList.lookup (op =) var_types n of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   506
           SOME ty =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   507
             (case ty of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   508
                SOME ty => Free (n, ty)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   509
              | NONE => Free (n, Term.dummyT) (*to infer the variable's type*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   510
             )
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   511
         | NONE =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   512
             raise MISINTERPRET_TERM ("Could not type variable", tptp_t))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   513
      else (*variables range over individuals*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   514
        Free (n, interpret_type config thy type_map (Defined_type Type_Ind)),
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   515
      thy)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   516
  | Term_Conditional (tptp_formula, tptp_t1, tptp_t2) =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   517
      (mk_fun @{const_name If}, thy)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   518
  | Term_Num (number_kind, num) =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   519
      let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   520
        val num_term =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   521
          if number_kind = Int_num then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   522
            HOLogic.mk_number @{typ "int"} (the (Int.fromString num))
47360
sultana
parents: 47359
diff changeset
   523
          else dummy_term () (*FIXME: not yet supporting rationals and reals*)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   524
      in (num_term, thy) end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   525
  | Term_Distinct_Object str =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   526
      let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   527
        fun alphanumerate c =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   528
          let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   529
            val c' = ord c
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   530
            val out_of_range =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   531
              ((c' > 64) andalso (c' < 91)) orelse ((c' > 96)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   532
               andalso (c' < 123)) orelse ((c' > 47) andalso (c' < 58))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   533
          in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   534
            if (not out_of_range) andalso (not (c = "_")) then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   535
              "_nom_" ^ Int.toString (ord c) ^ "_"
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   536
            else c
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   537
          end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   538
        val mangle_name = raw_explode #> map alphanumerate #> implode
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   539
      in declare_constant config (mangle_name str)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   540
          (interpret_type config thy type_map (Defined_type Type_Ind)) thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   541
      end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   542
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   543
(*Given a list of "'a option", then applies a function to each element if that
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   544
element is SOME value, otherwise it leaves it as NONE.*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   545
fun map_opt f xs =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   546
  fold
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   547
  (fn x => fn y =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   548
    (if Option.isSome x then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   549
       SOME (f (Option.valOf x))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   550
     else NONE) :: y
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   551
  ) xs []
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   552
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   553
fun interpret_formula config language const_map var_types type_map tptp_fmla thy =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   554
  case tptp_fmla of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   555
      Pred app =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   556
        interpret_term true config language thy const_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   557
         var_types type_map (Term_Func app)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   558
    | Fmla (symbol, tptp_formulas) =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   559
       (case symbol of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   560
          Interpreted_ExtraLogic Apply =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   561
            let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   562
              val (args, thy') = (fold_map (interpret_formula config language
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   563
               const_map var_types type_map) (tl tptp_formulas) thy)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   564
              val (func, thy') = interpret_formula config language const_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   565
               var_types type_map (hd tptp_formulas) thy'
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   566
            in (mapply args func, thy') end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   567
        | Uninterpreted const_name =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   568
            let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   569
              val (args, thy') = (fold_map (interpret_formula config language
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   570
               const_map var_types type_map) tptp_formulas thy)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   571
              val thy' = symb_const_types config type_map true const_name
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   572
               (length tptp_formulas) thy'
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   573
            in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   574
              (if is_prod_typed thy' config symbol then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   575
                 mtimes thy' args (interpret_symbol config thy' language
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   576
                  const_map symbol)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   577
               else
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   578
                mapply args
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   579
                 (interpret_symbol config thy' language const_map symbol),
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   580
              thy')
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   581
            end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   582
        | _ =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   583
            let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   584
              val (args, thy') =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   585
                fold_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   586
                 (interpret_formula config language
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   587
                  const_map var_types type_map)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   588
                 tptp_formulas thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   589
            in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   590
              (if is_prod_typed thy' config symbol then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   591
                 mtimes thy' args (interpret_symbol config thy' language
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   592
                  const_map symbol)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   593
               else
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   594
                 mapply args
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   595
                  (interpret_symbol config thy' language const_map symbol),
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   596
               thy')
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   597
            end)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   598
    | Sequent _ =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   599
        raise MISINTERPRET_FORMULA ("Sequent", tptp_fmla) (*FIXME unsupported*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   600
    | Quant (quantifier, bindings, tptp_formula) =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   601
        let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   602
          val (bound_vars, bound_var_types) = ListPair.unzip bindings
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   603
          val bound_var_types' : typ option list =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   604
            (map_opt : (tptp_type -> typ) -> (tptp_type option list) -> typ option list)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   605
            (interpret_type config thy type_map) bound_var_types
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   606
          val var_types' =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   607
            ListPair.zip (bound_vars, List.rev bound_var_types')
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   608
            |> List.rev
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   609
          fun fold_bind f =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   610
            fold
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   611
              (fn (n, ty) => fn t =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   612
                 case ty of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   613
                   NONE =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   614
                     f (n,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   615
                        if language = THF then Term.dummyT
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   616
                        else
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   617
                          interpret_type config thy type_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   618
                           (Defined_type Type_Ind),
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   619
                        t)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   620
                 | SOME ty => f (n, ty, t)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   621
              )
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   622
              var_types'
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   623
        in case quantifier of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   624
          Forall =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   625
            interpret_formula config language const_map (var_types' @ var_types)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   626
             type_map tptp_formula thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   627
            |>> fold_bind HOLogic.mk_all
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   628
        | Exists =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   629
            interpret_formula config language const_map (var_types' @ var_types)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   630
             type_map tptp_formula thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   631
            |>> fold_bind HOLogic.mk_exists
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   632
        | Lambda =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   633
            interpret_formula config language const_map (var_types' @ var_types)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   634
             type_map tptp_formula thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   635
            |>> fold_bind (fn (n, ty, rest) => lambda (Free (n, ty)) rest)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   636
        | Epsilon =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   637
            let val (t, thy') =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   638
              interpret_formula config language const_map var_types type_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   639
               (Quant (Lambda, bindings, tptp_formula)) thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   640
            in ((HOLogic.choice_const Term.dummyT) $ t, thy') end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   641
        | Iota =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   642
            let val (t, thy') =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   643
              interpret_formula config language const_map var_types type_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   644
               (Quant (Lambda, bindings, tptp_formula)) thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   645
            in (Const (@{const_name The}, Term.dummyT) $ t, thy') end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   646
        | Dep_Prod =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   647
            raise MISINTERPRET_FORMULA ("Unsupported", tptp_fmla)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   648
        | Dep_Sum =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   649
            raise MISINTERPRET_FORMULA ("Unsupported", tptp_fmla)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   650
        end
47359
5a1ff6bcf3dc added interpretation for formula conditional;
sultana
parents: 47332
diff changeset
   651
    | Conditional (fmla1, fmla2, fmla3) =>
5a1ff6bcf3dc added interpretation for formula conditional;
sultana
parents: 47332
diff changeset
   652
        let
5a1ff6bcf3dc added interpretation for formula conditional;
sultana
parents: 47332
diff changeset
   653
          val interp = interpret_formula config language const_map var_types type_map
5a1ff6bcf3dc added interpretation for formula conditional;
sultana
parents: 47332
diff changeset
   654
          val (((fmla1', fmla2'), fmla3'), thy') =
5a1ff6bcf3dc added interpretation for formula conditional;
sultana
parents: 47332
diff changeset
   655
            interp fmla1 thy
5a1ff6bcf3dc added interpretation for formula conditional;
sultana
parents: 47332
diff changeset
   656
            ||>> interp fmla2
5a1ff6bcf3dc added interpretation for formula conditional;
sultana
parents: 47332
diff changeset
   657
            ||>> interp fmla3
5a1ff6bcf3dc added interpretation for formula conditional;
sultana
parents: 47332
diff changeset
   658
        in (HOLogic.mk_conj (HOLogic.mk_imp (fmla1', fmla2'),
5a1ff6bcf3dc added interpretation for formula conditional;
sultana
parents: 47332
diff changeset
   659
                             HOLogic.mk_imp (HOLogic.mk_not fmla1', fmla3')),
5a1ff6bcf3dc added interpretation for formula conditional;
sultana
parents: 47332
diff changeset
   660
            thy')
5a1ff6bcf3dc added interpretation for formula conditional;
sultana
parents: 47332
diff changeset
   661
        end
5a1ff6bcf3dc added interpretation for formula conditional;
sultana
parents: 47332
diff changeset
   662
    | Let (tptp_let_list, tptp_formula) => (*FIXME not yet implemented*)
5a1ff6bcf3dc added interpretation for formula conditional;
sultana
parents: 47332
diff changeset
   663
        raise MISINTERPRET_FORMULA ("'Let' not yet implemented", tptp_fmla)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   664
    | Atom tptp_atom =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   665
        (case tptp_atom of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   666
          TFF_Typed_Atom (symbol, tptp_type_opt) =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   667
            (*FIXME ignoring type info*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   668
            (interpret_symbol config thy language const_map symbol, thy)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   669
        | THF_Atom_term tptp_term =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   670
            interpret_term true config language thy const_map var_types
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   671
             type_map tptp_term
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   672
        | THF_Atom_conn_term symbol =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   673
            (interpret_symbol config thy language const_map symbol, thy))
47360
sultana
parents: 47359
diff changeset
   674
    | Type_fmla _ => (*FIXME unsupported*)
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   675
         raise MISINTERPRET_FORMULA
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   676
          ("Cannot interpret types as formulas", tptp_fmla)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   677
    | THF_typing (tptp_formula, _) => (*FIXME ignoring type info*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   678
        interpret_formula config language
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   679
         const_map var_types type_map tptp_formula thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   680
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   681
(*Extract the type from a typing*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   682
local
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   683
  fun extract_type tptp_type =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   684
    case tptp_type of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   685
        Fmla_type typ => fmlatype_to_type typ
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   686
      | _ => tptp_type
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   687
in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   688
  fun typeof_typing (THF_typing (_, tptp_type)) = extract_type tptp_type
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   689
  fun typeof_tff_typing (Atom (TFF_Typed_Atom (_, SOME tptp_type))) =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   690
    extract_type tptp_type
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   691
end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   692
fun nameof_typing
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   693
  (THF_typing
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   694
     ((Atom (THF_Atom_term (Term_Func (Uninterpreted str, [])))), _)) = str
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   695
fun nameof_tff_typing (Atom (TFF_Typed_Atom (Uninterpreted str, _))) = str
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   696
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   697
fun interpret_line config type_map const_map path_prefix line thy =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   698
  case line of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   699
     Include (quoted_path, _) => (*FIXME currently everything is imported*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   700
       interpret_file'
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   701
        false
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   702
        config
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   703
        path_prefix
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   704
        (Path.append
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   705
          path_prefix
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   706
          (quoted_path
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   707
           |> unenclose
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   708
           |> Path.explode))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   709
        type_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   710
        const_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   711
        thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   712
   | Annotated_Formula (pos, lang, label, role, tptp_formula, annotation_opt) =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   713
       case role of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   714
         Role_Type =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   715
           let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   716
             val thy_name = Context.theory_name thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   717
             val (tptp_ty, name) =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   718
               if lang = THF then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   719
                 (typeof_typing tptp_formula (*assuming tptp_formula is a typing*),
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   720
                  nameof_typing tptp_formula (*and that the LHS is a (atom) name*))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   721
               else
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   722
                 (typeof_tff_typing tptp_formula,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   723
                  nameof_tff_typing tptp_formula)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   724
           in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   725
             case tptp_ty of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   726
               Defined_type Type_Type => (*add new type*)
47360
sultana
parents: 47359
diff changeset
   727
                 (*generate an Isabelle/HOL type to interpret this TPTP type,
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   728
                 and add it to both the Isabelle/HOL theory and to the type_map*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   729
                  let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   730
                    val (type_map', thy') =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   731
                      declare_type
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   732
                       config
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   733
                       (Atom_type name, name)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   734
                       type_map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   735
                       thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   736
                  in ((type_map',
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   737
                       const_map,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   738
                       []),
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   739
                      thy')
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   740
                  end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   741
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   742
             | _ => (*declaration of constant*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   743
                (*Here we populate the map from constants to the Isabelle/HOL
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   744
                terms they map to (which in turn contain their types).*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   745
                let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   746
                  val ty = interpret_type config thy type_map tptp_ty
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   747
                  (*make sure that the theory contains all the types appearing
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   748
                  in this constant's signature. Exception is thrown if encounter
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   749
                  an undeclared types.*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   750
                  val (t, thy') =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   751
                    let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   752
                      fun analyse_type thy thf_ty =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   753
                         if #cautious config then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   754
                          case thf_ty of
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   755
                             Fn_type (thf_ty1, thf_ty2) =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   756
                               (analyse_type thy thf_ty1;
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   757
                               analyse_type thy thf_ty2)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   758
                           | Atom_type ty_name =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   759
                               if type_exists thy ty_name then ()
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   760
                               else
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   761
                                raise MISINTERPRET_TYPE
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   762
                                 ("This type, in signature of " ^
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   763
                                    name ^ " has not been declared.",
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   764
                                   Atom_type ty_name)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   765
                           | _ => ()
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   766
                         else () (*skip test if we're not being cautious.*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   767
                    in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   768
                      analyse_type thy tptp_ty;
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   769
                      declare_constant config name ty thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   770
                    end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   771
                  (*register a mapping from name to t. Constants' type
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   772
                  declarations should occur at most once, so it's justified to
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   773
                  use "::". Note that here we use a constant's name rather
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   774
                  than the possibly- new one, since all references in the
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   775
                  theory will be to this name.*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   776
                  val const_map' = ((name, t) :: const_map)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   777
                in ((type_map,(*type_map unchanged, since a constant's
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   778
                                declaration shouldn't include any new types.*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   779
                     const_map',(*typing table of constant was extended*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   780
                     []),(*no formulas were interpreted*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   781
                    thy')(*theory was extended with new constant*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   782
                end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   783
           end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   784
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   785
       | _ => (*i.e. the AF is not a type declaration*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   786
           let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   787
             (*gather interpreted term, and the map of types occurring in that term*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   788
             val (t, thy') =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   789
               interpret_formula config lang
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   790
                const_map [] type_map tptp_formula thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   791
               |>> HOLogic.mk_Trueprop
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   792
             (*type_maps grow monotonically, so return the newest value (type_mapped);
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   793
             there's no need to unify it with the type_map parameter.*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   794
           in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   795
            ((type_map, const_map,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   796
              [(label, role, tptp_formula,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   797
                Syntax.check_term (Proof_Context.init_global thy') t,
47411
7df9a4f320a5 moved non-interpret-specific code to different module
sultana
parents: 47366
diff changeset
   798
                TPTP_Proof.extract_inference_info annotation_opt)]), thy')
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   799
           end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   800
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   801
and interpret_problem new_basic_types config path_prefix lines type_map const_map thy =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   802
      let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   803
        val thy_name = Context.theory_name thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   804
        (*Add interpretation of $o and generate an Isabelle/HOL type to
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   805
        interpret $i, unless we've been given a mapping of types.*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   806
        val (thy', type_map') =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   807
          if not new_basic_types then (thy, type_map)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   808
          else
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   809
            let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   810
              val (type_map', thy') =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   811
                declare_type config
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   812
                 (Defined_type Type_Ind, IND_TYPE) type_map thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   813
            in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   814
              (thy', type_map')
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   815
            end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   816
      in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   817
        fold (fn line =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   818
               fn ((type_map, const_map, lines), thy) =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   819
                 let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   820
                   (*process the line, ignoring the type-context for variables*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   821
                   val ((type_map', const_map', l'), thy') =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   822
                     interpret_line config type_map const_map path_prefix line thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   823
                 in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   824
                   ((type_map',
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   825
                     const_map',
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   826
                     l' @ lines),(*append is sufficient, union would be overkill*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   827
                    thy')
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   828
                 end)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   829
             lines (*lines of the problem file*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   830
             ((type_map', const_map, []), thy') (*initial values*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   831
      end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   832
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   833
and interpret_file' new_basic_types config path_prefix file_name =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   834
  let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   835
    val file_name' = Path.expand file_name
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   836
  in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   837
    if Path.is_absolute file_name' then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   838
      Path.implode file_name
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   839
      |> TPTP_Parser.parse_file
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   840
      |> interpret_problem new_basic_types config path_prefix
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   841
    else error "Could not determine absolute path to file."
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   842
  end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   843
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   844
and interpret_file cautious path_prefix file_name =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   845
  let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   846
    val config =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   847
      {cautious = cautious,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   848
       problem_name =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   849
        SOME (TPTP_Problem_Name.parse_problem_name ((Path.base #> Path.implode)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   850
         file_name))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   851
      }
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   852
    handle _(*FIXME*) =>
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   853
      {cautious = cautious,
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   854
       problem_name = NONE
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   855
      }
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   856
  in interpret_file' true config path_prefix file_name end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   857
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   858
fun import_file cautious path_prefix file_name type_map const_map thy =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   859
  let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   860
    val prob_name =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   861
      TPTP_Problem_Name.parse_problem_name (Path.implode (Path.base file_name))
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   862
      handle _(*FIXME*) => TPTP_Problem_Name.Nonstandard (Path.implode file_name)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   863
    val (result, thy') =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   864
      interpret_file cautious path_prefix file_name type_map const_map thy
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   865
  in TPTP_Data.map (cons ((prob_name, result))) thy' end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   866
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   867
val _ =
46961
5c6955f487e5 outer syntax command definitions based on formal command_spec derived from theory header declarations;
wenzelm
parents: 46951
diff changeset
   868
  Outer_Syntax.improper_command @{command_spec "import_tptp"} "import TPTP problem"
46951
4e032ac36134 more precise TPTP keywords and dependencies;
wenzelm
parents: 46879
diff changeset
   869
    (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
   870
      Toplevel.theory (fn thy =>
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
   871
       (*NOTE: assumes Axioms directory is on same level as the Problems one
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
   872
         (which is how TPTP is currently organised)*)
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
   873
       import_file true (Path.appends [Path.dir path, Path.parent, Path.parent])
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
   874
        path [] [] thy)))
46844
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   875
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   876
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   877
(*Used for debugging. Returns all files contained within a directory or its
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   878
subdirectories. Follows symbolic links, filters away directories.*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   879
fun get_file_list path =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   880
  let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   881
    fun check_file_entry f rest =
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   882
      let
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   883
        (*NOTE needed since don't have File.is_link and File.read_link*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   884
        val f_str = Path.implode f
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   885
      in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   886
        if File.is_dir f then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   887
          rest (*filter out directories*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   888
        else if OS.FileSys.isLink f_str then
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   889
          (*follow links -- NOTE this breaks if links are relative paths*)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   890
          check_file_entry (Path.explode (OS.FileSys.readLink f_str)) rest
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   891
        else f :: rest
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   892
      end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   893
  in
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   894
    File.read_dir path
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   895
    |> map
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   896
        (Path.explode
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   897
        #> Path.append path)
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   898
    |> (fn l => fold check_file_entry l [])
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   899
  end
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   900
5d9aab0c609c added tptp parser;
sultana
parents:
diff changeset
   901
end