diff options
Diffstat (limited to 'contrib/interface/xlate.ml')
-rw-r--r-- | contrib/interface/xlate.ml | 1393 |
1 files changed, 1311 insertions, 82 deletions
diff --git a/contrib/interface/xlate.ml b/contrib/interface/xlate.ml index 7f38ca0d2..2e49ec4e3 100644 --- a/contrib/interface/xlate.ml +++ b/contrib/interface/xlate.ml @@ -8,6 +8,10 @@ open Ast;; open Names;; open Ctast;; open Ascent;; +open Genarg;; +open Rawterm;; +open Tacexpr;; +open Vernacexpr;; let in_coq_ref = ref false;; @@ -77,6 +81,10 @@ let ctf_STRING_OPT_NONE = CT_coerce_NONE_to_STRING_OPT CT_none;; let ctf_STRING_OPT_SOME s = CT_coerce_STRING_to_STRING_OPT s;; +let ctf_STRING_OPT = function + | None -> ctf_STRING_OPT_NONE + | Some s -> ctf_STRING_OPT_SOME s + let ctv_ID_OPT_NONE = CT_coerce_NONE_to_ID_OPT CT_none;; let ctf_ID_OPT_SOME s = CT_coerce_ID_to_ID_OPT s;; @@ -102,7 +110,12 @@ let castc x = CT_coerce_TYPED_FORMULA_to_FORMULA x;; let varc x = CT_coerce_ID_to_FORMULA x;; +let xlate_ident id = CT_ident (string_of_id id) + +(* let ident_tac s = CT_user_tac (CT_ident s, CT_targ_list []);; +*) +let ident_tac s = CT_user_tac (xlate_ident s, CT_targ_list []);; let ident_vernac s = CT_user_vernac (CT_ident s, CT_varg_list []);; @@ -141,6 +154,7 @@ type iVARG = Varg_binder of ct_BINDER | Varg_tactic_arg of iTARG | Varg_varglist of iVARG list;; +(* let coerce_iTARG_to_TARG = function | Targ_intropatt x -> xlate_error "coerce_iTARG_to_TARG (3)" @@ -160,7 +174,9 @@ let coerce_iTARG_to_TARG = | Targ_cofixtac x -> CT_coerce_COFIXTAC_to_TARG x | Targ_tacexp x -> CT_coerce_TACTIC_COM_to_TARG x | Targ_redexp x -> xlate_error "coerce_iTarg_to_TARG(2)";; +*) +(* let rec coerce_iVARG_to_VARG = function | Varg_binder x -> CT_coerce_BINDER_to_VARG x @@ -189,6 +205,7 @@ let rec coerce_iVARG_to_VARG = CT_coerce_VARG_LIST_to_VARG (CT_varg_list (List.map coerce_iVARG_to_VARG x)) | _ -> xlate_error "coerce_iVARG_to_VARG: leftover case";; +*) let coerce_iVARG_to_FORMULA = function @@ -219,9 +236,14 @@ let xlate_id = | s -> CT_ident s) | _ -> xlate_error "xlate_id: not an identifier";; +(* let xlate_id_unit = function Node(_, "VOID", []) -> CT_unit | x -> CT_coerce_ID_to_ID_UNIT (xlate_id x);; +*) +let xlate_id_unit = function + None -> CT_unit + | Some x -> CT_coerce_ID_to_ID_UNIT (xlate_ident x);; let xlate_id_opt = function @@ -231,11 +253,20 @@ let xlate_id_opt = | s -> ctf_ID_OPT_SOME (CT_ident s)) | _ -> xlate_error "xlate_id: not an identifier";; +let xlate_ident_opt = + function + | None -> ctv_ID_OPT_NONE + | Some id -> ctf_ID_OPT_SOME (xlate_ident id) + let xlate_int = function | Num (_, n) -> CT_int n | _ -> xlate_error "xlate_int: not an int";; +let xlate_int_opt = function + | Some n -> CT_coerce_INT_to_INT_OPT (CT_int n) + | None -> CT_coerce_NONE_to_INT_OPT CT_none + let xlate_string = function | Str (_, s) -> CT_string s @@ -313,6 +344,28 @@ let qualid_to_ct_ID = | Node(_, "QUALIDMETA",[Num(_,n)]) -> Some(CT_metac (CT_int n)) | _ -> None;; +let tac_qualid_to_ct_ID qid = CT_ident (Nametab.string_of_qualid qid) + +let loc_qualid_to_ct_ID (_,qid) = CT_ident (Nametab.string_of_qualid qid) + +let qualid_or_meta_to_ct_ID = function + | AN (_,qid) -> tac_qualid_to_ct_ID qid + | MetaNum (_,n) -> CT_metac (CT_int n) + +let ident_or_meta_to_ct_ID = function + | AN (_,id) -> xlate_ident id + | MetaNum (_,n) -> CT_metac (CT_int n) + +let xlate_qualid_list l = CT_id_list (List.map loc_qualid_to_ct_ID l) + +let reference_to_ct_ID = function + | RIdent (_,id) -> CT_ident (Names.string_of_id id) + | RQualid (_,qid) -> CT_ident (Nametab.string_of_qualid qid) + +let xlate_class = function + | FunClass -> CT_ident "FUNCLASS" + | SortClass -> CT_ident "SORTCLASS" + | RefClass qid -> loc_qualid_to_ct_ID qid let special_case_qualid cont_function astnode = match qualid_to_ct_ID astnode with @@ -744,6 +797,13 @@ let xlate_special_cases cont_function arg = | [] -> None in xlate_rec xlate_formula_special_cases;; +let xlate_sort = + function + | Coqast.Node (_, "SET", []) -> CT_sortc "Set" + | Coqast.Node (_, "PROP", []) -> CT_sortc "Prop" + | Coqast.Node (_, "TYPE", []) -> CT_sortc "Type" + | _ -> xlate_error "xlate_sort";; + let xlate_formula a = !set_flags (); let rec ctrec = @@ -766,10 +826,28 @@ let xlate_formula a = | _ -> xlate_error "xlate_formula" in strip_Rform (ctrec a);; +(* let xlate_formula_opt = function | Node (_, "None", []) -> ctv_FORMULA_OPT_NONE | e -> CT_coerce_FORMULA_to_FORMULA_OPT (xlate_formula e);; +*) +let xlate_formula_opt = + function + | None -> ctv_FORMULA_OPT_NONE + | Some e -> CT_coerce_FORMULA_to_FORMULA_OPT (xlate_formula e);; + +let xlate_constr c = xlate_formula (Ctast.ast_to_ct c) + +let xlate_constr_opt c = xlate_formula_opt (option_app Ctast.ast_to_ct c) + +let xlate_hyp_location = + function + | InHyp (AI (_,id)) -> xlate_ident id + | InHyp (MetaId _) -> xlate_error "MetaId should occur only in quotations" + | InHypType id -> xlate_error "TODO: in (Type of id)" + +let xlate_clause l = CT_id_list (List.map xlate_hyp_location l) (** Tactics *) @@ -826,7 +904,7 @@ let make_ID_from_FORMULA = | _ -> xlate_error "make_ID_from_FORMULA: non-formula argument";; let make_ID_from_iTARG_FORMULA x = make_ID_from_FORMULA (strip_targ_command x);; - +(* let filter_binding_or_command_list bl = match bl with | (Targ_binding_com cmd) :: bl' -> @@ -837,6 +915,23 @@ let filter_binding_or_command_list bl = (CT_binding_list (List.map strip_targ_binding bl)) | [] -> CT_coerce_FORMULA_LIST_to_SPEC_LIST (CT_formula_list []) | _ -> xlate_error "filter_binding_or_command_list";; +*) +let xlate_quantified_hypothesis = function + | AnonHyp n -> CT_coerce_INT_to_ID_OR_INT (CT_int n) + | NamedHyp id -> CT_coerce_ID_to_ID_OR_INT (xlate_ident id) + +let xlate_explicit_binding (h,c) = + CT_binding (xlate_quantified_hypothesis h, xlate_constr c) + +let xlate_bindings = function + | ImplicitBindings l -> + CT_coerce_FORMULA_LIST_to_SPEC_LIST + (CT_formula_list (List.map xlate_constr l)) + | ExplicitBindings l -> + CT_coerce_BINDING_LIST_to_SPEC_LIST + (CT_binding_list (List.map xlate_explicit_binding l)) + | NoBindings -> + CT_coerce_FORMULA_LIST_to_SPEC_LIST (CT_formula_list []) let strip_targ_spec_list = function @@ -849,6 +944,7 @@ let strip_targ_intropatt = | _ -> xlate_error "strip_targ_intropatt";; +(* let rec get_flag_rec = function | n1 :: tail -> @@ -873,7 +969,23 @@ let rec get_flag_rec = | Node (_, a, _) -> error ("get_flag_rec : unexpected flag " ^ a) | _ -> error "get_flag_rec : unexpected flag") | [] -> [], CT_unf [];; - +*) +let get_flag r = + let conv_flags, red_ids = + if r.rDelta then + [CT_delta], CT_unfbut (List.map qualid_or_meta_to_ct_ID r.rConst) + else + (if r.rConst = [] + then (* probably useless: just for compatibility *) [] + else [CT_delta]), + CT_unf (List.map qualid_or_meta_to_ct_ID r.rConst) in + let conv_flags = if r.rBeta then CT_beta::conv_flags else conv_flags in + let conv_flags = if r.rIota then CT_iota::conv_flags else conv_flags in + let conv_flags = if r.rZeta then CT_zeta::conv_flags else conv_flags in + (* Rem: EVAR flag obsolète *) + conv_flags, red_ids + +(* let rec xlate_intro_pattern = function | Node(_,"CONJPATTERN", l) -> @@ -886,10 +998,21 @@ let rec xlate_intro_pattern = CT_coerce_ID_to_INTRO_PATT(CT_ident c) | Node(_, a, _) -> failwith ("xlate_intro_pattern on node " ^ a) | _ -> failwith "xlate_intro_pattern";; +*) +let rec xlate_intro_pattern = + function + | IntroOrAndPattern [l] -> + CT_conj_pattern(CT_intro_patt_list (List.map xlate_intro_pattern l)) + | IntroOrAndPattern ll -> + let insert_conj l = CT_conj_pattern (CT_intro_patt_list + (List.map xlate_intro_pattern l)) + in CT_disj_pattern(CT_intro_patt_list (List.map insert_conj ll)) + | IntroWildcard -> xlate_error "TODO: '_' intro pattern" + | IntroIdentifier c -> CT_coerce_ID_to_INTRO_PATT(xlate_ident c) let compute_INV_TYPE_from_string = function "InversionClear" -> CT_inv_clear - | "HalfInversion" -> CT_inv_simple + | "SimpleInversion" -> CT_inv_simple | "Inversion" -> CT_inv_regular | _ -> failwith "unexpected Inversion type";; @@ -909,6 +1032,7 @@ let tactic_special_case cont_function cvt_arg = function | _ -> assert false;; let xlate_context_pattern = function +(* Node(_,"TERM", [Node(_, "COMMAND", [v])]) -> CT_coerce_FORMULA_to_CONTEXT_PATTERN (xlate_formula v) | Node(_,"SUBTERM", [Node(_,"COMMAND",[v])]) -> @@ -916,12 +1040,23 @@ let xlate_context_pattern = function | Node(_,"SUBTERM", [Nvar(_, s); Node(_, "COMMAND", [v])]) -> CT_context(ctf_ID_OPT_SOME (CT_ident s), xlate_formula v) | _ -> assert false;; +*) + | Term v -> + CT_coerce_FORMULA_to_CONTEXT_PATTERN (xlate_constr v) + | Subterm (idopt, v) -> + CT_context(xlate_ident_opt idopt, xlate_constr v) + let xlate_match_context_hyps = function +(* [b] -> CT_premise_pattern(ctv_ID_OPT_NONE, xlate_context_pattern b) | [Nvar(_,s);b] -> CT_premise_pattern(ctf_ID_OPT_SOME (CT_ident s), xlate_context_pattern b) | _ -> assert false;; +*) + | NoHypId b -> CT_premise_pattern(ctv_ID_OPT_NONE, xlate_context_pattern b) + | Hyp ((_,id),b) -> CT_premise_pattern(ctf_ID_OPT_SOME (xlate_ident id), + xlate_context_pattern b) let xlate_largs_to_id_unit largs = @@ -929,6 +1064,8 @@ let xlate_largs_to_id_unit largs = fst::rest -> fst, rest | _ -> assert false;; +(* Obsolete, partially replaced by xlate_tacarg and partially dispatched on + throughout the code for each tactic entry let rec cvt_arg = function | Nvar (_, id) -> Targ_ident (CT_ident id) @@ -991,8 +1128,75 @@ let rec cvt_arg = (string_of_int l1) ^ " " ^ (string_of_int l2)) | _ -> failwith "cvt_arg" +*) +let rec (xlate_tacarg:raw_tactic_arg -> ct_TACTIC_ARG) = + function + | TacVoid -> + CT_void + | Tacexp t -> + CT_coerce_TACTIC_COM_to_TACTIC_ARG(xlate_tactic t) + | Integer n -> + CT_coerce_ID_OR_INT_to_TACTIC_ARG + (CT_coerce_INT_to_ID_OR_INT (CT_int n)) + | Reference r -> + CT_coerce_ID_OR_INT_to_TACTIC_ARG + (CT_coerce_ID_to_ID_OR_INT (reference_to_ct_ID r)) + | TacDynamic _ -> + failwith "Dynamics not treated in xlate_ast" + | ConstrMayEval (ConstrTerm c) -> + CT_coerce_FORMULA_to_TACTIC_ARG (xlate_constr c) + | ConstrMayEval _ -> + xlate_error "TODO: Eval/Inst as tactic argument" + | MetaIdArg _ -> + xlate_error "MetaIdArg should only be used in quotations" + | MetaNumArg (_,n) -> + CT_coerce_FORMULA_to_TACTIC_ARG + (CT_coerce_ID_to_FORMULA(CT_metac (CT_int n))) + | t -> + CT_coerce_TACTIC_COM_to_TACTIC_ARG(xlate_call_or_tacarg t) + +and (xlate_call_or_tacarg:raw_tactic_arg -> ct_TACTIC_COM) = + function + (* Moved from xlate_tactic *) + | TacCall (_,Reference r, a::l) -> + CT_simple_user_tac + (reference_to_ct_ID r, + CT_tactic_arg_list(xlate_tacarg a,List.map xlate_tacarg l)) + | TacCall (_,_,_) -> xlate_error "" + | Reference (RIdent (_,s)) -> ident_tac s + | t -> xlate_error "TODO: result other than tactic or constr" + and xlate_red_tactic = function + | Red true -> xlate_error "" + | Red false -> CT_red + | Hnf -> CT_hnf + | Simpl -> CT_simpl + | Cbv flag_list -> + let conv_flags, red_ids = get_flag flag_list in + CT_cbv (CT_conversion_flag_list conv_flags, red_ids) + | Lazy flag_list -> + let conv_flags, red_ids = get_flag flag_list in + CT_cbv (CT_conversion_flag_list conv_flags, red_ids) + | Unfold unf_list -> + let ct_unf_list = List.map (fun (nums,qid) -> + CT_unfold_occ (CT_int_list (List.map (fun x -> CT_int x) nums), + qualid_or_meta_to_ct_ID qid)) unf_list in + (match ct_unf_list with + | first :: others -> CT_unfold (CT_unfold_ne_list (first, others)) + | [] -> error "there should be at least one thing to unfold") + | Fold formula_list -> + CT_fold(CT_formula_list(List.map xlate_constr formula_list)) + | Pattern l -> + let pat_list = List.map (fun (nums,c) -> + CT_pattern_occ + (CT_int_list (List.map (fun x -> CT_int x) nums), + xlate_constr c)) l in + (match pat_list with + | first :: others -> CT_pattern (CT_pattern_ne_list (first, others)) + | [] -> error "Expecting at least one pattern in a Pattern command") + | ExtraRedExpr _ -> xlate_error "TODO: ExtraRedExpr" +(* | Node (loc, s, []) -> (match s with | "Red" -> CT_red @@ -1038,14 +1242,20 @@ and xlate_red_tactic = formula_list)) | Node (_, a, _) -> error ("xlate_red_tactic: unexpected argument " ^ a) | _ -> error "xlate_red_tactic : unexpected argument" +*) and xlate_tactic = function - | Node (_, s, l) -> +(* | Node (_, s, l) -> (match s, l with +*) +(* | "FUN", [Node(_, "FUNVAR", largs); t] -> - let fst, rest = xlate_largs_to_id_unit largs in - CT_tactic_fun - (CT_id_unit_list(fst, rest), xlate_tactic t) +*) + | TacFun (largs, t) -> + let fst, rest = xlate_largs_to_id_unit largs in + CT_tactic_fun (CT_id_unit_list(fst, rest), xlate_tactic t) + | TacFunRec _ -> xlate_error "Merged with Tactic Definition" +(* | "TACTICLIST", (t :: tl) -> (match List.map xlate_tactic (t::tl) with | [] -> xlate_error "xlate_tactic: internal xlate_error" @@ -1054,17 +1264,37 @@ and xlate_tactic = | xt :: xtl -> CT_then (xt, xtl)) | "TACTICLIST", _ -> xlate_error "xlate_tactic: malformed tactic-expression TACTICLIST" +*) + | TacThen (t1, t2) -> + (match xlate_tactic t1 with + | CT_then(t,tl) -> CT_then (t, tl@[xlate_tactic t2]) + | xt1 -> CT_then (xt1, [xlate_tactic t2])) +(* | "TACLIST", (t :: tl) -> (match List.map xlate_tactic (t::tl) with | [] -> xlate_error "xlate_tactic: internal xlate_error" | xt :: [] -> xt | xt :: xtl -> CT_parallel (xt, xtl)) +*) + | TacThens (t, tl) -> CT_parallel (xlate_tactic t, List.map xlate_tactic tl) +(* | "FIRST", (a::l) -> +*) + | TacFirst [] -> xlate_error "" + | TacFirst (a::l) -> CT_first(xlate_tactic a,List.map xlate_tactic l) +(* | "TCLSOLVE", (a::l) -> +*) + | TacSolve [] -> xlate_error "" + | TacSolve (a::l) -> CT_tacsolve(xlate_tactic a, List.map xlate_tactic l) +(* | "DO", ((Num (_, n)) :: (t :: [])) -> CT_do (CT_int n, xlate_tactic t) | "DO", _ -> xlate_error "xlate_tactic: malformed tactic-expression DO" +*) + | TacDo (n, t) -> CT_do (CT_int n, xlate_tactic t) +(* | "TRY", (t :: []) -> CT_try (xlate_tactic t) | "TRY", _ -> xlate_error "xlate_tactic: malformed tactic-expression TRY" | "REPEAT", (t :: []) -> CT_repeat (xlate_tactic t) @@ -1074,12 +1304,27 @@ and xlate_tactic = | "INFO", (t :: []) -> CT_info (xlate_tactic t) | "REPEAT", _ -> xlate_error "xlate_tactic: malformed tactic-expression REPEAT" +*) + | TacTry t -> CT_try (xlate_tactic t) + | TacRepeat t -> CT_repeat (xlate_tactic t) + | TacAbstract (t, None) -> CT_abstract(ctv_ID_OPT_NONE, (xlate_tactic t)) + | TacAbstract (t, Some id) -> + CT_abstract(ctf_ID_OPT_SOME (xlate_ident id), (xlate_tactic t)) + | TacInfo t -> CT_info (xlate_tactic t) + | TacProgress t -> xlate_error "TODO: Progress t" +(* | "ORELSE", (t1 :: (t2 :: [])) -> CT_orelse (xlate_tactic t1, xlate_tactic t2) | "ORELSE", _ -> xlate_error "xlate_tactic: malformed tactic-expression ORELSE" +*) + | TacOrelse (t1, t2) -> CT_orelse (xlate_tactic t1, xlate_tactic t2) + +(* | ((s, l) as it) when (is_tactic_special_case s) -> tactic_special_case xlate_tactic cvt_arg it +*) +(* moved to xlate_call_or_tacarg | "APP", (Nvar(_,s))::l -> let args = List.map (function @@ -1093,6 +1338,8 @@ and xlate_tactic = fst::args2 -> fst, args2 | _ -> assert false in CT_simple_user_tac(CT_ident s, CT_tactic_arg_list(fst, args2)) +*) +(* | "MATCH", exp::rules -> CT_match_tac(mk_let_value exp, match List.map @@ -1119,9 +1366,33 @@ and xlate_tactic = | [] -> assert false | fst::others -> CT_match_tac_rules(fst, others)) +*) + | TacMatch (exp, rules) -> + CT_match_tac(CT_coerce_DEF_BODY_to_LET_VALUE(formula_to_def_body exp), + match List.map + (function + | Pat ([],p,tac) -> + CT_match_tac_rule(xlate_context_pattern p, + mk_let_value tac) + | Pat (_,p,tac) -> xlate_error"No hyps in pure Match" + | All tac -> + CT_match_tac_rule + (CT_coerce_FORMULA_to_CONTEXT_PATTERN + CT_existvarc, + mk_let_value tac)) rules with + | [] -> assert false + | fst::others -> + CT_match_tac_rules(fst, others)) + +(* | "MATCHCONTEXT", rule1::rules -> +*) + | TacMatchContext (_,[]) -> failwith "" + | TacMatchContext (lr,rule1::rules) -> + (* TODO : traiter la direction "lr" *) CT_match_context(xlate_context_rule rule1, List.map xlate_context_rule rules) +(* | "LET", [Node(_, "LETDECL",l); t] -> let cvt_clause = @@ -1136,30 +1407,87 @@ and xlate_tactic = (xlate_tactic v)) | Node(_, s, _) -> failwith ("cvt_clause : unexpected " ^ s) | _ -> assert false in +*) + | TacLetIn (l, t) -> + let cvt_clause = + function + ((_,s),None,ConstrMayEval v) -> + CT_let_clause(xlate_ident s, + CT_coerce_DEF_BODY_to_LET_VALUE + (formula_to_def_body v)) + | ((_,s),None,Tacexp t) -> + CT_let_clause(xlate_ident s, + CT_coerce_TACTIC_COM_to_LET_VALUE + (xlate_tactic t)) + | ((_,s),None,t) -> + CT_let_clause(xlate_ident s, + CT_coerce_TACTIC_COM_to_LET_VALUE + (xlate_call_or_tacarg t)) + | ((_,s),Some c,v) -> xlate_error "TODO: Let id : c := t In t'" in let cl_l = List.map cvt_clause l in (match cl_l with | [] -> assert false | fst::others -> CT_lettac (CT_let_clauses(fst, others), mk_let_value t)) + | TacLetCut _ -> xlate_error "Unclear future of syntax Let x := t" + | TacLetRecIn _ -> xlate_error "TODO: Rec x = t In" + +(* | s, l -> xlate_tac (s, List.map cvt_arg l)) +*) + | TacAtom (_, t) -> xlate_tac t +(* was in xlate_tac *) + | TacFail 0 -> CT_fail + | TacFail n -> xlate_error "TODO: Fail n" + | TacId -> CT_idtac +(* moved to xlate_call_or_tacarg | Nvar(_, s) -> ident_tac s +*) +(* | the_node -> xlate_error ("xlate_tactic at " ^ (string_of_node_loc the_node) ) +*) + | TacArg a -> xlate_call_or_tacarg a and xlate_tac = - function + function +(* | "Absurd", ((Targ_command c) :: []) -> CT_absurd c | "Change", [Targ_command f; Targ_id_list b] -> CT_change(f,b) | "Contradiction", [] -> CT_contradiction +*) + | TacExtend ("Absurd",[c]) -> + CT_absurd (xlate_constr (out_gen rawwit_constr c)) + | TacChange (f, b) -> CT_change (xlate_constr f, xlate_clause b) + | TacExtend ("Contradiction",[]) -> CT_contradiction +(* | "DoubleInd", ((Targ_int n1) :: ((Targ_int n2) :: [])) -> - CT_tac_double (n1, n2) + CT_tac_double (n1, n2) +*) + | TacDoubleInduction (AnonHyp n1, AnonHyp n2) -> + CT_tac_double (CT_int n1, CT_int n2) + | TacDoubleInduction _ -> xlate_error "TODO: Double Induction id1 id2" +(* | "Discr", [] -> CT_discriminate_eq ctv_ID_OPT_NONE | "DiscrHyp", ((Targ_ident id) :: []) -> CT_discriminate_eq (ctf_ID_OPT_SOME id) | "DEqConcl", [] -> CT_simplify_eq ctv_ID_OPT_NONE | "DEqHyp", ((Targ_ident id) :: []) -> CT_simplify_eq (ctf_ID_OPT_SOME id) +*) + | TacExtend ("Discriminate", [idopt]) -> + CT_discriminate_eq + (xlate_ident_opt (out_gen (wit_opt rawwit_ident) idopt)) + | TacExtend ("DEq", [idopt]) -> + CT_simplify_eq + (xlate_ident_opt (out_gen (wit_opt rawwit_ident) idopt)) +(* | "Inj", [] -> CT_injection_eq ctv_ID_OPT_NONE | "InjHyp", ((Targ_ident id) :: []) -> CT_injection_eq (ctf_ID_OPT_SOME id) +*) + | TacExtend ("Injection", [idopt]) -> + CT_injection_eq + (xlate_ident_opt (out_gen (wit_opt rawwit_ident) idopt)) +(* | "Fix", ((Targ_int n) :: []) -> CT_fixtactic (ctv_ID_OPT_NONE, n, CT_fix_tac_list []) | "Fix", ((Targ_ident id) :: ((Targ_int n) :: fixtac_list)) -> @@ -1171,40 +1499,126 @@ and xlate_tac = CT_cofixtactic (CT_coerce_ID_to_ID_OPT id, CT_cofix_tac_list (List.map strip_targ_cofixtac cofixtac_list)) +*) + | TacFix (idopt, n) -> + CT_fixtactic (xlate_ident_opt idopt, CT_int n, CT_fix_tac_list []) + | TacMutualFix (id, n, fixtac_list) -> + let f (id,n,c) = CT_fixtac (xlate_ident id, CT_int n, xlate_constr c) in + CT_fixtactic + (ctf_ID_OPT_SOME (xlate_ident id), CT_int n, + CT_fix_tac_list (List.map f fixtac_list)) + | TacCofix idopt -> + CT_cofixtactic (xlate_ident_opt idopt, CT_cofix_tac_list []) + | TacMutualCofix (id, cofixtac_list) -> + let f (id,c) = CT_cofixtac (xlate_ident id, xlate_constr c) in + CT_cofixtactic + (CT_coerce_ID_to_ID_OPT (xlate_ident id), + CT_cofix_tac_list (List.map f cofixtac_list)) +(* | "IntrosUntil", ((Targ_ident id) :: []) -> CT_intros_until id +*) + | TacIntrosUntil (NamedHyp id) -> CT_intros_until (xlate_ident id) + | TacIntrosUntil (AnonHyp n) -> xlate_error "TODO: Intros until n" +(* | "IntroMove", [Targ_ident id1;Targ_ident id2] -> - CT_intro_after(CT_coerce_ID_to_ID_OPT id1, id2) +*) + | TacIntroMove (Some id1, Some (_,id2)) -> + CT_intro_after(CT_coerce_ID_to_ID_OPT (xlate_ident id1),xlate_ident id2) +(* | "IntroMove", [Targ_ident id2] -> - CT_intro_after(CT_coerce_NONE_to_ID_OPT CT_none, id2) +*) + | TacIntroMove (None, Some (_,id2)) -> + CT_intro_after(CT_coerce_NONE_to_ID_OPT CT_none, xlate_ident id2) +(* | "MoveDep", [Targ_ident id1;Targ_ident id2] -> - CT_move_after(id1, id2) +*) + | TacMove (true, (_,id1), (_,id2)) -> + CT_move_after(xlate_ident id1, xlate_ident id2) + | TacMove (false, id1, id2) -> xlate_error "Non dep Move is only internal" +(* | "Intros", [] -> CT_intros (CT_intro_patt_list []) | "Intros", [patt_list] -> CT_intros (strip_targ_intropatt patt_list) +*) + | TacIntroPattern [] -> CT_intros (CT_intro_patt_list []) + | TacIntroPattern patt_list -> + CT_intros (CT_intro_patt_list (List.map xlate_intro_pattern patt_list)) +(* | "Intro", [Targ_ident (CT_ident id)] -> - CT_intros (CT_intro_patt_list [CT_coerce_ID_to_INTRO_PATT(CT_ident id)]) +*) + | TacIntroMove (Some id, None) -> + CT_intros (CT_intro_patt_list[CT_coerce_ID_to_INTRO_PATT(xlate_ident id)]) + | TacIntroMove (None, None) -> xlate_error "TODO: Intro" +(* | "Left", (bindl :: []) -> CT_left (strip_targ_spec_list bindl) | "Right", (bindl :: []) -> CT_right (strip_targ_spec_list bindl) | "Split", (bindl :: []) -> CT_split (strip_targ_spec_list bindl) +*) + | TacLeft bindl -> CT_left (xlate_bindings bindl) + | TacRight bindl -> CT_right (xlate_bindings bindl) + | TacSplit bindl -> CT_split (xlate_bindings bindl) +(* | "Replace", ((Targ_command c1) :: ((Targ_command c2) :: [])) -> CT_replace_with (c1, c2) +*) + | TacExtend ("Replace", [c1; c2]) -> + let c1 = xlate_constr (out_gen rawwit_constr c1) in + let c2 = xlate_constr (out_gen rawwit_constr c2) in + CT_replace_with (c1, c2) | (*Changes to Equality.v some more rewrite possibilities *) +(* "RewriteLR", [(Targ_command c); bindl] -> CT_rewrite_lr (c, strip_targ_spec_list bindl, ctv_ID_OPT_NONE) - | "RewriteLRin", ((Targ_ident id) :: ((Targ_command c) :: (bindl::[]))) -> - CT_rewrite_lr (c, strip_targ_spec_list bindl, ctf_ID_OPT_SOME id) | "RewriteRL", [Targ_command c; bindl] -> CT_rewrite_rl (c, strip_targ_spec_list bindl, ctv_ID_OPT_NONE) +*) + TacExtend ("Rewrite", [b; cbindl]) -> + let b = out_gen Extraargs.rawwit_orient b in + let (c,bindl) = out_gen rawwit_constr_with_bindings cbindl in + let c = xlate_constr c and bindl = xlate_bindings bindl in + if b then CT_rewrite_lr (c, bindl, ctv_ID_OPT_NONE) + else CT_rewrite_rl (c, bindl, ctv_ID_OPT_NONE) +(* + | "RewriteLRin", ((Targ_ident id) :: ((Targ_command c) :: (bindl::[]))) -> + CT_rewrite_lr (c, strip_targ_spec_list bindl, ctf_ID_OPT_SOME id) | "RewriteRLin", [Targ_ident id; Targ_command c; bindl] -> CT_rewrite_rl (c, strip_targ_spec_list bindl, ctf_ID_OPT_SOME id) +*) + | TacExtend ("RewriteIn", [b; cbindl; id]) -> + let b = out_gen Extraargs.rawwit_orient b in + let (c,bindl) = out_gen rawwit_constr_with_bindings cbindl in + let c = xlate_constr c and bindl = xlate_bindings bindl in + let id = ctf_ID_OPT_SOME (xlate_ident (out_gen rawwit_ident id)) in + if b then CT_rewrite_lr (c, bindl, id) + else CT_rewrite_rl (c, bindl, id) +(* | "CondRewriteLR", [Targ_tacexp t; Targ_command c; bindl] -> CT_condrewrite_lr (t, c, strip_targ_spec_list bindl, ctv_ID_OPT_NONE) | "CondRewriteRL", [Targ_tacexp t; Targ_command c; bindl] -> CT_condrewrite_rl (t, c, strip_targ_spec_list bindl, ctv_ID_OPT_NONE) +*) + | TacExtend ("ConditionalRewrite", [t; b; cbindl]) -> + let t = out_gen rawwit_tactic t in + let b = out_gen Extraargs.rawwit_orient b in + let (c,bindl) = out_gen rawwit_constr_with_bindings cbindl in + let c = xlate_constr c and bindl = xlate_bindings bindl in + if b then CT_condrewrite_lr (xlate_tactic t, c, bindl, ctv_ID_OPT_NONE) + else CT_condrewrite_rl (xlate_tactic t, c, bindl, ctv_ID_OPT_NONE) +(* | "CondRewriteLRin", [Targ_tacexp t; Targ_ident id; Targ_command c; bindl] -> CT_condrewrite_lr (t, c, strip_targ_spec_list bindl, ctf_ID_OPT_SOME id) | "CondRewriteRLin", [Targ_tacexp t; Targ_ident id; Targ_command c; bindl] -> CT_condrewrite_rl (t, c, strip_targ_spec_list bindl, ctf_ID_OPT_SOME id) +*) + | TacExtend ("ConditionalRewriteIn", [t; b; cbindl; id]) -> + let t = out_gen rawwit_tactic t in + let b = out_gen Extraargs.rawwit_orient b in + let (c,bindl) = out_gen rawwit_constr_with_bindings cbindl in + let c = xlate_constr c and bindl = xlate_bindings bindl in + let id = ctf_ID_OPT_SOME (xlate_ident (out_gen rawwit_ident id)) in + if b then CT_condrewrite_lr (xlate_tactic t, c, bindl, id) + else CT_condrewrite_rl (xlate_tactic t, c, bindl, id) +(* | "SubstConcl_LR", ((Targ_command c) :: []) -> CT_cutrewrite_lr (c, ctv_ID_OPT_NONE) | "SubstHyp_LR", ((Targ_command c) :: ((Targ_ident id) :: [])) -> @@ -1215,16 +1629,53 @@ and xlate_tac = CT_cutrewrite_rl (c, ctf_ID_OPT_SOME id) | "SubstHypInConcl_LR", ((Targ_ident id) :: []) -> CT_deprewrite_lr id | "SubstHypInConcl_RL", ((Targ_ident id) :: []) -> CT_deprewrite_rl id +*) + | TacExtend ("DependentRewrite", [b; id_or_constr]) -> + let b = out_gen Extraargs.rawwit_orient b in + (match genarg_tag id_or_constr with + | IdentArgType -> (*Dependent Rewrite/SubstHypInConcl*) + let id = xlate_ident (out_gen rawwit_ident id_or_constr) in + if b then CT_deprewrite_lr id else CT_deprewrite_rl id + | ConstrArgType -> (*CutRewrite/SubstConcl*) + let c = xlate_constr (out_gen rawwit_constr id_or_constr) in + if b then CT_cutrewrite_lr (c, ctv_ID_OPT_NONE) + else CT_cutrewrite_rl (c, ctv_ID_OPT_NONE) + | _ -> xlate_error "") + | TacExtend ("DependentRewrite", [b; c; id]) -> (*CutRewrite in/SubstHyp*) + let b = out_gen Extraargs.rawwit_orient b in + let c = xlate_constr (out_gen rawwit_constr c) in + let id = xlate_ident (out_gen rawwit_ident id) in + if b then CT_cutrewrite_lr (c, ctf_ID_OPT_SOME id) + else CT_cutrewrite_lr (c, ctf_ID_OPT_SOME id) +(* | "Reflexivity", [] -> CT_reflexivity | "Symmetry", [] -> CT_symmetry | "Transitivity", ((Targ_command c) :: []) -> CT_transitivity c +*) + | TacReflexivity -> CT_reflexivity + | TacSymmetry -> CT_symmetry + | TacTransitivity c -> CT_transitivity (xlate_constr c) +(* | "Assumption", [] -> CT_assumption +*) + | TacAssumption -> CT_assumption +(* Moved to xlate_tactic | "FAIL", [] -> CT_fail | "IDTAC", [] -> CT_idtac +*) +(* | "Exact", ((Targ_command c) :: []) -> CT_exact c +*) + | TacExact c -> CT_exact (xlate_constr c) +(* | "DHyp", [Targ_ident id] -> CT_dhyp id | "CDHyp", [Targ_ident id] -> CT_cdhyp id | "DConcl", [] -> CT_dconcl +*) + | TacDestructHyp (true, (_,id)) -> CT_cdhyp (xlate_ident id) + | TacDestructHyp (false, (_,id)) -> CT_dhyp (xlate_ident id) + | TacDestructConcl -> CT_dconcl +(* | "SuperAuto", [a1;a2;a3;a4] -> CT_superauto( (match a1 with @@ -1242,8 +1693,19 @@ and xlate_tac = | _ -> (CT_coerce_NONE_to_USINGTDB CT_none))) +*) + | TacSuperAuto (nopt,l,a3,a4) -> + CT_superauto( + xlate_int_opt nopt, + xlate_qualid_list l, + (if a3 then CT_destructing else CT_coerce_NONE_to_DESTRUCTING CT_none), + (if a4 then CT_usingtdb else CT_coerce_NONE_to_USINGTDB CT_none)) +(* | "AutoTDB", [Targ_int n] -> CT_autotdb (CT_coerce_INT_to_INT_OPT n) | "AutoTDB", [] -> CT_autotdb (CT_coerce_NONE_to_INT_OPT CT_none) +*) + | TacAutoTDB nopt -> CT_autotdb (xlate_int_opt nopt) +(* | "Auto", ((Targ_int n) :: []) -> CT_auto (CT_coerce_INT_to_INT_OPT n) | "Auto", ((Targ_string (CT_string "*"))::[]) -> CT_auto_with((CT_coerce_NONE_to_INT_OPT CT_none), CT_star) @@ -1264,6 +1726,14 @@ and xlate_tac = idl))) | "Auto", ((Targ_int n) :: ((Targ_string (CT_string "*")) :: [])) -> CT_auto_with ((CT_coerce_INT_to_INT_OPT n), CT_star) +*) + | TacAuto (nopt, Some []) -> CT_auto (xlate_int_opt nopt) + | TacAuto (nopt, None) -> CT_auto_with (xlate_int_opt nopt, CT_star) + | TacAuto (nopt, Some (id1::idl)) -> + CT_auto_with(xlate_int_opt nopt, + CT_coerce_ID_NE_LIST_to_ID_NE_LIST_OR_STAR( + CT_id_ne_list(CT_ident id1, List.map (fun x -> CT_ident x) idl))) +(* | "EAuto", ((Targ_int n) :: []) -> CT_eauto (CT_coerce_INT_to_INT_OPT n) | "EAuto", [] -> CT_eauto (CT_coerce_NONE_to_INT_OPT CT_none) | "EAuto", ((Targ_int n) :: ((Targ_ident id1) :: idl)) -> @@ -1284,12 +1754,42 @@ and xlate_tac = CT_eauto_with ((CT_coerce_INT_to_INT_OPT n), CT_star) | "EAuto", ((Targ_string (CT_string "*"))::[]) -> CT_eauto_with((CT_coerce_NONE_to_INT_OPT CT_none), CT_star) +*) + | TacExtend ("EAuto", [nopt; popt; idl]) -> + let control = + match out_gen (wit_opt rawwit_int_or_var) nopt with + | Some breadth -> Some (true, breadth) + | None -> + match out_gen (wit_opt rawwit_int_or_var) popt with + | Some depth -> Some (false, depth) + | None -> None in + let idl = out_gen (wit_opt (wit_list0 rawwit_string)) idl in + xlate_error "TODO: EAuto n p" + (* Something like: + match idl with + | None -> CT_eauto_with (..., CT_star) + | Some [] -> CT_eauto ... + | Some (id::l) -> CT_eauto_with (..., ...) + *) +(* | "Prolog", ((Targ_int n) :: idlist) -> (*according to coqdev the code is right, they want formula *) CT_prolog (CT_formula_list (List.map strip_targ_command idlist), n) - | (**) +*) + | TacExtend ("Prolog", [cl; n]) -> + let cl = List.map xlate_constr (out_gen (wit_list0 rawwit_constr) cl) in + (match out_gen wit_int_or_var n with + | ArgVar _ -> xlate_error "" + | ArgArg n -> CT_prolog (CT_formula_list cl, CT_int n)) +(* "EApplyWithBindings", ((Targ_command c) :: (bindl :: [])) -> CT_eapply (c, strip_targ_spec_list bindl) +*) + | TacExtend ("EApply", [cbindl]) -> + let (c,bindl) = out_gen rawwit_constr_with_bindings cbindl in + let c = xlate_constr c and bindl = xlate_bindings bindl in + CT_eapply (c, bindl) +(* | "Trivial", [] -> CT_trivial | "Trivial", ((Targ_string (CT_string "*"))::[]) -> CT_trivial_with(CT_star) @@ -1299,25 +1799,61 @@ and xlate_tac = List.map (function Targ_ident x -> x | _ -> xlate_error "Trivial expects identifiers") idl)))) +*) + | TacTrivial (Some []) -> CT_trivial + | TacTrivial None -> CT_trivial_with(CT_star) + | TacTrivial (Some (id1::idl)) -> + CT_trivial_with(CT_coerce_ID_NE_LIST_to_ID_NE_LIST_OR_STAR( + (CT_id_ne_list(CT_ident id1,List.map (fun x -> CT_ident x) idl)))) +(* | "Reduce", ((Targ_redexp id) :: ((Targ_id_list l) :: [])) -> CT_reduce (id, l) +*) + | TacReduce (red, l) -> + CT_reduce (xlate_red_tactic red, xlate_clause l) +(* | "Apply", ((Targ_command c) :: (bindl :: [])) -> CT_apply (c, strip_targ_spec_list bindl) +*) + | TacApply (c,bindl) -> + CT_apply (xlate_constr c, xlate_bindings bindl) +(* | "Constructor", ((Targ_int n) :: (bindl :: [])) -> CT_constructor (n, strip_targ_spec_list bindl) +*) + | TacConstructor (n_or_meta, bindl) -> + let n = match n_or_meta with AI n -> n | MetaId _ -> xlate_error "" + in CT_constructor (CT_int n, xlate_bindings bindl) +(* | "Specialize", ((Targ_int n) :: ((Targ_command c) :: ((Targ_spec_list sl) :: []))) -> CT_specialize (CT_coerce_INT_to_INT_OPT n, c, sl) | "Specialize", ((Targ_command c) :: ((Targ_spec_list sl) :: [])) -> CT_specialize (CT_coerce_NONE_to_INT_OPT CT_none, c, sl) +*) + | TacSpecialize (nopt, (c,sl)) -> + CT_specialize (xlate_int_opt nopt, xlate_constr c, xlate_bindings sl) +(* | "Generalize", (first :: cl) -> CT_generalize (CT_formula_ne_list (strip_targ_command first, List.map strip_targ_command cl)) | "GeneralizeDep", [Targ_command c] -> CT_generalize_dependent c +*) + | TacGeneralize [] -> xlate_error "" + | TacGeneralize (first :: cl) -> + CT_generalize + (CT_formula_ne_list (xlate_constr first, List.map xlate_constr cl)) + | TacGeneralizeDep c -> + CT_generalize_dependent (xlate_constr c) +(* | "ElimType", ((Targ_command c) :: []) -> CT_elim_type c | "CaseType", ((Targ_command c) :: []) -> CT_case_type c +*) + | TacElimType c -> CT_elim_type (xlate_constr c) + | TacCaseType c -> CT_case_type (xlate_constr c) +(* | "Elim", ((Targ_command c1) :: ((Targ_spec_list sl) :: [])) -> CT_elim (c1, sl, CT_coerce_NONE_to_USING CT_none) | "Elim", @@ -1327,28 +1863,67 @@ and xlate_tac = CT_elim (c1, sl, CT_using (c2, sl2)) | "Case", ((Targ_command c1) :: ((Targ_spec_list sl) :: [])) -> CT_casetac (c1, sl) +*) + | TacElim ((c1,sl), None) -> + CT_elim (xlate_constr c1, xlate_bindings sl, + CT_coerce_NONE_to_USING CT_none) + | TacElim ((c1,sl), Some (c2,sl2)) -> + CT_elim (xlate_constr c1, xlate_bindings sl, + CT_using (xlate_constr c2, xlate_bindings sl2)) + | TacCase (c1,sl) -> + CT_casetac (xlate_constr c1, xlate_bindings sl) +(* | "Induction", ((Targ_ident id) :: []) -> CT_induction (CT_coerce_ID_to_ID_OR_INT id) | "Induction", ((Targ_int n) :: []) -> CT_induction (CT_coerce_INT_to_ID_OR_INT n) +*) + | TacOldInduction h -> CT_induction (xlate_quantified_hypothesis h) +(* | "Destruct", ((Targ_ident id) :: []) -> CT_destruct (CT_coerce_ID_to_ID_OR_INT id) | "Destruct", ((Targ_int n) :: []) -> CT_destruct (CT_coerce_INT_to_ID_OR_INT n) +*) + | TacOldDestruct h -> CT_destruct (xlate_quantified_hypothesis h) +(* | "Cut", ((Targ_command c) :: []) -> CT_cut c +*) + | TacCut c -> CT_cut (xlate_constr c) +(* | "CutAndApply", ((Targ_command c) :: []) -> CT_use c +*) + | TacLApply c -> CT_use (xlate_constr c) +(* | "DecomposeThese", ((Targ_id_list l) :: ((Targ_command c) :: [])) -> (match l with CT_id_list (id :: l') -> CT_decompose_list( CT_id_ne_list(id,l'),c) | _ -> xlate_error "DecomposeThese : empty list of identifiers?") +*) + | TacDecompose ([],c) -> + xlate_error "Decompose : empty list of identifiers?" + | TacDecompose (id::l,c) -> + let id' = qualid_or_meta_to_ct_ID id in + let l' = List.map qualid_or_meta_to_ct_ID l in + CT_decompose_list(CT_id_ne_list(id',l'),xlate_constr c) + | TacDecomposeAnd c -> xlate_error "TODO: Decompose Record" + | TacDecomposeOr c -> xlate_error "TODO: Decompose Sum" +(* | "Clear", [id_list] -> (match id_list with Targ_id_list(CT_id_list(id::idl)) -> CT_clear (CT_id_ne_list (id, idl)) | _ -> xlate_error "Clear expects a non empty list of identifiers") +*) + | TacClear [] -> + xlate_error "Clear expects a non empty list of identifiers" + | TacClear (id::idl) -> + let idl' = List.map ident_or_meta_to_ct_ID idl in + CT_clear (CT_id_ne_list (ident_or_meta_to_ct_ID id, idl')) | (*For translating tactics/Inv.v *) +(* "Inv", [Targ_string (CT_string s); Targ_ident id] -> CT_inversion (compute_INV_TYPE_from_string s, id, CT_id_list []) | "InvIn", ((Targ_ident (CT_ident s))::((Targ_ident id) :: idlist)) -> @@ -1362,15 +1937,107 @@ and xlate_tac = ((Targ_ident id) :: ((Targ_command c) :: []))) -> CT_depinversion (compute_INV_TYPE_from_string s, id, CT_coerce_FORMULA_to_FORMULA_OPT c) +*) + TacExtend ("SimpleInversion"|"Inversion"|"InversionClear" as s, [id]) -> + let id = xlate_ident (out_gen rawwit_ident id) in + CT_inversion (compute_INV_TYPE_from_string s, id, CT_id_list []) + | TacExtend ("SimpleInversion"|"Inversion"|"InversionClear" as s, + [id;copt_or_idl]) -> + let id = xlate_ident (out_gen rawwit_ident id) in + (match genarg_tag copt_or_idl with + | List1ArgType IdentArgType -> (* InvIn *) + let idl = out_gen (wit_list1 rawwit_ident) copt_or_idl in + CT_inversion (compute_INV_TYPE_from_string s, id, + CT_id_list (List.map xlate_ident idl)) + | OptArgType ConstrArgType -> (* DInv *) + let copt = out_gen (wit_opt rawwit_constr) copt_or_idl in + CT_depinversion + (compute_INV_TYPE_from_string s, id, xlate_constr_opt copt) + | _ -> xlate_error "") +(* | "UseInversionLemma", ((Targ_ident id) :: ((Targ_command c) :: [])) -> CT_use_inversion (id, c, CT_id_list []) | "UseInversionLemmaIn", ((Targ_ident id) :: ((Targ_command c) :: idlist)) -> CT_use_inversion (id, c, CT_id_list (List.map strip_targ_ident idlist)) +*) + | TacExtend ("InversionUsing", [id; c]) -> + let id = xlate_ident (out_gen rawwit_ident id) in + let c = out_gen rawwit_constr c in + CT_use_inversion (id, xlate_constr c, CT_id_list []) + | TacExtend ("InversionUsing", [id; c; idlist]) -> + let id = xlate_ident (out_gen rawwit_ident id) in + let c = out_gen rawwit_constr c in + let idlist = out_gen (wit_list1 rawwit_ident) idlist in + CT_use_inversion (id, xlate_constr c, + CT_id_list (List.map xlate_ident idlist)) +(* | "Omega", [] -> CT_omega +*) + | TacExtend ("Omega", []) -> CT_omega +(* | "APP", (Targ_ident id)::l -> CT_user_tac (id, CT_targ_list (List.map coerce_iTARG_to_TARG l)) +*) + | TacRename (_, _) -> xlate_error "TODO: Rename id into id'" + | TacClearBody _ -> xlate_error "TODO: Clear Body H" + | TacDAuto (_, _) -> xlate_error "TODO: DAuto" + | TacNewDestruct _ -> xlate_error "TODO: NewDestruct" + | TacNewInduction _ -> xlate_error "TODO: NewInduction" + | TacInstantiate (_, _) -> xlate_error "TODO: Instantiate" + | TacLetTac (_, _, _) -> xlate_error "TODO: LetTac" + | TacForward (_, _, _) -> xlate_error "TODO: Assert/Pose id:=c" + | TacTrueCut (_, _) -> xlate_error "TODO: Assert id:t" + | TacAnyConstructor tacopt -> xlate_error "TODO: Constructor tac" +(* | s, l -> CT_user_tac (CT_ident s, CT_targ_list (List.map coerce_iTARG_to_TARG l)) +*) + | TacExtend (id, l) -> + CT_user_tac (CT_ident id, CT_targ_list (List.map coerce_genarg_to_TARG l)) + | TacAlias (_, _, _) -> xlate_error "TODO: aliases" + +and coerce_genarg_to_TARG x = + match Genarg.genarg_tag x with + (* Basic types *) + | BoolArgType -> xlate_error "TODO: generic boolean argument" + | IntArgType -> + let n = out_gen rawwit_int x in + CT_coerce_ID_OR_INT_to_TARG (CT_coerce_INT_to_ID_OR_INT (CT_int n)) + | IntOrVarArgType -> + let x = match out_gen rawwit_int_or_var x with + | ArgArg n -> CT_coerce_INT_to_ID_OR_INT (CT_int n) + | ArgVar (_,id) -> CT_coerce_ID_to_ID_OR_INT (xlate_ident id) in + CT_coerce_ID_OR_INT_to_TARG x + | StringArgType -> + let s = CT_string (out_gen rawwit_string x) in + CT_coerce_ID_OR_STRING_to_TARG (CT_coerce_STRING_to_ID_OR_STRING s) + | PreIdentArgType -> + let id = CT_ident (out_gen rawwit_pre_ident x) in + CT_coerce_ID_OR_INT_to_TARG (CT_coerce_ID_to_ID_OR_INT id) + | IdentArgType -> + let id = xlate_ident (out_gen rawwit_ident x) in + CT_coerce_ID_OR_INT_to_TARG (CT_coerce_ID_to_ID_OR_INT id) + | QualidArgType -> + let id = tac_qualid_to_ct_ID (snd (out_gen rawwit_qualid x)) in + CT_coerce_ID_OR_INT_to_TARG (CT_coerce_ID_to_ID_OR_INT id) + (* Specific types *) + | ConstrArgType -> + CT_coerce_FORMULA_to_TARG (xlate_constr (out_gen rawwit_constr x)) + | ConstrMayEvalArgType -> xlate_error"TODO: generic constr-may-eval argument" + | QuantHypArgType ->xlate_error"TODO: generic quantified hypothesis argument" + | TacticArgType -> + let t = xlate_tactic (out_gen rawwit_tactic x) in + CT_coerce_TACTIC_COM_to_TARG t + | CastedOpenConstrArgType -> xlate_error "TODO: open constr" + | ConstrWithBindingsArgType -> xlate_error "TODO: constr with bindings" + | RedExprArgType -> xlate_error "TODO: red expr as generic argument" + | List0ArgType l -> xlate_error "TODO: lists of generic arguments" + | List1ArgType l -> xlate_error "TODO: non empty lists of generic arguments" + | OptArgType x -> xlate_error "TODO: optional generic arguments" + | PairArgType (u,v) -> xlate_error "TODO: pairs of generic arguments" + | ExtraArgType s -> xlate_error "Cannot treat extra generic arguments" + +(* and (xlate_context_rule: Ctast.t -> ct_CONTEXT_RULE) = function | Node(_, "MATCHCONTEXTRULE", parts) -> @@ -1384,6 +2051,16 @@ and (xlate_context_rule: Ctast.t -> ct_CONTEXT_RULE) = let hyps, cpat, tactic = xlate_ctxt_rule_aux parts in CT_context_rule(CT_context_hyp_list hyps, cpat, tactic) | _ -> assert false +*) +and xlate_context_rule = + function + | Pat (hyps, concl_pat, tactic) -> + CT_context_rule( + CT_context_hyp_list (List.map xlate_match_context_hyps hyps), + xlate_context_pattern concl_pat, xlate_tactic tactic) + | All te -> + xlate_error "TODO: wildcard match_context_rule" +(* and (formula_to_def_body : Ctast.t -> ct_DEF_BODY) = function | Node(_, "EVAL", [f;Node(_, "REDEXP", [tac])]) -> @@ -1404,11 +2081,29 @@ and (formula_to_def_body : Ctast.t -> ct_DEF_BODY) = | _ -> failwith("error raised inside formula_to_def_body (3) " ^ s)) +*) +and formula_to_def_body = + function + | ConstrEval (red, f) -> + CT_coerce_EVAL_CMD_to_DEF_BODY( + CT_eval(CT_coerce_NONE_to_INT_OPT CT_none, + xlate_red_tactic red, xlate_constr f)) + | ConstrContext _ -> xlate_error "TODO: Inst" + | ConstrTypeOf _ -> xlate_error "TODO: Check" + | ConstrTerm c -> ct_coerce_FORMULA_to_DEF_BODY(xlate_constr c) + +(* and mk_let_value = function Node(_, "COMMAND", [v]) -> CT_coerce_DEF_BODY_to_LET_VALUE(formula_to_def_body v) | v -> CT_coerce_TACTIC_COM_to_LET_VALUE(xlate_tactic v);; +*) +and mk_let_value = function + TacArg (ConstrMayEval v) -> + CT_coerce_DEF_BODY_to_LET_VALUE(formula_to_def_body v) + | v -> CT_coerce_TACTIC_COM_to_LET_VALUE(xlate_tactic v);; +(* let strip_varg_int = function | Varg_int n -> n @@ -1428,14 +2123,75 @@ let strip_varg_binder = function | Varg_binder n -> n | _ -> xlate_error "strip vernac: non-binder argument";; - +*) + +let coerce_genarg_to_VARG x = + match Genarg.genarg_tag x with + (* Basic types *) + | BoolArgType -> xlate_error "TODO: generic boolean argument" + | IntArgType -> + let n = out_gen rawwit_int x in + CT_coerce_INT_OPT_to_VARG (CT_coerce_INT_to_INT_OPT (CT_int n)) + | IntOrVarArgType -> + (match out_gen rawwit_int_or_var x with + | ArgArg n -> + CT_coerce_INT_OPT_to_VARG (CT_coerce_INT_to_INT_OPT (CT_int n)) + | ArgVar (_,id) -> + CT_coerce_ID_OPT_OR_ALL_to_VARG + (CT_coerce_ID_OPT_to_ID_OPT_OR_ALL + (CT_coerce_ID_to_ID_OPT (xlate_ident id)))) + | StringArgType -> + let s = CT_string (out_gen rawwit_string x) in + CT_coerce_STRING_OPT_to_VARG (CT_coerce_STRING_to_STRING_OPT s) + | PreIdentArgType -> + let id = CT_ident (out_gen rawwit_pre_ident x) in + CT_coerce_ID_OPT_OR_ALL_to_VARG + (CT_coerce_ID_OPT_to_ID_OPT_OR_ALL + (CT_coerce_ID_to_ID_OPT id)) + | IdentArgType -> + let id = xlate_ident (out_gen rawwit_ident x) in + CT_coerce_ID_OPT_OR_ALL_to_VARG + (CT_coerce_ID_OPT_to_ID_OPT_OR_ALL + (CT_coerce_ID_to_ID_OPT id)) + | QualidArgType -> + let id = tac_qualid_to_ct_ID (snd (out_gen rawwit_qualid x)) in + CT_coerce_ID_OPT_OR_ALL_to_VARG + (CT_coerce_ID_OPT_to_ID_OPT_OR_ALL + (CT_coerce_ID_to_ID_OPT id)) + (* Specific types *) + | ConstrArgType -> + CT_coerce_FORMULA_OPT_to_VARG + (CT_coerce_FORMULA_to_FORMULA_OPT (xlate_constr (out_gen rawwit_constr x))) + | ConstrMayEvalArgType -> xlate_error"TODO: generic constr-may-eval argument" + | QuantHypArgType ->xlate_error"TODO: generic quantified hypothesis argument" + | TacticArgType -> + let t = xlate_tactic (out_gen rawwit_tactic x) in + CT_coerce_TACTIC_OPT_to_VARG (CT_coerce_TACTIC_COM_to_TACTIC_OPT t) + | CastedOpenConstrArgType -> xlate_error "TODO: open constr" + | ConstrWithBindingsArgType -> xlate_error "TODO: constr with bindings" + | RedExprArgType -> xlate_error "TODO: red expr as generic argument" + | List0ArgType l -> xlate_error "TODO: lists of generic arguments" + | List1ArgType l -> xlate_error "TODO: non empty lists of generic arguments" + | OptArgType x -> xlate_error "TODO: optional generic arguments" + | PairArgType (u,v) -> xlate_error "TODO: pairs of generic arguments" + | ExtraArgType s -> xlate_error "Cannot treat extra generic arguments" + +(* let xlate_thm x = CT_thm (match x with | "THEOREM" -> "Theorem" | "REMARK" -> "Remark" | "LEMMA" -> "Lemma" | "FACT" -> "Fact" | _ -> xlate_error "xlate_thm");; +*) +let xlate_thm x = CT_thm (match x with + | Theorem -> "Theorem" + | Remark -> "Remark" + | Lemma -> "Lemma" + | Fact -> "Fact" + | Decl -> "Decl") +(* let xlate_defn x = CT_defn (match x with | "DEFINITION" -> "Definition" | "LOCAL" -> "Local" @@ -1448,12 +2204,26 @@ let xlate_defn x = CT_defn (match x with | "COERCION" -> "Coercion" | "LCOERCION" -> "LCOERCION" | _ -> xlate_error "xlate_defn");; +*) +let xlate_defn x = CT_defn (match x with + | LocalDefinition -> "Local" + | Definition -> "Definition") +(* let xlate_defn_or_thm s = try CT_coerce_THM_to_DEFN_OR_THM (xlate_thm s) with | _ -> CT_coerce_DEFN_to_DEFN_OR_THM (xlate_defn s);; +*) +let xlate_defn_or_thm = + function + (* Unable to decide if a fact in one section or at toplevel, a remark + at toplevel or a theorem or a Definition *) + | StartTheoremProof k -> CT_coerce_THM_to_DEFN_OR_THM (xlate_thm k) + | StartDefinitionBody k -> CT_coerce_DEFN_to_DEFN_OR_THM (xlate_defn k);; + +(* let xlate_var x = CT_var (match x with | "HYPOTHESES" -> "Hypothesis" | "HYPOTHESIS" -> "Hypothesis" @@ -1466,15 +2236,28 @@ let xlate_var x = CT_var (match x with "Axiom" as s -> s | "Parameter" as s -> s | _ -> xlate_error "xlate_var");; +*) +let xlate_var x = CT_var (match x with + | AssumptionParameter -> "Parameter" + | AssumptionAxiom -> "Axiom" + | AssumptionVariable -> "Variable" + | AssumptionHypothesis -> "Hypothesis");; +(* let xlate_dep = function | "DEP" -> CT_dep "Induction for" | "NODEP" -> CT_dep "Minimality for" | _ -> xlate_error "xlate_dep";; +*) +let xlate_dep = + function + | true -> CT_dep "Induction for" + | false -> CT_dep "Minimality for";; let xlate_locn = function +(* | Varg_int n -> CT_coerce_INT_to_INT_OR_LOCN n | Varg_string (CT_string "top") -> CT_coerce_LOCN_to_INT_OR_LOCN (CT_locn "top") @@ -1483,6 +2266,22 @@ let xlate_locn = | Varg_string (CT_string "next") -> CT_coerce_LOCN_to_INT_OR_LOCN (CT_locn "next") | _ -> xlate_error "xlate_locn";; +*) + | GoTo n -> CT_coerce_INT_to_INT_OR_LOCN (CT_int n) + | GoTop -> CT_coerce_LOCN_to_INT_OR_LOCN (CT_locn "top") + | GoPrev -> CT_coerce_LOCN_to_INT_OR_LOCN (CT_locn "prev") + | GoNext -> CT_coerce_LOCN_to_INT_OR_LOCN (CT_locn "next") + +let xlate_search_restr = + function + | SearchOutside [] -> CT_coerce_NONE_to_IN_OR_OUT_MODULES CT_none + | SearchInside (m1::l1) -> + CT_in_modules (CT_id_ne_list(loc_qualid_to_ct_ID m1, + List.map loc_qualid_to_ct_ID l1)) + | SearchOutside (m1::l1) -> + CT_out_modules (CT_id_ne_list(loc_qualid_to_ct_ID m1, + List.map loc_qualid_to_ct_ID l1)) + | SearchInside [] -> xlate_error "bad extra argument for Search" let xlate_check = function @@ -1491,18 +2290,12 @@ let xlate_check = | _ -> xlate_error "xlate_check";; let build_constructors l = - let strip_coerce = - function - | CT_coerce_ID_to_ID_OPT id -> id - | _ -> xlate_error "build_constructors" in - let rec rebind = - function - | [] -> [] - | (CT_binder ((CT_id_opt_ne_list (id, ids)), c)) :: l -> - (List.map (function id_opt -> CT_constr (strip_coerce id_opt, c)) - (id::ids)) @ rebind l in - CT_constr_list (rebind l);; + let f (id,coe,c) = + if coe then xlate_error "TODO: coercions in constructors" + else CT_constr (xlate_ident id, xlate_constr c) in + CT_constr_list (List.map f l) +(* let build_record_field_list l = let build_record_field = function @@ -1515,6 +2308,17 @@ let build_record_field_list l = CT_constr_coercion (id, coerce_iVARG_to_FORMULA c) | _ -> xlate_error "unexpected field in build_record_field_list" in CT_recconstr_list (List.map build_record_field l);; +*) +let build_record_field_list l = + let build_record_field (coe,d) = match d with + | AssumExpr (id,c) -> + if coe then CT_constr_coercion (xlate_ident id, xlate_constr c) + else + CT_coerce_CONSTR_to_RECCONSTR + (CT_constr (xlate_ident id, xlate_constr c)) + | DefExpr (id,c,topt) -> + xlate_error "TODO: manifest fields in Record" in + CT_recconstr_list (List.map build_record_field l);; let xlate_ast = let rec xlate_ast_aux = @@ -1540,6 +2344,7 @@ let xlate_ast = (CT_id_list (List.map (function s -> CT_ident s) sl)) in xlate_ast_aux;; +(* let get_require_flags impexp spec = let ct_impexp = match impexp with @@ -1553,18 +2358,38 @@ let get_require_flags impexp spec = | CT_string "IMPLEMENTATION" -> ctv_SPEC_OPT_NONE | CT_string s -> xlate_error ("unexpected Require specification flag " ^ s) in ct_impexp, ct_spec;; +*) + +let get_require_flags impexp spec = + let ct_impexp = + match impexp with + | false -> CT_import + | true -> CT_export in + let ct_spec = + match spec with + | None -> ctv_SPEC_OPT_NONE + | Some true -> CT_spec + | Some false -> ctv_SPEC_OPT_NONE in + ct_impexp, ct_spec;; let cvt_optional_eval_for_definition c1 optional_eval = match optional_eval with - None -> ct_coerce_FORMULA_to_DEF_BODY c1 - | Some (Targ_redexp red_com) -> + None -> ct_coerce_FORMULA_to_DEF_BODY (xlate_constr c1) + | Some red -> CT_coerce_EVAL_CMD_to_DEF_BODY( CT_eval(CT_coerce_NONE_to_INT_OPT CT_none, - red_com, - c1)) - | _ -> xlate_error - "bad extra argument (tactic?) for Definition";; + xlate_red_tactic red, + xlate_constr c1)) + +let cvt_vernac_binder = function + | (id,c) -> + CT_binder(CT_id_opt_ne_list (xlate_ident_opt (Some id),[]),xlate_constr c) +let cvt_vernac_binders args = + CT_binder_list(List.map cvt_vernac_binder args) + + +(* let rec cvt_varg = function | Node (_, "VERNACARGLIST", l) -> Varg_varglist (List.map cvt_varg l) @@ -1611,16 +2436,27 @@ let rec cvt_varg = (string_of_node_loc it)) | the_node -> failwith ("cvt_varg : " ^ (string_of_node_loc the_node)) and xlate_vernac = +*) +let xlate_vernac = function +(* | Node(_, "TACDEF", [Nvar(_,id); Node(_,"AST", [Node(_,"FUN", [Node(_,"FUNVAR", largs); tac])])]) -> - CT_tactic_definition(CT_ident id, - CT_id_list(List.map xlate_id largs), +*) + | VernacDeclareTacticDefinition (loc,[(_,id),TacFun (largs,tac)]) -> + let fst, rest = xlate_largs_to_id_unit largs in + let extract = function CT_unit -> xlate_error "TODO: void parameter" + | CT_coerce_ID_to_ID_UNIT x -> x in + let largs = List.map extract (fst::rest) in + CT_tactic_definition(xlate_ident id, + (* TODO, replace CT_id_list by CT_id_unit_list *) + CT_id_list largs, xlate_tactic tac) +(* | Node(_, "TACDEF", Nvar(_, id):: ((Node(_, "AST",[Node(_, "REC", [vc])])::tl) as the_list)) -> let x_rec_tacs = @@ -1639,11 +2475,37 @@ and xlate_vernac = let fst, others = match x_rec_tacs with fst::others -> fst, others | _ -> assert false in +*) + | VernacDeclareTacticDefinition + (loc,((id,TacFunRec (largs,tac))::_ as the_list)) -> + let x_rec_tacs = + List.map + (function + | ((_,x),TacFunRec ((_,fst),(argl,tac))) -> + let fst, rest = xlate_largs_to_id_unit ((Some fst)::argl) in + CT_rec_tactic_fun(xlate_ident x, + CT_id_unit_list(fst, rest), + xlate_tactic tac) + | ((_,x),tac) -> + CT_rec_tactic_fun(xlate_ident x, + (* Pas clair... *) + CT_id_unit_list (xlate_id_unit (Some x), []), + xlate_tactic tac)) the_list in + let fst, others = match x_rec_tacs with + fst::others -> fst, others + | _ -> assert false in CT_rec_tactic_definition(CT_rec_tactic_fun_list(fst, others)) +(* | Node(_, "TACDEF", [Nvar(_,id);Node(_,"AST",[tac])]) -> - CT_tactic_definition(CT_ident id, CT_id_list[], xlate_tactic tac) +*) + | VernacDeclareTacticDefinition (_,[(_,id),tac]) -> + CT_tactic_definition(xlate_ident id, CT_id_list[], xlate_tactic tac) + | VernacDeclareTacticDefinition (loc,_) -> xlate_error "Shouldn't occur" +(* | Node (_, s, l) -> (match s, List.map cvt_varg l with +*) +(* | "LoadFile", ((Varg_string verbose) :: ((Varg_string s) :: [])) -> CT_load ( (match verbose with @@ -1652,6 +2514,14 @@ and xlate_vernac = | CT_string s -> xlate_error ("expecting the keyword Verbose only :" ^ s)), CT_coerce_STRING_to_ID_OR_STRING s) +*) + | VernacLoad (verbose,s) -> + CT_load ( + (match verbose with + | false -> CT_coerce_NONE_to_VERBOSE_OPT CT_none + | true -> CT_verbose), + CT_coerce_STRING_to_ID_OR_STRING (CT_string s)) +(* | "Eval", ((Varg_tactic_arg (Targ_redexp tac)) :: ((Varg_constr f) :: tail)) -> let numopt = @@ -1659,23 +2529,44 @@ and xlate_vernac = | (Varg_int i) :: [] -> CT_coerce_INT_to_INT_OPT i | [] -> CT_coerce_NONE_to_INT_OPT CT_none | _ -> xlate_error "Eval expects an optional integer" in - CT_coerce_EVAL_CMD_to_COMMAND(CT_eval (numopt, tac, f)) +*) + | VernacCheckMayEval (Some red, numopt, f) -> + let red = xlate_red_tactic red in + CT_coerce_EVAL_CMD_to_COMMAND + (CT_eval (xlate_int_opt numopt, red, xlate_constr f)) +(* | "PWD", [] -> CT_pwd | "CD", ((Varg_string str) :: []) -> CT_cd (ctf_STRING_OPT_SOME str) | "CD", [] -> CT_cd ctf_STRING_OPT_NONE | "ADDPATH", ((Varg_string str) :: []) -> CT_addpath str | "RECADDPATH", ((Varg_string str) :: []) -> CT_recaddpath str | "DELPATH", ((Varg_string str) :: []) -> CT_delpath str - | "PrintPath", [] -> CT_print_loadpath | "QUIT", [] -> CT_quit - | (*ML commands *) - "AddMLPath", ((Varg_string str) :: []) -> CT_ml_add_path str +*) + | VernacChdir (Some str) -> CT_cd (ctf_STRING_OPT_SOME (CT_string str)) + | VernacChdir None -> CT_cd ctf_STRING_OPT_NONE + | VernacAddLoadPath (false,str,None) -> CT_addpath (CT_string str) + | VernacAddLoadPath (true,str,None) -> CT_recaddpath (CT_string str) + | VernacAddLoadPath (_,str,Some x) -> + xlate_error"TODO: Add (Rec) LoadPath as" + | VernacRemoveLoadPath str -> CT_delpath (CT_string str) + | VernacToplevelControl Quit -> CT_quit + | VernacToplevelControl _ -> xlate_error "TODO?: Drop/ProtectedToplevel" + (*ML commands *) +(* + | "AddMLPath", ((Varg_string str) :: []) -> CT_ml_add_path str | "RecAddMLPath", ((Varg_string str) :: []) -> CT_rec_ml_add_path str - | "PrintMLPath", [] -> CT_ml_print_path - | "PrintMLModules", [] -> CT_ml_print_modules - | "DeclareMLModule", (str :: l) -> CT_ml_declare_modules (CT_string_ne_list (strip_varg_string str, List.map strip_varg_string l)) + | "DeclareMLModule", (str :: l) -> +*) + | VernacAddMLPath (false,str) -> CT_ml_add_path (CT_string str) + | VernacAddMLPath (true,str) -> CT_rec_ml_add_path (CT_string str) + | VernacDeclareMLModule [] -> failwith "" + | VernacDeclareMLModule (str :: l) -> + CT_ml_declare_modules + (CT_string_ne_list (CT_string str, List.map (fun x -> CT_string x) l)) +(* | "GOAL", [] -> CT_proof_no_op | "GOAL", (c :: []) -> CT_coerce_THEOREM_GOAL_to_COMMAND (CT_goal (coerce_iVARG_to_FORMULA c)) | (*My attempt at getting all variants of Abort to use abort node *) @@ -1690,6 +2581,17 @@ and xlate_vernac = | "FOCUS", [] -> CT_focus (CT_coerce_NONE_to_INT_OPT CT_none) | "FOCUS", [Varg_int n] -> CT_focus (CT_coerce_INT_to_INT_OPT n) | "UNFOCUS", [] -> CT_unfocus +*) + | VernacStartProof (_, None, c, _, _) -> + CT_coerce_THEOREM_GOAL_to_COMMAND (CT_goal (xlate_constr c)) + | VernacAbort (Some id) -> CT_abort(ctf_ID_OPT_OR_ALL_SOME(xlate_ident id)) + | VernacAbort None -> CT_abort ctv_ID_OPT_OR_ALL_NONE + | VernacAbortAll -> CT_abort ctv_ID_OPT_OR_ALL_ALL + | VernacRestart -> CT_restart + | VernacSolve (n, tac) -> CT_solve (CT_int n, xlate_tactic tac) + | VernacFocus nopt -> CT_focus (xlate_int_opt nopt) + | VernacUnfocus -> CT_unfocus +(* | "HintRewrite", [orient; formula_list; Varg_ident base; Varg_tactic t] -> let ct_orient = match orient with | Varg_string (CT_string "LR") -> CT_lr @@ -1698,7 +2600,23 @@ and xlate_vernac = let f_ne_list = match formula_list with Varg_constrlist (fst::rest) -> CT_formula_ne_list(fst,rest) | _ -> assert false in - CT_hintrewrite(ct_orient, f_ne_list, base, t) +*) + | VernacExtend ("HintRewrite", orient :: formula_list :: base :: t) -> + let orient = out_gen rawwit_bool orient in + let formula_list = out_gen (wit_list1 (rawwit_constr)) formula_list in + let base = out_gen rawwit_pre_ident base in + let t = match t with + | [] -> TacId + | [t] -> out_gen rawwit_tactic t + | _ -> failwith "" in + let ct_orient = match orient with + | true -> CT_lr + | false -> CT_rl in + let f_ne_list = match List.map xlate_constr formula_list with + (fst::rest) -> CT_formula_ne_list(fst,rest) + | _ -> assert false in + CT_hintrewrite(ct_orient, f_ne_list, CT_ident base, xlate_tactic t) +(* | "HintResolve", ((Varg_ident id_name) :: ((Varg_varglist dbnames) :: ((Varg_constr c)::[]))) -> @@ -1731,6 +2649,24 @@ and xlate_vernac = Varg_tactic t] -> CT_hint(id_name, CT_id_list (List.map coerce_iVARG_to_ID dbnames), CT_extern(n, c, t)) +*) + | VernacHints (dbnames,h) -> + let dblist = CT_id_list(List.map (fun x -> CT_ident x) dbnames) in + (match h with + | HintsResolve [Some id_name, c] -> (* = Old HintResolve *) + CT_hint(xlate_ident id_name, dblist, CT_resolve (xlate_constr c)) + | HintsImmediate [Some id_name, c] -> (* = Old HintImmediate *) + CT_hint(xlate_ident id_name, dblist, CT_immediate(xlate_constr c)) + | HintsUnfold [Some id_name, q] -> (* = Old HintUnfold *) + CT_hint(xlate_ident id_name, dblist, + CT_unfold_hint (loc_qualid_to_ct_ID q)) + | HintsConstructors (id_name, q) -> + CT_hint(xlate_ident id_name, dblist, + CT_constructors (loc_qualid_to_ct_ID q)) + | HintsExtern (id_name, n, c, t) -> + CT_hint(xlate_ident id_name, dblist, + CT_extern(CT_int n, xlate_constr c, xlate_tactic t)) +(* | "HintsResolve", (Varg_varglist(dbnames)::(Varg_ident n1) :: names) -> CT_hints(CT_ident "Resolve", @@ -1746,7 +2682,44 @@ and xlate_vernac = CT_hints(CT_ident "Unfold", CT_id_ne_list(n1, List.map coerce_iVARG_to_ID names), CT_id_list(List.map coerce_iVARG_to_ID dbnames)) +*) + | HintsResolve l -> (* = Old HintsResolve *) + let l = List.map + (function + (None,Coqast.Node(_,"QUALID",l)) -> Astterm.interp_qualid l + | _ -> failwith "") l in + let n1, names = match List.map tac_qualid_to_ct_ID l with + n1 :: names -> n1, names + | _ -> failwith "" in + CT_hints(CT_ident "Resolve", + CT_id_ne_list(n1, names), + dblist) + | HintsImmediate l -> (* = Old HintsImmediate *) + let l = List.map + (function + (None,Coqast.Node(_,"QUALID",l)) -> Astterm.interp_qualid l + | _ -> failwith "") l in + let n1, names = match List.map tac_qualid_to_ct_ID l with + n1 :: names -> n1, names + | _ -> failwith "" in + CT_hints(CT_ident "Immediate", + CT_id_ne_list(n1, names), + dblist) + | HintsUnfold l -> (* = Old HintsUnfold *) + let l = List.map + (function + (None,qid) -> loc_qualid_to_ct_ID qid + | _ -> failwith "") l in + let n1, names = match l with + n1 :: names -> n1, names + | _ -> failwith "" in + CT_hints(CT_ident "Unfold", + CT_id_ne_list(n1, names), + dblist)) +(* Obsolete | "BY", ((Varg_tactic tcom) :: []) -> xlate_error "BY not implemented" +*) +(* | (*My attempt to get all variants of Save to use the same node *) "SaveNamed", [] -> CT_save (CT_coerce_THM_to_THM_OPT (CT_thm "Theorem"), ctv_ID_OPT_NONE) @@ -1764,33 +2737,101 @@ and xlate_vernac = CT_save (CT_coerce_THM_to_THM_OPT (CT_thm kind_string), ctf_ID_OPT_SOME s) | "SaveAnonymous", [Varg_ident s] -> CT_save (CT_coerce_THM_to_THM_OPT (CT_thm "Theorem"), ctf_ID_OPT_SOME s) +*) + | VernacEndProof (true,None) -> + CT_save (CT_coerce_THM_to_THM_OPT (CT_thm "Theorem"), ctv_ID_OPT_NONE) + | VernacEndProof (false,None) -> + CT_save (CT_coerce_THM_to_THM_OPT (CT_thm "Definition"), ctv_ID_OPT_NONE) + | VernacEndProof (b,Some (s, Some kind)) -> + CT_save (CT_coerce_THM_to_THM_OPT (xlate_thm kind), + ctf_ID_OPT_SOME (xlate_ident s)) + | VernacEndProof (b,Some (s,None)) -> + CT_save (CT_coerce_THM_to_THM_OPT (CT_thm "Theorem"), + ctf_ID_OPT_SOME (xlate_ident s)) +(* | "TRANSPARENT", (id :: idl) -> - CT_transparent(CT_id_ne_list(strip_varg_ident id, - List.map strip_varg_ident idl)) +*) + | VernacSetOpacity (false, id :: idl) -> + CT_transparent(CT_id_ne_list(loc_qualid_to_ct_ID id, + List.map loc_qualid_to_ct_ID idl)) +(* | "OPAQUE", (id :: idl) - -> CT_opaque (CT_id_ne_list(strip_varg_ident id, - List.map strip_varg_ident idl)) +*) + | VernacSetOpacity (true, id :: idl) + -> CT_opaque (CT_id_ne_list(loc_qualid_to_ct_ID id, + List.map loc_qualid_to_ct_ID idl)) + | VernacSetOpacity (_, []) -> xlate_error "Shouldn't occur" +(* No longer supported | "WriteModule", ((Varg_ident id) :: []) -> CT_write_module (id, CT_coerce_NONE_to_STRING_OPT CT_none) +*) +(* | "UNDO", ((Varg_int n) :: []) -> CT_undo (CT_coerce_INT_to_INT_OPT n) - | "SHOW", [] -> CT_show_goal (CT_coerce_NONE_to_INT_OPT CT_none) - | "SHOW", ((Varg_int n) :: []) -> CT_show_goal (CT_coerce_INT_to_INT_OPT n) +*) + | VernacUndo n -> CT_undo (CT_coerce_INT_to_INT_OPT (CT_int n)) +(* + | "SHOW", [] -> + | "SHOW", ((Varg_int n) :: []) -> +*) + | VernacShow (ShowGoal nopt) -> CT_show_goal (xlate_int_opt nopt) +(* | "ShowNode", [] -> CT_show_node | "ShowProof", [] -> CT_show_proof | "ShowTree", [] -> CT_show_tree | "ShowScript", [] -> CT_show_script | "ShowProofs", [] -> CT_show_proofs | "SHOWIMPL", [] -> CT_show_implicits +*) + | VernacShow ShowNode -> CT_show_node + | VernacShow ShowProof -> CT_show_proof + | VernacShow ShowTree -> CT_show_tree + | VernacShow ShowProofNames -> CT_show_proofs + | VernacShow (ShowIntros _|ShowGoalImplicitly _|ShowExistentials|ShowScript) + -> xlate_error "TODO: Show Intro/Intros/Implicits/Existentials/Script" +(* | "Go", (arg :: []) -> CT_go (xlate_locn arg) +*) + | VernacGo arg -> CT_go (xlate_locn arg) +(* | "ExplainProof", l -> - CT_explain_proof (CT_int_list (List.map strip_varg_int l)) +*) + | VernacShow ExplainProof l -> + CT_explain_proof (CT_int_list (List.map (fun x -> CT_int x) l)) +(* | "ExplainProofTree", l -> - CT_explain_prooftree (CT_int_list (List.map strip_varg_int l)) - | "PrintHint", [] -> CT_print_hint (CT_coerce_NONE_to_ID_OPT CT_none) - | "PrintHintDb", [Varg_ident id] -> CT_print_hintdb id +*) + | VernacShow ExplainTree l -> + CT_explain_prooftree (CT_int_list (List.map (fun x -> CT_int x) l)) +(* | "CheckGuard", [] -> CT_guarded - | "PrintHintId", ((Varg_ident id) :: []) -> - CT_print_hint (CT_coerce_ID_to_ID_OPT id) +*) + | VernacCheckGuard -> CT_guarded + | VernacPrint p -> + (match p with + PrintFullContext -> CT_print_all + | PrintName id -> CT_print_id (loc_qualid_to_ct_ID id) + | PrintOpaqueName id -> CT_print_opaqueid (loc_qualid_to_ct_ID id) + | PrintSectionContext id -> CT_print_section (loc_qualid_to_ct_ID id) + | PrintModules -> CT_print_modules + | PrintGrammar (phylum, name) -> CT_print_grammar CT_grammar_none + | PrintHintDb -> CT_print_hint (CT_coerce_NONE_to_ID_OPT CT_none) + | PrintHintDbName id -> CT_print_hintdb (CT_ident id) + | PrintHint id -> + CT_print_hint (CT_coerce_ID_to_ID_OPT (loc_qualid_to_ct_ID id)) + | PrintLoadPath -> CT_print_loadpath + | PrintMLLoadPath -> CT_ml_print_path + | PrintMLModules -> CT_ml_print_modules + | PrintGraph -> CT_print_graph + | PrintClasses -> CT_print_classes + | PrintCoercions -> CT_print_coercions + | PrintCoercionPaths (id1, id2) -> + CT_print_path (xlate_class id1, xlate_class id2) + | PrintInspect n -> CT_inspect (CT_int n) + | PrintUniverses _ -> xlate_error "TODO: Dump Universes" + | PrintHintGoal -> xlate_error "TODO: Print Hint" + | PrintLocalContext -> xlate_error "TODO: Print" + | PrintTables -> xlate_error "TODO: Print Tables") +(* | "PrintAll", [] -> CT_print_all | "PrintId", ((Varg_ident id) :: []) -> CT_print_id id | "PrintOpaqueId", ((Varg_ident id) :: []) -> CT_print_opaqueid id @@ -1799,22 +2840,51 @@ and xlate_vernac = | "PrintModules", [] -> CT_print_modules | "PrintGrammar", ((Varg_ident phylum) :: ((Varg_ident name) :: [])) -> CT_print_grammar CT_grammar_none + | "PrintHint", [] -> CT_print_hint (CT_coerce_NONE_to_ID_OPT CT_none) + | "PrintHintDb", [Varg_ident id] -> CT_print_hintdb id + | "PrintHintId", ((Varg_ident id) :: []) -> + | "PrintPath", [] -> CT_print_loadpath + | "PrintMLPath", [] -> CT_ml_print_path + | "PrintMLModules", [] -> CT_ml_print_modules + | "PrintGRAPH", [] -> CT_print_graph + | "PrintCLASSES", [] -> CT_print_classes + | "PrintCOERCIONS", [] -> CT_print_coercions + | "PrintPATH", ((Varg_ident id1) :: ((Varg_ident id2) :: [])) -> + CT_print_path (id1, id2) + | "INSPECT", ((Varg_int n) :: []) -> CT_inspect n +*) +(* No longer supported | "BeginModule", ((Varg_ident id) :: []) -> CT_module id +*) +(* | "BeginSection", ((Varg_ident id) :: []) -> - CT_coerce_SECTION_BEGIN_to_COMMAND (CT_section id) - | "EndSection", ((Varg_ident id) :: []) -> CT_section_end id +*) + | VernacBeginSection id -> + CT_coerce_SECTION_BEGIN_to_COMMAND (CT_section (xlate_ident id)) +(* + | "EndSection", ((Varg_ident id) :: []) -> +*) + | VernacEndSection id -> CT_section_end (xlate_ident id) +(* | "StartProof", ((Varg_string (CT_string kind)) :: ((Varg_ident s) :: (c :: []))) -> +*) + | VernacStartProof (kind, Some s, c, _, _) -> CT_coerce_THEOREM_GOAL_to_COMMAND( - CT_theorem_goal (xlate_defn_or_thm kind, s, coerce_iVARG_to_FORMULA c)) + CT_theorem_goal (xlate_defn_or_thm kind, xlate_ident s,xlate_constr c)) +(* | (*My attempt: suspend and resume as separate nodes *) "SUSPEND", [] -> CT_suspend | "RESUME", ((Varg_ident id) :: []) -> CT_resume (ctf_ID_OPT_SOME id) | "RESUME", [] -> CT_resume ctv_ID_OPT_NONE - | (*formerly | ("SUSPEND", []) -> suspend(CT_true) + (*formerly | ("SUSPEND", []) -> suspend(CT_true) | ("RESUME", []) -> suspend(CT_false) *) - "DEFINITION", +*) + | VernacSuspend -> CT_suspend + | VernacResume idopt -> CT_resume (xlate_ident_opt idopt) +(* + | "DEFINITION", (* reference : toplevel/vernacentries.ml *) (Varg_string (CT_string kind):: Varg_ident s :: Varg_constr c :: rest) -> let typ_opt, red_option = match rest with @@ -1827,17 +2897,29 @@ and xlate_vernac = CT_coerce_FORMULA_to_FORMULA_OPT (CT_coerce_SORT_TYPE_to_FORMULA b), None | _ -> assert false in - CT_definition - (xlate_defn kind, s, - cvt_optional_eval_for_definition c red_option, typ_opt) +*) + | VernacDefinition (kind,s,red_option,c,typ_opt,_) -> + CT_definition + (xlate_defn kind, xlate_ident s, + cvt_optional_eval_for_definition c red_option, + xlate_constr_opt typ_opt) +(* | "VARIABLE", ((Varg_string (CT_string kind)) :: ((Varg_binderlist b) :: [])) -> CT_variable (xlate_var kind, b) | "PARAMETER", ((Varg_string (CT_string kind)) :: ((Varg_binderlist b) :: [])) -> CT_variable (xlate_var kind, b) +*) + | VernacAssumption (kind, b) -> + CT_variable (xlate_var kind, cvt_vernac_binders b) +(* | "Check", ((Varg_string (CT_string kind)) :: (c :: [])) -> CT_check (coerce_iVARG_to_FORMULA c) +*) + | VernacCheckMayEval (None, numopt, c) -> + CT_check (xlate_constr c) +(* | "SearchPattern",Varg_constr c::l -> (match l with | [] -> CT_search_pattern(c, @@ -1864,7 +2946,15 @@ and xlate_vernac = | _ -> xlate_error "bad extra argument for Search") in CT_search(id, modifier) | _ -> xlate_error "bad argument list for Search") - | "INSPECT", ((Varg_int n) :: []) -> CT_inspect n +*) + | VernacSearch (s,x) -> + (match s with + | SearchPattern c -> + CT_search_pattern(xlate_constr c, xlate_search_restr x) + | SearchHead id -> + CT_search(loc_qualid_to_ct_ID id, xlate_search_restr x) + | SearchRewrite c -> xlate_error "TODO: SearchRewrite") +(* | (*Record from tactics/Record.v *) "RECORD", ((Varg_string coercion_or_not) :: ((Varg_ident s) :: @@ -1887,6 +2977,21 @@ and xlate_vernac = | _ -> assert false), record_constructor, build_record_field_list field_list) +*) + | (*Record from tactics/Record.v *) + VernacRecord + (add_coercion, s, binders, c1, rec_constructor_or_none, field_list) -> + let record_constructor = xlate_ident_opt rec_constructor_or_none in +(* match rec_constructor_or_none with + | None -> CT_coerce_NONE_to_ID_OPT CT_none + | Some id -> CT_coerce_ID_to_ID_OPT id in +*) CT_record + ((if add_coercion then CT_coercion_atm else + CT_coerce_NONE_to_COERCION_OPT(CT_none)), + xlate_ident s, cvt_vernac_binders binders, xlate_sort c1, record_constructor, + build_record_field_list field_list) + +(* TODO | (*Inversions from tactics/Inv.v *) "MakeSemiInversionLemmaFromHyp", ((Varg_int n) :: ((Varg_ident id1) :: ((Varg_ident id2) :: []))) -> @@ -1914,6 +3019,8 @@ and xlate_vernac = ((Varg_ident id) :: (c :: ((Varg_sorttype sort) :: []))) -> CT_derive_depinversion (CT_inv_clear, id, coerce_iVARG_to_FORMULA c, sort) +*) +(* | "ONEINDUCTIVE", ((Varg_string (CT_string f)) :: @@ -1953,6 +3060,17 @@ and xlate_vernac = | _ -> xlate_error "mutual inductive" in CT_mind_decl (CT_co_ind co_or_ind, CT_ind_spec_list (List.map strip_mutind lmi)) +*) + | VernacInductive (isind, lmi) -> + let co_or_ind = if isind then "Inductive" else "CoInductive" in + let strip_mutind (s, parameters, c, constructors) = + CT_ind_spec + (xlate_ident s, cvt_vernac_binders parameters, xlate_constr c, + build_constructors constructors) in + CT_mind_decl + (CT_co_ind co_or_ind, CT_ind_spec_list (List.map strip_mutind lmi)) + +(* | "MUTUALRECURSIVE", ((Varg_varglist (lm :: lmi)) :: []) -> let strip_mutrec = function @@ -1965,6 +3083,19 @@ and xlate_vernac = | _ -> xlate_error "mutual recursive" in CT_fix_decl (CT_fix_rec_list (strip_mutrec lm, List.map strip_mutrec lmi)) +*) + | VernacFixpoint [] -> xlate_error "mutual recursive" + | VernacFixpoint (lm :: lmi) -> + let strip_mutrec (fid, bl, arf, ardef) = + match cvt_vernac_binders bl with + | CT_binder_list (b :: bl) -> + CT_fix_rec (xlate_ident fid, CT_binder_ne_list (b, bl), + xlate_constr arf, xlate_constr ardef) + | _ -> xlate_error "mutual recursive" in + CT_fix_decl + (CT_fix_rec_list (strip_mutrec lm, List.map strip_mutrec lmi)) + +(* | "MUTUALCORECURSIVE", ((Varg_varglist (lm :: lmi)) :: []) -> let strip_mutcorec = function @@ -1974,6 +3105,15 @@ and xlate_vernac = | _ -> xlate_error "mutual corecursive" in CT_cofix_decl (CT_cofix_rec_list (strip_mutcorec lm, List.map strip_mutcorec lmi)) +*) + | VernacCoFixpoint [] -> xlate_error "mutual corecursive" + | VernacCoFixpoint (lm :: lmi) -> + let strip_mutcorec (fid, arf, ardef) = + CT_cofix_rec (xlate_ident fid, xlate_constr arf, xlate_constr ardef) in + CT_cofix_decl + (CT_cofix_rec_list (strip_mutcorec lm, List.map strip_mutcorec lmi)) + +(* | "INDUCTIONSCHEME", ((Varg_varglist (lm :: lmi)) :: []) -> let strip_ind = function @@ -1985,6 +3125,17 @@ and xlate_vernac = | _ -> xlate_error "induction scheme" in CT_ind_scheme (CT_scheme_spec_list (strip_ind lm, List.map strip_ind lmi)) +*) + | VernacScheme [] -> xlate_error "induction scheme" + | VernacScheme (lm :: lmi) -> + let strip_ind (id, depstr, inde, sort) = + CT_scheme_spec + (xlate_ident id, xlate_dep depstr, + CT_coerce_ID_to_FORMULA (loc_qualid_to_ct_ID inde), + xlate_sort sort) in + CT_ind_scheme + (CT_scheme_spec_list (strip_ind lm, List.map strip_ind lmi)) +(* | "SyntaxMacro", ((Varg_ident id) :: (c :: [])) -> CT_syntax_macro @@ -1992,31 +3143,53 @@ and xlate_vernac = | "SyntaxMacro", ((Varg_ident id) :: (c :: ((Varg_int n) :: []))) -> CT_syntax_macro (id, coerce_iVARG_to_FORMULA c, CT_coerce_INT_to_INT_OPT n) +*) + | VernacSyntacticDefinition (id, c, nopt) -> + CT_syntax_macro (xlate_ident id, xlate_constr c, xlate_int_opt nopt) + +(* Obsolete | "ABSTRACTION", ((Varg_ident id) :: (c :: l)) -> CT_abstraction (id, coerce_iVARG_to_FORMULA c, CT_int_list (List.map strip_varg_int l)) +*) +(* | "Require", ((Varg_string impexp) :: ((Varg_string spec) :: ((Varg_ident id) :: []))) -> +*) + | VernacRequire (None, spec, lid) -> xlate_error "TODO: Read Module" + | VernacRequire (Some impexp, spec, [id]) -> let ct_impexp, ct_spec = get_require_flags impexp spec in - CT_require (ct_impexp, ct_spec, id, CT_coerce_NONE_to_STRING_OPT CT_none) + CT_require (ct_impexp, ct_spec, loc_qualid_to_ct_ID id, + CT_coerce_NONE_to_STRING_OPT CT_none) + | VernacRequire (_,_,([]|_::_::_)) -> + xlate_error "TODO: general form of future Require" +(* | "RequireFrom", ((Varg_string impexp) :: ((Varg_string spec) :: ((Varg_ident id) :: ((Varg_string filename) :: [])))) -> +*) + | VernacRequireFrom (impexp, spec, id, filename) -> let ct_impexp, ct_spec = get_require_flags impexp spec in CT_require - (ct_impexp, ct_spec, id, CT_coerce_STRING_to_STRING_OPT filename) + (ct_impexp, ct_spec, xlate_ident id, + CT_coerce_STRING_to_STRING_OPT (CT_string filename)) +(* | "SYNTAX", ((Varg_ident phylum) :: ((Varg_ident s) :: (x :: (y :: l)))) -> - xlate_error "SYNTAX not implemented" - | (*Two versions of the syntax node with and without the binder list. *) +*) + | VernacSyntax (phylum, l) -> xlate_error "SYNTAX not implemented" + (*Two versions of the syntax node with and without the binder list. *) (*Need to update the metal file and ascent.mli first! | ("SYNTAX", [Varg_ident phy; Varg_ident s; spatarg; unparg; blist]) -> (syntaxop phy s spatarg unparg blist) | ("SYNTAX", [Varg_ident phy; Varg_ident s; spatarg; unparg]) -> (syntaxop phy s spatarg unparg coerce_ID_OPT_to_FORMULA_OPT(CT_coerce_NONE_to_ID_OPT(CT_none)))*) +(* Token is obsolete (automatically done by Grammar) and with no effects "TOKEN", ((Varg_string str) :: []) -> CT_token str +*) +(* | "INFIX", ((Varg_ast (CT_coerce_ID_OR_STRING_to_AST (CT_coerce_STRING_to_ID_OR_STRING @@ -2029,11 +3202,26 @@ and xlate_vernac = | "NONA" -> CT_nona | "NONE" -> CT_coerce_NONE_to_ASSOC CT_none | _ -> xlate_error "infix1"), n, str, id) +*) + | VernacInfix (str_assoc, n, str, id) -> + CT_infix ( + (match str_assoc with + | Some Gramext.LeftA -> CT_lefta + | Some Gramext.RightA -> CT_righta + | Some Gramext.NonA -> CT_nona + | None -> CT_coerce_NONE_to_ASSOC CT_none), + CT_int n, CT_string str, loc_qualid_to_ct_ID id) +(* | "GRAMMAR", (ge :: []) -> xlate_error "GRAMMAR not implemented" +*) + | VernacGrammar _ -> xlate_error "GRAMMAR not implemented" +(* Undo and Hyps Limit are now handled through the global options entries | "SETUNDO", ((Varg_int n) :: []) -> CT_setundo n | "UNSETUNDO", [] -> CT_unsetundo | "SETHYPSLIMIT", ((Varg_int n) :: []) -> CT_sethyp n | "UNSETHYPSLIMIT", [] -> CT_unsethyp +*) +(* | "COERCION", ((Varg_string (CT_string s)) :: ((Varg_string (CT_string str)) :: @@ -2049,12 +3237,32 @@ and xlate_vernac = | "" -> CT_coerce_NONE_to_LOCAL_OPT CT_none | _ -> xlate_error "unknown flag for a coercion2" in CT_coercion (local_opt, id_opt, id1, id2, id3) +*) + | VernacCoercion (s, id1, id2, id3) -> + let id_opt = CT_coerce_NONE_to_IDENTITY_OPT CT_none in + let local_opt = + match s with + (* Cannot decide whether it is a global or a Local but at toplevel *) + | Nametab.NeverDischarge -> CT_coerce_NONE_to_LOCAL_OPT CT_none + | Nametab.DischargeAt _ -> CT_local + | Nametab.NotDeclare -> assert false in + CT_coercion (local_opt, id_opt, loc_qualid_to_ct_ID id1, + xlate_class id2, xlate_class id3) + + | VernacIdentityCoercion (s, id1, id2, id3) -> + let id_opt = CT_identity in + let local_opt = + match s with + (* Cannot decide whether it is a global or a Local but at toplevel *) + | Nametab.NeverDischarge -> CT_coerce_NONE_to_LOCAL_OPT CT_none + | Nametab.DischargeAt _ -> CT_local + | Nametab.NotDeclare -> assert false in + CT_coercion (local_opt, id_opt, xlate_ident id1, + xlate_class id2, xlate_class id3) +(* Not supported | "CLASS", (_ :: ((Varg_ident id1) :: [])) -> CT_class id1 - | "PrintGRAPH", [] -> CT_print_graph - | "PrintCLASSES", [] -> CT_print_classes - | "PrintCOERCIONS", [] -> CT_print_coercions - | "PrintPATH", ((Varg_ident id1) :: ((Varg_ident id2) :: [])) -> - CT_print_path (id1, id2) +*) +(* Natural entries are currently not supported | "SelectLanguageText", ((Varg_ident id) :: []) -> CT_set_natural id | "PrintText", ((Varg_ident id) :: []) -> CT_print_natural id | "AddTextParamOmit", ((Varg_ident id) :: []) -> @@ -2079,9 +3287,17 @@ and xlate_vernac = CT_remove_natural_feature (CT_nat_transparent, id) | "PrintTextParamImmediate", [] -> CT_print_natural_feature CT_nat_transparent +*) +(* | "ResetName", ((Varg_ident id) :: []) -> CT_reset id - | "ResetSection", ((Varg_ident id) :: []) -> CT_reset_section id | "ResetInitial", [] -> CT_restore_state (CT_ident "Initial") +*) + | VernacResetName id -> CT_reset (xlate_ident id) + | VernacResetInitial -> CT_restore_state (CT_ident "Initial") +(* No longer supported + | "ResetSection", ((Varg_ident id) :: []) -> CT_reset_section id +*) +(* Omega flags are handled through the global options entries | "OmegaFlag", ((Varg_string (CT_string s)) :: []) -> let fst_code = code (get s 0) in let @@ -2096,13 +3312,26 @@ and xlate_vernac = | _ -> CT_omega_flag (set_or_unset, CT_coerce_STRING_to_OMEGA_FEATURE (CT_string s))) - | s, l -> +*) + | VernacExtend (s, l) -> CT_user_vernac - (CT_ident s, CT_varg_list (List.map coerce_iVARG_to_VARG l))) - | _ -> xlate_error "xlate_vernac";; + (CT_ident s, CT_varg_list (List.map coerce_genarg_to_VARG l)) + | VernacDebug b -> xlate_error "TODO: Debug On/Off" + + | VernacList l -> xlate_error "Not treated here" + | (VernacLocate _|VernacGlobalCheck _|VernacPrintOption _| + VernacMemOption (_, _)|VernacRemoveOption (_, _)|VernacAddOption (_, _)| + VernacSetOption (_, _)|VernacUnsetOption _|VernacDeclareImplicits (_, _)| + VernacHintDestruct (_, _, _, _, _)|VernacBack _|VernacRestoreState _| + VernacWriteState _|VernacSolveExistential (_, _)|VernacCanonical _| + VernacImport (_, _)|VernacExactProof _|VernacDistfix (_, _, _, _)| + VernacTacticGrammar _|VernacVar _|VernacTime _|VernacNop|VernacComments _) + -> xlate_error "TODO: vernac" let xlate_vernac_list = function - | Node (_, "vernac_list", (v :: l)) -> - CT_command_list (xlate_vernac v, List.map xlate_vernac l) - | _ -> xlate_error "xlate_command_list";; + | VernacList (v::l) -> + CT_command_list + (xlate_vernac (snd v), List.map (fun (_,x) -> xlate_vernac x) l) + | VernacList [] -> xlate_error "xlate_command_list" + | _ -> xlate_error "Not a list of commands";; |