]> matita.cs.unibo.it Git - fireball-separation.git/commitdiff
Added check with purification to andrea.ml
authoracondolu <andrea.condoluci@unibo.it>
Wed, 30 May 2018 13:29:30 +0000 (15:29 +0200)
committeracondolu <andrea.condoluci@unibo.it>
Wed, 30 May 2018 13:29:30 +0000 (15:29 +0200)
Note! It now diverges because it uses B (bottoms)

ocaml/andrea.ml

index 8535988b7c48fc490342951fd68691f460897811..7493905ae227c3b9b6715da82cf233caebdc25ac 100644 (file)
@@ -4,6 +4,8 @@ let rec fold_nat f x n = if n = 0 then x else f (fold_nat f x (n-1)) n ;;
 \r
 let print_hline = Console.print_hline;;\r
 \r
+open Pure\r
+\r
 type var = int;;\r
 type t =\r
  | V of var\r
@@ -145,6 +147,24 @@ let get_subterm_with_head_and_args hd_var n_args =
  in aux 0\r
 ;;\r
 \r
+let rec purify = function\r
+ | L t -> Pure.L (purify t)\r
+ | A (t1,t2) -> Pure.A (purify t1, purify t2)\r
+ | V n -> Pure.V n\r
+ | B -> Pure.B\r
+;;\r
+\r
+let check p sigma =\r
+ let div = purify p.div in\r
+ let conv = purify p.conv in\r
+ let sigma = List.map (fun (v,t) -> v, purify t) sigma in\r
+ let freshno = List.fold_right (fun (x,_) -> max x) sigma 0 in\r
+ let env = Pure.env_of_sigma freshno sigma in\r
+ assert (Pure.diverged (Pure.mwhd (env,div,[])));\r
+ assert (not (Pure.diverged (Pure.mwhd (env,conv,[]))));\r
+ ()\r
+;;\r
+\r
 let sanity p =\r
  print_endline (string_of_problem p); (* non cancellare *)\r
  if p.conv = B then problem_fail p "p.conv diverged";\r
@@ -252,7 +272,7 @@ let rec auto p =
  let hd_var, n_args = get_inert p.div in\r
  match get_subterm_with_head_and_args hd_var n_args p.conv with\r
  | None ->\r
-    (try problem_fail (eat p) "Auto did not complete the problem"  with Done _ -> ())\r
+    (try problem_fail (eat p) "Auto did not complete the problem"  with Done sigma -> sigma)\r
  | Some t ->\r
   let j = find_eta_difference p t n_args - 1 in\r
   let k = 1 + max\r
@@ -291,7 +311,11 @@ let rec conv_join = function
  | x::xs -> conv_join xs ^ " ("^ x ^")"\r
 ;;\r
 \r
-let auto' a b = auto (problem_of a (conv_join b));;\r
+let auto' a b =\r
+ let p = problem_of a (conv_join b) in\r
+ let sigma = auto p in\r
+ check p sigma\r
+;;\r
 \r
 (* Example usage of exec, interactive:\r
 \r