]> matita.cs.unibo.it Git - fireball-separation.git/blob - ocaml/sat.ml
Added exception Lambda, which may be caught when a conv becomes a lambda
[fireball-separation.git] / ocaml / sat.ml
1 (*\r
2  Reductions from SAT and 3-colorability of graphs to separation\r
3  of lambda-terms. Commented out the encoding from SAT.\r
4 *)\r
5 \r
6 open Util;;\r
7 \r
8 (* type cnf = int list list;;\r
9 \r
10 let (++) f g x = f (g x);;\r
11 \r
12 let maxvar : cnf -> int =\r
13  let aux f = List.fold_left (fun acc x -> max acc (f x)) 0 in\r
14  aux (aux abs)\r
15 ;; *)\r
16 \r
17 type graph = (int * int) list;;\r
18 type color = int;;\r
19 \r
20 let arc x y = min x y, max x y;;\r
21 let mem g x y = List.mem (arc x y) g;;\r
22 \r
23 (* let reduction_sat_3col p =\r
24  let triangle a0 a1 a2 = [arc a0 a1; arc a0 a2; arc a1 a2] in\r
25  let init0 = triangle 0 1 2 in\r
26  (* 0false; 1true; 2base*)\r
27  let n = maxvar p in\r
28  let init1 = Array.to_list (Array.mapi (fun i () -> triangle (2*i+1) (2*(i+1)) 2) (Array.make n ())) in\r
29  let freshno = ref (2 * n + 3) in\r
30  let mk_triangle () =\r
31   let i = !freshno in\r
32   freshno := i+3; i, i+1, i+2 in\r
33  let rec translate = function\r
34  | [] -> assert false\r
35  | x::[] -> [triangle 0 2 x]\r
36  | x::y::l ->\r
37     let a,b,c = mk_triangle () in\r
38     triangle a b c :: [arc x a; arc y b] :: translate (c::l) in\r
39  let p = List.map (List.map (fun x ->\r
40    if x = 0 then assert false\r
41     else if x < 0 then 2 * (abs x + 1)\r
42     else 2 * x + 1\r
43   )) p in\r
44  let init2 = List.map (List.concat ++ translate) p in\r
45  !freshno, init0 @ List.concat (init1 @ init2)\r
46 ;;\r
47 \r
48 let string_of_graph g =\r
49  String.concat " " (List.map (fun (x,y) -> string_of_int x ^ "<>" ^ string_of_int y) g)\r
50 ;; *)\r
51 \r
52 (* let main p =\r
53  let mv = maxvar p in\r
54  prerr_endline (string_of_int mv);\r
55  let _, g = reduction_sat_3col p in\r
56  prerr_endline (string_of_graph g);\r
57  generate ;;\r
58 \r
59 prerr_endline (main[\r
60  [1; -2; 3];\r
61  [2; 4; -5]\r
62 ]);; *)\r
63 \r
64 let p_ = "BOMB ";;\r
65 let x_ = "x ";;\r
66 (* y, z dummies *)\r
67 let y_ = "y ";;\r
68 let z_ = "z ";;\r
69 (* a, b endline separators *)\r
70 let a_ = "a ";;\r
71 let b_ = "b ";;\r
72 \r
73 let generate g n max =\r
74  (* 0 <= n <= max+1 *)\r
75  let three f sep =\r
76   String.concat sep (List.map f [0;1;2]) in\r
77  let rec aux' n m color =\r
78   if m = -1 then x_\r
79   else aux' n (m-1) color ^\r
80    if n = m then\r
81      (if List.mem (n,n) g then p_^p_^p_ (* cappio nel grafo *)\r
82       else three (fun c -> if color = c then y_ else p_) "")\r
83    else if n < m then y_^y_^y_\r
84    else if List.mem (m,n) g then\r
85     three (fun c -> if color = c then p_ else y_) ""\r
86    else y_^y_^y_ in\r
87  let rec aux m =\r
88   if m = -1 then x_\r
89    else aux (m-1) ^\r
90     if n < m then p_^p_^p_\r
91     else if n = m then\r
92       "(_." ^ three (aux' n max) "b) (_." ^ "b) "\r
93     else y_^y_^y_\r
94  in aux max ^ a_\r
95 ;;\r
96 \r
97 let generate2 g n max =\r
98  let rec aux m =\r
99   if m = -1 then x_\r
100    else aux (m-1) ^\r
101     if n < m then p_^p_^p_\r
102     else if n = m\r
103     then z_^z_^z_\r
104     else y_^y_^y_\r
105  in aux max ^ p_\r
106 ;;\r
107 \r
108 \r
109 let encode_graph g =\r
110  let g = List.map (fun (x,y) -> min x y, max x y) g in\r
111  let mapi f a = Array.to_list (Array.mapi f a) in\r
112  let nodex_no =\r
113   List.fold_left (fun acc (a,b) -> Pervasives.max acc (Pervasives.max a b)) 0 in\r
114  String.concat "\n" ("\n$ problem from 3-colorability" ::\r
115   let no = nodex_no g in\r
116   mapi (fun i () ->\r
117     (if i = no+1 then "D " else "C ") ^ generate g i no\r
118   ) (Array.make (no+2) ()) @\r
119   mapi (fun i () ->\r
120     "C " ^ generate2 g i no\r
121   ) (Array.make (no+1) ());\r
122  )\r
123 ;;\r
124 \r
125 print_endline "Three example encodings:";;\r
126 \r
127 (* easy one *)\r
128 prerr_endline (encode_graph [0,1;]);;\r
129 \r
130 (* two imopssible problems *)\r
131 prerr_endline (\r
132  encode_graph [0,1; 1,1]\r
133 );;\r
134 prerr_endline (\r
135  encode_graph [0,1; 0,2; 1,2; 0,3; 1,3; 2,3]\r
136 );;\r
137 \r
138 (******************************************************************************)\r
139 \r
140 print_endline "\nIt will now run some problems and decode the solutions";;\r
141 print_endline "Press ENTER to continue.";;\r
142 let _ = read_line ();;\r
143 \r
144 let strip_lambda_matches =\r
145  let getvar = function\r
146   | `Var(n,_) -> n\r
147   | _ -> assert false in\r
148  let rec aux n = function\r
149   | `Lam(_,t) -> aux (n+1) t\r
150   | `Match(_,_,_,bs,_) -> Some (n, List.map (getvar ++ snd) !bs)\r
151   | _ -> None\r
152  in aux 0\r
153 ;;\r
154 \r
155 let next_candidates sigma cands =\r
156  let sigma = Util.filter_map\r
157   (fun x -> try Some (List.assoc x sigma) with Not_found -> None) cands in\r
158  match Util.find_opt strip_lambda_matches sigma with\r
159  | None -> -1, []\r
160  | Some x -> x\r
161 ;;\r
162 \r
163 let fix_numbers l =\r
164  let rec aux n = function\r
165  | [] -> []\r
166  | x::xs -> (x - 2*n - 1) :: (aux (n+1) xs)\r
167  in aux 0 l\r
168 ;;\r
169 \r
170 let color (g:graph) =\r
171  let p = encode_graph g in\r
172  let (_, _, _, _, vars as p) = Parser.problem_of_string p in\r
173  let _, result = Lambda4.solve (Lambda4.problem_of p) in\r
174  match result with\r
175  | `Unseparable _ -> prerr_endline "Graph not colorable"; None\r
176  | `Separable sigma -> (\r
177   (* start from variable x *)\r
178   let x = Util.index_of "x" vars in\r
179   (* List.iter (fun x -> prerr_endline (string_of_int (fst x) ^ ":" ^ Num.print ~l:vars (snd x))) sigma; *)\r
180   let rec iter f x =\r
181    let n, x = f x in if x = [] then [] else n :: iter f x in\r
182   let numbers = iter (next_candidates sigma) [x] in\r
183   let numbers = fix_numbers numbers in\r
184   (* display solution *)\r
185   let colors = ["r"; "g"; "b"] in\r
186   prerr_endline ("\nSolution found:\n " ^ String.concat "\n "\r
187    (List.mapi (fun i x ->\r
188      string_of_int i ^ " := " ^ List.nth colors x) numbers));\r
189   assert (List.for_all (fun (a,b) -> List.nth numbers a <> List.nth numbers b) g);\r
190   Some numbers)\r
191 ;;\r
192 \r
193 let bruteforce g =\r
194  let nodes_no = 1+\r
195   List.fold_left (fun acc (a,b) -> Pervasives.max acc (Pervasives.max a b)) 0 g in\r
196  let check x = if List.for_all (fun (a,b) -> List.nth x a <> List.nth x b) g\r
197   then failwith "bruteforce: sat" in\r
198  let rec guess l = prerr_string "+";\r
199   if List.length l = nodes_no\r
200    then check l\r
201     else (guess (0::l); guess (1::l); guess (2::l)) in\r
202  guess [];\r
203  prerr_endline "bruteforce: unsat"\r
204 ;;\r
205 \r
206 assert (color [0,1;0,2;1,2;2,3;3,0] <> None);;\r
207 assert (color [0,1;0,2;1,2;2,3;3,0;0,4;4,2] <> None);;\r
208 \r
209 (* assert (color [\r
210  1,2; 1,4; 1,7; 1,9; 2,3; 2,6; 2,8; 3,5;\r
211  3,7; 3,0; 4,5; 4,6; 4,0; 5,8; 5,9; 6,11;\r
212  7,11; 8,11; 9,11; 0,11;\r
213 ] = None);; *)\r
214 \r
215 (* https://turing.cs.hbg.psu.edu/txn131/file_instances/coloring/graph_color/queen5_5.col *)\r
216 color [1,7\r
217 ; 1,13\r
218 ; 1,19\r
219 ; 1,25\r
220 ; 1,2\r
221 ; 1,3\r
222 ; 1,4\r
223 ; 1,5\r
224 ; 1,6\r
225 ; 1,11\r
226 ; 1,16\r
227 ; 1,21\r
228 ; 2,8\r
229 ; 2,14\r
230 ; 2,20\r
231 ; 2,6\r
232 ; 2,3\r
233 ; 2,4\r
234 ; 2,5\r
235 ; 2,7\r
236 ; 2,12\r
237 ; 2,17\r
238 ; 2,22\r
239 ; 2,1\r
240 ; 3,9\r
241 ; 3,15\r
242 ; 3,7\r
243 ; 3,11\r
244 ; 3,4\r
245 ; 3,5\r
246 ; 3,8\r
247 ; 3,13\r
248 ; 3,18\r
249 ; 3,23\r
250 ; 3,2\r
251 ; 3,1\r
252 ; 4,10\r
253 ; 4,8\r
254 ; 4,12\r
255 ; 4,16\r
256 ; 4,5\r
257 ; 4,9\r
258 ; 4,14\r
259 ; 4,19\r
260 ; 4,24\r
261 ; 4,3\r
262 ; 4,2\r
263 ; 4,1\r
264 ; 5,9\r
265 ; 5,13\r
266 ; 5,17\r
267 ; 5,21\r
268 ; 5,10\r
269 ; 5,15\r
270 ; 5,20\r
271 ; 5,25\r
272 ; 5,4\r
273 ; 5,3\r
274 ; 5,2\r
275 ; 5,1\r
276 ; 6,12\r
277 ; 6,18\r
278 ; 6,24\r
279 ; 6,7\r
280 ; 6,8\r
281 ; 6,9\r
282 ; 6,10\r
283 ; 6,11\r
284 ; 6,16\r
285 ; 6,21\r
286 ; 6,2\r
287 ; 6,1\r
288 ; 7,13\r
289 ; 7,19\r
290 ; 7,25\r
291 ; 7,11\r
292 ; 7,8\r
293 ; 7,9\r
294 ; 7,10\r
295 ; 7,12\r
296 ; 7,17\r
297 ; 7,22\r
298 ; 7,6\r
299 ; 7,3\r
300 ; 7,2\r
301 ; 7,1\r
302 ; 8,14\r
303 ; 8,20\r
304 ; 8,12\r
305 ; 8,16\r
306 ; 8,9\r
307 ; 8,10\r
308 ; 8,13\r
309 ; 8,18\r
310 ; 8,23\r
311 ; 8,7\r
312 ; 8,6\r
313 ; 8,4\r
314 ; 8,3\r
315 ; 8,2\r
316 ; 9,15\r
317 ; 9,13\r
318 ; 9,17\r
319 ; 9,21\r
320 ; 9,10\r
321 ; 9,14\r
322 ; 9,19\r
323 ; 9,24\r
324 ; 9,8\r
325 ; 9,7\r
326 ; 9,6\r
327 ; 9,5\r
328 ; 9,4\r
329 ; 9,3\r
330 ; 10,14\r
331 ; 10,18\r
332 ; 10,22\r
333 ; 10,15\r
334 ; 10,20\r
335 ; 10,25\r
336 ; 10,9\r
337 ; 10,8\r
338 ; 10,7\r
339 ; 10,6\r
340 ; 10,5\r
341 ; 10,4\r
342 ; 11,17\r
343 ; 11,23\r
344 ; 11,12\r
345 ; 11,13\r
346 ; 11,14\r
347 ; 11,15\r
348 ; 11,16\r
349 ; 11,21\r
350 ; 11,7\r
351 ; 11,6\r
352 ; 11,3\r
353 ; 11,1\r
354 ; 12,18\r
355 ; 12,24\r
356 ; 12,16\r
357 ; 12,13\r
358 ; 12,14\r
359 ; 12,15\r
360 ; 12,17\r
361 ; 12,22\r
362 ; 12,11\r
363 ; 12,8\r
364 ; 12,7\r
365 ; 12,6\r
366 ; 12,4\r
367 ; 12,2\r
368 ; 13,19\r
369 ; 13,25\r
370 ; 13,17\r
371 ; 13,21\r
372 ; 13,14\r
373 ; 13,15\r
374 ; 13,18\r
375 ; 13,23\r
376 ; 13,12\r
377 ; 13,11\r
378 ; 13,9\r
379 ; 13,8\r
380 ; 13,7\r
381 ; 13,5\r
382 ; 13,3\r
383 ; 13,1\r
384 ; 14,20\r
385 ; 14,18\r
386 ; 14,22\r
387 ; 14,15\r
388 ; 14,19\r
389 ; 14,24\r
390 ; 14,13\r
391 ; 14,12\r
392 ; 14,11\r
393 ; 14,10\r
394 ; 14,9\r
395 ; 14,8\r
396 ; 14,4\r
397 ; 14,2\r
398 ; 15,19\r
399 ; 15,23\r
400 ; 15,20\r
401 ; 15,25\r
402 ; 15,14\r
403 ; 15,13\r
404 ; 15,12\r
405 ; 15,11\r
406 ; 15,10\r
407 ; 15,9\r
408 ; 15,5\r
409 ; 15,3\r
410 ; 16,22\r
411 ; 16,17\r
412 ; 16,18\r
413 ; 16,19\r
414 ; 16,20\r
415 ; 16,21\r
416 ; 16,12\r
417 ; 16,11\r
418 ; 16,8\r
419 ; 16,6\r
420 ; 16,4\r
421 ; 16,1\r
422 ; 17,23\r
423 ; 17,21\r
424 ; 17,18\r
425 ; 17,19\r
426 ; 17,20\r
427 ; 17,22\r
428 ; 17,16\r
429 ; 17,13\r
430 ; 17,12\r
431 ; 17,11\r
432 ; 17,9\r
433 ; 17,7\r
434 ; 17,5\r
435 ; 17,2\r
436 ; 18,24\r
437 ; 18,22\r
438 ; 18,19\r
439 ; 18,20\r
440 ; 18,23\r
441 ; 18,17\r
442 ; 18,16\r
443 ; 18,14\r
444 ; 18,13\r
445 ; 18,12\r
446 ; 18,10\r
447 ; 18,8\r
448 ; 18,6\r
449 ; 18,3\r
450 ; 19,25\r
451 ; 19,23\r
452 ; 19,20\r
453 ; 19,24\r
454 ; 19,18\r
455 ; 19,17\r
456 ; 19,16\r
457 ; 19,15\r
458 ; 19,14\r
459 ; 19,13\r
460 ; 19,9\r
461 ; 19,7\r
462 ; 19,4\r
463 ; 19,1\r
464 ; 20,24\r
465 ; 20,25\r
466 ; 20,19\r
467 ; 20,18\r
468 ; 20,17\r
469 ; 20,16\r
470 ; 20,15\r
471 ; 20,14\r
472 ; 20,10\r
473 ; 20,8\r
474 ; 20,5\r
475 ; 20,2\r
476 ; 21,22\r
477 ; 21,23\r
478 ; 21,24\r
479 ; 21,25\r
480 ; 21,17\r
481 ; 21,16\r
482 ; 21,13\r
483 ; 21,11\r
484 ; 21,9\r
485 ; 21,6\r
486 ; 21,5\r
487 ; 21,1\r
488 ; 22,23\r
489 ; 22,24\r
490 ; 22,25\r
491 ; 22,21\r
492 ; 22,18\r
493 ; 22,17\r
494 ; 22,16\r
495 ; 22,14\r
496 ; 22,12\r
497 ; 22,10\r
498 ; 22,7\r
499 ; 22,2\r
500 ; 23,24\r
501 ; 23,25\r
502 ; 23,22\r
503 ; 23,21\r
504 ; 23,19\r
505 ; 23,18\r
506 ; 23,17\r
507 ; 23,15\r
508 ; 23,13\r
509 ; 23,11\r
510 ; 23,8\r
511 ; 23,3\r
512 ; 24,25\r
513 ; 24,23\r
514 ; 24,22\r
515 ; 24,21\r
516 ; 24,20\r
517 ; 24,19\r
518 ; 24,18\r
519 ; 24,14\r
520 ; 24,12\r
521 ; 24,9\r
522 ; 24,6\r
523 ; 24,4\r
524 ; 25,24\r
525 ; 25,23\r
526 ; 25,22\r
527 ; 25,21\r
528 ; 25,20\r
529 ; 25,19\r
530 ; 25,15\r
531 ; 25,13\r
532 ; 25,10\r
533 ; 25,7\r
534 ; 25,5\r
535 ; 25,1];;\r