diff options
Diffstat (limited to 'translate/pptacticnew.ml')
-rw-r--r-- | translate/pptacticnew.ml | 905 |
1 files changed, 0 insertions, 905 deletions
diff --git a/translate/pptacticnew.ml b/translate/pptacticnew.ml deleted file mode 100644 index 7da30c4e..00000000 --- a/translate/pptacticnew.ml +++ /dev/null @@ -1,905 +0,0 @@ -(************************************************************************) -(* v * The Coq Proof Assistant / The Coq Development Team *) -(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *) -(* \VV/ **************************************************************) -(* // * This file is distributed under the terms of the *) -(* * GNU Lesser General Public License Version 2.1 *) -(************************************************************************) - -(* $Id: pptacticnew.ml,v 1.57.2.3 2005/05/15 12:47:03 herbelin Exp $ *) - -open Pp -open Names -open Nameops -open Environ -open Util -open Extend -open Ppextend -open Ppconstrnew -open Tacexpr -open Rawterm -open Topconstr -open Genarg -open Libnames -open Pptactic - -let sep_v = fun _ -> str"," ++ spc() - -let strip_prod_binders_expr n ty = - let rec strip_ty acc n ty = - match ty with - Topconstr.CProdN(_,bll,a) -> - let nb = - List.fold_left (fun i (nal,_) -> i + List.length nal) 0 bll in - if nb >= n then (List.rev (bll@acc), a) - else strip_ty (bll@acc) (n-nb) a - | Topconstr.CArrow(_,a,b) -> - if n=1 then - (List.rev (([(dummy_loc,Anonymous)],a)::acc), b) - else strip_ty (([(dummy_loc,Anonymous)],a)::acc) (n-1) b - | _ -> error "Cannot translate fix tactic: not enough products" in - strip_ty [] n ty - - -(* In v8 syntax only double quote char is escaped by repeating it *) -let rec escape_string_v8 s = - let rec escape_at s i = - if i<0 then s - else if s.[i] == '"' then - let s' = String.sub s 0 i^"\""^String.sub s i (String.length s - i) in - escape_at s' (i-1) - else escape_at s (i-1) in - escape_at s (String.length s - 1) - -let qstringnew s = str ("\""^escape_string_v8 s^"\"") -let qsnew = qstringnew - -let translate_v7_ltac = function - | "DiscrR" -> "discrR" - | "Sup0" -> "prove_sup0" - | "SupOmega" -> "omega_sup" - | "Sup" -> "prove_sup" - | "RCompute" -> "Rcompute" - | "IntroHypG" -> "intro_hyp_glob" - | "IntroHypL" -> "intro_hyp_pt" - | "IsDiff_pt" -> "is_diff_pt" - | "IsDiff_glob" -> "is_diff_glob" - | "IsCont_pt" -> "is_cont_pt" - | "IsCont_glob" -> "is_cont_glob" - | "RewTerm" -> "rew_term" - | "ConsProof" -> "deriv_proof" - | "SimplifyDerive" -> "simplify_derive" - | "Reg" -> "reg" (* ??? *) - | "SplitAbs" -> "split_case_Rabs" - | "SplitAbsolu" -> "split_Rabs" - | "SplitRmult" -> "split_Rmult" - | "CaseEqk" -> "case_eq" - | "SqRing" -> "ring_Rsqr" - | "TailSimpl" -> "tail_simpl" - | "CoInduction" -> "coinduction" - | "ElimCompare" -> "elim_compare" - | "CCsolve" -> "CCsolve" (* ?? *) - | "ArrayAccess" -> "array_access" - | "MemAssoc" -> "mem_assoc" - | "SeekVarAux" -> "seek_var_aux" - | "SeekVar" -> "seek_var" - | "NumberAux" -> "number_aux" - | "Number" -> "number" - | "BuildVarList" -> "build_varlist" - | "Assoc" -> "assoc" - | "Remove" -> "remove" - | "Union" -> "union" - | "RawGiveMult" -> "raw_give_mult" - | "GiveMult" -> "give_mult" - | "ApplyAssoc" -> "apply_assoc" - | "ApplyDistrib" -> "apply_distrib" - | "GrepMult" -> "grep_mult" - | "WeakReduce" -> "weak_reduce" - | "Multiply" -> "multiply" - | "ApplyMultiply" -> "apply_multiply" - | "ApplyInverse" -> "apply_inverse" - | "StrongFail" -> "strong_fail" - | "InverseTestAux" -> "inverse_test_aux" - | "InverseTest" -> "inverse_test" - | "ApplySimplif" -> "apply_simplif" - | "Unfolds" -> "unfolds" - | "Reduce" -> "reduce" - | "Field_Gen_Aux" -> "field_gen_aux" - | "Field_Gen" -> "field_gen" - | "EvalWeakReduce" -> "eval_weak_reduce" - | "Field_Term" -> "field_term" - | "Fourier" -> "fourier" (* ou Fourier ?? *) - | "FourierEq" -> "fourier_eq" - | "S_to_plus" -> "rewrite_S_to_plus_term" - | "S_to_plus_eq" -> "rewrite_S_to_plus" - | "NatRing" -> "ring_nat" - | "Solve1" -> "solve1" - | "Solve2" -> "solve2" - | "Elim_eq_term" -> "elim_eq_term" - | "Elim_eq_Z" -> "elim_eq_Z" - | "Elim_eq_pos" -> "elim_eq_pos" - | "Elim_Zcompare" -> "elim_Zcompare" - | "ProveStable" -> "prove_stable" - | "interp_A" -> "interp_A" - | "InitExp" -> "init_exp" - | "SimplInv" -> "simpl_inv" - | "Map" -> "map_tactic" - | "BuildMonomAux" -> "build_monom_aux" - | "BuildMonom" -> "build_monom" - | "SimplMonomAux" -> "simpl_monom_aux" - | "SimplMonom" -> "simpl_monom" - | "SimplAllMonoms" -> "simpl_all_monomials" - | "AssocDistrib" -> "assoc_distrib" - | "NowShow" -> "now_show" - | ("subst"|"simpl"|"elim"|"destruct"|"apply"|"intro" (* ... *)) as x -> - let x' = x^"_" in - msgerrnl - (str ("Warning: '"^ - x^"' is now a primitive tactic; it has been translated to '"^x'^"'")); - x' - | x -> x - -let id_of_ltac_v7_id id = - id_of_string (translate_v7_ltac (string_of_id id)) - -let pr_ltac_or_var pr = function - | ArgArg x -> pr x - | ArgVar (loc,id) -> - pr_with_comments loc (pr_id (id_of_ltac_v7_id id)) - -let pr_arg pr x = spc () ++ pr x - -let pr_ltac_constant sp = - (* Source de bug: le nom le plus court n'est pas forcement correct - apres renommage *) - let qid = Nametab.shortest_qualid_of_tactic sp in - let dir,id = repr_qualid qid in - pr_qualid (make_qualid dir (id_of_ltac_v7_id id)) - -let pr_evaluable_reference_env env = function - | EvalVarRef id -> pr_id (Constrextern.v7_to_v8_id id) - | EvalConstRef sp -> pr_global (Termops.vars_of_env env) (Libnames.ConstRef sp) - -let pr_inductive vars ind = pr_global vars (Libnames.IndRef ind) - -let pr_quantified_hypothesis = function - | AnonHyp n -> int n - | NamedHyp id -> pr_id id - -let pr_quantified_hypothesis_arg h = spc () ++ pr_quantified_hypothesis h - -(* -let pr_binding prc = function - | NamedHyp id, c -> hov 1 (pr_id id ++ str " := " ++ cut () ++ prc c) - | AnonHyp n, c -> hov 1 (int n ++ str " := " ++ cut () ++ prc c) -*) - -let pr_esubst prc l = - let pr_qhyp = function - (_,AnonHyp n,c) -> str "(" ++ int n ++ str" := " ++ prc c ++ str ")" - | (_,NamedHyp id,c) -> - str "(" ++ pr_id id ++ str" := " ++ prc c ++ str ")" - in - prlist_with_sep spc pr_qhyp l - -let pr_bindings_gen for_ex prlc prc = function - | ImplicitBindings l -> - spc () ++ - hv 2 ((if for_ex then mt() else str "with" ++ spc ()) ++ - prlist_with_sep spc prc l) - | ExplicitBindings l -> - spc () ++ - hv 2 ((if for_ex then mt() else str "with" ++ spc ()) ++ - pr_esubst prlc l) - | NoBindings -> mt () - -let pr_bindings prlc prc = pr_bindings_gen false prlc prc - -let pr_with_bindings prlc prc (c,bl) = - if Options.do_translate () then - (* translator calls pr_with_bindings on rawconstr: we cast it! *) - let bl' = translate_with_bindings (fst (Obj.magic c) : rawconstr) bl in - hov 1 (prc c ++ pr_bindings prlc prc bl') - else - hov 1 (prc c ++ pr_bindings prlc prc bl) - -let pr_with_constr prc = function - | None -> mt () - | Some c -> spc () ++ hov 1 (str "with" ++ spc () ++ prc c) - -(* Translator copy of pr_intro_pattern based on a translating "pr_id" *) -let rec pr_intro_pattern = function - | IntroOrAndPattern pll -> pr_case_intro_pattern pll - | IntroWildcard -> str "_" - | IntroIdentifier id -> pr_id id -and pr_case_intro_pattern = function - | [_::_ as pl] -> - str "(" ++ hov 0 (prlist_with_sep pr_coma pr_intro_pattern pl) ++ str ")" - | pll -> - str "[" ++ - hv 0 (prlist_with_sep pr_bar - (fun l -> hov 0 (prlist_with_sep spc pr_intro_pattern l)) pll) - ++ str "]" - -let pr_with_names = function - | None -> mt () - | Some ipat -> spc () ++ hov 1 (str "as" ++ spc () ++ pr_intro_pattern ipat) - -let pr_occs pp = function - [] -> pp - | nl -> hov 1 (pp ++ spc() ++ str"at " ++ - hov 0 (prlist_with_sep spc int nl)) - -let pr_hyp_location pr_id = function - | id, occs, InHyp -> spc () ++ pr_occs (pr_id id) occs - | id, occs, InHypTypeOnly -> - spc () ++ pr_occs (str "(type of " ++ pr_id id ++ str ")") occs - | id, occs, InHypValueOnly -> - spc () ++ pr_occs (str "(value of " ++ pr_id id ++ str ")") occs - -let pr_hyp_location pr_id (id,occs,(hl,hl')) = - if !hl' <> None then pr_hyp_location pr_id (id,occs,out_some !hl') - else - (if hl = InHyp && Options.do_translate () then - msgerrnl (h 0 (str "Translator warning: Unable to detect if " ++ pr_id id ++ spc () ++ str "denotes a local definition")); - pr_hyp_location pr_id (id,occs,hl)) - -let pr_in pp = spc () ++ hov 0 (str "in" ++ pp) - -let pr_simple_clause pr_id = function - | [] -> mt () - | l -> pr_in (spc () ++ prlist_with_sep spc pr_id l) - -let pr_clauses pr_id = function - { onhyps=None; onconcl=true; concl_occs=nl } -> - pr_in (pr_occs (str " *") nl) - | { onhyps=None; onconcl=false } -> pr_in (str " * |-") - | { onhyps=Some l; onconcl=true; concl_occs=nl } -> - pr_in (prlist_with_sep (fun () -> str",") (pr_hyp_location pr_id) l - ++ pr_occs (str" |- *") nl) - | { onhyps=Some l; onconcl=false } -> - pr_in (prlist_with_sep (fun()->str",") (pr_hyp_location pr_id) l) - -let pr_clause_pattern pr_id = function - | (None, []) -> mt () - | (glopt,l) -> - str " in" ++ - prlist - (fun (id,nl) -> prlist (pr_arg int) nl - ++ spc () ++ pr_id id) l ++ - pr_opt (fun nl -> prlist_with_sep spc int nl ++ str " Goal") glopt - -let pr_induction_arg prc = function - | ElimOnConstr c -> prc c - | ElimOnIdent (loc,id) -> pr_with_comments loc (pr_id id) - | ElimOnAnonHyp n -> int n - -let pr_induction_kind = function - | SimpleInversion -> str "simple inversion" - | FullInversion -> str "inversion" - | FullInversionClear -> str "inversion_clear" - -let pr_match_pattern pr_pat = function - | Term a -> pr_pat a - | Subterm (None,a) -> str "context [" ++ pr_pat a ++ str "]" - | Subterm (Some id,a) -> - str "context " ++ pr_id id ++ str "[" ++ pr_pat a ++ str "]" - -let pr_match_hyps pr_pat = function - | Hyp (nal,mp) -> pr_lname nal ++ str ":" ++ pr_match_pattern pr_pat mp - -let pr_match_rule m pr pr_pat = function - | Pat ([],mp,t) when m -> - pr_match_pattern pr_pat mp ++ - spc () ++ str "=>" ++ brk (1,4) ++ pr t - | Pat (rl,mp,t) -> - prlist_with_sep (fun () -> str",") (pr_match_hyps pr_pat) rl ++ - spc () ++ str "|-" ++ spc () ++ pr_match_pattern pr_pat mp ++ spc () ++ - str "=>" ++ brk (1,4) ++ pr t - | All t -> str "_" ++ spc () ++ str "=>" ++ brk (1,4) ++ pr t - -let pr_funvar = function - | None -> spc () ++ str "_" - | Some id -> spc () ++ pr_id id - -let pr_let_clause k pr = function - | (id,None,t) -> - hov 0 (str k ++ pr_lident id ++ str " :=" ++ brk (1,1) ++ - pr (TacArg t)) - | (id,Some c,t) -> - hv 0 (str k ++ pr_lident id ++ str" :" ++ brk(1,2) ++ - pr c ++ - str " :=" ++ brk (1,1) ++ pr (TacArg t)) - -let pr_let_clauses pr = function - | hd::tl -> - hv 0 - (pr_let_clause "let " pr hd ++ - prlist (fun t -> spc () ++ pr_let_clause "with " pr t) tl) - | [] -> anomaly "LetIn must declare at least one binding" - -let pr_rec_clause pr (id,(l,t)) = - hov 0 - (pr_lident id ++ prlist pr_funvar l ++ str " :=") ++ spc () ++ pr t - -let pr_rec_clauses pr l = - prlist_with_sep (fun () -> fnl () ++ str "with ") (pr_rec_clause pr) l - -let pr_seq_body pr tl = - hv 0 (str "[ " ++ - prlist_with_sep (fun () -> spc () ++ str "| ") pr tl ++ - str " ]") - -let pr_as_names_force force ids (pp,ids') = - pr_with_names - (if (!pp or force) & List.exists ((<>) (ref [])) ids' - then Some (IntroOrAndPattern (List.map (fun x -> !x) ids')) - else ids) - -let duplicate force nodup ids pr = function - | [] -> pr (pr_as_names_force force ids (ref false,[])) - | x::l when List.for_all (fun y -> snd x=snd y) l -> - pr (pr_as_names_force force ids x) - | l -> - if List.exists (fun (b,ids) -> !b) l & (force or - List.exists (fun (_,ids) -> ids <> (snd (List.hd l))) (List.tl l)) - then - if nodup then begin - msgerrnl - (h 0 (str "Translator warning: Unable to enforce v7 names while translating Induction/NewDestruct/NewInduction. Names in the different branches are") ++ brk (0,0) ++ - hov 0 (prlist_with_sep spc - (fun id -> hov 0 (pr_as_names_force true ids id)) - (List.rev l))); - pr (pr_as_names_force force ids (ref false,[])) - end - else - pr_seq_body (fun x -> pr (pr_as_names_force force ids x)) (List.rev l) - else pr (pr_as_names_force force ids (ref false,[])) - -let pr_hintbases = function - | None -> spc () ++ str "with *" - | Some [] -> mt () - | Some l -> - spc () ++ hov 2 (str "with" ++ prlist (fun s -> spc () ++ str s) l) - -let pr_autoarg_adding = function - | [] -> mt () - | l -> - spc () ++ str "adding [" ++ - hv 0 (prlist_with_sep spc pr_reference l) ++ str "]" - -let pr_autoarg_destructing = function - | true -> spc () ++ str "destructing" - | false -> mt () - -let pr_autoarg_usingTDB = function - | true -> spc () ++ str "using tdb" - | false -> mt () - -let rec pr_tacarg_using_rule pr_gen = function - | Egrammar.TacTerm s :: l, al -> spc () ++ str s ++ pr_tacarg_using_rule pr_gen (l,al) - | Egrammar.TacNonTerm _ :: l, a :: al -> pr_gen a ++ pr_tacarg_using_rule pr_gen (l,al) - | [], [] -> mt () - | _ -> failwith "Inconsistent arguments of extended tactic" - -let pr_then () = str ";" - - -open Closure - -let make_pr_tac (pr_tac,pr_tac0,pr_constr,pr_lconstr,pr_pat,pr_cst,pr_ind,pr_ref,pr_ident,pr_extend,strip_prod_binders) = - -let pr_bindings env = pr_bindings (pr_lconstr env) (pr_constr env) in -let pr_ex_bindings env = pr_bindings_gen true (pr_lconstr env) (pr_constr env) in -let pr_with_bindings env = pr_with_bindings (pr_lconstr env) (pr_constr env) in -let pr_eliminator env cb = str "using" ++ pr_arg (pr_with_bindings env) cb in -let pr_constrarg env c = spc () ++ pr_constr env c in -let pr_lconstrarg env c = spc () ++ pr_lconstr env c in - -let pr_intarg n = spc () ++ int n in - -let pr_binder_fix env (nal,t) = -(* match t with - | CHole _ -> spc() ++ prlist_with_sep spc (pr_lname) nal - | _ ->*) - let s = - prlist_with_sep spc (pr_lname) nal ++ str ":" ++ - pr_lconstr env t in - spc() ++ hov 1 (str"(" ++ s ++ str")") in - -let pr_fix_tac env (id,n,c) = - let rec set_nth_name avoid n = function - (nal,ty)::bll -> - if n <= List.length nal then - match list_chop (n-1) nal with - _, (_,Name id) :: _ -> id, (nal,ty)::bll - | bef, (loc,Anonymous) :: aft -> - let id = next_ident_away_from (id_of_string"y") avoid in - id, ((bef@(loc,Name id)::aft, ty)::bll) - | _ -> assert false - else - let (id,bll') = set_nth_name avoid (n-List.length nal) bll in - (id,(nal,ty)::bll') - | [] -> assert false in - let (bll,ty) = strip_prod_binders n c in - let names = - List.fold_left - (fun ln (nal,_) -> List.fold_left - (fun ln na -> match na with (_,Name id) -> id::ln | _ -> ln) - ln nal) - [] bll in - let idarg,bll = set_nth_name names n bll in - let annot = - if List.length names = 1 then mt() - else spc() ++ str"{struct " ++ pr_id idarg ++ str"}" in - hov 1 (str"(" ++ pr_id id ++ - prlist (pr_binder_fix env) bll ++ annot ++ str" :" ++ - pr_lconstrarg env ty ++ str")") in -(* spc() ++ - hov 0 (pr_id id ++ pr_intarg n ++ str":" ++ pr_constrarg - env c) -*) -let pr_cofix_tac env (id,c) = - hov 1 (str"(" ++ pr_id id ++ str" :" ++ pr_lconstrarg env c ++ str")") in - - - (* Printing tactics as arguments *) -let rec pr_atom0 env = function - | TacIntroPattern [] -> str "intros" - | TacIntroMove (None,None) -> str "intro" - | TacAssumption -> str "assumption" - | TacAnyConstructor None -> str "constructor" - | TacTrivial (Some []) -> str "trivial" - | TacAuto (None,Some []) -> str "auto" -(* | TacAutoTDB None -> str "autotdb" - | TacDestructConcl -> str "dconcl"*) - | TacReflexivity -> str "reflexivity" - | t -> str "(" ++ pr_atom1 env t ++ str ")" - - (* Main tactic printer *) -and pr_atom1 env = function - | TacAutoTDB _ | TacDestructHyp _ | TacDestructConcl - | TacSuperAuto _ | TacExtend (_, - ("GTauto"|"GIntuition"|"TSimplif"| - "LinearIntuition"),_) -> - errorlabstrm "Obsolete V8" (str "Tactic is not ported to V8.0") - | TacExtend (loc,s,l) -> - pr_with_comments loc - (pr_extend (pr_constr env) (pr_lconstr env) (pr_tac env) s l) - | TacAlias (loc,s,l,_) -> - pr_with_comments loc - (pr_extend (pr_constr env) (pr_lconstr env) (pr_tac env) s - (List.map snd l)) - - (* Basic tactics *) - | TacIntroPattern [] as t -> pr_atom0 env t - | TacIntroPattern (_::_ as p) -> - hov 1 (str "intros" ++ spc () ++ prlist_with_sep spc pr_intro_pattern p) - | TacIntrosUntil h -> - hv 1 (str "intros until" ++ pr_arg pr_quantified_hypothesis h) - | TacIntroMove (None,None) as t -> pr_atom0 env t - | TacIntroMove (Some id1,None) -> str "intro " ++ pr_id id1 - | TacIntroMove (ido1,Some id2) -> - hov 1 - (str "intro" ++ pr_opt pr_id ido1 ++ spc () ++ str "after " ++ - pr_lident id2) - | TacAssumption as t -> pr_atom0 env t - | TacExact c -> hov 1 (str "exact" ++ pr_constrarg env c) - | TacApply cb -> hov 1 (str "apply" ++ spc () ++ pr_with_bindings env cb) - | TacElim (cb,cbo) -> - hov 1 (str "elim" ++ pr_arg (pr_with_bindings env) cb ++ - pr_opt (pr_eliminator env) cbo) - | TacElimType c -> hov 1 (str "elimtype" ++ pr_constrarg env c) - | TacCase cb -> hov 1 (str "case" ++ spc () ++ pr_with_bindings env cb) - | TacCaseType c -> hov 1 (str "casetype" ++ pr_constrarg env c) - | TacFix (ido,n) -> hov 1 (str "fix" ++ pr_opt pr_id ido ++ pr_intarg n) - | TacMutualFix (id,n,l) -> - hov 1 (str "fix" ++ spc () ++ pr_id id ++ pr_intarg n ++ spc() ++ - str"with " ++ prlist_with_sep spc (pr_fix_tac env) l) - | TacCofix ido -> hov 1 (str "cofix" ++ pr_opt pr_id ido) - | TacMutualCofix (id,l) -> - hov 1 (str "cofix" ++ spc () ++ pr_id id ++ spc() ++ - str"with " ++ prlist_with_sep spc (pr_cofix_tac env) l) - | TacCut c -> hov 1 (str "cut" ++ pr_constrarg env c) - | TacTrueCut (Anonymous,c) -> - hov 1 (str "assert" ++ pr_constrarg env c) - | TacTrueCut (Name id,c) -> - hov 1 (str "assert" ++ spc () ++ - hov 1 (str"(" ++ pr_id id ++ str " :" ++ - pr_lconstrarg env c ++ str")")) - | TacForward (false,na,c) -> - hov 1 (str "assert" ++ spc () ++ - hov 1 (str"(" ++ pr_name na ++ str " :=" ++ - pr_lconstrarg env c ++ str")")) - | TacForward (true,Anonymous,c) -> - if Options.do_translate () then - (* Pose was buggy and was wrongly substituted in conclusion in v7 *) - hov 1 (str "set" ++ pr_constrarg env c) - else - hov 1 (str "pose" ++ pr_constrarg env c) - | TacForward (true,Name id,c) -> - if Options.do_translate () then - hov 1 (str "set" ++ spc() ++ - hov 1 (str"(" ++ pr_id id ++ str " :=" ++ - pr_lconstrarg env c ++ str")")) - else - hov 1 (str "pose" ++ spc() ++ - hov 1 (str"(" ++ pr_id id ++ str " :=" ++ - pr_lconstrarg env c ++ str")")) - | TacGeneralize l -> - hov 1 (str "generalize" ++ spc () ++ - prlist_with_sep spc (pr_constr env) l) - | TacGeneralizeDep c -> - hov 1 (str "generalize" ++ spc () ++ str "dependent" ++ - pr_constrarg env c) - | TacLetTac (Anonymous,c,cl) -> - hov 1 (str "set" ++ pr_constrarg env c) ++ pr_clauses pr_ident cl - | TacLetTac (Name id,c,cl) -> - hov 1 (str "set" ++ spc () ++ - hov 1 (str"(" ++ pr_id id ++ str " :=" ++ - pr_lconstrarg env c ++ str")") ++ - pr_clauses pr_ident cl) - | TacInstantiate (n,c,cls) -> - hov 1 (str "instantiate" ++ spc() ++ - hov 1 (str"(" ++ pr_arg int n ++ str" :=" ++ - pr_lconstrarg env c ++ str ")" ++ - pr_clauses pr_ident cls)) - (* Derived basic tactics *) - | TacSimpleInduction (h,l) -> - if List.exists (fun (pp,_) -> !pp) !l then - duplicate true true None (fun pnames -> - hov 1 (str "induction" ++ pr_arg pr_quantified_hypothesis h ++ - pnames)) !l - else - hov 1 (str "simple induction" ++ pr_arg pr_quantified_hypothesis h) - | TacNewInduction (h,e,(ids,l)) -> - duplicate false true ids (fun pnames -> - hov 1 (str "induction" ++ spc () ++ - pr_induction_arg (pr_constr env) h ++ pnames ++ - pr_opt (pr_eliminator env) e)) !l - | TacSimpleDestruct h -> - hov 1 (str "simple destruct" ++ pr_arg pr_quantified_hypothesis h) - | TacNewDestruct (h,e,(ids,l)) -> - duplicate false true ids (fun pnames -> - hov 1 (str "destruct" ++ spc () ++ - pr_induction_arg (pr_constr env) h ++ pnames ++ - pr_opt (pr_eliminator env) e)) !l - | TacDoubleInduction (h1,h2) -> - hov 1 - (str "double induction" ++ - pr_arg pr_quantified_hypothesis h1 ++ - pr_arg pr_quantified_hypothesis h2) - | TacDecomposeAnd c -> - hov 1 (str "decompose record" ++ pr_constrarg env c) - | TacDecomposeOr c -> - hov 1 (str "decompose sum" ++ pr_constrarg env c) - | TacDecompose (l,c) -> - let vars = Termops.vars_of_env env in - hov 1 (str "decompose" ++ spc () ++ - hov 0 (str "[" ++ prlist_with_sep spc (pr_ind vars) l - ++ str "]" ++ pr_constrarg env c)) - | TacSpecialize (n,c) -> - hov 1 (str "specialize" ++ spc () ++ pr_opt int n ++ pr_with_bindings env c) - | TacLApply c -> - hov 1 (str "lapply" ++ pr_constrarg env c) - - (* Automation tactics *) - | TacTrivial (Some []) as x -> pr_atom0 env x - | TacTrivial db -> hov 0 (str "trivial" ++ pr_hintbases db) - | TacAuto (None,Some []) as x -> pr_atom0 env x - | TacAuto (n,db) -> - hov 0 (str "auto" ++ pr_opt (pr_or_var int) n ++ pr_hintbases db) -(* | TacAutoTDB None as x -> pr_atom0 env x - | TacAutoTDB (Some n) -> hov 0 (str "autotdb" ++ spc () ++ int n) - | TacDestructHyp (true,id) -> - hov 0 (str "cdhyp" ++ spc () ++ pr_lident id) - | TacDestructHyp (false,id) -> - hov 0 (str "dhyp" ++ spc () ++ pr_lident id) - | TacDestructConcl as x -> pr_atom0 env x - | TacSuperAuto (n,l,b1,b2) -> - hov 1 (str "superauto" ++ pr_opt int n ++ pr_autoarg_adding l ++ - pr_autoarg_destructing b1 ++ pr_autoarg_usingTDB b2)*) - | TacDAuto (n,p) -> - hov 1 (str "auto" ++ pr_opt (pr_or_var int) n ++ str "decomp" ++ - pr_opt int p) - - (* Context management *) - | TacClear l -> - hov 1 (str "clear" ++ spc () ++ prlist_with_sep spc pr_ident l) - | TacClearBody l -> - hov 1 (str "clearbody" ++ spc () ++ prlist_with_sep spc pr_ident l) - | TacMove (b,id1,id2) -> - (* Rem: only b = true is available for users *) - assert b; - hov 1 - (str "move" ++ brk (1,1) ++ pr_ident id1 ++ spc () ++ - str "after" ++ brk (1,1) ++ pr_ident id2) - | TacRename (id1,id2) -> - hov 1 - (str "rename" ++ brk (1,1) ++ pr_ident id1 ++ spc () ++ - str "into" ++ brk (1,1) ++ pr_ident id2) - - (* Constructors *) - | TacLeft l -> hov 1 (str "left" ++ pr_bindings env l) - | TacRight l -> hov 1 (str "right" ++ pr_bindings env l) - | TacSplit (false,l) -> hov 1 (str "split" ++ pr_bindings env l) - | TacSplit (true,l) -> hov 1 (str "exists" ++ pr_ex_bindings env l) - | TacAnyConstructor (Some t) -> - hov 1 (str "constructor" ++ pr_arg (pr_tac0 env) t) - | TacAnyConstructor None as t -> pr_atom0 env t - | TacConstructor (n,l) -> - hov 1 (str "constructor" ++ pr_or_metaid pr_intarg n ++ - pr_bindings env l) - - (* Conversion *) - | TacReduce (r,h) -> - hov 1 (pr_red_expr (pr_constr env,pr_lconstr env,pr_cst env) r ++ - pr_clauses pr_ident h) - | TacChange (occ,c,h) -> - hov 1 (str "change" ++ brk (1,1) ++ - (match occ with - None -> mt() - | Some([],c1) -> - hov 1 (pr_constr env c1 ++ spc() ++ str "with ") - | Some(ocl,c1) -> - hov 1 (pr_constr env c1 ++ spc() ++ - str "at " ++ prlist_with_sep spc int ocl) ++ spc() ++ - str "with ") ++ - pr_constr env c ++ pr_clauses pr_ident h) - - (* Equivalence relations *) - | TacReflexivity as x -> pr_atom0 env x - | TacSymmetry cls -> str "symmetry " ++ pr_clauses pr_ident cls - | TacTransitivity c -> str "transitivity" ++ pr_constrarg env c - - (* Equality and inversion *) - | TacInversion (DepInversion (k,c,ids),hyp) -> - hov 1 (str "dependent " ++ pr_induction_kind k ++ spc () ++ - pr_quantified_hypothesis hyp ++ - pr_with_names ids ++ pr_with_constr (pr_constr env) c) - | TacInversion (NonDepInversion (k,cl,ids),hyp) -> - hov 1 (pr_induction_kind k ++ spc () ++ - pr_quantified_hypothesis hyp ++ - pr_with_names ids ++ pr_simple_clause pr_ident cl) - | TacInversion (InversionUsing (c,cl),hyp) -> - hov 1 (str "inversion" ++ spc() ++ pr_quantified_hypothesis hyp ++ - spc () ++ str "using" ++ spc () ++ pr_constr env c ++ - pr_simple_clause pr_ident cl) - -in - -let ltop = (5,E) in -let lseq = 5 in -let ltactical = 3 in -let lorelse = 2 in -let llet = 1 in -let lfun = 1 in -let labstract = 3 in -let lmatch = 1 in -let latom = 0 in -let lcall = 1 in -let leval = 1 in -let ltatom = 1 in - -let rec pr_tac env inherited tac = - let (strm,prec) = match tac with - | TacAbstract (t,None) -> - str "abstract " ++ pr_tac env (labstract,L) t, labstract - | TacAbstract (t,Some s) -> - hov 0 - (str "abstract (" ++ pr_tac env (labstract,L) t ++ str")" ++ spc () ++ - str "using " ++ pr_id s), - labstract - | TacLetRecIn (l,t) -> - hv 0 - (str "let rec " ++ pr_rec_clauses (pr_tac env ltop) l ++ str " in" ++ - fnl () ++ pr_tac env (llet,E) t), - llet - | TacLetIn (llc,u) -> - v 0 - (hv 0 (pr_let_clauses (pr_tac env ltop) llc - ++ str " in") ++ - fnl () ++ pr_tac env (llet,E) u), - llet - | TacMatch (t,lrul) -> - hov 0 (str "match " ++ pr_tac env ltop t ++ str " with" - ++ prlist - (fun r -> fnl () ++ str "| " ++ - pr_match_rule true (pr_tac env ltop) pr_pat r) - lrul - ++ fnl() ++ str "end"), - lmatch - | TacMatchContext (lr,lrul) -> - hov 0 ( - str (if lr then "match reverse goal with" else "match goal with") - ++ prlist - (fun r -> fnl () ++ str "| " ++ - pr_match_rule false (pr_tac env ltop) pr_pat r) - lrul - ++ fnl() ++ str "end"), - lmatch - | TacFun (lvar,body) -> - hov 2 (str "fun" ++ - prlist pr_funvar lvar ++ str " =>" ++ spc () ++ - pr_tac env (lfun,E) body), - lfun - | TacThens (t,tl) -> - hov 1 (pr_tac env (lseq,E) t ++ pr_then () ++ spc () ++ - pr_seq_body (pr_tac env ltop) tl), - lseq - | TacThen (t1,t2) -> - let pp2 = - (* Hook for translation names in induction/destruct *) - match t2 with - | TacAtom (_,TacSimpleInduction (h,l)) -> - if List.exists (fun (pp,ids) -> !pp) !l then - duplicate true false None (fun pnames -> - hov 1 - (str "induction" ++ pr_arg pr_quantified_hypothesis h ++ - pnames)) !l - else - hov 1 - (str "simple induction" ++ pr_arg pr_quantified_hypothesis h) - | TacAtom (_,TacNewInduction (h,e,(ids,l))) -> - duplicate false false ids (fun pnames -> - hov 1 (str "induction" ++ spc () ++ - pr_induction_arg (pr_constr env) h ++ pnames ++ - pr_opt (pr_eliminator env) e)) !l - | TacAtom (_,TacNewDestruct (h,e,(ids,l))) -> - duplicate false false ids (fun pnames -> - hov 1 (str "destruct" ++ spc () ++ - pr_induction_arg (pr_constr env) h ++ pnames ++ - pr_opt (pr_eliminator env) e)) !l - (* end hook *) - | _ -> pr_tac env (lseq,L) t2 in - hov 1 (pr_tac env (lseq,E) t1 ++ pr_then () ++ spc () ++ pp2), - lseq - | TacTry t -> - hov 1 (str "try" ++ spc () ++ pr_tac env (ltactical,E) t), - ltactical - | TacDo (n,t) -> - hov 1 (str "do " ++ pr_or_var int n ++ spc () ++ pr_tac env (ltactical,E) t), - ltactical - | TacRepeat t -> - hov 1 (str "repeat" ++ spc () ++ pr_tac env (ltactical,E) t), - ltactical - | TacProgress t -> - hov 1 (str "progress" ++ spc () ++ pr_tac env (ltactical,E) t), - ltactical - | TacInfo t -> - hov 1 (str "info" ++ spc () ++ pr_tac env (ltactical,E) t), - ltactical - | TacOrelse (t1,t2) -> - hov 1 (pr_tac env (lorelse,L) t1 ++ str " ||" ++ brk (1,1) ++ - pr_tac env (lorelse,E) t2), - lorelse - | TacFail (ArgArg 0,"") -> str "fail", latom - | TacFail (n,s) -> - str "fail" ++ (if n=ArgArg 0 then mt () else pr_arg (pr_or_var int) n) ++ - (if s="" then mt() else qsnew s), latom - | TacFirst tl -> - str "first" ++ spc () ++ pr_seq_body (pr_tac env ltop) tl, llet - | TacSolve tl -> - str "solve" ++ spc () ++ pr_seq_body (pr_tac env ltop) tl, llet - | TacId "" -> str "idtac", latom - | TacId s -> str "idtac" ++ (qsnew s), latom - | TacAtom (loc,t) -> - pr_with_comments loc (hov 1 (pr_atom1 env t)), ltatom - | TacArg(Tacexp e) -> pr_tac0 env e, latom - | TacArg(ConstrMayEval (ConstrTerm c)) -> - str "constr:" ++ pr_constr env c, latom - | TacArg(ConstrMayEval c) -> - pr_may_eval (pr_constr env) (pr_lconstr env) (pr_cst env) c, leval - | TacArg(TacFreshId sopt) -> str "fresh" ++ pr_opt qsnew sopt, latom - | TacArg(Integer n) -> int n, latom - | TacArg(TacCall(loc,f,l)) -> - pr_with_comments loc - (hov 1 (pr_ref f ++ spc () ++ - prlist_with_sep spc (pr_tacarg env) l)), - lcall - | TacArg a -> pr_tacarg env a, latom - in - if prec_less prec inherited then strm - else str"(" ++ strm ++ str")" - -and pr_tacarg env = function - | TacDynamic (loc,t) -> - pr_with_comments loc (str ("<dynamic ["^(Dyn.tag t)^"]>")) - | MetaIdArg (loc,s) -> pr_with_comments loc (str ("$" ^ s)) - | IntroPattern ipat -> str "ipattern:" ++ pr_intro_pattern ipat - | TacVoid -> str "()" - | Reference r -> pr_ref r - | ConstrMayEval c -> - pr_may_eval (pr_constr env) (pr_lconstr env) (pr_cst env) c - | TacFreshId sopt -> str "fresh" ++ pr_opt qsnew sopt - | (TacCall _|Tacexp _|Integer _) as a -> - str "ltac:" ++ pr_tac env (latom,E) (TacArg a) - -in ((fun env -> pr_tac env ltop), - (fun env -> pr_tac env (latom,E)), - pr_match_rule) - -let pi1 (a,_,_) = a -let pi2 (_,a,_) = a -let pi3 (_,_,a) = a - -let strip_prod_binders_rawterm n (ty,_) = - let rec strip_ty acc n ty = - if n=0 then (List.rev acc, (ty,None)) else - match ty with - Rawterm.RProd(loc,na,a,b) -> - strip_ty (([dummy_loc,na],(a,None))::acc) (n-1) b - | _ -> error "Cannot translate fix tactic: not enough products" in - strip_ty [] n ty - -let strip_prod_binders_constr n ty = - let rec strip_ty acc n ty = - if n=0 then (List.rev acc, ty) else - match Term.kind_of_term ty with - Term.Prod(na,a,b) -> - strip_ty (([dummy_loc,na],a)::acc) (n-1) b - | _ -> error "Cannot translate fix tactic: not enough products" in - strip_ty [] n ty - - -let rec raw_printers = - (pr_raw_tactic, - pr_raw_tactic0, - Ppconstrnew.pr_constr_env, - Ppconstrnew.pr_lconstr_env, - Ppconstrnew.pr_pattern, - (fun _ -> pr_reference), - (fun _ -> pr_reference), - pr_reference, - pr_or_metaid pr_lident, - Pptactic.pr_raw_extend, - strip_prod_binders_expr) - -and pr_raw_tactic env (t:raw_tactic_expr) = - pi1 (make_pr_tac raw_printers) env t - -and pr_raw_tactic0 env t = - pi2 (make_pr_tac raw_printers) env t - -and pr_raw_match_rule env t = - pi3 (make_pr_tac raw_printers) env t - -let pr_and_constr_expr pr (c,_) = pr c - - -let rec glob_printers = - (pr_glob_tactic, - pr_glob_tactic0, - (fun env -> pr_and_constr_expr (Ppconstrnew.pr_rawconstr_env_no_translate env)), - (fun env -> pr_and_constr_expr (Ppconstrnew.pr_lrawconstr_env_no_translate env)), - (fun c -> Ppconstrnew.pr_constr_pattern_env (Global.env()) c), - (fun env -> pr_or_var (pr_and_short_name (pr_evaluable_reference_env env))), - (fun vars -> pr_or_var (pr_inductive vars)), - pr_ltac_or_var (pr_located pr_ltac_constant), - pr_lident, - Pptactic.pr_glob_extend, - strip_prod_binders_rawterm) - -and pr_glob_tactic env (t:glob_tactic_expr) = - pi1 (make_pr_tac glob_printers) env t - -and pr_glob_tactic0 env t = - pi2 (make_pr_tac glob_printers) env t - -and pr_glob_match_rule env t = - pi3 (make_pr_tac glob_printers) env t - -let (pr_tactic,_,_) = - make_pr_tac - (pr_glob_tactic, - pr_glob_tactic0, - pr_term_env, - pr_lterm_env, - Ppconstrnew.pr_constr_pattern, - pr_evaluable_reference_env, - pr_inductive, - pr_ltac_constant, - pr_id, - Pptactic.pr_extend, - strip_prod_binders_constr) - |