src/HOL/Tools/ATP/res_clasimpset.ML
author quigley
Thu, 31 Mar 2005 19:47:30 +0200
changeset 15643 5829f30fc20a
child 15700 970e0293dfb3
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15643
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
     1
(* Get claset rules *)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
     2
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
     3
fun remove_all [] rules = rules
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
     4
|   remove_all (x::xs) rules = let val rules' = List.filter (not_equal x) rules
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
     5
                              in
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
     6
                                  remove_all xs rules'
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
     7
                              end; 
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
     8
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
     9
fun has_name th = not((Thm.name_of_thm th)= "")
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    10
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    11
fun rule_is_fol th = let val tm = prop_of th
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    12
                     in 
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    13
                        Term.is_first_order tm
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    14
                     end
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    15
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    16
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    17
fun has_name_pair (a,b) = not_equal a "";
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    18
fun good_pair c (a,b) = not_equal b c;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    19
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    20
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    21
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    22
val num_of_clauses = ref 0;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    23
val clause_arr = Array.array(3500, ("empty", 0));
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    24
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    25
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    26
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    27
fun multi x 0 xlist = xlist
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    28
   |multi x n xlist = multi x (n -1 ) (x::xlist);
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    29
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    30
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    31
fun clause_numbering (name:string, cls) = let val num_of_cls = length cls
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    32
                                              val numbers = 0 upto (num_of_cls -1)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    33
                                              val multi_name = multi name num_of_cls []
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    34
                                          in 
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    35
                                              zip multi_name numbers
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    36
                                          end;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    37
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    38
fun stick []  = []
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    39
|   stick (x::xs)  = x@(stick xs )
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    40
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    41
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    42
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    43
fun fill_cls_array array n [] = ()
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    44
|   fill_cls_array array n (x::xs) = let val _ = Array.update (array, n,x)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    45
                                     in
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    46
                                        fill_cls_array array (n+1) (xs)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    47
                                     end;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    48
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    49
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    50
   	      	    
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    51
val nc = ref (Symtab.empty : (thm list) Symtab.table)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    52
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    53
 
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    54
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    55
fun memo_add_clauses (name:string, cls)=
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    56
                        nc := Symtab.update((name , cls), !nc);
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    57
      	       
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    58
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    59
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    60
fun memo_find_clause name = case Symtab.lookup (!nc,name) of
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    61
      	        NONE =>  []
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    62
                |SOME cls  => cls ;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    63
      	        	
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    64
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    65
fun retr_thms ([]:MetaSimplifier.rrule list) = []
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    66
	  | retr_thms (r::rs) = (#name r, #thm r)::(retr_thms rs);
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    67
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    68
fun snds [] = []
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    69
   | snds ((x,y)::l) = y::(snds l);
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    70
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    71
fun simpset_rules_of_thy thy =
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    72
     let val simpset = simpset_of thy
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    73
	val rules = #rules(fst (rep_ss simpset))
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    74
	val thms = retr_thms (snds(Net.dest rules))
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    75
     in	thms  end;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    76
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    77
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    78
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    79
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    80
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    81
fun not_second c (a,b)  = not_equal b c;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    82
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    83
fun remove_all_simps [] name_rule_list:(string*thm) list = name_rule_list
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    84
|   remove_all_simps ((x:thm)::xs) (name_rule_list:(string*thm) list) = 
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    85
                              let val name_rules' = List.filter (not_second  x) name_rule_list
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    86
                              in
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    87
                                  remove_all_simps xs name_rules'
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    88
                              end; 
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    89
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    90
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    91
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    92
fun thm_is_fol (x, thm) = rule_is_fol thm
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    93
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    94
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    95
fun get_simp_metas [] = [[]]
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    96
|   get_simp_metas (x::xs) = let val metas = ResAxioms.meta_cnf_axiom x
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    97
                             in
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    98
                                 metas::(get_simp_metas xs)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
    99
                             end
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   100
                             handle THM _ => get_simp_metas xs
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   101
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   102
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   103
(* re-jig all these later as smaller functions for each bit *)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   104
  val num_of_clauses = ref 0;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   105
val clause_arr = Array.array(3500, ("empty", 0));
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   106
                               
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   107
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   108
fun write_out_clasimp filename = let 
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   109
                                   (****************************************)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   110
                                   (* add claset rules to array and write out as strings *)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   111
                                   (****************************************)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   112
                                   val claset_rules =claset_rules_of_thy Main.thy
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   113
                                   val claset = clausify_classical_rules_thy Main.thy
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   114
                                   val (claset_clauses,badthms) =  claset;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   115
                                   val clausifiable_rules = remove_all badthms claset_rules;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   116
                                   val named_claset = List.filter has_name clausifiable_rules;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   117
                                   val name_fol_cs = List.filter rule_is_fol  named_claset;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   118
                                   (* length name_fol_cs is 93 *)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   119
                                   val good_names = map Thm.name_of_thm name_fol_cs;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   120
 
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   121
                                   (*******************************************)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   122
                                    (* get (name, thm) pairs for claset rules *)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   123
                                   (*******************************************)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   124
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   125
                                   val names_rules = zip good_names name_fol_cs;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   126
                                   
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   127
                                   val new_clasrls = (fst(clausify_classical_rules name_fol_cs[]));
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   128
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   129
                                   val claset_tptp_strs = map ( map ResClause.tptp_clause) new_clasrls;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   130
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   131
                                   (* list of lists of tptp string clauses *)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   132
                                   val stick_clasrls =  map stick claset_tptp_strs;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   133
                                   (* stick stick_clasrls length is 172*)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   134
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   135
                                   val name_stick = zip good_names stick_clasrls;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   136
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   137
                                   val cl_name_nums =map clause_numbering name_stick;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   138
                                       
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   139
                                   val cl_long_name_nums = stick cl_name_nums;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   140
                                   (*******************************************)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   141
                                  (* create array and put clausename, number pairs into it *)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   142
                                   (*******************************************)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   143
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   144
                                        val _ = fill_cls_array clause_arr 1 cl_long_name_nums;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   145
                                 
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   146
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   147
                                   val _= num_of_clauses := (List.length cl_long_name_nums);
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   148
                                   
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   149
                                   (*************************************)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   150
                                   (* write claset out as tptp file      *)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   151
                                    (*************************************)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   152
                                  
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   153
                                    val claset_all_strs = stick stick_clasrls;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   154
                                    val out = TextIO.openOut filename;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   155
                                    val _=   ResLib.writeln_strs out claset_all_strs;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   156
                                    val _= TextIO.flushOut out;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   157
                                    val _=  TextIO.output (out,("\n \n"));
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   158
                                    val _= TextIO.flushOut out;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   159
                                   (*val _= TextIO.closeOut out;*)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   160
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   161
                                  (*********************)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   162
                                  (* Get simpset rules *)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   163
                                  (*********************)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   164
                                  val (simpset_name_rules) =simpset_rules_of_thy Main.thy;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   165
                                  val named_simps = List.filter has_name_pair simpset_name_rules;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   166
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   167
                                  val simp_names = map fst named_simps;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   168
                                  val simp_rules = map snd named_simps;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   169
                              
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   170
                                  val (simpset_cls,badthms) = clausify_simpset_rules simp_rules [];
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   171
                                 (* 1137 clausif simps *)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   172
                                  val clausifiable_simps = remove_all_simps badthms named_simps;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   173
                                   
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   174
                                    val name_fol_simps = List.filter thm_is_fol clausifiable_simps ;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   175
                                    val simp_names = map fst name_fol_simps;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   176
                                    val simp_rules = map snd name_fol_simps;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   177
                                    
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   178
                                     (* 995 of these *)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   179
                                    (* need to get names of claset_cluases so we can make sure we've*)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   180
                                    (* got the same ones (ie. the named ones ) as the claset rules *)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   181
                                    (* length 1374*)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   182
                                    val new_simps = fst(clausify_simpset_rules simp_rules []);
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   183
                                    val simpset_tptp_strs = map (map ResClause.tptp_clause) new_simps;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   184
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   185
                                    val stick_strs = map stick simpset_tptp_strs;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   186
                                    val name_stick = zip simp_names stick_strs;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   187
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   188
                                    val name_nums =map clause_numbering name_stick;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   189
                                    (* length 2409*)
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   190
                                    val long_name_nums = stick name_nums;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   191
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   192
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   193
                                    val _ =fill_cls_array clause_arr (!num_of_clauses + 1) long_name_nums;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   194
                                    val _ =num_of_clauses := (!num_of_clauses) + (List.length long_name_nums);
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   195
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   196
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   197
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   198
                                    val tptplist =  (stick stick_strs) 
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   199
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   200
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   201
                              in 
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   202
                                   ResLib.writeln_strs out tptplist;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   203
                                   TextIO.flushOut out;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   204
                                   TextIO.closeOut out
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   205
                              end;
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   206
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   207
(*
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   208
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   209
 Array.sub(clause_arr,  2310);
5829f30fc20a *** empty log message ***
quigley
parents:
diff changeset
   210
*)