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