X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Fgrafite_engine%2FgrafiteEngine.ml;h=df01f8467f2778dbf3a33db297830116dcd0c02b;hb=d0a1160d2bf67698ddcaa5f603f316ceb2e4bf96;hp=c96de18961f252a9f3689ff93937b14b77418f18;hpb=4f12c6bc7fb5f1ba3bd42f78abddb77b3b0a8f93;p=helm.git diff --git a/helm/software/components/grafite_engine/grafiteEngine.ml b/helm/software/components/grafite_engine/grafiteEngine.ml index c96de1896..df01f8467 100644 --- a/helm/software/components/grafite_engine/grafiteEngine.ml +++ b/helm/software/components/grafite_engine/grafiteEngine.ml @@ -56,16 +56,18 @@ let namer_of names = end else FreshNamesGenerator.mk_fresh_name ~subst:[] metasenv context name ~typ -let tactic_of_ast ast = +let tactic_of_ast status ast = let module PET = ProofEngineTypes in match ast with | GrafiteAst.Absurd (_, term) -> Tactics.absurd term | GrafiteAst.Apply (_, term) -> Tactics.apply term - | GrafiteAst.ApplyS (_, term) -> - Tactics.applyS ~term ~dbd:(LibraryDb.instance ()) + | GrafiteAst.ApplyS (_, term, params) -> + Tactics.applyS ~term ~params ~dbd:(LibraryDb.instance ()) + ~universe:status.GrafiteTypes.universe | GrafiteAst.Assumption _ -> Tactics.assumption | GrafiteAst.Auto (_,params) -> AutoTactic.auto_tac ~params ~dbd:(LibraryDb.instance ()) + ~universe:status.GrafiteTypes.universe | GrafiteAst.Change (_, pattern, with_what) -> Tactics.change ~pattern with_what | GrafiteAst.Clear (_,id) -> Tactics.clear id @@ -84,8 +86,10 @@ let tactic_of_ast ast = let dbd = LibraryDb.instance () in let mk_fresh_name_callback = namer_of names in Tactics.decompose ~mk_fresh_name_callback ~dbd ~user_types ?what - | GrafiteAst.Demodulate _ -> Tactics.demodulate ~dbd:(LibraryDb.instance ()) - | GrafiteAst.Discriminate (_,term) -> Tactics.discriminate term + | GrafiteAst.Demodulate _ -> + Tactics.demodulate + ~dbd:(LibraryDb.instance ()) ~universe:status.GrafiteTypes.universe + | GrafiteAst.Destruct (_,term) -> Tactics.destruct term | GrafiteAst.Elim (_, what, using, depth, names) -> Tactics.elim_intros ?using ?depth ~mk_fresh_name_callback:(namer_of names) what @@ -122,7 +126,6 @@ let tactic_of_ast ast = Tactics.generalize ~mk_fresh_name_callback:(namer_of names) pattern | GrafiteAst.Goal (_, n) -> Tactics.set_goal n | GrafiteAst.IdTac _ -> Tactics.id - | GrafiteAst.Injection (_,term) -> Tactics.injection term | GrafiteAst.Intros (_, None, names) -> PrimitiveTactics.intros_tac ~mk_fresh_name_callback:(namer_of names) () | GrafiteAst.Intros (_, Some num, names) -> @@ -152,24 +155,31 @@ let tactic_of_ast ast = | GrafiteAst.Right _ -> Tactics.right | GrafiteAst.Ring _ -> Tactics.ring | GrafiteAst.Split _ -> Tactics.split + | GrafiteAst.Subst _ -> Tactics.subst | GrafiteAst.Symmetry _ -> Tactics.symmetry | GrafiteAst.Transitivity (_, term) -> Tactics.transitivity term (* Implementazioni Aggiunte *) | GrafiteAst.Assume (_, id, t) -> Declarative.assume id t | GrafiteAst.Suppose (_, t, id, t1) -> Declarative.suppose t id t1 | GrafiteAst.By_term_we_proved (_, t, ty, id, t1) -> - Declarative.by_term_we_proved t ty id t1 + Declarative.by_term_we_proved ~dbd:(LibraryDb.instance()) + ~universe:status.GrafiteTypes.universe t ty id t1 | GrafiteAst.We_need_to_prove (_, t, id, t2) -> Declarative.we_need_to_prove t id t2 - | GrafiteAst.Bydone (_, t) -> Declarative.bydone t + | GrafiteAst.Bydone (_, t) -> + Declarative.bydone ~dbd:(LibraryDb.instance()) + ~universe:status.GrafiteTypes.universe t | GrafiteAst.We_proceed_by_induction_on (_, t, t1) -> Declarative.we_proceed_by_induction_on t t1 - | GrafiteAst.Byinduction (_, t, id) -> Declarative.assume id t + | GrafiteAst.Byinduction (_, t, id) -> Declarative.byinduction t id | GrafiteAst.Thesisbecomes (_, t) -> Declarative.thesisbecomes t - | GrafiteAst.Let1 (_, id, t, t1) -> Declarative.let1 id t t1 + | GrafiteAst.ExistsElim (_, t, id1, t1, id2, t2) -> + Declarative.existselim t id1 t1 id2 t2 | GrafiteAst.Case (_,id,params) -> Declarative.case id params - | GrafiteAst.Bywehave(_,t,t1,id,t2,id1) -> Declarative.bywehave t t1 id t2 id1 - | GrafiteAst.RewritingStep (_,termine,t1,t2) -> Declarative.prova termine t1 t2 + | GrafiteAst.AndElim(_,t,id1,t1,id2,t2) -> Declarative.andelim t id1 t1 id2 t2 + | GrafiteAst.RewritingStep (_,termine,t1,t2,cont) -> + Declarative.rewritingstep ~dbd:(LibraryDb.instance ()) + ~universe:status.GrafiteTypes.universe termine t1 t2 cont let classify_tactic tactic = match tactic with @@ -178,7 +188,6 @@ let classify_tactic tactic = | GrafiteAst.Split _ | GrafiteAst.Replace _ | GrafiteAst.Reduce _ - | GrafiteAst.Injection _ | GrafiteAst.IdTac _ | GrafiteAst.Generalize _ | GrafiteAst.Elim _ @@ -303,7 +312,7 @@ let apply_tactic ~disambiguate_tactic (text,prefix_len,tactic) (status, goal) = let proof = GrafiteTypes.get_current_proof status in let proof_status = proof, goal in let needs_reordering, always_opens_a_goal = classify_tactic tactic in - let tactic = tactic_of_ast tactic in + let tactic = tactic_of_ast status tactic in (* apply tactic will change the lexicon_status ... *) (* prerr_endline "apply_tactic bassa"; *) let (proof, opened) = ProofEngineTypes.apply_tactic tactic proof_status in @@ -354,8 +363,8 @@ type eval_ast = disambiguate_command: (GrafiteTypes.status -> - ('obj GrafiteAst.command) disambiguator_input -> - GrafiteTypes.status * Cic.obj GrafiteAst.command) -> + (('term,'obj) GrafiteAst.command) disambiguator_input -> + GrafiteTypes.status * (Cic.term,Cic.obj) GrafiteAst.command) -> disambiguate_macro: (GrafiteTypes.status -> @@ -373,10 +382,10 @@ type eval_ast = type 'a eval_command = {ec_go: 'term 'obj. disambiguate_command: - (GrafiteTypes.status -> ('obj GrafiteAst.command) disambiguator_input -> - GrafiteTypes.status * Cic.obj GrafiteAst.command) -> + (GrafiteTypes.status -> (('term,'obj) GrafiteAst.command) disambiguator_input -> + GrafiteTypes.status * (Cic.term,Cic.obj) GrafiteAst.command) -> options -> GrafiteTypes.status -> - ('obj GrafiteAst.command) disambiguator_input -> + (('term,'obj) GrafiteAst.command) disambiguator_input -> GrafiteTypes.status * UriManager.uri list } @@ -392,8 +401,8 @@ type 'a eval_executable = disambiguate_command: (GrafiteTypes.status -> - ('obj GrafiteAst.command) disambiguator_input -> - GrafiteTypes.status * Cic.obj GrafiteAst.command) -> + (('term,'obj) GrafiteAst.command) disambiguator_input -> + GrafiteTypes.status * (Cic.term,Cic.obj) GrafiteAst.command) -> disambiguate_macro: (GrafiteTypes.status -> @@ -409,8 +418,8 @@ type 'a eval_executable = type 'a eval_from_moo = { efm_go: GrafiteTypes.status -> string -> GrafiteTypes.status } -let coercion_moo_statement_of uri = - GrafiteAst.Coercion (HExtlib.dummy_floc, uri, false) +let coercion_moo_statement_of arity uri = + GrafiteAst.Coercion (HExtlib.dummy_floc, uri, false, arity) let refinement_toolkit = { RefinementTool.type_of_aux' = @@ -435,11 +444,12 @@ let refinement_toolkit = { RefinementTool.pack_coercion_obj = CicRefine.pack_coercion_obj; } -let eval_coercion status ~add_composites uri = +let eval_coercion status ~add_composites uri arity = let status,compounds = - GrafiteSync.add_coercion ~add_composites refinement_toolkit status uri in + GrafiteSync.add_coercion ~add_composites refinement_toolkit status uri arity + in let moo_content = - List.map coercion_moo_statement_of (uri::compounds) + List.map (coercion_moo_statement_of arity) (uri::compounds) in let status = GrafiteTypes.add_moo_content moo_content status in {status with GrafiteTypes.proof_status = GrafiteTypes.No_proof}, @@ -462,6 +472,16 @@ let eval_tactical ~disambiguate_tactic status tac = let goals (_, opened, closed) = opened, closed let set_goals (opened, closed) (status, _, _) = (status, opened, closed) let get_stack (status, _) = GrafiteTypes.get_stack status + + let get_status (status, goal) = + match status.GrafiteTypes.proof_status with + | GrafiteTypes.Incomplete_proof incomplete -> incomplete.GrafiteTypes.proof, goal + | _ -> assert false + + let get_proof (status, _, _) = + match status.GrafiteTypes.proof_status with + | GrafiteTypes.Incomplete_proof incomplete -> incomplete.GrafiteTypes.proof + | _ -> assert false let set_stack stack (status, opened, closed) = GrafiteTypes.set_stack stack status, opened, closed @@ -496,6 +516,8 @@ let eval_tactical ~disambiguate_tactic status tac = | GrafiteAst.Solve (loc, tacticals) -> MatitaTacticals.solve_tactics ~tactics:(List.map (fun t -> "", tactical_of_ast (l+1) t) tacticals) + | GrafiteAst.Progress (loc, tactical) -> + MatitaTacticals.progress_tactic ~tactic:(tactical_of_ast (l+1) tactical) | GrafiteAst.Skip _loc -> MatitaTacticals.skip | GrafiteAst.Dot _loc -> MatitaTacticals.dot @@ -534,7 +556,11 @@ let add_coercions_of_record_to_moo obj lemmas status = let obj,_ = CicEnvironment.get_cooked_obj CicUniv.empty_ugraph uri in let attrs = CicUtil.attributes_of_obj obj in - List.mem (`Class `Coercion) attrs + try + match List.find + (function `Class (`Coercion _) -> true | _-> false) attrs + with `Class (`Coercion n) -> true,n | _ -> assert false + with Not_found -> false,0 with Not_found -> assert false in (* looking at the fields we can know the 'wanted' coercions, but not the @@ -544,9 +570,9 @@ let add_coercions_of_record_to_moo obj lemmas status = let wanted_coercions = HExtlib.filter_map (function - | (name,true) -> + | (name,true,arity) -> Some - (UriManager.uri_of_string + (arity, UriManager.uri_of_string (GrafiteTypes.qualify status name ^ ".con")) | _ -> None) fields @@ -559,13 +585,22 @@ let add_coercions_of_record_to_moo obj lemmas status = List.split (HExtlib.filter_map (fun uri -> - let is_a_wanted_coercion = - List.exists (UriManager.eq uri) wanted_coercions + let is_a_wanted_coercion,arity_wanted = + try + let arity,_ = + List.find (fun (n,u) -> UriManager.eq u uri) + wanted_coercions + in + true, arity + with Not_found -> false, 0 in - if is_a_coercion uri || is_a_wanted_coercion then - Some (uri, coercion_moo_statement_of uri) + let is_a_coercion, arity_coercion = is_a_coercion uri in + if is_a_coercion then + Some (uri, coercion_moo_statement_of arity_coercion uri) + else if is_a_wanted_coercion then + Some (uri, coercion_moo_statement_of arity_wanted uri) else - None) + None) lemmas) in (*prerr_endline "actual coercions:"; @@ -590,14 +625,28 @@ let rec eval_command = {ec_go = fun ~disambiguate_command opts status let status,cmd = disambiguate_command status (text,prefix_len,cmd) in let status,uris = match cmd with - | GrafiteAst.Print (_,"proofterm") -> - let _,_,p,_ = GrafiteTypes.get_current_proof status in - print_endline (AutoTactic.pp_proofterm p); - status,[] - | GrafiteAst.Print (_,_) -> status,[] + | GrafiteAst.Index (loc,None,uri) -> + assert false (* TODO: for user input *) + | GrafiteAst.Index (loc,Some key,uri) -> + let universe = Universe.index + status.GrafiteTypes.universe key (CicUtil.term_of_uri uri) in + let status = {status with GrafiteTypes.universe = universe} in +(* debug + let msg = + let candidates = Universe.get_candidates status.GrafiteTypes.universe key in + ("candidates for " ^ (CicPp.ppterm key) ^ " = " ^ + (String.concat "\n" (List.map CicPp.ppterm candidates))) + in + prerr_endline msg; +*) + let status = GrafiteTypes.add_moo_content [cmd] status in + status,[] + | GrafiteAst.Coercion (loc, uri, add_composites, arity) -> + eval_coercion status ~add_composites uri arity | GrafiteAst.Default (loc, what, uris) as cmd -> LibraryObjects.set_default what uris; GrafiteTypes.add_moo_content [cmd] status,[] + | GrafiteAst.Drop loc -> raise Drop | GrafiteAst.Include (loc, baseuri) -> let moopath_rw, moopath_r = LibraryMisc.obj_file_of_baseuri @@ -611,7 +660,52 @@ let rec eval_command = {ec_go = fun ~disambiguate_command opts status raise (IncludedFileNotCompiled (moopath_rw,baseuri)) in let status = eval_from_moo.efm_go status moopath in +(* debug + let lt_uri = UriManager.uri_of_string "cic:/matita/nat/orders/lt.con" in + let nat_uri = UriManager.uri_of_string "cic:/matita/nat/nat/nat.ind" in + let nat = Cic.MutInd(nat_uri,0,[]) in + let zero = Cic.MutConstruct(nat_uri,0,1,[]) in + let succ = Cic.MutConstruct(nat_uri,0,2,[]) in + let fake= Cic.Meta(-1,[]) in + let term= Cic.Appl [Cic.Const (lt_uri,[]);zero;Cic.Appl[succ;zero]] in let msg = + let candidates = Universe.get_candidates status.GrafiteTypes.universe term in + ("candidates for " ^ (CicPp.ppterm term) ^ " = " ^ + (String.concat "\n" (List.map CicPp.ppterm candidates))) + in + prerr_endline msg; +*) status,[] + | GrafiteAst.Print (_,"proofterm") -> + let _,_,p,_ = GrafiteTypes.get_current_proof status in + print_endline (AutoTactic.pp_proofterm p); + status,[] + | GrafiteAst.Print (_,_) -> status,[] + | GrafiteAst.Qed loc -> + let uri, metasenv, bo, ty = + match status.GrafiteTypes.proof_status with + | GrafiteTypes.Proof (Some uri, metasenv, body, ty) -> + uri, metasenv, body, ty + | GrafiteTypes.Proof (None, metasenv, body, ty) -> + raise (GrafiteTypes.Command_error + ("Someone allows to start a theorem without giving the "^ + "name/uri. This should be fixed!")) + | _-> + raise + (GrafiteTypes.Command_error "You can't Qed an incomplete theorem") + in + if metasenv <> [] then + raise + (GrafiteTypes.Command_error + "Proof not completed! metasenv is not empty!"); + let name = UriManager.name_of_uri uri in + let obj = Cic.Constant (name,Some bo,ty,[],[]) in + let status, lemmas = add_obj uri obj status in + {status with + GrafiteTypes.proof_status = GrafiteTypes.No_proof}, + uri::lemmas + | GrafiteAst.Relation (loc, id, a, aeq, refl, sym, trans) -> + Setoids.add_relation id a aeq refl sym trans; + status, [] (*CSC: TO BE FIXED *) | GrafiteAst.Set (loc, name, value) -> if name = "baseuri" then begin let value = @@ -641,31 +735,6 @@ let rec eval_command = {ec_go = fun ~disambiguate_command opts status "/foo.con"))); end; GrafiteTypes.set_option status name value,[] - | GrafiteAst.Drop loc -> raise Drop - | GrafiteAst.Qed loc -> - let uri, metasenv, bo, ty = - match status.GrafiteTypes.proof_status with - | GrafiteTypes.Proof (Some uri, metasenv, body, ty) -> - uri, metasenv, body, ty - | GrafiteTypes.Proof (None, metasenv, body, ty) -> - raise (GrafiteTypes.Command_error - ("Someone allows to start a theorem without giving the "^ - "name/uri. This should be fixed!")) - | _-> - raise - (GrafiteTypes.Command_error "You can't Qed an incomplete theorem") - in - if metasenv <> [] then - raise - (GrafiteTypes.Command_error - "Proof not completed! metasenv is not empty!"); - let name = UriManager.name_of_uri uri in - let obj = Cic.Constant (name,Some bo,ty,[],[]) in - let status, lemmas = add_obj uri obj status in - {status with GrafiteTypes.proof_status = GrafiteTypes.No_proof}, - uri::lemmas - | GrafiteAst.Coercion (loc, uri, add_composites) -> - eval_coercion status ~add_composites uri | GrafiteAst.Obj (loc,obj) -> let ext,name = match obj with