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