X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=components%2Fgrafite_engine%2FgrafiteEngine.ml;h=582ad112d667e559aec395cde9a3c992731656ff;hb=67cf4ce16c346991c8eda71576414f5c6324ab82;hp=c55bf8d9ebecb5296304548c296d6f42a0b17426;hpb=9a17bf0f4213f5f130326d658ce7ee4b41f6d6f2;p=helm.git diff --git a/components/grafite_engine/grafiteEngine.ml b/components/grafite_engine/grafiteEngine.ml index c55bf8d9e..582ad112d 100644 --- a/components/grafite_engine/grafiteEngine.ml +++ b/components/grafite_engine/grafiteEngine.ml @@ -28,12 +28,15 @@ open Printf exception Drop -exception IncludedFileNotCompiled of string (* file name *) +(* mo file name, ma file name *) +exception IncludedFileNotCompiled of string * string exception Macro of GrafiteAst.loc * (Cic.context -> GrafiteTypes.status * Cic.term GrafiteAst.macro) exception ReadOnlyUri of string +type 'a disambiguator_input = string * int * 'a + type options = { do_heavy_checks: bool ; clean_baseuri: bool @@ -53,15 +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, params) -> + Tactics.applyS ~term ~params ~dbd:(LibraryDb.instance ()) + ~universe:status.GrafiteTypes.universe | GrafiteAst.Assumption _ -> Tactics.assumption - | GrafiteAst.Auto (_,depth,width,paramodulation,full) -> - AutoTactic.auto_tac ?depth ?width ?paramodulation ?full - ~dbd:(LibraryDb.instance ()) () + | 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 @@ -79,8 +85,9 @@ let tactic_of_ast ast = let user_types = List.rev_map to_type types in 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.Discriminate (_,term) -> Tactics.discriminate term + Tactics.decompose ~mk_fresh_name_callback ~dbd ~user_types ?what + | GrafiteAst.Demodulate _ -> Tactics.demodulate ~dbd:(LibraryDb.instance ()) + | 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 @@ -93,8 +100,6 @@ let tactic_of_ast ast = | GrafiteAst.Fold (_, reduction_kind, term, pattern) -> let reduction = match reduction_kind with - | `Demodulate -> - GrafiteTypes.command_error "demodulation can't be folded" | `Normalize -> PET.const_lazy_reduction (CicReduction.normalize ~delta:false ~subst:[]) @@ -119,7 +124,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) -> @@ -127,16 +131,15 @@ let tactic_of_ast ast = ~mk_fresh_name_callback:(namer_of names) () | GrafiteAst.Inversion (_, term) -> Tactics.inversion term - | GrafiteAst.LApply (_, how_many, to_what, what, ident) -> + | GrafiteAst.LApply (_, linear, how_many, to_what, what, ident) -> let names = match ident with None -> [] | Some id -> [id] in - Tactics.lapply ~mk_fresh_name_callback:(namer_of names) ?how_many - ~to_what what + Tactics.lapply ~mk_fresh_name_callback:(namer_of names) + ~linear ?how_many ~to_what what | GrafiteAst.Left _ -> Tactics.left | GrafiteAst.LetIn (loc,term,name) -> Tactics.letin term ~mk_fresh_name_callback:(namer_of [name]) | GrafiteAst.Reduce (_, reduction_kind, pattern) -> (match reduction_kind with - | `Demodulate -> Tactics.demodulate ~dbd:(LibraryDb.instance ()) ~pattern | `Normalize -> Tactics.normalize ~pattern | `Reduce -> Tactics.reduce ~pattern | `Simpl -> Tactics.simpl ~pattern @@ -150,10 +153,28 @@ 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 ~dbd:(LibraryDb.instance()) 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 ~dbd:(LibraryDb.instance()) t + | GrafiteAst.We_proceed_by_induction_on (_, t, t1) -> + Declarative.we_proceed_by_induction_on t t1 + | GrafiteAst.Byinduction (_, t, id) -> Declarative.byinduction t id + | GrafiteAst.Thesisbecomes (_, t) -> Declarative.thesisbecomes t + | GrafiteAst.ExistsElim (_, t, id1, t1, id2, t2) -> + Declarative.existselim t id1 t1 id2 t2 + | GrafiteAst.Case (_,id,params) -> Declarative.case id params + | 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 ()) termine t1 t2 cont -(* maybe we only need special cases for apply and goal *) let classify_tactic tactic = match tactic with (* tactics that can't close the goal (return a goal we want to "select") *) @@ -161,7 +182,6 @@ let classify_tactic tactic = | GrafiteAst.Split _ | GrafiteAst.Replace _ | GrafiteAst.Reduce _ - | GrafiteAst.Injection _ | GrafiteAst.IdTac _ | GrafiteAst.Generalize _ | GrafiteAst.Elim _ @@ -275,18 +295,18 @@ let reorder_metasenv start refine tactic goals current_goal always_opens_a_goal= |+ FINE DEBUG CODE +| *) before @ produced_metas @ after, goals -let apply_tactic ~disambiguate_tactic tactic (status, goal) = +let apply_tactic ~disambiguate_tactic (text,prefix_len,tactic) (status, goal) = (* prerr_endline "apply_tactic"; *) (* prerr_endline (Continuationals.Stack.pp (GrafiteTypes.get_stack status)); *) let starting_metasenv = GrafiteTypes.get_proof_metasenv status in let before = List.map (fun g, _, _ -> g) starting_metasenv in (* prerr_endline "disambiguate"; *) - let status, tactic = disambiguate_tactic status goal tactic in + let status, tactic = disambiguate_tactic status goal (text,prefix_len,tactic) in let metasenv_after_refinement = GrafiteTypes.get_proof_metasenv status in 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 @@ -330,34 +350,36 @@ type eval_ast = disambiguate_tactic: (GrafiteTypes.status -> ProofEngineTypes.goal -> - ('term, 'lazy_term, 'reduction, 'ident) GrafiteAst.tactic -> + (('term, 'lazy_term, 'reduction, 'ident) GrafiteAst.tactic) + disambiguator_input -> GrafiteTypes.status * (Cic.term, Cic.lazy_term, Cic.lazy_term GrafiteAst.reduction, string) GrafiteAst.tactic) -> disambiguate_command: (GrafiteTypes.status -> - 'obj GrafiteAst.command -> - GrafiteTypes.status * Cic.obj GrafiteAst.command) -> + (('term,'obj) GrafiteAst.command) disambiguator_input -> + GrafiteTypes.status * (Cic.term,Cic.obj) GrafiteAst.command) -> disambiguate_macro: (GrafiteTypes.status -> - 'term GrafiteAst.macro -> + ('term GrafiteAst.macro) disambiguator_input -> Cic.context -> GrafiteTypes.status * Cic.term GrafiteAst.macro) -> ?do_heavy_checks:bool -> ?clean_baseuri:bool -> GrafiteTypes.status -> - ('term, 'lazy_term, 'reduction, 'obj, 'ident) GrafiteAst.statement -> + (('term, 'lazy_term, 'reduction, 'obj, 'ident) GrafiteAst.statement) + disambiguator_input -> GrafiteTypes.status * UriManager.uri list } type 'a eval_command = {ec_go: 'term 'obj. disambiguate_command: - (GrafiteTypes.status -> - 'obj GrafiteAst.command -> - GrafiteTypes.status * Cic.obj GrafiteAst.command) -> - options -> GrafiteTypes.status -> 'obj GrafiteAst.command -> + (GrafiteTypes.status -> (('term,'obj) GrafiteAst.command) disambiguator_input -> + GrafiteTypes.status * (Cic.term,Cic.obj) GrafiteAst.command) -> + options -> GrafiteTypes.status -> + (('term,'obj) GrafiteAst.command) disambiguator_input -> GrafiteTypes.status * UriManager.uri list } @@ -366,39 +388,64 @@ type 'a eval_executable = disambiguate_tactic: (GrafiteTypes.status -> ProofEngineTypes.goal -> - ('term, 'lazy_term, 'reduction, 'ident) GrafiteAst.tactic -> + (('term, 'lazy_term, 'reduction, 'ident) GrafiteAst.tactic) + disambiguator_input -> GrafiteTypes.status * (Cic.term, Cic.lazy_term, Cic.lazy_term GrafiteAst.reduction, string) GrafiteAst.tactic) -> disambiguate_command: (GrafiteTypes.status -> - 'obj GrafiteAst.command -> - GrafiteTypes.status * Cic.obj GrafiteAst.command) -> + (('term,'obj) GrafiteAst.command) disambiguator_input -> + GrafiteTypes.status * (Cic.term,Cic.obj) GrafiteAst.command) -> disambiguate_macro: (GrafiteTypes.status -> - 'term GrafiteAst.macro -> + ('term GrafiteAst.macro) disambiguator_input -> Cic.context -> GrafiteTypes.status * Cic.term GrafiteAst.macro) -> options -> GrafiteTypes.status -> - ('term, 'lazy_term, 'reduction, 'obj, 'ident) GrafiteAst.code -> + (('term, 'lazy_term, 'reduction, 'obj, 'ident) GrafiteAst.code) disambiguator_input -> GrafiteTypes.status * UriManager.uri list } 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 eval_coercion status ~add_composites uri = - let basedir = Helm_registry.get "matita.basedir" in +let refinement_toolkit = { + RefinementTool.type_of_aux' = + (fun ?localization_tbl e c t u -> + let saved = !CicRefine.insert_coercions in + CicRefine.insert_coercions:= false; + let rc = + try + let t, ty, metasenv, ugraph = + CicRefine.type_of_aux' ?localization_tbl e c t u in + RefinementTool.Success (t, ty, metasenv, ugraph) + with + | CicRefine.RefineFailure s + | CicRefine.Uncertain s + | CicRefine.AssertFailure s -> RefinementTool.Exception s + in + CicRefine.insert_coercions := saved; + rc); + RefinementTool.ppsubst = CicMetaSubst.ppsubst; + RefinementTool.apply_subst = CicMetaSubst.apply_subst; + RefinementTool.ppmetasenv = CicMetaSubst.ppmetasenv; + RefinementTool.pack_coercion_obj = CicRefine.pack_coercion_obj; + } + +let eval_coercion status ~add_composites uri arity = let status,compounds = - prerr_endline "evaluating a coercion command"; - GrafiteSync.add_coercion ~basedir ~add_composites status uri in - let moo_content = coercion_moo_statement_of uri in - let status = GrafiteTypes.add_moo_content [moo_content] status in + GrafiteSync.add_coercion ~add_composites refinement_toolkit status uri arity + in + let moo_content = + 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}, compounds @@ -413,12 +460,22 @@ let eval_tactical ~disambiguate_tactic status tac = type tactic = input_status -> output_status - let id_tactic = apply_tactic (GrafiteAst.IdTac HExtlib.dummy_floc) + let id_tactic = apply_tactic ("",0,(GrafiteAst.IdTac HExtlib.dummy_floc)) let mk_tactic tac = tac let apply_tactic tac = 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 @@ -428,7 +485,9 @@ let eval_tactical ~disambiguate_tactic status tac = end in let module MatitaTacticals = Tacticals.Make (MatitaStatus) in - let rec tactical_of_ast l tac = + let rec tactical_of_ast l (text,prefix_len,tac) = + let apply_tactic t = apply_tactic (text, prefix_len, t) in + let tactical_of_ast l t = tactical_of_ast l (text,prefix_len,t) in match tac with | GrafiteAst.Tactic (loc, tactic) -> MatitaTacticals.tactic (MatitaStatus.mk_tactic (apply_tactic tactic)) @@ -451,16 +510,19 @@ 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 - | GrafiteAst.Semicolon loc -> MatitaTacticals.semicolon - | GrafiteAst.Branch loc -> MatitaTacticals.branch - | GrafiteAst.Shift loc -> MatitaTacticals.shift - | GrafiteAst.Pos (loc, i) -> MatitaTacticals.pos i - | GrafiteAst.Merge loc -> MatitaTacticals.merge - | GrafiteAst.Focus (loc, goals) -> MatitaTacticals.focus goals - | GrafiteAst.Unfocus loc -> MatitaTacticals.unfocus + | GrafiteAst.Skip _loc -> MatitaTacticals.skip + | GrafiteAst.Dot _loc -> MatitaTacticals.dot + | GrafiteAst.Semicolon _loc -> MatitaTacticals.semicolon + | GrafiteAst.Branch _loc -> MatitaTacticals.branch + | GrafiteAst.Shift _loc -> MatitaTacticals.shift + | GrafiteAst.Pos (_loc, i) -> MatitaTacticals.pos i + | GrafiteAst.Merge _loc -> MatitaTacticals.merge + | GrafiteAst.Focus (_loc, goals) -> MatitaTacticals.focus goals + | GrafiteAst.Unfocus _loc -> MatitaTacticals.unfocus + | GrafiteAst.Wildcard _loc -> MatitaTacticals.wildcard in let status, _, _ = tactical_of_ast 0 tac (status, ~-1) in let status = (* is proof completed? *) @@ -488,7 +550,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 `Projection) 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 @@ -498,78 +564,116 @@ 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 in - prerr_endline "wanted coercions:"; + (*prerr_endline "wanted coercions:"; List.iter (fun u -> prerr_endline (UriManager.string_of_uri u)) - wanted_coercions; + wanted_coercions; *) let coercions, moo_content = List.split (HExtlib.filter_map (fun uri -> - let is_a_wanted_coercion = - List.exists (UriManager.eq uri) wanted_coercions in - if is_a_coercion uri && is_a_wanted_coercion then - Some (uri, coercion_moo_statement_of uri) + 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 + 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:"; + (*prerr_endline "actual coercions:"; + List.iter + (fun u -> prerr_endline (UriManager.string_of_uri u)) + coercions; + prerr_endline "lemmas was:"; List.iter (fun u -> prerr_endline (UriManager.string_of_uri u)) - coercions; + lemmas; *) let status = GrafiteTypes.add_moo_content moo_content status in {status with GrafiteTypes.coercions = coercions @ status.GrafiteTypes.coercions}, lemmas let add_obj uri obj status = - let basedir = Helm_registry.get "matita.basedir" in - let status,lemmas = GrafiteSync.add_obj ~basedir uri obj status in + let status,lemmas = GrafiteSync.add_obj refinement_toolkit uri obj status in status, lemmas -let rec eval_command = {ec_go = fun ~disambiguate_command opts status cmd -> - let status,cmd = disambiguate_command status cmd in - let basedir = Helm_registry.get "matita.basedir" in +let rec eval_command = {ec_go = fun ~disambiguate_command opts status +(text,prefix_len,cmd) -> + let status,cmd = disambiguate_command status (text,prefix_len,cmd) in let status,uris = match cmd with + | 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 = LibraryMisc.obj_file_of_baseuri ~basedir ~baseuri in - if not (Sys.file_exists moopath) then - raise (IncludedFileNotCompiled moopath); + let moopath_rw, moopath_r = + LibraryMisc.obj_file_of_baseuri + ~must_exist:false ~baseuri ~writable:true, + LibraryMisc.obj_file_of_baseuri + ~must_exist:false ~baseuri ~writable:false + in + let moopath = + if Sys.file_exists moopath_r then moopath_r else + if Sys.file_exists moopath_rw then moopath_rw else + 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.Set (loc, name, value) -> - if name = "baseuri" then begin - let value = - let v = Http_getter_misc.strip_trailing_slash value in - try - ignore (String.index v ' '); - GrafiteTypes.command_error "baseuri can't contain spaces" - with Not_found -> v - in - if Http_getter_storage.is_read_only value then begin - HLog.error (sprintf "uri %s belongs to a read-only repository" value); - raise (ReadOnlyUri value) - end; - if not (GrafiteMisc.is_empty value) && opts.clean_baseuri then begin - HLog.message ("baseuri " ^ value ^ " is not empty"); - HLog.message ("cleaning baseuri " ^ value); - LibraryClean.clean_baseuris ~basedir [value]; - end; - end; - GrafiteTypes.set_option status name value,[] - | GrafiteAst.Drop loc -> raise Drop + | 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 @@ -590,10 +694,41 @@ let rec eval_command = {ec_go = fun ~disambiguate_command opts status cmd -> 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}, + {status with + GrafiteTypes.proof_status = GrafiteTypes.No_proof}, uri::lemmas - | GrafiteAst.Coercion (loc, uri, add_composites) -> - eval_coercion status ~add_composites uri + | 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 = + let v = Http_getter_misc.strip_trailing_slash value in + try + ignore (String.index v ' '); + GrafiteTypes.command_error "baseuri can't contain spaces" + with Not_found -> v + in + if Http_getter_storage.is_read_only value then begin + HLog.error (sprintf "uri %s belongs to a read-only repository" value); + raise (ReadOnlyUri value) + end; + if not (Http_getter_storage.is_empty value) && + opts.clean_baseuri + then begin + HLog.message ("baseuri " ^ value ^ " is not empty"); + HLog.message ("cleaning baseuri " ^ value); + LibraryClean.clean_baseuris [value]; + assert (Http_getter_storage.is_empty value); + end; + if not (Helm_registry.get_opt_default Helm_registry.bool "matita.nodisk" + ~default:false) + then + HExtlib.mkdir + (Filename.dirname (Http_getter.filename ~writable:true (value ^ + "/foo.con"))); + end; + GrafiteTypes.set_option status name value,[] | GrafiteAst.Obj (loc,obj) -> let ext,name = match obj with @@ -604,8 +739,8 @@ let rec eval_command = {ec_go = fun ~disambiguate_command opts status cmd -> (match types with (name,_,_,_)::_ -> name | _ -> assert false) | _ -> assert false in let uri = - UriManager.uri_of_string (GrafiteTypes.qualify status name ^ ext) - in + UriManager.uri_of_string (GrafiteTypes.qualify status name ^ ext) in + let obj = CicRefine.pack_coercion_obj obj in let metasenv = GrafiteTypes.get_proof_metasenv status in match obj with | Cic.CurrentProof (_,metasenv',bo,ty,_,_) -> @@ -640,9 +775,8 @@ let rec eval_command = {ec_go = fun ~disambiguate_command opts status cmd -> ("Theorem already proved: " ^ UriManager.string_of_uri x ^ "\nPlease use a variant.")); end; - assert (metasenv = metasenv'); - let initial_proof = (Some uri, metasenv, bo, ty) in - let initial_stack = Continuationals.Stack.of_metasenv metasenv in + let initial_proof = (Some uri, metasenv', bo, ty) in + let initial_stack = Continuationals.Stack.of_metasenv metasenv' in { status with GrafiteTypes.proof_status = GrafiteTypes.Incomplete_proof { GrafiteTypes.proof = initial_proof; stack = initial_stack } }, @@ -664,23 +798,25 @@ let rec eval_command = {ec_go = fun ~disambiguate_command opts status cmd -> {status with GrafiteTypes.proof_status = GrafiteTypes.No_proof},uris | _ -> status,uris -} and eval_executable = {ee_go = fun ~disambiguate_tactic ~disambiguate_command ~disambiguate_macro opts status ex -> +} and eval_executable = {ee_go = fun ~disambiguate_tactic ~disambiguate_command +~disambiguate_macro opts status (text,prefix_len,ex) -> match ex with | GrafiteAst.Tactical (_, tac, None) -> - eval_tactical ~disambiguate_tactic status tac,[] + eval_tactical ~disambiguate_tactic status (text,prefix_len,tac),[] | GrafiteAst.Tactical (_, tac, Some punct) -> - let status = eval_tactical ~disambiguate_tactic status tac in - eval_tactical ~disambiguate_tactic status punct,[] + let status = + eval_tactical ~disambiguate_tactic status (text,prefix_len,tac) in + eval_tactical ~disambiguate_tactic status (text,prefix_len,punct),[] | GrafiteAst.Command (_, cmd) -> - eval_command.ec_go ~disambiguate_command opts status cmd + eval_command.ec_go ~disambiguate_command opts status (text,prefix_len,cmd) | GrafiteAst.Macro (loc, macro) -> - raise (Macro (loc,disambiguate_macro status macro)) + raise (Macro (loc,disambiguate_macro status (text,prefix_len,macro))) } and eval_from_moo = {efm_go = fun status fname -> let ast_of_cmd cmd = - GrafiteAst.Executable (HExtlib.dummy_floc, + ("",0,GrafiteAst.Executable (HExtlib.dummy_floc, GrafiteAst.Command (HExtlib.dummy_floc, - cmd)) + cmd))) in let moo = GrafiteMarshal.load_moo fname in List.fold_left @@ -688,15 +824,17 @@ let rec eval_command = {ec_go = fun ~disambiguate_command opts status cmd -> let ast = ast_of_cmd ast in let status,lemmas = eval_ast.ea_go - ~disambiguate_tactic:(fun status _ tactic -> status,tactic) - ~disambiguate_command:(fun status cmd -> status,cmd) + ~disambiguate_tactic:(fun status _ (_,_,tactic) -> status,tactic) + ~disambiguate_command:(fun status (_,_,cmd) -> status,cmd) ~disambiguate_macro:(fun _ _ -> assert false) status ast in assert (lemmas=[]); status) status moo -} and eval_ast = {ea_go = fun ~disambiguate_tactic ~disambiguate_command ~disambiguate_macro ?(do_heavy_checks=false) ?(clean_baseuri=true) status st +} and eval_ast = {ea_go = fun ~disambiguate_tactic ~disambiguate_command +~disambiguate_macro ?(do_heavy_checks=false) ?(clean_baseuri=true) status +(text,prefix_len,st) -> let opts = { do_heavy_checks = do_heavy_checks ; @@ -705,8 +843,8 @@ let rec eval_command = {ec_go = fun ~disambiguate_command opts status cmd -> match st with | GrafiteAst.Executable (_,ex) -> eval_executable.ee_go ~disambiguate_tactic ~disambiguate_command - ~disambiguate_macro opts status ex - | GrafiteAst.Comment (_,c) -> eval_comment status c,[] + ~disambiguate_macro opts status (text,prefix_len,ex) + | GrafiteAst.Comment (_,c) -> eval_comment status (text,prefix_len,c),[] } let eval_ast = eval_ast.ea_go