X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Fbinaries%2Fmatitaprover%2Ftptp_cnf.ml;h=ffac7658523f917e298a51b7536a807130f732c7;hb=ba973eae07a1c2542ba0dc12931ef465a42eddf9;hp=ef5136c9e03968ac4324df17748cf858d9695986;hpb=1c9b8f3ba2c86446d44160ae494bc85624bc5eaf;p=helm.git diff --git a/helm/software/components/binaries/matitaprover/tptp_cnf.ml b/helm/software/components/binaries/matitaprover/tptp_cnf.ml index ef5136c9e..ffac76585 100644 --- a/helm/software/components/binaries/matitaprover/tptp_cnf.ml +++ b/helm/software/components/binaries/matitaprover/tptp_cnf.ml @@ -1,383 +1,29 @@ -module A = Ast;; -(* -type sort = Prop | Univ;; - -let floc = HExtlib.dummy_floc;; - - -let paramod_timeout = ref 600;; -let depth = ref 10;; - -let universe = "Univ" ;; -let prop = "Prop";; - -let kw = [ - "and","myand" -];; - -let mk_ident s = - PT.Ident ((try List.assoc s kw with Not_found -> s),None) -;; - -let rec collect_arities_from_term = function - | A.Constant name -> [name,(0,Univ)] - | A.Variable name -> [name,(0,Univ)] - | A.Function (name,l) -> - (name,(List.length l,Univ)):: - List.flatten (List.map collect_arities_from_term l) -;; - -let rec collect_fv_from_term = function - | A.Constant name -> [] - | A.Variable name -> [name] - | A.Function (_,l) -> - List.flatten (List.map collect_fv_from_term l) -;; - -let collect_arities_from_atom a = - let aux = function - | A.Proposition name -> [name,(0,Prop)] - | A.Predicate (name,args) -> - (name,(List.length args,Prop)) :: - (List.flatten (List.map collect_arities_from_term args)) - | A.True -> [] - | A.False -> [] - | A.Eq (t1,t2) -> - collect_arities_from_term t1 @ collect_arities_from_term t2 - | A.NotEq (t1,t2) -> - collect_arities_from_term t1 @ collect_arities_from_term t2 - in - HExtlib.list_uniq (List.sort compare (List.flatten (List.map aux a))) -;; - -let collect_fv_from_atom a = - let aux = function - | A.Proposition name -> [name] - | A.Predicate (name,args) -> - name :: List.flatten (List.map collect_fv_from_term args) - | A.True -> [] - | A.False -> [] - | A.Eq (t1,t2) -> collect_fv_from_term t1 @ collect_fv_from_term t2 - | A.NotEq (t1,t2) -> collect_fv_from_term t1 @ collect_fv_from_term t2 - in - let rec aux2 = function - | [] -> [] - | hd::tl -> aux hd @ aux2 tl - in - HExtlib.list_uniq (List.sort compare (aux2 a)) -;; - -let rec collect_fv_from_formulae = function - | A.Disjunction (a,b) -> - collect_fv_from_formulae a @ collect_fv_from_formulae b - | A.NegAtom a - | A.Atom a -> collect_fv_from_atom [a] -;; - -let rec convert_term = function - | A.Variable x -> mk_ident x - | A.Constant x -> mk_ident x - | A.Function (name, args) -> - PT.Appl (mk_ident name :: List.map convert_term args) -;; - -let rec atom_of_formula neg pos = function - | A.Disjunction (a,b) -> - let neg, pos = atom_of_formula neg pos a in - atom_of_formula neg pos b - | A.NegAtom a -> a::neg, pos - | A.Atom (A.NotEq (a,b)) -> (A.Eq (a,b) :: neg), pos - | A.Atom a -> neg, a::pos -;; - -let atom_of_formula f = - let neg, pos = atom_of_formula [] [] f in - neg @ pos -;; - -let rec mk_arrow component tail = function - | 0 -> begin - match tail with - | Prop -> mk_ident prop - | Univ -> mk_ident universe - end - | n -> - PT.Binder - (`Forall, - ((mk_ident "_"),Some (mk_ident component)), - mk_arrow component tail (n-1)) -;; - -let build_ctx_for_arities univesally arities t = - let binder = if univesally then `Forall else `Exists in - let rec aux = function - | [] -> t - | (name,(nargs,sort))::tl -> - PT.Binder - (binder, - (mk_ident name,Some (mk_arrow universe sort nargs)), - aux tl) - in - aux arities -;; - -let convert_atom universally a = - let aux = function - | A.Proposition p -> mk_ident p - | A.Predicate (name,params) -> - PT.Appl ((mk_ident name) :: (List.map convert_term params)) - | A.True -> mk_ident "True" - | A.False -> mk_ident "False" - | A.Eq (l,r) - | A.NotEq (l,r) -> (* removes the negation *) - PT.Appl [mk_ident "eq";mk_ident universe;convert_term l;convert_term r] - in - let rec aux2 = function - | [] -> assert false - | [x] -> aux x - | he::tl -> - if universally then - PT.Binder (`Forall, (mk_ident "_", Some (aux he)), aux2 tl) - else - PT.Appl [mk_ident "And";aux he;aux2 tl] - in - let arities = collect_arities_from_atom a in - let fv = collect_fv_from_atom a in - build_ctx_for_arities universally - (List.filter - (function (x,(0,Univ)) -> List.mem x fv | _-> false) - arities) - (aux2 a) -;; - -let collect_arities atom ctx = - let atoms = atom@(List.flatten (List.map atom_of_formula ctx)) in - collect_arities_from_atom atoms -;; - -let collect_arities_from_formulae f = - let rec collect_arities_from_formulae = function - | A.Disjunction (a,b) -> - collect_arities_from_formulae a @ collect_arities_from_formulae b - | A.NegAtom a - | A.Atom a -> collect_arities_from_atom [a] - in - HExtlib.list_uniq (List.sort compare (collect_arities_from_formulae f)) -;; - -let is_formulae_1eq_negated f = - let atom = atom_of_formula f in - match atom with - | [A.NotEq (l,r)] -> true - | _ -> false -;; - -let collect_fv_1stord_from_formulae f = - let arities = collect_arities_from_formulae f in - let fv = collect_fv_from_formulae f in - List.map fst - (List.filter (function (x,(0,Univ)) -> List.mem x fv | _-> false) arities) -;; - -let rec convert_formula fv no_arities context f = - let atom = atom_of_formula f in - let t = convert_atom (fv = []) atom in - let rec build_ctx n = function - | [] -> t - | hp::tl -> - PT.Binder - (`Forall, - (mk_ident ("H" ^ string_of_int n), - Some (convert_formula [] true [] hp)), - build_ctx (n+1) tl) - in - let arities = if no_arities then [] else collect_arities atom context in - build_ctx_for_arities true arities (build_ctx 0 context) -;; - -let check_if_atom_is_negative = function - | A.True -> false - | A.False -> true - | A.Proposition _ -> false - | A.Predicate _ -> false - | A.Eq _ -> false - | A.NotEq _ -> true -;; - -let rec check_if_formula_is_negative = function - | A.Disjunction (a,b) -> - check_if_formula_is_negative a && check_if_formula_is_negative b - | A.NegAtom a -> not (check_if_atom_is_negative a) - | A.Atom a -> check_if_atom_is_negative a -;; - -let ng_generate_tactics fv ueq_case context arities = - [ GA.Executable(floc,GA.NTactic(floc, - [GA.NIntro (floc,"Univ") ; GA.NDot(floc)])) ] - @ - (HExtlib.list_mapi - (fun (name,_) _-> - GA.Executable(floc,GA.NTactic(floc, - [GA.NIntro (floc,(try List.assoc name kw with Not_found -> name)); - GA.NDot(floc)]))) - arities) - @ - (HExtlib.list_mapi - (fun _ i-> - GA.Executable(floc,GA.NTactic(floc, - [GA.NIntro (floc,"H"^string_of_int i);GA.NDot(floc)]))) - context) - @ -(if fv <> [] then - (List.flatten - (List.map - (fun _ -> - [GA.Executable(floc,GA.NTactic(floc, - [GA.NApply (floc, - PT.Appl [mk_ident "ex_intro";PT.Implicit;PT.Implicit; - PT.Implicit;PT.Implicit]);GA.NBranch floc])); - GA.Executable(floc,GA.NTactic(floc, - [GA.NPos (floc,[2])]))]) - fv)) - else [])@ - [GA.Executable(floc,GA.NTactic(floc, [ - if (*ueq_case*) true then - GA.NAuto (floc,( - HExtlib.list_mapi - (fun _ i -> - mk_ident ("H" ^ string_of_int i)) - context - ,[])) - else - GA.NAuto (floc,([],[ - "depth",string_of_int 5; - "width",string_of_int 5; - "size",string_of_int 20; - "timeout",string_of_int 10; - ])) - ; - GA.NSemicolon(floc)])); -(* - GA.Executable(floc,GA.NTactic(floc, Some (GA.Try(floc, - GA.Assumption floc)), GA.Dot(floc))) -*) - ]@ -(if fv <> [] then - (List.flatten - (List.map - (fun _ -> - [GA.Executable(floc,GA.NTactic(floc, [GA.NShift floc; - GA.NSkip floc; GA.NMerge floc]))]) - fv)) - else [])@ - [GA.Executable(floc,GA.NTactic(floc,[GA.NTry(floc, GA.NAssumption(floc)); - GA.NSemicolon(floc)]))]@ - [GA.Executable(floc,GA.NCommand(floc, GA.NQed(floc)))] +let trans_atom ~neg = function + | Ast.True | Ast.False | Ast.Predicate _ | Ast.Proposition _ -> assert false + | Ast.Eq _ when neg -> assert false + | Ast.Eq (a,b) -> Ast.Function ("==",[Ast.Constant "_"; a; b]) + | Ast.NotEq (a,b) when neg -> Ast.Function ("==",[Ast.Constant "_"; a; b]) + | Ast.NotEq _ -> assert false ;; -let generate_tactics fv ueq_case = - [GA.Executable(floc,GA.Tactic(floc, Some - (GA.Intros (floc,(None,[]))),GA.Dot(floc)))] @ -(if fv <> [] then - (List.flatten - (List.map - (fun _ -> - [GA.Executable(floc,GA.Tactic(floc, Some - (GA.Exists floc),GA.Branch floc)); - GA.Executable(floc,GA.Tactic(floc, None, - (GA.Pos (floc,[2]))))]) - fv)) - else [])@ - [GA.Executable(floc,GA.Tactic(floc, Some ( - if true (*ueq_case*) then - GA.AutoBatch (floc,([],["paramodulation",""; - "timeout",string_of_int !paramod_timeout])) - else - GA.AutoBatch (floc,([],[ - "depth",string_of_int 5; - "width",string_of_int 5; - "size",string_of_int 20; - "timeout",string_of_int 10; - ])) - ), - GA.Semicolon(floc))); - GA.Executable(floc,GA.Tactic(floc, Some (GA.Try(floc, - GA.Assumption floc)), GA.Dot(floc))) - ]@ -(if fv <> [] then - (List.flatten - (List.map - (fun _ -> - [GA.Executable(floc,GA.Tactic(floc, None, GA.Shift floc)); - GA.Executable(floc,GA.NonPunctuationTactical(floc, GA.Skip floc, - (GA.Merge floc)))]) - fv)) - else [])@ - [GA.Executable(floc,GA.Command(floc, GA.Print(floc,"proofterm"))); - GA.Executable(floc,GA.Command(floc, GA.Qed(floc)))] +let trans_formulae ~neg = function + | Ast.Disjunction _ -> assert false + | Ast.Atom a -> trans_atom ~neg a + | Ast.NegAtom _ -> assert false ;; -let convert_ast ng statements context = function - | A.Comment s -> - let s = String.sub s 1 (String.length s - 1) in - let s = - if s.[String.length s - 1] = '\n' then - String.sub s 0 (String.length s - 1) - else - s - in - statements @ [GA.Comment (floc,GA.Note (floc,s))], - context - | A.Inclusion (s,_) -> - statements @ [ - GA.Comment ( - floc, GA.Note ( - floc,"Inclusion of: " ^ s))], context - | A.AnnotatedFormula (name,kind,f,_,_) -> - match kind with - | A.Axiom - | A.Hypothesis -> - statements, f::context - | A.Negated_conjecture when not (check_if_formula_is_negative f) -> - statements, f::context - | A.Negated_conjecture -> - let ueq_case = is_formulae_1eq_negated f in - let fv = collect_fv_1stord_from_formulae f in - let old_f = f in - let f = - PT.Binder - (`Forall, - (mk_ident universe,Some (PT.Sort (`Type (CicUniv.fresh ())))), - convert_formula fv false context f) - in - let o = PT.Theorem (`Theorem,name,f,None) in - (statements @ - [ GA.Executable(floc,GA.Command(floc, - (*if ng then GA.NObj (floc,o) else*) GA.Obj(floc,o))); ] @ - if ng then - ng_generate_tactics fv ueq_case context - (let atom = atom_of_formula old_f in collect_arities atom context) - else generate_tactics fv ueq_case), - context - | A.Definition - | A.Lemma - | A.Theorem - | A.Conjecture - | A.Lemma_conjecture - | A.Plain - | A.Unknown -> assert false -;; (* HELPERS *) let resolve ~tptppath s = let resolved_name = - if Filename.check_suffix s ".p" then - (assert (String.length s > 5); - let prefix = String.sub s 0 3 in - tptppath ^ "/Problems/" ^ prefix ^ "/" ^ s) - else - tptppath ^ "/" ^ s + if tptppath = "/" then s else + if Filename.check_suffix s ".p" then + (assert (String.length s > 5); + let prefix = String.sub s 0 3 in + tptppath ^ "/Problems/" ^ prefix ^ "/" ^ s) + else + tptppath ^ "/" ^ s in if HExtlib.is_regular resolved_name then resolved_name @@ -389,79 +35,30 @@ let resolve ~tptppath s = ;; (* MAIN *) -let tptp2grafite ?(timeout=600) ?(def_depth=10) ?raw_preamble ~tptppath ~filename ~ng () = - paramod_timeout := timeout; - depth := def_depth; +let parse ~tptppath filename = let rec aux = function | [] -> [] - | ((A.Inclusion (file,_)) as hd) :: tl -> + | (Ast.Inclusion (file,_)) :: tl -> let file = resolve ~tptppath file in let lexbuf = Lexing.from_channel (open_in file) in let statements = Parser.main Lexer.yylex lexbuf in - hd :: aux (statements @ tl) + aux (statements @ tl) | hd::tl -> hd :: aux tl in - let statements = aux [A.Inclusion (filename,[])] in - let grafite_ast_statements,_ = - List.fold_left - (fun (st, ctx) f -> - let newst, ctx = convert_ast ng st ctx f in - newst, ctx) - ([],[]) statements - in - let pp t = - (* ZACK: setting width to 80 will trigger a bug of BoxPp.render_to_string - * which will show up using the following command line: - * ./tptp2grafite -tptppath ~tassi/TPTP-v3.1.1 GRP170-1 *) - let width = max_int in - let term_pp prec content_term = - let pres_term = TermContentPres.pp_ast content_term in - let lookup_uri = fun _ -> None in - let markup = CicNotationPres.render ~lookup_uri ~prec pres_term in - let s = BoxPp.render_to_string List.hd width markup ~map_unicode_to_tex:false in - Pcre.substitute - ~rex:(Pcre.regexp ~flags:[`UTF8] "∀[Ha-z][a-z0-9_]*") ~subst:(fun x -> "\n" ^ x) - s + let statements = aux [Ast.Inclusion (filename,[])] in + let positives, negatives = + let rec aux p n = function + | [] -> p,n + | Ast.Comment _ :: tl -> aux p n tl + | Ast.AnnotatedFormula (name, (Ast.Axiom | Ast.Hypothesis), f,_,_) :: tl-> + aux (p@[Ast.Constant name,trans_formulae ~neg:false f]) n tl + | Ast.AnnotatedFormula (name, Ast.Negated_conjecture, f,_,_) :: tl -> + assert (n = []); + aux p (n@[Ast.Constant name, trans_formulae ~neg:true f]) tl + | _ -> prerr_endline "bad syntax"; assert false in - CicNotationPp.set_pp_term (term_pp 90); - let lazy_term_pp = fun x -> assert false in - let obj_pp = CicNotationPp.pp_obj CicNotationPp.pp_term in - Pcre.replace ~pat:"theorem" ~templ:"ntheorem" - (GrafiteAstPp.pp_statement - ~map_unicode_to_tex:false ~term_pp:(term_pp 19) ~lazy_term_pp ~obj_pp t) - in - let buri = Pcre.replace ~pat:"\\.p$" ("cic:/matita/TPTP/" ^ filename) in - let extra_statements_start = [ - (*GA.Executable(floc,GA.Command(floc, - GA.Set(floc,"baseuri",buri)))*)] - in - let preamble = - match raw_preamble with - | None -> - pp (GA.Executable(floc, - GA.Command(floc,GA.Include(floc,true,"logic/equality.ma")))) - | Some s -> s buri - in - let extra_statements_end = [] in - let aliases = [] - (*[("eq","cic:/Coq/Init/Logic/eq.ind#xpointer(1/1)"); - ("trans_eq","cic:/Coq/Init/Logic/trans_eq.con"); - ("eq_ind_r","cic:/Coq/Init/Logic/eq_ind_r.con"); - ("eq_ind","cic:/Coq/Init/Logic/eq_ind.con"); - ("sym_eq","cic:/Coq/Init/Logic/sym_eq.con"); - ("refl_equal","cic:/Coq/Init/Logic/eq.ind#xpointer(1/1/1)")] *) - in - let s1 = List.map pp extra_statements_start in - let s2 = - List.map - (fun (n,s) -> - LexiconAstPp.pp_command (LA.Alias(floc, LA.Ident_alias(n,s))) ^ ".") - aliases + aux [] [] statements in - let s3 = List.map pp grafite_ast_statements in - let s4 = List.map pp extra_statements_end in - String.concat "\n" (s1@[preamble]@s2@s3@s4) + positives, negatives ;; -*) -let parse _ = assert false;;