module OT = struct type t = string let compare = Pervasives.compare end module HC = Map.Make(OT) type leaf = int * string let cache = ref HC.empty let num = ref 100 let hash s = try HC.find s !cache with Not_found -> cache := HC.add s (!num,s) !cache; decr num; HC.find s !cache ;; hash "==";; hash "_";; let main () = let problem_file = ref "no-file-given" in let tptppath = ref "./" in Arg.parse [ "--tptppath", Arg.String (fun p -> tptppath := p), "[path] TPTP lib root" ] (fun x -> problem_file := x) "matitaprover [problemfile]"; let hypotheses, goals = Tptp_cnf.parse ~tptppath:!tptppath !problem_file in let goal = match goals with [x] -> x | _ -> assert false in let module B : Terms.Blob with type t = leaf and type input = Ast.term = struct type t = leaf let eq a b = a == b let compare (a,_) (b,_) = Pervasives.compare a b let eqP = hash "==" let pp (_,a) = a type input = Ast.term let rec embed m = function | Ast.Variable name -> (try m, List.assoc name m with Not_found -> let t = Terms.Var ~-(List.length m) in (name,t)::m, t) | Ast.Constant name -> m, Terms.Leaf (hash name) | Ast.Function (name,args) -> let m, args = HExtlib.list_mapi_acc (fun x _ m -> embed m x) m args in m, Terms.Node (Terms.Leaf (hash name):: args) ;; let saturate bo ty = let vars, ty = embed [] ty in let _, bo = embed vars bo in let bo = Terms.Node (bo :: List.map snd (List.rev vars)) in bo, ty ;; let embed t = snd(embed [] t);; end in let module P = Paramod.Paramod(B) in let module Pp = Pp.Pp(B) in let bag = Terms.M.empty, 0 in let bag, g_passives = P.mk_goal bag goal in let bag, passives = HExtlib.list_mapi_acc (fun x _ b -> P.mk_passive b x) bag hypotheses in prerr_endline "Order"; HC.iter (fun _ (w,x) -> prerr_endline (" " ^ x ^ " is " ^ string_of_int w)) !cache; prerr_endline "Facts"; List.iter (fun x -> prerr_endline (" " ^ Pp.pp_unit_clause x)) passives; prerr_endline "Goal"; prerr_endline (" " ^ Pp.pp_unit_clause g_passives); ignore(P.paramod bag ~g_passives:[g_passives] ~passives); () ;; main ()