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