src/HOL/Tools/ATP/atp_problem.ML
changeset 43163 31babd4b1552
parent 43126 a7db0afd5200
child 43193 e11bd628f1a5
equal deleted inserted replaced
43162:9a8acc5adfa3 43163:31babd4b1552
     7 
     7 
     8 signature ATP_PROBLEM =
     8 signature ATP_PROBLEM =
     9 sig
     9 sig
    10   datatype 'a fo_term = ATerm of 'a * 'a fo_term list
    10   datatype 'a fo_term = ATerm of 'a * 'a fo_term list
    11   datatype quantifier = AForall | AExists
    11   datatype quantifier = AForall | AExists
    12   datatype connective = ANot | AAnd | AOr | AImplies | AIf | AIff | ANotIff
    12   datatype connective = ANot | AAnd | AOr | AImplies | AIff
    13   datatype ('a, 'b, 'c) formula =
    13   datatype ('a, 'b, 'c) formula =
    14     AQuant of quantifier * ('a * 'b option) list * ('a, 'b, 'c) formula |
    14     AQuant of quantifier * ('a * 'b option) list * ('a, 'b, 'c) formula |
    15     AConn of connective * ('a, 'b, 'c) formula list |
    15     AConn of connective * ('a, 'b, 'c) formula list |
    16     AAtom of 'c
    16     AAtom of 'c
    17 
    17 
    91 
    91 
    92 (** ATP problem **)
    92 (** ATP problem **)
    93 
    93 
    94 datatype 'a fo_term = ATerm of 'a * 'a fo_term list
    94 datatype 'a fo_term = ATerm of 'a * 'a fo_term list
    95 datatype quantifier = AForall | AExists
    95 datatype quantifier = AForall | AExists
    96 datatype connective = ANot | AAnd | AOr | AImplies | AIf | AIff | ANotIff
    96 datatype connective = ANot | AAnd | AOr | AImplies | AIff
    97 datatype ('a, 'b, 'c) formula =
    97 datatype ('a, 'b, 'c) formula =
    98   AQuant of quantifier * ('a * 'b option) list * ('a, 'b, 'c) formula |
    98   AQuant of quantifier * ('a * 'b option) list * ('a, 'b, 'c) formula |
    99   AConn of connective * ('a, 'b, 'c) formula list |
    99   AConn of connective * ('a, 'b, 'c) formula list |
   100   AAtom of 'c
   100   AAtom of 'c
   101 
   101 
   145 
   145 
   146 fun raw_polarities_of_conn ANot = (SOME false, NONE)
   146 fun raw_polarities_of_conn ANot = (SOME false, NONE)
   147   | raw_polarities_of_conn AAnd = (SOME true, SOME true)
   147   | raw_polarities_of_conn AAnd = (SOME true, SOME true)
   148   | raw_polarities_of_conn AOr = (SOME true, SOME true)
   148   | raw_polarities_of_conn AOr = (SOME true, SOME true)
   149   | raw_polarities_of_conn AImplies = (SOME false, SOME true)
   149   | raw_polarities_of_conn AImplies = (SOME false, SOME true)
   150   | raw_polarities_of_conn AIf = (SOME true, SOME false)
       
   151   | raw_polarities_of_conn AIff = (NONE, NONE)
   150   | raw_polarities_of_conn AIff = (NONE, NONE)
   152   | raw_polarities_of_conn ANotIff = (NONE, NONE)
       
   153 fun polarities_of_conn NONE = K (NONE, NONE)
   151 fun polarities_of_conn NONE = K (NONE, NONE)
   154   | polarities_of_conn (SOME pos) =
   152   | polarities_of_conn (SOME pos) =
   155     raw_polarities_of_conn #> not pos ? pairself (Option.map not)
   153     raw_polarities_of_conn #> not pos ? pairself (Option.map not)
   156 
   154 
   157 fun mk_anot (AConn (ANot, [phi])) = phi
   155 fun mk_anot (AConn (ANot, [phi])) = phi
   233 
   231 
   234 fun string_for_connective ANot = tptp_not
   232 fun string_for_connective ANot = tptp_not
   235   | string_for_connective AAnd = tptp_and
   233   | string_for_connective AAnd = tptp_and
   236   | string_for_connective AOr = tptp_or
   234   | string_for_connective AOr = tptp_or
   237   | string_for_connective AImplies = tptp_implies
   235   | string_for_connective AImplies = tptp_implies
   238   | string_for_connective AIf = tptp_if
       
   239   | string_for_connective AIff = tptp_iff
   236   | string_for_connective AIff = tptp_iff
   240   | string_for_connective ANotIff = tptp_not_iff
       
   241 
   237 
   242 fun string_for_bound_var format (s, ty) =
   238 fun string_for_bound_var format (s, ty) =
   243   s ^ (if format = TFF orelse format = THF then
   239   s ^ (if format = TFF orelse format = THF then
   244          " " ^ tptp_has_type ^ " " ^
   240          " " ^ tptp_has_type ^ " " ^
   245          string_for_type format (ty |> the_default (AType tptp_individual_type))
   241          string_for_type format (ty |> the_default (AType tptp_individual_type))
   339     AConn (AOr, map (clausify_formula1 false) phis)
   335     AConn (AOr, map (clausify_formula1 false) phis)
   340   | clausify_formula1 true (AConn (AOr, phis)) =
   336   | clausify_formula1 true (AConn (AOr, phis)) =
   341     AConn (AOr, map (clausify_formula1 true) phis)
   337     AConn (AOr, map (clausify_formula1 true) phis)
   342   | clausify_formula1 true (AConn (AImplies, [phi1, phi2])) =
   338   | clausify_formula1 true (AConn (AImplies, [phi1, phi2])) =
   343     AConn (AOr, [clausify_formula1 false phi1, clausify_formula1 true phi2])
   339     AConn (AOr, [clausify_formula1 false phi1, clausify_formula1 true phi2])
   344   | clausify_formula1 true (AConn (AIf, phis)) =
       
   345     clausify_formula1 true (AConn (AImplies, rev phis))
       
   346   | clausify_formula1 _ _ = raise CLAUSIFY ()
   340   | clausify_formula1 _ _ = raise CLAUSIFY ()
   347 fun clausify_formula true (AConn (AIff, phis)) =
   341 fun clausify_formula true (AConn (AIff, phis)) =
   348     [clausify_formula1 true (AConn (AIf, phis)),
   342     [clausify_formula1 true (AConn (AImplies, rev phis)),
   349      clausify_formula1 true (AConn (AImplies, phis))]
   343      clausify_formula1 true (AConn (AImplies, phis))]
   350   | clausify_formula false (AConn (ANotIff, phis)) =
       
   351     clausify_formula true (AConn (AIff, phis))
       
   352   | clausify_formula pos phi = [clausify_formula1 pos phi]
   344   | clausify_formula pos phi = [clausify_formula1 pos phi]
   353 
   345 
   354 fun clausify_formula_line (Formula (ident, kind, phi, source, info)) =
   346 fun clausify_formula_line (Formula (ident, kind, phi, source, info)) =
   355     let
   347     let
   356       val (n, phis) = phi |> try (clausify_formula true) |> these |> `length
   348       val (n, phis) = phi |> try (clausify_formula true) |> these |> `length