diff options
Diffstat (limited to 'contrib/interface/xlate.ml')
-rw-r--r-- | contrib/interface/xlate.ml | 2267 |
1 files changed, 0 insertions, 2267 deletions
diff --git a/contrib/interface/xlate.ml b/contrib/interface/xlate.ml deleted file mode 100644 index e3cd56a0..00000000 --- a/contrib/interface/xlate.ml +++ /dev/null @@ -1,2267 +0,0 @@ -(** Translation from coq abstract syntax trees to centaur vernac - *) -open String;; -open Char;; -open Util;; -open Names;; -open Ascent;; -open Genarg;; -open Rawterm;; -open Termops;; -open Tacexpr;; -open Vernacexpr;; -open Decl_kinds;; -open Topconstr;; -open Libnames;; -open Goptions;; - - -(* // Verify whether this is dead code, as of coq version 7 *) -(* The following three sentences have been added to cope with a change -of strategy from the Coq team in the way rules construct ast's. The -problem is that now grammar rules will refer to identifiers by giving -their absolute name, using the mutconstruct when needed. Unfortunately, -when you have a mutconstruct structure, you don't have a way to guess -the corresponding identifier without an environment, and the parser -does not have an environment. We add one, only for the constructs -that are always loaded. *) -let type_table = ((Hashtbl.create 17) : - (string, ((string array) array)) Hashtbl.t);; - -Hashtbl.add type_table "Coq.Init.Logic.and" - [|[|"dummy";"conj"|]|];; - -Hashtbl.add type_table "Coq.Init.Datatypes.prod" - [|[|"dummy";"pair"|]|];; - -Hashtbl.add type_table "Coq.Init.Datatypes.nat" - [|[|"";"O"; "S"|]|];; - -Hashtbl.add type_table "Coq.ZArith.fast_integer.Z" -[|[|"";"ZERO";"POS";"NEG"|]|];; - - -Hashtbl.add type_table "Coq.ZArith.fast_integer.positive" -[|[|"";"xI";"xO";"xH"|]|];; - -(*The following two codes are added to cope with the distinction - between ocaml and caml-light syntax while using ctcaml to - manipulate the program *) -let code_plus = code (get "+" 0);; - -let code_minus = code (get "-" 0);; - -let coercion_description_holder = ref (function _ -> None : t -> int option);; - -let coercion_description t = !coercion_description_holder t;; - -let set_coercion_description f = - coercion_description_holder:=f; ();; - -let xlate_error s = print_endline ("xlate_error : "^s);failwith ("Translation error: " ^ s);; - -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 (CT_string 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;; - -let ctv_ID_OPT_OR_ALL_NONE = - CT_coerce_ID_OPT_to_ID_OPT_OR_ALL (CT_coerce_NONE_to_ID_OPT CT_none);; - -let ctv_FORMULA_OPT_NONE = - CT_coerce_ID_OPT_to_FORMULA_OPT(CT_coerce_NONE_to_ID_OPT CT_none);; - -let ctv_PATTERN_OPT_NONE = CT_coerce_NONE_to_PATTERN_OPT CT_none;; - -let ctv_DEF_BODY_OPT_NONE = CT_coerce_FORMULA_OPT_to_DEF_BODY_OPT - ctv_FORMULA_OPT_NONE;; - -let ctf_ID_OPT_OR_ALL_SOME s = - CT_coerce_ID_OPT_to_ID_OPT_OR_ALL (ctf_ID_OPT_SOME s);; - -let ctv_ID_OPT_OR_ALL_ALL = CT_all;; - -let ctv_SPEC_OPT_NONE = CT_coerce_NONE_to_SPEC_OPT CT_none;; - -let ct_coerce_FORMULA_to_DEF_BODY x = - CT_coerce_CONTEXT_PATTERN_to_DEF_BODY - (CT_coerce_FORMULA_to_CONTEXT_PATTERN x);; - -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 (xlate_ident s, CT_targ_list []);; - -let ident_vernac s = CT_user_vernac (CT_ident s, CT_varg_list []);; - -let nums_to_int_list_aux l = List.map (fun x -> CT_int x) l;; - -let nums_to_int_list l = CT_int_list(nums_to_int_list_aux l);; - -let num_or_var_to_int = function - | ArgArg x -> CT_int x - | _ -> xlate_error "TODO: nums_to_int_list_aux ArgVar";; - -let nums_or_var_to_int_list_aux l = List.map num_or_var_to_int l;; - -let nums_or_var_to_int_list l = CT_int_list(nums_or_var_to_int_list_aux l);; - -let nums_or_var_to_int_ne_list n l = - CT_int_ne_list(num_or_var_to_int n, nums_or_var_to_int_list_aux l);; - -type iTARG = Targ_command of ct_FORMULA - | Targ_intropatt of ct_INTRO_PATT_LIST - | Targ_id_list of ct_ID_LIST - | Targ_spec_list of ct_SPEC_LIST - | Targ_binding_com of ct_FORMULA - | Targ_ident of ct_ID - | Targ_int of ct_INT - | Targ_binding of ct_BINDING - | Targ_pattern of ct_PATTERN - | Targ_unfold of ct_UNFOLD - | Targ_unfold_ne_list of ct_UNFOLD_NE_LIST - | Targ_string of ct_STRING - | Targ_fixtac of ct_FIXTAC - | Targ_cofixtac of ct_COFIXTAC - | Targ_tacexp of ct_TACTIC_COM - | Targ_redexp of ct_RED_COM;; - -type iVARG = Varg_binder of ct_BINDER - | Varg_binderlist of ct_BINDER_LIST - | Varg_bindernelist of ct_BINDER_NE_LIST - | Varg_call of ct_ID * iVARG list - | Varg_constr of ct_FORMULA - | Varg_sorttype of ct_SORT_TYPE - | Varg_constrlist of ct_FORMULA list - | Varg_ident of ct_ID - | Varg_int of ct_INT - | Varg_intlist of ct_INT_LIST - | Varg_none - | Varg_string of ct_STRING - | Varg_tactic of ct_TACTIC_COM - | Varg_ast of ct_AST - | Varg_astlist of ct_AST_LIST - | Varg_tactic_arg of iTARG - | Varg_varglist of iVARG list;; - - -let coerce_iVARG_to_FORMULA = - function - | Varg_constr x -> x - | Varg_sorttype x -> CT_coerce_SORT_TYPE_to_FORMULA x - | Varg_ident id -> CT_coerce_ID_to_FORMULA id - | _ -> xlate_error "coerce_iVARG_to_FORMULA: unexpected argument";; - -let coerce_iVARG_to_ID = - function Varg_ident id -> id - | _ -> xlate_error "coerce_iVARG_to_ID";; - -let coerce_VARG_to_ID = - function - | CT_coerce_ID_OPT_OR_ALL_to_VARG (CT_coerce_ID_OPT_to_ID_OPT_OR_ALL (CT_coerce_ID_to_ID_OPT x)) -> - x - | _ -> xlate_error "coerce_VARG_to_ID";; - -let xlate_ident_opt = - function - | None -> ctv_ID_OPT_NONE - | Some id -> ctf_ID_OPT_SOME (xlate_ident id) - -let xlate_id_to_id_or_int_opt s = - CT_coerce_ID_OPT_to_ID_OR_INT_OPT - (CT_coerce_ID_to_ID_OPT (CT_ident (string_of_id s)));; - -let xlate_int_to_id_or_int_opt n = - CT_coerce_ID_OR_INT_to_ID_OR_INT_OPT - (CT_coerce_INT_to_ID_OR_INT (CT_int n));; - -let none_in_id_or_int_opt = - CT_coerce_ID_OPT_to_ID_OR_INT_OPT - (CT_coerce_NONE_to_ID_OPT(CT_none));; - -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_int_or_var_opt_to_int_opt = function - | Some (ArgArg n) -> CT_coerce_INT_to_INT_OPT (CT_int n) - | Some (ArgVar _) -> xlate_error "int_or_var: TODO" - | None -> CT_coerce_NONE_to_INT_OPT CT_none - -let apply_or_by_notation f = function - | AN x -> f x - | ByNotation _ -> xlate_error "TODO: ByNotation" - -let tac_qualid_to_ct_ID ref = - CT_ident (Libnames.string_of_qualid (snd (qualid_of_reference ref))) - -let loc_qualid_to_ct_ID ref = - CT_ident (Libnames.string_of_qualid (snd (qualid_of_reference ref))) - -let int_of_meta n = int_of_string (string_of_id n) -let is_int_meta n = try let _ = int_of_meta n in true with _ -> false - -let xlate_qualid_list l = CT_id_list (List.map loc_qualid_to_ct_ID l) - -let reference_to_ct_ID = function - | Ident (_,id) -> CT_ident (Names.string_of_id id) - | Qualid (_,qid) -> CT_ident (Libnames.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 id_to_pattern_var ctid = - match ctid with - | CT_metaid _ -> xlate_error "metaid not expected in pattern_var" - | CT_ident "_" -> - CT_coerce_ID_OPT_to_MATCH_PATTERN (CT_coerce_NONE_to_ID_OPT CT_none) - | CT_ident id_string -> - CT_coerce_ID_OPT_to_MATCH_PATTERN - (CT_coerce_ID_to_ID_OPT (CT_ident id_string)) - | CT_metac _ -> assert false;; - -exception Not_natural;; - -let xlate_sort = - function - | RProp Term.Pos -> CT_sortc "Set" - | RProp Term.Null -> CT_sortc "Prop" - | RType None -> CT_sortc "Type" - | RType (Some u) -> xlate_error "xlate_sort";; - - -let xlate_qualid a = - let d,i = Libnames.repr_qualid a in - let l = Names.repr_dirpath d in - List.fold_left (fun s i1 -> (string_of_id i1) ^ "." ^ s) (string_of_id i) l;; - -(* // The next two functions should be modified to make direct reference - to a notation operator *) -let notation_to_formula s l = CT_notation(CT_string s, CT_formula_list l);; - -let xlate_reference = function - Ident(_,i) -> CT_ident (string_of_id i) - | Qualid(_, q) -> CT_ident (xlate_qualid q);; -let rec xlate_match_pattern = - function - | CPatAtom(_, Some s) -> id_to_pattern_var (xlate_reference s) - | CPatAtom(_, None) -> id_to_pattern_var (CT_ident "_") - | CPatCstr(_, f, []) -> id_to_pattern_var (xlate_reference f) - | CPatCstr (_, f1 , (arg1 :: args)) -> - CT_pattern_app - (id_to_pattern_var (xlate_reference f1), - CT_match_pattern_ne_list - (xlate_match_pattern arg1, - List.map xlate_match_pattern args)) - | CPatAlias (_, pattern, id) -> - CT_pattern_as - (xlate_match_pattern pattern, CT_coerce_ID_to_ID_OPT (xlate_ident id)) - | CPatOr (_,l) -> xlate_error "CPatOr: TODO" - | CPatDelimiters(_, key, p) -> - CT_pattern_delimitors(CT_num_type key, xlate_match_pattern p) - | CPatPrim (_,Numeral n) -> - CT_coerce_NUM_to_MATCH_PATTERN - (CT_int_encapsulator(Bigint.to_string n)) - | CPatPrim (_,String _) -> xlate_error "CPatPrim (String): TODO" - | CPatNotation(_, s, (l,[])) -> - CT_pattern_notation(CT_string s, - CT_match_pattern_list(List.map xlate_match_pattern l)) - | CPatNotation(_, s, (l,_)) -> - xlate_error "CPatNotation (recursive notation): TODO" -;; - - -let xlate_id_opt_aux = function - Name id -> ctf_ID_OPT_SOME(CT_ident (string_of_id id)) - | Anonymous -> ctv_ID_OPT_NONE;; - -let xlate_id_opt (_, v) = xlate_id_opt_aux v;; - -let xlate_id_opt_ne_list = function - [] -> assert false - | a::l -> CT_id_opt_ne_list(xlate_id_opt a, List.map xlate_id_opt l);; - - -let rec last = function - [] -> assert false - | [a] -> a - | a::tl -> last tl;; - -let rec decompose_last = function - [] -> assert false - | [a] -> [], a - | a::tl -> let rl, b = decompose_last tl in (a::rl), b;; - -let make_fix_struct (n,bl) = - let names = names_of_local_assums bl in - let nn = List.length names in - if nn = 1 || n = None then ctv_ID_OPT_NONE - else ctf_ID_OPT_SOME(CT_ident (string_of_id (snd (Option.get n))));; - -let rec xlate_binder = function - (l,k,t) -> CT_binder(xlate_id_opt_ne_list l, xlate_formula t) -and xlate_return_info = function -| (Some Anonymous, None) | (None, None) -> - CT_coerce_NONE_to_RETURN_INFO CT_none -| (None, Some t) -> CT_return(xlate_formula t) -| (Some x, Some t) -> CT_as_and_return(xlate_id_opt_aux x, xlate_formula t) -| (Some _, None) -> assert false -and xlate_formula_opt = - function - | None -> ctv_FORMULA_OPT_NONE - | Some e -> CT_coerce_FORMULA_to_FORMULA_OPT (xlate_formula e) - -and xlate_binder_l = function - LocalRawAssum(l,_,t) -> CT_binder(xlate_id_opt_ne_list l, xlate_formula t) - | LocalRawDef(n,v) -> CT_coerce_DEF_to_BINDER(CT_def(xlate_id_opt n, - xlate_formula v)) -and - xlate_match_pattern_ne_list = function - [] -> assert false - | a::l -> CT_match_pattern_ne_list(xlate_match_pattern a, - List.map xlate_match_pattern l) -and translate_one_equation = function - (_,[_,lp], a) -> CT_eqn (xlate_match_pattern_ne_list lp, xlate_formula a) - | _ -> xlate_error "TODO: disjunctive multiple patterns" -and - xlate_binder_ne_list = function - [] -> assert false - | a::l -> CT_binder_ne_list(xlate_binder a, List.map xlate_binder l) -and - xlate_binder_list = function - l -> CT_binder_list( List.map xlate_binder_l l) -and (xlate_formula:Topconstr.constr_expr -> Ascent.ct_FORMULA) = function - - CRef r -> varc (xlate_reference r) - | CArrow(_,a,b)-> CT_arrowc (xlate_formula a, xlate_formula b) - | CProdN(_,ll,b) as whole_term -> - let rec gather_binders = function - CProdN(_, ll, b) -> - ll@(gather_binders b) - | _ -> [] in - let rec fetch_ultimate_body = function - CProdN(_, _, b) -> fetch_ultimate_body b - | a -> a in - CT_prodc(xlate_binder_ne_list (gather_binders whole_term), - xlate_formula (fetch_ultimate_body b)) - | CLambdaN(_,ll,b)-> CT_lambdac(xlate_binder_ne_list ll, xlate_formula b) - | CLetIn(_, v, a, b) -> - CT_letin(CT_def(xlate_id_opt v, xlate_formula a), xlate_formula b) - | CAppExpl(_, (Some n, r), l) -> - let l', last = decompose_last l in - CT_proj(xlate_formula last, - CT_formula_ne_list - (CT_bang(varc (xlate_reference r)), - List.map xlate_formula l')) - | CAppExpl(_, (None, r), []) -> CT_bang(varc(xlate_reference r)) - | CAppExpl(_, (None, r), l) -> - CT_appc(CT_bang(varc (xlate_reference r)), - xlate_formula_ne_list l) - | CApp(_, (Some n,f), l) -> - let l', last = decompose_last l in - CT_proj(xlate_formula_expl last, - CT_formula_ne_list - (xlate_formula f, List.map xlate_formula_expl l')) - | CApp(_, (_,f), l) -> - CT_appc(xlate_formula f, xlate_formula_expl_ne_list l) - | CRecord (_,_,_) -> xlate_error "CRecord: TODO" - | CCases (_, _, _, [], _) -> assert false - | CCases (_, _, ret_type, tm::tml, eqns)-> - CT_cases(CT_matched_formula_ne_list(xlate_matched_formula tm, - List.map xlate_matched_formula tml), - xlate_formula_opt ret_type, - CT_eqn_list (List.map (fun x -> translate_one_equation x) eqns)) - | CLetTuple (_,a::l, ret_info, c, b) -> - CT_let_tuple(CT_id_opt_ne_list(xlate_id_opt_aux a, - List.map xlate_id_opt_aux l), - xlate_return_info ret_info, - xlate_formula c, - xlate_formula b) - | CLetTuple (_, [], _, _, _) -> xlate_error "NOT parsed: Let with ()" - | CIf (_,c, ret_info, b1, b2) -> - CT_if - (xlate_formula c, xlate_return_info ret_info, - xlate_formula b1, xlate_formula b2) - - | CSort(_, s) -> CT_coerce_SORT_TYPE_to_FORMULA(xlate_sort s) - | CNotation(_, s,(l,[])) -> notation_to_formula s (List.map xlate_formula l) - | CNotation(_, s,(l,_)) -> xlate_error "CNotation (recursive): TODO" - | CGeneralization(_,_,_,_) -> xlate_error "CGeneralization: TODO" - | CPrim (_, Numeral i) -> - CT_coerce_NUM_to_FORMULA(CT_int_encapsulator(Bigint.to_string i)) - | CPrim (_, String _) -> xlate_error "CPrim (String): TODO" - | CHole _ -> CT_existvarc -(* I assume CDynamic has been inserted to make free form extension of - the language possible, but this would go agains the logic of pcoq anyway. *) - | CDynamic (_, _) -> assert false - | CDelimiters (_, key, num) -> - CT_num_encapsulator(CT_num_type key , xlate_formula num) - | CCast (_, e, CastConv (_, t)) -> - CT_coerce_TYPED_FORMULA_to_FORMULA - (CT_typed_formula(xlate_formula e, xlate_formula t)) - | CCast (_, e, CastCoerce) -> assert false - | CPatVar (_, (_,i)) when is_int_meta i -> - CT_coerce_ID_to_FORMULA(CT_metac (CT_int (int_of_meta i))) - | CPatVar (_, (false, s)) -> - CT_coerce_ID_to_FORMULA(CT_metaid (string_of_id s)) - | CPatVar (_, (true, s)) -> - xlate_error "Second order variable not supported" - | CEvar _ -> xlate_error "CEvar not supported" - | CCoFix (_, (_, id), lm::lmi) -> - let strip_mutcorec ((_, fid), bl,arf, ardef) = - CT_cofix_rec (xlate_ident fid, xlate_binder_list bl, - xlate_formula arf, xlate_formula ardef) in - CT_cofixc(xlate_ident id, - (CT_cofix_rec_list (strip_mutcorec lm, List.map strip_mutcorec lmi))) - | CFix (_, (_, id), lm::lmi) -> - let strip_mutrec ((_, fid), (n, ro), bl, arf, ardef) = - let struct_arg = make_fix_struct (n, bl) in - let arf = xlate_formula arf in - let ardef = xlate_formula ardef in - match xlate_binder_list bl with - | CT_binder_list (b :: bl) -> - CT_fix_rec (xlate_ident fid, CT_binder_ne_list (b, bl), - struct_arg, arf, ardef) - | _ -> xlate_error "mutual recursive" in - CT_fixc (xlate_ident id, - CT_fix_binder_list - (CT_coerce_FIX_REC_to_FIX_BINDER - (strip_mutrec lm), List.map - (fun x-> CT_coerce_FIX_REC_to_FIX_BINDER (strip_mutrec x)) - lmi)) - | CCoFix _ -> assert false - | CFix _ -> assert false -and xlate_matched_formula = function - (f, (Some x, Some y)) -> - CT_formula_as_in(xlate_formula f, xlate_id_opt_aux x, xlate_formula y) - | (f, (None, Some y)) -> - CT_formula_in(xlate_formula f, xlate_formula y) - | (f, (Some x, None)) -> - CT_formula_as(xlate_formula f, xlate_id_opt_aux x) - | (f, (None, None)) -> - CT_coerce_FORMULA_to_MATCHED_FORMULA(xlate_formula f) -and xlate_formula_expl = function - (a, None) -> xlate_formula a - | (a, Some (_,ExplByPos (i, _))) -> - xlate_error "explicitation of implicit by rank not supported" - | (a, Some (_,ExplByName i)) -> - CT_labelled_arg(CT_ident (string_of_id i), xlate_formula a) -and xlate_formula_expl_ne_list = function - [] -> assert false - | a::l -> CT_formula_ne_list(xlate_formula_expl a, List.map xlate_formula_expl l) -and xlate_formula_ne_list = function - [] -> assert false - | a::l -> CT_formula_ne_list(xlate_formula a, List.map xlate_formula l);; - -let (xlate_ident_or_metaid: - Names.identifier Util.located Tacexpr.or_metaid -> ct_ID) = function - AI (_, x) -> xlate_ident x - | MetaId(_, x) -> CT_metaid x;; - -let nums_of_occs (b,nums) = - if b then nums - else List.map (function ArgArg x -> ArgArg (-x) | y -> y) nums - -let xlate_hyp = function - | AI (_,id) -> xlate_ident id - | MetaId _ -> xlate_error "MetaId should occur only in quotations" - -let xlate_hyp_location = - function - | (occs, AI (_,id)), InHypTypeOnly -> - CT_intype(xlate_ident id, nums_or_var_to_int_list (nums_of_occs occs)) - | (occs, AI (_,id)), InHypValueOnly -> - CT_invalue(xlate_ident id, nums_or_var_to_int_list (nums_of_occs occs)) - | (occs, AI (_,id)), InHyp when occs = all_occurrences_expr -> - CT_coerce_UNFOLD_to_HYP_LOCATION - (CT_coerce_ID_to_UNFOLD (xlate_ident id)) - | ((_,a::l as occs), AI (_,id)), InHyp -> - let nums = nums_of_occs occs in - let a = List.hd nums and l = List.tl nums in - CT_coerce_UNFOLD_to_HYP_LOCATION - (CT_unfold_occ (xlate_ident id, - CT_int_ne_list(num_or_var_to_int a, - nums_or_var_to_int_list_aux l))) - | (_, AI (_,id)), InHyp -> xlate_error "Unused" (* (true,]) *) - | (_, MetaId _),_ -> - xlate_error "MetaId not supported in xlate_hyp_location (should occur only in quotations)" - - - -let xlate_clause cls = - let hyps_info = - match cls.onhyps with - None -> CT_coerce_STAR_to_HYP_LOCATION_LIST_OR_STAR CT_star - | Some l -> CT_hyp_location_list(List.map xlate_hyp_location l) in - CT_clause - (hyps_info, - if cls.concl_occs <> no_occurrences_expr then - CT_coerce_STAR_to_STAR_OPT CT_star - else - CT_coerce_NONE_to_STAR_OPT CT_none) - -(** Tactics - *) -let strip_targ_spec_list = - function - | Targ_spec_list x -> x - | _ -> xlate_error "strip tactic: non binding-list argument";; - -let strip_targ_binding = - function - | Targ_binding x -> x - | _ -> xlate_error "strip tactic: non-binding argument";; - -let strip_targ_command = - function - | Targ_command x -> x - | Targ_binding_com x -> x - | _ -> xlate_error "strip tactic: non-command argument";; - -let strip_targ_ident = - function - | Targ_ident x -> x - | _ -> xlate_error "strip tactic: non-ident argument";; - -let strip_targ_int = - function - | Targ_int x -> x - | _ -> xlate_error "strip tactic: non-int argument";; - -let strip_targ_pattern = - function - | Targ_pattern x -> x - | _ -> xlate_error "strip tactic: non-pattern argument";; - -let strip_targ_unfold = - function - | Targ_unfold x -> x - | _ -> xlate_error "strip tactic: non-unfold argument";; - -let strip_targ_fixtac = - function - | Targ_fixtac x -> x - | _ -> xlate_error "strip tactic: non-fixtac argument";; - -let strip_targ_cofixtac = - function - | Targ_cofixtac x -> x - | _ -> xlate_error "strip tactic: non-cofixtac argument";; - -(*Need to transform formula to id for "Prolog" tactic problem *) -let make_ID_from_FORMULA = - function - | CT_coerce_ID_to_FORMULA id -> id - | _ -> 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 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_quantified_hypothesis_opt = function - | None -> - CT_coerce_ID_OPT_to_ID_OR_INT_OPT ctv_ID_OPT_NONE - | Some (AnonHyp n) -> xlate_int_to_id_or_int_opt n - | Some (NamedHyp id) -> xlate_id_to_id_or_int_opt id;; - -let xlate_id_or_int = function - ArgArg n -> CT_coerce_INT_to_ID_OR_INT(CT_int n) - | ArgVar(_, s) -> CT_coerce_ID_to_ID_OR_INT(xlate_ident s);; - -let xlate_explicit_binding (loc,h,c) = - CT_binding (xlate_quantified_hypothesis h, xlate_formula c) - -let xlate_bindings = function - | ImplicitBindings l -> - CT_coerce_FORMULA_LIST_to_SPEC_LIST - (CT_formula_list (List.map xlate_formula 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 - | Targ_spec_list x -> x - | _ -> xlate_error "strip_tar_spec_list";; - -let strip_targ_intropatt = - function - | Targ_intropatt x -> x - | _ -> xlate_error "strip_targ_intropatt";; - -let get_flag r = - let conv_flags, red_ids = - let csts = List.map (apply_or_by_notation tac_qualid_to_ct_ID) r.rConst in - if r.rDelta then - [CT_delta], CT_unfbut csts - else - (if r.rConst = [] - then (* probably useless: just for compatibility *) [] - else [CT_delta]), - CT_unf csts 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 (loc,pat) = match pat with - | IntroOrAndPattern [] -> assert false - | IntroOrAndPattern (fp::ll) -> - CT_disj_pattern - (CT_intro_patt_list(List.map xlate_intro_pattern fp), - List.map - (fun l -> - CT_intro_patt_list(List.map xlate_intro_pattern l)) - ll) - | IntroWildcard -> CT_coerce_ID_to_INTRO_PATT(CT_ident "_" ) - | IntroIdentifier c -> CT_coerce_ID_to_INTRO_PATT(xlate_ident c) - | IntroAnonymous -> xlate_error "TODO: IntroAnonymous" - | IntroFresh _ -> xlate_error "TODO: IntroFresh" - | IntroRewrite _ -> xlate_error "TODO: IntroRewrite" - -let compute_INV_TYPE = function - FullInversionClear -> CT_inv_clear - | SimpleInversion -> CT_inv_simple - | FullInversion -> CT_inv_regular - -let is_tactic_special_case = function - "AutoRewrite" -> true - | _ -> false;; - -let xlate_context_pattern = function - | Term v -> - CT_coerce_FORMULA_to_CONTEXT_PATTERN (xlate_formula v) - | Subterm (b, idopt, v) -> (* TODO: application pattern *) - CT_context(xlate_ident_opt idopt, xlate_formula v) - - -let xlate_match_context_hyps = function - | Hyp (na,b) -> CT_premise_pattern(xlate_id_opt na, xlate_context_pattern b) - | Def (na,b,t) -> xlate_error "TODO: Let hyps" - (* CT_premise_pattern(xlate_id_opt na, xlate_context_pattern b, xlate_context_pattern t);; *) - -let xlate_arg_to_id_opt = function - Some id -> CT_coerce_ID_to_ID_OPT(CT_ident (string_of_id id)) - | None -> ctv_ID_OPT_NONE;; - -let xlate_largs_to_id_opt largs = - match List.map xlate_arg_to_id_opt largs with - fst::rest -> fst, rest - | _ -> assert false;; - -let xlate_int_or_constr = function - ElimOnConstr (a,NoBindings) -> CT_coerce_FORMULA_to_FORMULA_OR_INT(xlate_formula a) - | ElimOnConstr _ -> xlate_error "TODO: ElimOnConstr with bindings" - | ElimOnIdent(_,i) -> - CT_coerce_ID_OR_INT_to_FORMULA_OR_INT - (CT_coerce_ID_to_ID_OR_INT(xlate_ident i)) - | ElimOnAnonHyp i -> - CT_coerce_ID_OR_INT_to_FORMULA_OR_INT - (CT_coerce_INT_to_ID_OR_INT(CT_int i));; - -let xlate_using = function - None -> CT_coerce_NONE_to_USING(CT_none) - | Some (c2,sl2) -> CT_using (xlate_formula c2, xlate_bindings sl2);; - -let xlate_one_unfold_block = function - ((true,[]),qid) -> - CT_coerce_ID_to_UNFOLD(apply_or_by_notation tac_qualid_to_ct_ID qid) - | (((_,_::_) as occs), qid) -> - let l = nums_of_occs occs in - CT_unfold_occ(apply_or_by_notation tac_qualid_to_ct_ID qid, - nums_or_var_to_int_ne_list (List.hd l) (List.tl l)) - | ((false,[]), qid) -> xlate_error "Unused" -;; - -let xlate_with_names = function - None -> CT_coerce_ID_OPT_to_INTRO_PATT_OPT ctv_ID_OPT_NONE - | Some fp -> CT_coerce_INTRO_PATT_to_INTRO_PATT_OPT (xlate_intro_pattern fp) - -let rawwit_main_tactic = Pcoq.rawwit_tactic Pcoq.tactic_main_level - -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_FORMULA_OR_INT_to_TACTIC_ARG - (CT_coerce_ID_OR_INT_to_FORMULA_OR_INT - (CT_coerce_INT_to_ID_OR_INT (CT_int n))) - | Reference r -> - CT_coerce_FORMULA_OR_INT_to_TACTIC_ARG - (CT_coerce_ID_OR_INT_to_FORMULA_OR_INT - (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_OR_INT_to_TACTIC_ARG - (CT_coerce_FORMULA_to_FORMULA_OR_INT (xlate_formula c)) - | ConstrMayEval(ConstrEval(r,c)) -> - CT_coerce_EVAL_CMD_to_TACTIC_ARG - (CT_eval(CT_coerce_NONE_to_INT_OPT CT_none, xlate_red_tactic r, - xlate_formula c)) - | ConstrMayEval(ConstrTypeOf(c)) -> - CT_coerce_TERM_CHANGE_to_TACTIC_ARG(CT_check_term(xlate_formula c)) - | MetaIdArg _ -> - xlate_error "MetaIdArg should only be used in quotations" - | 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 (_, r, a::l) -> - CT_simple_user_tac - (reference_to_ct_ID r, - CT_tactic_arg_list(xlate_tacarg a,List.map xlate_tacarg l)) - | Reference (Ident (_,s)) -> ident_tac s - | ConstrMayEval(ConstrTerm a) -> - CT_formula_marker(xlate_formula a) - | TacFreshId [] -> CT_fresh(ctf_STRING_OPT None) - | TacFreshId [ArgArg s] -> CT_fresh(ctf_STRING_OPT (Some s)) - | TacFreshId _ -> xlate_error "TODO: fresh with many args" - | t -> xlate_error "TODO LATER: result other than tactic or constr" - -and xlate_red_tactic = - function - | Red true -> xlate_error "" - | Red false -> CT_red - | CbvVm -> CT_cbvvm - | Hnf -> CT_hnf - | Simpl None -> CT_simpl ctv_PATTERN_OPT_NONE - | Simpl (Some (occs,c)) -> - let l = nums_of_occs occs in - CT_simpl - (CT_coerce_PATTERN_to_PATTERN_OPT - (CT_pattern_occ - (CT_int_list(nums_or_var_to_int_list_aux l), xlate_formula c))) - | 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_lazy (CT_conversion_flag_list conv_flags, red_ids) - | Unfold unf_list -> - let ct_unf_list = List.map xlate_one_unfold_block 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_formula formula_list)) - | Pattern l -> - let pat_list = List.map (fun (occs,c) -> - CT_pattern_occ - (CT_int_list (nums_or_var_to_int_list_aux (nums_of_occs occs)), - xlate_formula 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 LATER: ExtraRedExpr (probably dead code)" - -and xlate_local_rec_tac = function - (* TODO LATER: local recursive tactics and global ones should be handled in - the same manner *) - | ((_,x),Tacexp (TacFun (argl,tac))) -> - let fst, rest = xlate_largs_to_id_opt argl in - CT_rec_tactic_fun(xlate_ident x, - CT_id_opt_ne_list(fst, rest), - xlate_tactic tac) - | _ -> xlate_error "TODO: more general argument of 'let rec in'" - -and xlate_tactic = - function - | TacFun (largs, t) -> - let fst, rest = xlate_largs_to_id_opt largs in - CT_tactic_fun (CT_id_opt_ne_list(fst, rest), xlate_tactic t) - | TacThen (t1,[||],t2,[||]) -> - (match xlate_tactic t1 with - CT_then(a,l) -> CT_then(a,l@[xlate_tactic t2]) - | t -> CT_then (t,[xlate_tactic t2])) - | TacThen _ -> xlate_error "TacThen generalization TODO" - | TacThens(t1,[]) -> assert false - | TacThens(t1,t::l) -> - let ct = xlate_tactic t in - let cl = List.map xlate_tactic l in - (match xlate_tactic t1 with - CT_then(ct1,cl1) -> CT_then(ct1, cl1@[CT_parallel(ct, cl)]) - | ct1 -> CT_then(ct1,[CT_parallel(ct, cl)])) - | TacFirst([]) -> assert false - | TacFirst(t1::l)-> CT_first(xlate_tactic t1, List.map xlate_tactic l) - | TacSolve([]) -> assert false - | TacSolve(t1::l)-> CT_tacsolve(xlate_tactic t1, List.map xlate_tactic l) - | TacComplete _ -> xlate_error "TODO: tactical complete" - | TacDo(count, t) -> CT_do(xlate_id_or_int count, xlate_tactic t) - | TacTry t -> CT_try (xlate_tactic t) - | TacRepeat t -> CT_repeat(xlate_tactic t) - | TacAbstract(t,id_opt) -> - CT_abstract((match id_opt with - None -> ctv_ID_OPT_NONE - | Some id -> ctf_ID_OPT_SOME (CT_ident (string_of_id id))), - xlate_tactic t) - | TacProgress t -> CT_progress(xlate_tactic t) - | TacOrelse(t1,t2) -> CT_orelse(xlate_tactic t1, xlate_tactic t2) - | TacMatch (true,_,_) -> failwith "TODO: lazy match" - | TacMatch (false, exp, rules) -> - CT_match_tac(xlate_tactic 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)) - | TacMatchGoal (_,_,[]) | TacMatchGoal (true,_,_) -> failwith "" - | TacMatchGoal (false,false,rule1::rules) -> - CT_match_context(xlate_context_rule rule1, - List.map xlate_context_rule rules) - | TacMatchGoal (false,true,rule1::rules) -> - CT_match_context_reverse(xlate_context_rule rule1, - List.map xlate_context_rule rules) - | TacLetIn (false, l, t) -> - let cvt_clause = - function - ((_,s),ConstrMayEval v) -> - CT_let_clause(xlate_ident s, - CT_coerce_NONE_to_TACTIC_OPT CT_none, - CT_coerce_DEF_BODY_to_LET_VALUE - (formula_to_def_body v)) - | ((_,s),Tacexp t) -> - CT_let_clause(xlate_ident s, - CT_coerce_NONE_to_TACTIC_OPT CT_none, - CT_coerce_TACTIC_COM_to_LET_VALUE - (xlate_tactic t)) - | ((_,s),t) -> - CT_let_clause(xlate_ident s, - CT_coerce_NONE_to_TACTIC_OPT CT_none, - CT_coerce_TACTIC_COM_to_LET_VALUE - (xlate_call_or_tacarg t)) in - let cl_l = List.map cvt_clause l in - (match cl_l with - | [] -> assert false - | fst::others -> - CT_let_ltac (CT_let_clauses(fst, others), mk_let_value t)) - | TacLetIn(true, [], _) -> xlate_error "recursive definition with no definition" - | TacLetIn(true, f1::l, t) -> - let tl = CT_rec_tactic_fun_list - (xlate_local_rec_tac f1, List.map xlate_local_rec_tac l) in - CT_rec_tactic_in(tl, xlate_tactic t) - | TacAtom (_, t) -> xlate_tac t - | TacFail (count, []) -> CT_fail(xlate_id_or_int count, ctf_STRING_OPT_NONE) - | TacFail (count, [MsgString s]) -> CT_fail(xlate_id_or_int count, - ctf_STRING_OPT_SOME (CT_string s)) - | TacFail (count, _) -> xlate_error "TODO: generic fail message" - | TacId [] -> CT_idtac ctf_STRING_OPT_NONE - | TacId [MsgString s] -> CT_idtac(ctf_STRING_OPT_SOME (CT_string s)) - | TacId _ -> xlate_error "TODO: generic idtac message" - | TacInfo t -> CT_info(xlate_tactic t) - | TacArg a -> xlate_call_or_tacarg a - -and xlate_tac = - function - | TacExtend (_, "firstorder", tac_opt::l) -> - let t1 = - match - out_gen (wit_opt rawwit_main_tactic) tac_opt - with - | None -> CT_coerce_NONE_to_TACTIC_OPT CT_none - | Some t2 -> CT_coerce_TACTIC_COM_to_TACTIC_OPT (xlate_tactic t2) in - (match l with - [] -> CT_firstorder t1 - | [l1] -> - (match genarg_tag l1 with - List1ArgType PreIdentArgType -> - let l2 = List.map - (fun x -> CT_ident x) - (out_gen (wit_list1 rawwit_pre_ident) l1) in - let fst,l3 = - match l2 with fst::l3 -> fst,l3 | [] -> assert false in - CT_firstorder_using(t1, CT_id_ne_list(fst, l3)) - | List1ArgType RefArgType -> - let l2 = List.map reference_to_ct_ID - (out_gen (wit_list1 rawwit_ref) l1) in - let fst,l3 = - match l2 with fst::l3 -> fst, l3 | [] -> assert false in - CT_firstorder_with(t1, CT_id_ne_list(fst, l3)) - | _ -> assert false) - | _ -> assert false) - | TacExtend (_, "refine", [c]) -> - CT_refine (xlate_formula (snd (out_gen rawwit_casted_open_constr c))) - | TacExtend (_,"absurd",[c]) -> - CT_absurd (xlate_formula (out_gen rawwit_constr c)) - | TacExtend (_,"contradiction",[opt_c]) -> - (match out_gen (wit_opt rawwit_constr_with_bindings) opt_c with - None -> CT_contradiction - | Some(c, b) -> - let c1 = xlate_formula c in - let bindings = xlate_bindings b in - CT_contradiction_thm(c1, bindings)) - | TacChange (None, f, b) -> CT_change (xlate_formula f, xlate_clause b) - | TacChange (Some(l,c), f, b) -> - (* TODO LATER: combine with other constructions of pattern_occ *) - let l = nums_of_occs l in - CT_change_local( - CT_pattern_occ(CT_int_list(nums_or_var_to_int_list_aux l), - xlate_formula c), - xlate_formula f, - xlate_clause b) - | TacExtend (_,"contradiction",[]) -> CT_contradiction - | TacDoubleInduction (n1, n2) -> - CT_tac_double (xlate_quantified_hypothesis n1, xlate_quantified_hypothesis n2) - | TacExtend (_,"discriminate", []) -> - CT_discriminate_eq (CT_coerce_ID_OPT_to_ID_OR_INT_OPT ctv_ID_OPT_NONE) - | TacExtend (_,"discriminate", [id]) -> - CT_discriminate_eq - (xlate_quantified_hypothesis_opt - (Some (out_gen rawwit_quant_hyp id))) - | TacExtend (_,"simplify_eq", []) -> - CT_simplify_eq (CT_coerce_ID_OPT_to_ID_OR_INT_OPT - (CT_coerce_NONE_to_ID_OPT CT_none)) - | TacExtend (_,"simplify_eq", [id]) -> - let id1 = out_gen rawwit_quant_hyp id in - let id2 = CT_coerce_ID_OR_INT_to_ID_OR_INT_OPT - (xlate_quantified_hypothesis id1) in - CT_simplify_eq id2 - | TacExtend (_,"injection", []) -> - CT_injection_eq (CT_coerce_ID_OPT_to_ID_OR_INT_OPT ctv_ID_OPT_NONE) - | TacExtend (_,"injection", [id]) -> - CT_injection_eq - (xlate_quantified_hypothesis_opt - (Some (out_gen rawwit_quant_hyp id))) - | TacExtend (_,"injection_as", [idopt;ipat]) -> - xlate_error "TODO: injection as" - | TacFix (idopt, n) -> - CT_fixtactic (xlate_ident_opt idopt, CT_int n, CT_fix_tac_list []) - | TacMutualFix (false, id, n, fixtac_list) -> - let f (id,n,c) = CT_fixtac (xlate_ident id, CT_int n, xlate_formula c) in - CT_fixtactic - (ctf_ID_OPT_SOME (xlate_ident id), CT_int n, - CT_fix_tac_list (List.map f fixtac_list)) - | TacMutualFix (true, id, n, fixtac_list) -> - xlate_error "TODO: non user-visible fix" - | TacCofix idopt -> - CT_cofixtactic (xlate_ident_opt idopt, CT_cofix_tac_list []) - | TacMutualCofix (false, id, cofixtac_list) -> - let f (id,c) = CT_cofixtac (xlate_ident id, xlate_formula c) in - CT_cofixtactic - (CT_coerce_ID_to_ID_OPT (xlate_ident id), - CT_cofix_tac_list (List.map f cofixtac_list)) - | TacMutualCofix (true, id, cofixtac_list) -> - xlate_error "TODO: non user-visible cofix" - | TacIntrosUntil (NamedHyp id) -> - CT_intros_until (CT_coerce_ID_to_ID_OR_INT (xlate_ident id)) - | TacIntrosUntil (AnonHyp n) -> - CT_intros_until (CT_coerce_INT_to_ID_OR_INT (CT_int n)) - | TacIntroMove (Some id1, MoveAfter id2) -> - CT_intro_after(CT_coerce_ID_to_ID_OPT (xlate_ident id1),xlate_hyp id2) - | TacIntroMove (None, MoveAfter id2) -> - CT_intro_after(CT_coerce_NONE_to_ID_OPT CT_none, xlate_hyp id2) - | TacMove (true, id1, MoveAfter id2) -> - CT_move_after(xlate_hyp id1, xlate_hyp id2) - | TacMove (false, id1, id2) -> xlate_error "Non dep Move is only internal" - | TacMove _ -> xlate_error "TODO: move before, at top, at bottom" - | TacIntroPattern patt_list -> - CT_intros - (CT_intro_patt_list (List.map xlate_intro_pattern patt_list)) - | TacIntroMove (Some id, MoveToEnd true) -> - CT_intros (CT_intro_patt_list[CT_coerce_ID_to_INTRO_PATT(xlate_ident id)]) - | TacIntroMove (None, MoveToEnd true) -> - CT_intro (CT_coerce_NONE_to_ID_OPT CT_none) - | TacIntroMove _ -> xlate_error "TODO" - | TacLeft (false,bindl) -> CT_left (xlate_bindings bindl) - | TacRight (false,bindl) -> CT_right (xlate_bindings bindl) - | TacSplit (false,false,bindl) -> CT_split (xlate_bindings bindl) - | TacSplit (false,true,bindl) -> CT_exists (xlate_bindings bindl) - | TacSplit _ | TacRight _ | TacLeft _ -> - xlate_error "TODO: esplit, eright, etc" - | TacExtend (_,"replace", [c1; c2;cl;tac_opt]) -> - let c1 = xlate_formula (out_gen rawwit_constr c1) in - let c2 = xlate_formula (out_gen rawwit_constr c2) in - let cl = - (* J.F. : 18/08/2006 - Hack to coerce the "clause" argument of replace to a real clause - To be remove if we can reuse the clause grammar entrie defined in g_tactic - *) - let cl_as_clause = Extraargs.raw_in_arg_hyp_to_clause (out_gen Extraargs.rawwit_in_arg_hyp cl) in - let cl_as_xlate_arg = - {cl_as_clause with - Tacexpr.onhyps = - Option.map - (fun l -> - List.map (fun ((l,id),hyp_flag) -> ((l, Tacexpr.AI ((),id)) ,hyp_flag)) l - ) - cl_as_clause.Tacexpr.onhyps - } - in - cl_as_xlate_arg - in - let cl = xlate_clause cl in - let tac_opt = - match out_gen (Extraargs.rawwit_by_arg_tac) tac_opt with - | None -> CT_coerce_NONE_to_TACTIC_OPT CT_none - | Some tac -> - let tac = xlate_tactic tac in - CT_coerce_TACTIC_COM_to_TACTIC_OPT tac - in - CT_replace_with (c1, c2,cl,tac_opt) - | TacRewrite(false,[b,Precisely 1,cbindl],cl,None) -> - let cl = xlate_clause cl - and c = xlate_formula (fst cbindl) - and bindl = xlate_bindings (snd cbindl) in - if b then CT_rewrite_lr (c, bindl, cl) - else CT_rewrite_rl (c, bindl, cl) - | TacRewrite(_,_,_,Some _) -> xlate_error "TODO: rewrite by" - | TacRewrite(false,_,cl,_) -> xlate_error "TODO: rewrite of several hyps at once" - | TacRewrite(true,_,cl,_) -> xlate_error "TODO: erewrite" - | TacExtend (_,"conditional_rewrite", [t; b; cbindl]) -> - let t = out_gen rawwit_main_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_formula 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) - | TacExtend (_,"conditional_rewrite", [t; b; cbindl; id]) -> - let t = out_gen rawwit_main_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_formula c and bindl = xlate_bindings bindl in - let id = ctf_ID_OPT_SOME (xlate_ident (snd (out_gen rawwit_var id))) in - if b then CT_condrewrite_lr (xlate_tactic t, c, bindl, id) - else CT_condrewrite_rl (xlate_tactic t, c, bindl, id) - | TacExtend (_,"dependent_rewrite", [b; c]) -> - let b = out_gen Extraargs.rawwit_orient b in - let c = xlate_formula (out_gen rawwit_constr c) in - (match c with - | CT_coerce_ID_to_FORMULA (CT_ident _ as id) -> - if b then CT_deprewrite_lr id else CT_deprewrite_rl id - | _ -> xlate_error "dependent rewrite on term: not supported") - | TacExtend (_,"dependent_rewrite", [b; c; id]) -> - xlate_error "dependent rewrite on terms in hypothesis: not supported" - | TacExtend (_,"cut_rewrite", [b; c]) -> - let b = out_gen Extraargs.rawwit_orient b in - let c = xlate_formula (out_gen rawwit_constr c) in - if b then CT_cutrewrite_lr (c, ctv_ID_OPT_NONE) - else CT_cutrewrite_lr (c, ctv_ID_OPT_NONE) - | TacExtend (_,"cut_rewrite", [b; c; id]) -> - let b = out_gen Extraargs.rawwit_orient b in - let c = xlate_formula (out_gen rawwit_constr c) in - let id = xlate_ident (snd (out_gen rawwit_var id)) in - if b then CT_cutrewrite_lr (c, ctf_ID_OPT_SOME id) - else CT_cutrewrite_lr (c, ctf_ID_OPT_SOME id) - | TacExtend(_, "subst", [l]) -> - CT_subst - (CT_id_list - (List.map (fun x -> CT_ident (string_of_id x)) - (out_gen (wit_list1 rawwit_ident) l))) - | TacReflexivity -> CT_reflexivity - | TacSymmetry cls -> CT_symmetry(xlate_clause cls) - | TacTransitivity c -> CT_transitivity (xlate_formula c) - | TacAssumption -> CT_assumption - | TacExact c -> CT_exact (xlate_formula c) - | TacExactNoCheck c -> CT_exact_no_check (xlate_formula c) - | TacVmCastNoCheck c -> CT_vm_cast_no_check (xlate_formula c) - | TacDestructHyp (true, (_,id)) -> CT_cdhyp (xlate_ident id) - | TacDestructHyp (false, (_,id)) -> CT_dhyp (xlate_ident id) - | TacDestructConcl -> CT_dconcl - | 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)) - | TacAutoTDB nopt -> CT_autotdb (xlate_int_opt nopt) - | TacAuto (nopt, [], Some []) -> CT_auto (xlate_int_or_var_opt_to_int_opt nopt) - | TacAuto (nopt, [], None) -> - CT_auto_with (xlate_int_or_var_opt_to_int_opt nopt, - CT_coerce_STAR_to_ID_NE_LIST_OR_STAR CT_star) - | TacAuto (nopt, [], Some (id1::idl)) -> - CT_auto_with(xlate_int_or_var_opt_to_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))) - | TacAuto (nopt, _::_, _) -> - xlate_error "TODO: auto using" - |TacExtend(_, ("autorewritev7"|"autorewritev8"), l::t) -> - let (id_list:ct_ID list) = - List.map (fun x -> CT_ident x) (out_gen (wit_list1 rawwit_pre_ident) l) in - let fst, (id_list1: ct_ID list) = - match id_list with [] -> assert false | a::tl -> a,tl in - let t1 = - match t with - [t0] -> - CT_coerce_TACTIC_COM_to_TACTIC_OPT - (xlate_tactic(out_gen rawwit_main_tactic t0)) - | [] -> CT_coerce_NONE_to_TACTIC_OPT CT_none - | _ -> assert false in - CT_autorewrite (CT_id_ne_list(fst, id_list1), t1) - | TacExtend (_,"eauto", [nopt; popt; lems; idl]) -> - let first_n = - match out_gen (wit_opt rawwit_int_or_var) nopt with - | Some (ArgVar(_, s)) -> xlate_id_to_id_or_int_opt s - | Some (ArgArg n) -> xlate_int_to_id_or_int_opt n - | None -> none_in_id_or_int_opt in - let second_n = - match out_gen (wit_opt rawwit_int_or_var) popt with - | Some (ArgVar(_, s)) -> xlate_id_to_id_or_int_opt s - | Some (ArgArg n) -> xlate_int_to_id_or_int_opt n - | None -> none_in_id_or_int_opt in - let _lems = - match out_gen Eauto.rawwit_auto_using lems with - | [] -> [] - | _ -> xlate_error "TODO: eauto using" in - let idl = out_gen Eauto.rawwit_hintbases idl in - (match idl with - None -> CT_eauto_with(first_n, - second_n, - CT_coerce_STAR_to_ID_NE_LIST_OR_STAR CT_star) - | Some [] -> CT_eauto(first_n, second_n) - | Some (a::l) -> - CT_eauto_with(first_n, second_n, - CT_coerce_ID_NE_LIST_to_ID_NE_LIST_OR_STAR - (CT_id_ne_list - (CT_ident a, - List.map (fun x -> CT_ident x) l)))) - | TacExtend (_,"prolog", [cl; n]) -> - let cl = List.map xlate_formula (out_gen (wit_list0 rawwit_constr) cl) in - (match out_gen rawwit_int_or_var n with - | ArgVar _ -> xlate_error "" - | ArgArg n -> CT_prolog (CT_formula_list cl, CT_int n)) - (* eapply now represented by TacApply (true,cbindl) - | TacExtend (_,"eapply", [cbindl]) -> -*) - | TacTrivial ([],Some []) -> CT_trivial - | TacTrivial ([],None) -> - CT_trivial_with(CT_coerce_STAR_to_ID_NE_LIST_OR_STAR 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)))) - | TacTrivial (_::_,_) -> - xlate_error "TODO: trivial using" - | TacReduce (red, l) -> - CT_reduce (xlate_red_tactic red, xlate_clause l) - | TacApply (true,false,[c,bindl],None) -> - CT_apply (xlate_formula c, xlate_bindings bindl) - | TacApply (true,true,[c,bindl],None) -> - CT_eapply (xlate_formula c, xlate_bindings bindl) - | TacApply (_,_,_,_) -> - xlate_error "TODO: simple (e)apply and iterated apply and apply in" - | TacConstructor (false,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) - | TacConstructor _ -> xlate_error "TODO: econstructor" - | TacSpecialize (nopt, (c,sl)) -> - CT_specialize (xlate_int_opt nopt, xlate_formula c, xlate_bindings sl) - | TacGeneralize [] -> xlate_error "" - | TacGeneralize ((((true,[]),first),Anonymous) :: cl) - when List.for_all (fun ((o,_),na) -> o = all_occurrences_expr - & na = Anonymous) cl -> - CT_generalize - (CT_formula_ne_list (xlate_formula first, - List.map (fun ((_,c),_) -> xlate_formula c) cl)) - | TacGeneralize _ -> xlate_error "TODO: Generalize at and as" - | TacGeneralizeDep c -> - CT_generalize_dependent (xlate_formula c) - | TacElimType c -> CT_elim_type (xlate_formula c) - | TacCaseType c -> CT_case_type (xlate_formula c) - | TacElim (false,(c1,sl), u) -> - CT_elim (xlate_formula c1, xlate_bindings sl, xlate_using u) - | TacCase (false,(c1,sl)) -> - CT_casetac (xlate_formula c1, xlate_bindings sl) - | TacElim (true,_,_) | TacCase (true,_) - | TacInductionDestruct (_,true,_) -> - xlate_error "TODO: eelim, ecase, edestruct, einduction" - | TacSimpleInductionDestruct (true,h) -> - CT_induction (xlate_quantified_hypothesis h) - | TacSimpleInductionDestruct (false,h) -> - CT_destruct (xlate_quantified_hypothesis h) - | TacCut c -> CT_cut (xlate_formula c) - | TacLApply c -> CT_use (xlate_formula c) - | TacDecompose ([],c) -> - xlate_error "Decompose : empty list of identifiers?" - | TacDecompose (id::l,c) -> - let id' = apply_or_by_notation tac_qualid_to_ct_ID id in - let l' = List.map (apply_or_by_notation tac_qualid_to_ct_ID) l in - CT_decompose_list(CT_id_ne_list(id',l'),xlate_formula c) - | TacDecomposeAnd c -> CT_decompose_record (xlate_formula c) - | TacDecomposeOr c -> CT_decompose_sum(xlate_formula c) - | TacClear (false,[]) -> - xlate_error "Clear expects a non empty list of identifiers" - | TacClear (false,id::idl) -> - let idl' = List.map xlate_hyp idl in - CT_clear (CT_id_ne_list (xlate_hyp id, idl')) - | TacClear (true,_) -> xlate_error "TODO: 'clear - idl' and 'clear'" - | TacRevert _ -> xlate_error "TODO: revert" - | (*For translating tactics/Inv.v *) - TacInversion (NonDepInversion (k,idl,l),quant_hyp) -> - CT_inversion(compute_INV_TYPE k, xlate_quantified_hypothesis quant_hyp, - xlate_with_names l, - CT_id_list (List.map xlate_hyp idl)) - | TacInversion (DepInversion (k,copt,l),quant_hyp) -> - let id = xlate_quantified_hypothesis quant_hyp in - CT_depinversion (compute_INV_TYPE k, id, - xlate_with_names l, xlate_formula_opt copt) - | TacInversion (InversionUsing (c,idlist), id) -> - let id = xlate_quantified_hypothesis id in - CT_use_inversion (id, xlate_formula c, - CT_id_list (List.map xlate_hyp idlist)) - | TacExtend (_,"omega", []) -> CT_omega - | TacRename [id1, id2] -> CT_rename(xlate_hyp id1, xlate_hyp id2) - | TacRename _ -> xlate_error "TODO: add support for n-ary rename" - | TacClearBody([]) -> assert false - | TacClearBody(a::l) -> - CT_clear_body (CT_id_ne_list (xlate_hyp a, List.map xlate_hyp l)) - | TacDAuto (a, b, []) -> - CT_dauto(xlate_int_or_var_opt_to_int_opt a, xlate_int_opt b) - | TacDAuto (a, b, _) -> - xlate_error "TODO: dauto using" - | TacInductionDestruct(true,false,[a,b,(None,c),None]) -> - CT_new_destruct - (List.map xlate_int_or_constr a, xlate_using b, - xlate_with_names c) - | TacInductionDestruct(false,false,[a,b,(None,c),None]) -> - CT_new_induction - (List.map xlate_int_or_constr a, xlate_using b, - xlate_with_names c) - | TacInductionDestruct(_,false,_) -> - xlate_error "TODO: clause 'in' and full 'as' of destruct/induction" - | TacLetTac (na, c, cl, true) when cl = nowhere -> - CT_pose(xlate_id_opt_aux na, xlate_formula c) - | TacLetTac (na, c, cl, true) -> - CT_lettac(xlate_id_opt ((0,0),na), xlate_formula c, - (* TODO LATER: This should be shared with Unfold, - but the structures are different *) - xlate_clause cl) - | TacLetTac (na, c, cl, false) -> xlate_error "TODO: remember" - | TacAssert (None, Some (_,IntroIdentifier id), c) -> - CT_assert(xlate_id_opt ((0,0),Name id), xlate_formula c) - | TacAssert (None, None, c) -> - CT_assert(xlate_id_opt ((0,0),Anonymous), xlate_formula c) - | TacAssert (Some (TacId []), Some (_,IntroIdentifier id), c) -> - CT_truecut(xlate_id_opt ((0,0),Name id), xlate_formula c) - | TacAssert (Some (TacId []), None, c) -> - CT_truecut(xlate_id_opt ((0,0),Anonymous), xlate_formula c) - | TacAssert _ -> - xlate_error "TODO: assert with 'as' and 'by' and pose proof with 'as'" - | TacAnyConstructor(false,Some tac) -> - CT_any_constructor - (CT_coerce_TACTIC_COM_to_TACTIC_OPT(xlate_tactic tac)) - | TacAnyConstructor(false,None) -> - CT_any_constructor(CT_coerce_NONE_to_TACTIC_OPT CT_none) - | TacAnyConstructor _ -> xlate_error "TODO: econstructor" - | TacExtend(_, "ring", [args]) -> - CT_ring - (CT_formula_list - (List.map xlate_formula - (out_gen (wit_list0 rawwit_constr) args))) - | TacExtend (_, "f_equal", _) -> xlate_error "TODO: f_equal" - | TacExtend (_,id, l) -> - print_endline ("Extratactics : "^ id); - CT_user_tac (CT_ident id, CT_targ_list (List.map coerce_genarg_to_TARG l)) - | TacAlias _ -> xlate_error "Alias not supported" - -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_FORMULA_OR_INT_to_TARG - (CT_coerce_ID_OR_INT_to_FORMULA_OR_INT - (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_FORMULA_OR_INT_to_TARG - (CT_coerce_ID_OR_INT_to_FORMULA_OR_INT x) - | StringArgType -> - let s = CT_string (out_gen rawwit_string x) in - CT_coerce_SCOMMENT_CONTENT_to_TARG - (CT_coerce_ID_OR_STRING_to_SCOMMENT_CONTENT - (CT_coerce_STRING_to_ID_OR_STRING s)) - | PreIdentArgType -> - let id = CT_ident (out_gen rawwit_pre_ident x) in - CT_coerce_FORMULA_OR_INT_to_TARG - (CT_coerce_ID_OR_INT_to_FORMULA_OR_INT - (CT_coerce_ID_to_ID_OR_INT id)) - | IntroPatternArgType -> - xlate_error "TODO" - | IdentArgType true -> - let id = xlate_ident (out_gen rawwit_ident x) in - CT_coerce_FORMULA_OR_INT_to_TARG - (CT_coerce_ID_OR_INT_to_FORMULA_OR_INT - (CT_coerce_ID_to_ID_OR_INT id)) - | IdentArgType false -> - xlate_error "TODO" - | VarArgType -> - let id = xlate_ident (snd (out_gen rawwit_var x)) in - CT_coerce_FORMULA_OR_INT_to_TARG - (CT_coerce_ID_OR_INT_to_FORMULA_OR_INT - (CT_coerce_ID_to_ID_OR_INT id)) - | RefArgType -> - let id = tac_qualid_to_ct_ID (out_gen rawwit_ref x) in - CT_coerce_FORMULA_OR_INT_to_TARG - (CT_coerce_ID_OR_INT_to_FORMULA_OR_INT - (CT_coerce_ID_to_ID_OR_INT id)) - (* Specific types *) - | SortArgType -> - CT_coerce_SCOMMENT_CONTENT_to_TARG - (CT_coerce_FORMULA_to_SCOMMENT_CONTENT - (CT_coerce_SORT_TYPE_to_FORMULA (xlate_sort (out_gen rawwit_sort x)))) - | ConstrArgType -> - CT_coerce_SCOMMENT_CONTENT_to_TARG - (CT_coerce_FORMULA_to_SCOMMENT_CONTENT (xlate_formula (out_gen rawwit_constr x))) - | ConstrMayEvalArgType -> xlate_error"TODO: generic constr-may-eval argument" - | QuantHypArgType ->xlate_error"TODO: generic quantified hypothesis argument" - | OpenConstrArgType b -> - CT_coerce_SCOMMENT_CONTENT_to_TARG - (CT_coerce_FORMULA_to_SCOMMENT_CONTENT(xlate_formula - (snd (out_gen - (rawwit_open_constr_gen b) x)))) - | ExtraArgType s as y when Pcoq.is_tactic_genarg y -> - let n = Option.get (Pcoq.tactic_genarg_level s) in - let t = xlate_tactic (out_gen (Pcoq.rawwit_tactic n) x) in - CT_coerce_TACTIC_COM_to_TARG t - | ConstrWithBindingsArgType -> xlate_error "TODO: generic constr with bindings" - | BindingsArgType -> xlate_error "TODO: generic with bindings" - | RedExprArgType -> xlate_error "TODO: generic red expr" - | 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 = - 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 tactic -> - CT_def_context_rule (xlate_tactic tactic) -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_formula f)) - | ConstrContext((_, id), f) -> - CT_coerce_CONTEXT_PATTERN_to_DEF_BODY - (CT_context - (CT_coerce_ID_to_ID_OPT (CT_ident (string_of_id id)), - xlate_formula f)) - | ConstrTypeOf f -> CT_type_of (xlate_formula f) - | ConstrTerm c -> ct_coerce_FORMULA_to_DEF_BODY(xlate_formula c) - -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 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_ID_OR_INT_OPT_to_VARG - (CT_coerce_INT_OPT_to_ID_OR_INT_OPT - (CT_coerce_INT_to_INT_OPT (CT_int n))) - | IntOrVarArgType -> - (match out_gen rawwit_int_or_var x with - | ArgArg n -> - CT_coerce_ID_OR_INT_OPT_to_VARG - (CT_coerce_INT_OPT_to_ID_OR_INT_OPT - (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)) - | IntroPatternArgType -> - xlate_error "TODO" - | IdentArgType true -> - 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)) - | IdentArgType false -> - xlate_error "TODO" - | VarArgType -> - let id = xlate_ident (snd (out_gen rawwit_var 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)) - | RefArgType -> - let id = tac_qualid_to_ct_ID (out_gen rawwit_ref 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 *) - | SortArgType -> - CT_coerce_FORMULA_OPT_to_VARG - (CT_coerce_FORMULA_to_FORMULA_OPT - (CT_coerce_SORT_TYPE_to_FORMULA (xlate_sort (out_gen rawwit_sort x)))) - | ConstrArgType -> - CT_coerce_FORMULA_OPT_to_VARG - (CT_coerce_FORMULA_to_FORMULA_OPT (xlate_formula (out_gen rawwit_constr x))) - | ConstrMayEvalArgType -> xlate_error"TODO: generic constr-may-eval argument" - | QuantHypArgType ->xlate_error"TODO: generic quantified hypothesis argument" - | ExtraArgType s as y when Pcoq.is_tactic_genarg y -> - let n = Option.get (Pcoq.tactic_genarg_level s) in - let t = xlate_tactic (out_gen (Pcoq.rawwit_tactic n) x) in - CT_coerce_TACTIC_OPT_to_VARG (CT_coerce_TACTIC_COM_to_TACTIC_OPT t) - | OpenConstrArgType _ -> xlate_error "TODO: generic open constr" - | ConstrWithBindingsArgType -> xlate_error "TODO: generic constr with bindings" - | BindingsArgType -> xlate_error "TODO: generic 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 (string_of_theorem_kind x) - -let xlate_defn k = CT_defn (string_of_definition_kind k) - -let xlate_var x = CT_var (match x with - | (Global,Definitional) -> "Parameter" - | (Global,Logical) -> "Axiom" - | (Local,Definitional) -> "Variable" - | (Local,Logical) -> "Hypothesis" - | (Global,Conjectural) -> "Conjecture" - | (Local,Conjectural) -> xlate_error "No local conjecture");; - - -let xlate_dep = - function - | true -> CT_dep "Induction for" - | false -> CT_dep "Minimality for";; - -let xlate_locn = - function - | 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 - | "CHECK" -> "Check" - | "PRINTTYPE" -> "Type" - | _ -> xlate_error "xlate_check";; - -let build_constructors l = - let f (coe,((_,id),c)) = - if coe then CT_constr_coercion (xlate_ident id, xlate_formula c) - else CT_constr (xlate_ident id, xlate_formula c) in - CT_constr_list (List.map f l) - -let build_record_field_list l = - let build_record_field ((coe,d),not) = match d with - | AssumExpr (id,c) -> - if coe then CT_recconstr_coercion (xlate_id_opt id, xlate_formula c) - else - CT_recconstr(xlate_id_opt id, xlate_formula c) - | DefExpr (id,c,topt) -> - if coe then - CT_defrecconstr_coercion(xlate_id_opt id, xlate_formula c, - xlate_formula_opt topt) - else - CT_defrecconstr(xlate_id_opt id, xlate_formula c, xlate_formula_opt topt) in - CT_recconstr_list (List.map build_record_field l);; - -let get_require_flags impexp spec = - let ct_impexp = - match impexp with - | None -> CT_coerce_NONE_to_IMPEXP CT_none - | Some false -> CT_import - | Some 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 (xlate_formula c1) - | Some red -> - CT_coerce_EVAL_CMD_to_DEF_BODY( - CT_eval(CT_coerce_NONE_to_INT_OPT CT_none, - xlate_red_tactic red, - xlate_formula c1)) - -let cvt_vernac_binder = function - | b,(id::idl,c) -> - let l,t = - CT_id_opt_ne_list - (xlate_ident_opt (Some (snd id)), - List.map (fun id -> xlate_ident_opt (Some (snd id))) idl), - xlate_formula c in - if b then - CT_binder_coercion(l,t) - else - CT_binder(l,t) - | _, _ -> xlate_error "binder with no left part, rejected";; - -let cvt_vernac_binders = function - a::args -> CT_binder_ne_list(cvt_vernac_binder a, List.map cvt_vernac_binder args) - | [] -> assert false;; - - -let xlate_comment = function - CommentConstr c -> CT_coerce_FORMULA_to_SCOMMENT_CONTENT(xlate_formula c) - | CommentString s -> CT_coerce_ID_OR_STRING_to_SCOMMENT_CONTENT - (CT_coerce_STRING_to_ID_OR_STRING(CT_string s)) - | CommentInt n -> - CT_coerce_FORMULA_to_SCOMMENT_CONTENT - (CT_coerce_NUM_to_FORMULA(CT_int_encapsulator (string_of_int n)));; - -let translate_opt_notation_decl = function - None -> CT_coerce_NONE_to_DECL_NOTATION_OPT(CT_none) - | Some(s, f, sc) -> - let tr_sc = - match sc with - None -> ctv_ID_OPT_NONE - | Some id -> CT_coerce_ID_to_ID_OPT (CT_ident id) in - CT_decl_notation(CT_string s, xlate_formula f, tr_sc);; - -let xlate_level = function - Extend.NumLevel n -> CT_coerce_INT_to_INT_OR_NEXT(CT_int n) - | Extend.NextLevel -> CT_next_level;; - -let xlate_syntax_modifier = function - Extend.SetItemLevel((s::sl), level) -> - CT_set_item_level - (CT_id_ne_list(CT_ident s, List.map (fun s -> CT_ident s) sl), - xlate_level level) - | Extend.SetItemLevel([], _) -> assert false - | Extend.SetLevel level -> CT_set_level (CT_int level) - | Extend.SetAssoc Gramext.LeftA -> CT_lefta - | Extend.SetAssoc Gramext.RightA -> CT_righta - | Extend.SetAssoc Gramext.NonA -> CT_nona - | Extend.SetEntryType(x,typ) -> - CT_entry_type(CT_ident x, - match typ with - Extend.ETIdent -> CT_ident "ident" - | Extend.ETReference -> CT_ident "global" - | Extend.ETBigint -> CT_ident "bigint" - | _ -> xlate_error "syntax_type not parsed") - | Extend.SetOnlyParsing -> CT_only_parsing - | Extend.SetFormat(_,s) -> CT_format(CT_string s);; - - -let rec xlate_module_type = function - | CMTEident(_, qid) -> - CT_coerce_ID_to_MODULE_TYPE(CT_ident (xlate_qualid qid)) - | CMTEwith(mty, decl) -> - let mty1 = xlate_module_type mty in - (match decl with - CWith_Definition((_, idl), c) -> - CT_module_type_with_def(mty1, - CT_id_list (List.map xlate_ident idl), - xlate_formula c) - | CWith_Module((_, idl), (_, qid)) -> - CT_module_type_with_mod(mty1, - CT_id_list (List.map xlate_ident idl), - CT_ident (xlate_qualid qid))) - | CMTEapply (_,_) -> xlate_error "TODO: Funsig application";; - - -let xlate_module_binder_list (l:module_binder list) = - CT_module_binder_list - (List.map (fun (_, idl, mty) -> - let idl1 = - List.map (fun (_, x) -> CT_ident (string_of_id x)) idl in - let fst,idl2 = match idl1 with - [] -> assert false - | fst::idl2 -> fst,idl2 in - CT_module_binder - (CT_id_ne_list(fst, idl2), xlate_module_type mty)) l);; - -let xlate_module_type_check_opt = function - None -> CT_coerce_MODULE_TYPE_OPT_to_MODULE_TYPE_CHECK - (CT_coerce_ID_OPT_to_MODULE_TYPE_OPT ctv_ID_OPT_NONE) - | Some(mty, true) -> CT_only_check(xlate_module_type mty) - | Some(mty, false) -> - CT_coerce_MODULE_TYPE_OPT_to_MODULE_TYPE_CHECK - (CT_coerce_MODULE_TYPE_to_MODULE_TYPE_OPT - (xlate_module_type mty));; - -let rec xlate_module_expr = function - CMEident (_, qid) -> CT_coerce_ID_OPT_to_MODULE_EXPR - (CT_coerce_ID_to_ID_OPT (CT_ident (xlate_qualid qid))) - | CMEapply (me1, me2) -> CT_module_app(xlate_module_expr me1, - xlate_module_expr me2) - -let rec xlate_vernac = - function - | VernacDeclareTacticDefinition (true, tacs) -> - (match List.map - (function - (id, _, body) -> - CT_tac_def(reference_to_ct_ID id, xlate_tactic body)) - tacs with - [] -> assert false - | fst::tacs1 -> - CT_tactic_definition - (CT_tac_def_ne_list(fst, tacs1))) - | VernacDeclareTacticDefinition(false, _) -> - xlate_error "obsolete tactic definition not handled" - | 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)) - | 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_formula f)) - |VernacChdir opt_s -> CT_cd (ctf_STRING_OPT opt_s) - | VernacAddLoadPath (false,str,None) -> - CT_addpath (CT_string str, ctv_ID_OPT_NONE) - | VernacAddLoadPath (false,str,Some x) -> - CT_addpath (CT_string str, - CT_coerce_ID_to_ID_OPT (CT_ident (string_of_dirpath x))) - | VernacAddLoadPath (true,str,None) -> - CT_recaddpath (CT_string str, ctv_ID_OPT_NONE) - | VernacAddLoadPath (_,str, Some x) -> - CT_recaddpath (CT_string str, - CT_coerce_ID_to_ID_OPT (CT_ident (string_of_dirpath x))) - | VernacRemoveLoadPath str -> CT_delpath (CT_string str) - | VernacToplevelControl Quit -> CT_quit - | VernacToplevelControl _ -> xlate_error "Drop/ProtectedToplevel not supported" - (*ML commands *) - | 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)) - | VernacGoal c -> - CT_coerce_THEOREM_GOAL_to_COMMAND (CT_goal (xlate_formula 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, b) -> - CT_solve (CT_int n, xlate_tactic tac, - if b then CT_dotdot - else CT_coerce_NONE_to_DOTDOT_OPT CT_none) - -(* MMode *) - - | (VernacDeclProof | VernacReturn | VernacProofInstr _) -> - anomaly "No MMode in CTcoq" - - -(* /MMode *) - - | VernacFocus nopt -> CT_focus (xlate_int_opt nopt) - | VernacUnfocus -> CT_unfocus - |VernacExtend("Extraction", [f;l]) -> - let file = out_gen rawwit_string f in - let l1 = out_gen (wit_list1 rawwit_ref) l in - let fst,l2 = match l1 with [] -> assert false | fst::l2 -> fst, l2 in - CT_extract_to_file(CT_string file, - CT_id_ne_list(loc_qualid_to_ct_ID fst, - List.map loc_qualid_to_ct_ID l2)) - | VernacExtend("ExtractionInline", [l]) -> - let l1 = out_gen (wit_list1 rawwit_ref) l in - let fst, l2 = match l1 with [] -> assert false | fst ::l2 -> fst, l2 in - CT_inline(CT_id_ne_list(loc_qualid_to_ct_ID fst, - List.map loc_qualid_to_ct_ID l2)) - | VernacExtend("ExtractionNoInline", [l]) -> - let l1 = out_gen (wit_list1 rawwit_ref) l in - let fst, l2 = match l1 with [] -> assert false | fst ::l2 -> fst, l2 in - CT_no_inline(CT_id_ne_list(loc_qualid_to_ct_ID fst, - List.map loc_qualid_to_ct_ID l2)) - | VernacExtend("Field", - [fth;ainv;ainvl;div]) -> - (match List.map (fun v -> xlate_formula(out_gen rawwit_constr v)) - [fth;ainv;ainvl] - with - [fth1;ainv1;ainvl1] -> - let adiv1 = - xlate_formula_opt (out_gen (wit_opt rawwit_constr) div) in - CT_add_field(fth1, ainv1, ainvl1, adiv1) - |_ -> assert false) - | VernacExtend ("HintRewrite", o::f::([b]|[_;b] as args)) -> - let orient = out_gen Extraargs.rawwit_orient o in - let formula_list = out_gen (wit_list1 rawwit_constr) f in - let base = out_gen rawwit_pre_ident b in - let t = - match args with [t;_] -> out_gen rawwit_main_tactic t | _ -> TacId [] - in - let ct_orient = match orient with - | true -> CT_lr - | false -> CT_rl in - let f_ne_list = match List.map xlate_formula 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) - | VernacCreateHintDb (local,dbname,b) -> - xlate_error "TODO: VernacCreateHintDb" - | VernacHints (local,dbnames,h) -> - let dblist = CT_id_list(List.map (fun x -> CT_ident x) dbnames) in - (match h with - | HintsConstructors l -> - let n1, names = match List.map tac_qualid_to_ct_ID l with - n1 :: names -> n1, names - | _ -> failwith "" in - if local then - CT_local_hints(CT_ident "Constructors", - CT_id_ne_list(n1, names), dblist) - else - CT_hints(CT_ident "Constructors", - CT_id_ne_list(n1, names), dblist) - | HintsExtern (n, c, t) -> - let pat = match c with - | None -> CT_coerce_ID_OPT_to_FORMULA_OPT (CT_coerce_NONE_to_ID_OPT CT_none) - | Some c -> CT_coerce_FORMULA_to_FORMULA_OPT (xlate_formula c) - in CT_hint_extern(CT_int n, pat, xlate_tactic t, dblist) - | HintsImmediate l -> - let f1, formulas = match List.map xlate_formula l with - a :: tl -> a, tl - | _ -> failwith "" in - let l' = CT_formula_ne_list(f1, formulas) in - if local then - (match h with - HintsResolve _ -> - CT_local_hints_resolve(l', dblist) - | HintsImmediate _ -> - CT_local_hints_immediate(l', dblist) - | _ -> assert false) - else - (match h with - HintsResolve _ -> CT_hints_resolve(l', dblist) - | HintsImmediate _ -> CT_hints_immediate(l', dblist) - | _ -> assert false) - | HintsResolve l -> - let f1, formulas = match List.map xlate_formula (List.map pi3 l) with - a :: tl -> a, tl - | _ -> failwith "" in - let l' = CT_formula_ne_list(f1, formulas) in - if local then - (match h with - HintsResolve _ -> - CT_local_hints_resolve(l', dblist) - | HintsImmediate _ -> - CT_local_hints_immediate(l', dblist) - | _ -> assert false) - else - (match h with - HintsResolve _ -> CT_hints_resolve(l', dblist) - | HintsImmediate _ -> CT_hints_immediate(l', dblist) - | _ -> assert false) - | HintsUnfold l -> - let n1, names = match List.map loc_qualid_to_ct_ID l with - n1 :: names -> n1, names - | _ -> failwith "" in - if local then - CT_local_hints(CT_ident "Unfold", - CT_id_ne_list(n1, names), dblist) - else - CT_hints(CT_ident "Unfold", CT_id_ne_list(n1, names), dblist) - | HintsTransparency (l,b) -> - let n1, names = match List.map loc_qualid_to_ct_ID l with - n1 :: names -> n1, names - | _ -> failwith "" in - let ty = if b then "Transparent" else "Opaque" in - if local then - CT_local_hints(CT_ident ty, - CT_id_ne_list(n1, names), dblist) - else - CT_hints(CT_ident ty, CT_id_ne_list(n1, names), dblist) - | HintsDestruct(id, n, loc, f, t) -> - let dl = match loc with - ConclLocation() -> CT_conclusion_location - | HypLocation true -> CT_discardable_hypothesis - | HypLocation false -> CT_hypothesis_location in - if local then - CT_local_hint_destruct - (xlate_ident id, CT_int n, - dl, xlate_formula f, xlate_tactic t, dblist) - else - CT_hint_destruct - (xlate_ident id, CT_int n, dl, xlate_formula f, - xlate_tactic t, dblist) -) - | VernacEndProof (Proved (true,None)) -> - CT_save (CT_coerce_THM_to_THM_OPT (CT_thm "Theorem"), ctv_ID_OPT_NONE) - | VernacEndProof (Proved (false,None)) -> - CT_save (CT_coerce_THM_to_THM_OPT (CT_thm "Definition"), ctv_ID_OPT_NONE) - | VernacEndProof (Proved (b,Some ((_,s), Some kind))) -> - CT_save (CT_coerce_THM_to_THM_OPT (xlate_thm kind), - ctf_ID_OPT_SOME (xlate_ident s)) - | VernacEndProof (Proved (b,Some ((_,s),None))) -> - CT_save (CT_coerce_THM_to_THM_OPT (CT_thm "Theorem"), - ctf_ID_OPT_SOME (xlate_ident s)) - | VernacEndProof Admitted -> - CT_save (CT_coerce_THM_to_THM_OPT (CT_thm "Admitted"), ctv_ID_OPT_NONE) - | VernacSetOpacity (_,l) -> - CT_strategy(CT_level_list - (List.map (fun (l,q) -> - (level_to_ct_LEVEL l, - CT_id_list(List.map loc_qualid_to_ct_ID q))) l)) - | VernacUndo n -> CT_undo (CT_coerce_INT_to_INT_OPT (CT_int n)) - | VernacShow (ShowGoal nopt) -> CT_show_goal (xlate_int_opt nopt) - | VernacShow ShowNode -> CT_show_node - | VernacShow ShowProof -> CT_show_proof - | VernacShow ShowTree -> CT_show_tree - | VernacShow ShowProofNames -> CT_show_proofs - | VernacShow (ShowIntros true) -> CT_show_intros - | VernacShow (ShowIntros false) -> CT_show_intro - | VernacShow (ShowGoalImplicitly None) -> CT_show_implicit (CT_int 1) - | VernacShow (ShowGoalImplicitly (Some n)) -> CT_show_implicit (CT_int n) - | VernacShow ShowExistentials -> CT_show_existentials - | VernacShow ShowScript -> CT_show_script - | VernacShow(ShowMatch _) -> xlate_error "TODO: VernacShow(ShowMatch _)" - | VernacShow(ShowThesis) -> xlate_error "TODO: VernacShow(ShowThesis _)" - | VernacGo arg -> CT_go (xlate_locn arg) - | VernacShow (ExplainProof l) -> CT_explain_proof (nums_to_int_list l) - | VernacShow (ExplainTree l) -> - CT_explain_prooftree (nums_to_int_list l) - | 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 name -> CT_print_grammar CT_grammar_none - | PrintHintDb -> CT_print_hintdb (CT_coerce_STAR_to_ID_OR_STAR CT_star) - | PrintHintDbName id -> - CT_print_hintdb (CT_coerce_ID_to_ID_OR_STAR (CT_ident id)) - | PrintRewriteHintDbName id -> - CT_print_rewrite_hintdb (CT_ident id) - | PrintHint id -> - CT_print_hint (CT_coerce_ID_to_ID_OPT (loc_qualid_to_ct_ID id)) - | PrintHintGoal -> CT_print_hint ctv_ID_OPT_NONE - | PrintLoadPath None -> CT_print_loadpath - | PrintLoadPath _ -> xlate_error "TODO: Print LoadPath dir" - | PrintMLLoadPath -> CT_ml_print_path - | PrintMLModules -> CT_ml_print_modules - | PrintGraph -> CT_print_graph - | PrintClasses -> CT_print_classes - | PrintLtac qid -> CT_print_ltac (loc_qualid_to_ct_ID qid) - | PrintCoercions -> CT_print_coercions - | PrintCoercionPaths (id1, id2) -> - CT_print_path (xlate_class id1, xlate_class id2) - | PrintCanonicalConversions -> - xlate_error "TODO: Print Canonical Structures" - | PrintAssumptions _ -> - xlate_error "TODO: Print Needed Assumptions" - | PrintInstances _ -> - xlate_error "TODO: Print Instances" - | PrintTypeClasses -> - xlate_error "TODO: Print TypeClasses" - | PrintInspect n -> CT_inspect (CT_int n) - | PrintUniverses opt_s -> CT_print_universes(ctf_STRING_OPT opt_s) - | PrintTables -> CT_print_tables - | PrintModuleType a -> CT_print_module_type (loc_qualid_to_ct_ID a) - | PrintModule a -> CT_print_module (loc_qualid_to_ct_ID a) - | PrintScopes -> CT_print_scopes - | PrintScope id -> CT_print_scope (CT_ident id) - | PrintVisibility id_opt -> - CT_print_visibility - (match id_opt with - Some id -> CT_coerce_ID_to_ID_OPT(CT_ident id) - | None -> ctv_ID_OPT_NONE) - | PrintAbout qid -> CT_print_about(loc_qualid_to_ct_ID qid) - | PrintImplicit qid -> CT_print_implicit(loc_qualid_to_ct_ID qid)) - | VernacBeginSection (_,id) -> - CT_coerce_SECTION_BEGIN_to_COMMAND (CT_section (xlate_ident id)) - | VernacEndSegment (_,id) -> CT_section_end (xlate_ident id) - | VernacStartTheoremProof (k, [Some (_,s), (bl,c)], _, _) -> - CT_coerce_THEOREM_GOAL_to_COMMAND( - CT_theorem_goal (CT_coerce_THM_to_DEFN_OR_THM (xlate_thm k), xlate_ident s, - xlate_binder_list bl, xlate_formula c)) - | VernacStartTheoremProof _ -> - xlate_error "TODO: Mutually dependent theorems" - | VernacSuspend -> CT_suspend - | VernacResume idopt -> CT_resume (xlate_ident_opt (Option.map snd idopt)) - | VernacDefinition (k,(_,s),ProveBody (bl,typ),_) -> - CT_coerce_THEOREM_GOAL_to_COMMAND - (CT_theorem_goal - (CT_coerce_DEFN_to_DEFN_OR_THM (xlate_defn k), - xlate_ident s, xlate_binder_list bl, xlate_formula typ)) - | VernacDefinition (kind,(_,s),DefineBody(bl,red_option,c,typ_opt),_) -> - CT_definition - (xlate_defn kind, xlate_ident s, xlate_binder_list bl, - cvt_optional_eval_for_definition c red_option, - xlate_formula_opt typ_opt) - | VernacAssumption (kind,inline ,b) ->xlate_error "TODO: Parameter Inline" - (*inline : bool -> automatic delta reduction at fonctor application*) - (* CT_variable (xlate_var kind, cvt_vernac_binders b)*) - | VernacCheckMayEval (None, numopt, c) -> - CT_check (xlate_formula c) - | VernacSearch (s,x) -> - let translated_restriction = xlate_search_restr x in - (match s with - | SearchPattern c -> - CT_search_pattern(xlate_formula c, translated_restriction) - | SearchHead id -> - CT_search(loc_qualid_to_ct_ID id, translated_restriction) - | SearchRewrite c -> - CT_search_rewrite(xlate_formula c, translated_restriction) - | SearchAbout (a::l) -> - let xlate_search_about_item (b,it) = - if not b then xlate_error "TODO: negative searchabout constraint"; - match it with - SearchSubPattern (CRef x) -> - CT_coerce_ID_to_ID_OR_STRING(loc_qualid_to_ct_ID x) - | SearchString (s,None) -> - CT_coerce_STRING_to_ID_OR_STRING(CT_string s) - | SearchString _ | SearchSubPattern _ -> - xlate_error - "TODO: search subpatterns or notation with explicit scope" - in - CT_search_about - (CT_id_or_string_ne_list(xlate_search_about_item a, - List.map xlate_search_about_item l), - translated_restriction) - | SearchAbout [] -> assert false) - -(* | (\*Record from tactics/Record.v *\) *) -(* VernacRecord *) -(* (_, (add_coercion, (_,s)), binders, c1, *) -(* rec_constructor_or_none, field_list) -> *) -(* let record_constructor = *) -(* xlate_ident_opt (Option.map snd rec_constructor_or_none) in *) -(* CT_record *) -(* ((if add_coercion then CT_coercion_atm else *) -(* CT_coerce_NONE_to_COERCION_OPT(CT_none)), *) -(* xlate_ident s, xlate_binder_list binders, *) -(* xlate_formula (Option.get c1), record_constructor, *) -(* build_record_field_list field_list) *) - | VernacInductive (isind, lmi) -> - let co_or_ind = if Decl_kinds.recursivity_flag_of_kind isind then "Inductive" else "CoInductive" in - let strip_mutind = function - (((_, (_,s)), parameters, c, _, Constructors constructors), notopt) -> - CT_ind_spec - (xlate_ident s, xlate_binder_list parameters, xlate_formula (Option.get c), - build_constructors constructors, - translate_opt_notation_decl notopt) - | _ -> xlate_error "TODO: Record notation in (Co)Inductive" in - CT_mind_decl - (CT_co_ind co_or_ind, CT_ind_spec_list (List.map strip_mutind lmi)) - | VernacFixpoint ([],_) -> xlate_error "mutual recursive" - | VernacFixpoint ((lm :: lmi),boxed) -> - let strip_mutrec (((_,fid), (n, ro), bl, arf, ardef), _ntn) = - let struct_arg = make_fix_struct (n, bl) in - let arf = xlate_formula arf in - let ardef = xlate_formula ardef in - match xlate_binder_list bl with - | CT_binder_list (b :: bl) -> - CT_fix_rec (xlate_ident fid, CT_binder_ne_list (b, bl), - struct_arg, arf, ardef) - | _ -> xlate_error "mutual recursive" in - CT_fix_decl - (CT_fix_rec_list (strip_mutrec lm, List.map strip_mutrec lmi)) - | VernacCoFixpoint ([],boxed) -> xlate_error "mutual corecursive" - | VernacCoFixpoint ((lm :: lmi),boxed) -> - let strip_mutcorec (((_,fid), bl, arf, ardef), _ntn) = - CT_cofix_rec (xlate_ident fid, xlate_binder_list bl, - xlate_formula arf, xlate_formula ardef) in - CT_cofix_decl - (CT_cofix_rec_list (strip_mutcorec lm, List.map strip_mutcorec lmi)) - | VernacScheme [] -> xlate_error "induction scheme" - | VernacScheme (lm :: lmi) -> - let strip_ind = function - | (Some (_,id), InductionScheme (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) - | (None, InductionScheme (depstr, inde, sort)) -> - CT_scheme_spec - (xlate_ident (id_of_string ""), xlate_dep depstr, - CT_coerce_ID_to_FORMULA (loc_qualid_to_ct_ID inde), - xlate_sort sort) - | (_, EqualityScheme _) -> xlate_error "TODO: Scheme Equality" in - CT_ind_scheme - (CT_scheme_spec_list (strip_ind lm, List.map strip_ind lmi)) - | VernacCombinedScheme _ -> xlate_error "TODO: Combined Scheme" - | VernacSyntacticDefinition ((_,id), ([],c), false, _) -> - CT_syntax_macro (xlate_ident id, xlate_formula c, xlate_int_opt None) - | VernacSyntacticDefinition ((_,id), _, _, _) -> - xlate_error"TODO: Local abbreviations and abbreviations with parameters" - (* Modules and Module Types *) - | VernacInclude (_) -> xlate_error "TODO : Include " - | VernacDeclareModuleType((_, id), bl, mty_o) -> - CT_module_type_decl(xlate_ident id, - xlate_module_binder_list bl, - match mty_o with - None -> - CT_coerce_ID_OPT_to_MODULE_TYPE_OPT - ctv_ID_OPT_NONE - | Some mty1 -> - CT_coerce_MODULE_TYPE_to_MODULE_TYPE_OPT - (xlate_module_type mty1)) - | VernacDefineModule(_,(_, id), bl, mty_o, mexpr_o) -> - CT_module(xlate_ident id, - xlate_module_binder_list bl, - xlate_module_type_check_opt mty_o, - match mexpr_o with - None -> CT_coerce_ID_OPT_to_MODULE_EXPR ctv_ID_OPT_NONE - | Some m -> xlate_module_expr m) - | VernacDeclareModule(_,(_, id), bl, mty_o) -> - CT_declare_module(xlate_ident id, - xlate_module_binder_list bl, - xlate_module_type_check_opt (Some mty_o), - CT_coerce_ID_OPT_to_MODULE_EXPR ctv_ID_OPT_NONE) - | VernacRequire (impexp, spec, id::idl) -> - let ct_impexp, ct_spec = get_require_flags impexp spec in - CT_require (ct_impexp, ct_spec, - CT_coerce_ID_NE_LIST_to_ID_NE_LIST_OR_STRING( - CT_id_ne_list(loc_qualid_to_ct_ID id, - List.map loc_qualid_to_ct_ID idl))) - | VernacRequire (_,_,[]) -> - xlate_error "Require should have at least one id argument" - | VernacRequireFrom (impexp, spec, filename) -> - let ct_impexp, ct_spec = get_require_flags impexp spec in - CT_require(ct_impexp, ct_spec, - CT_coerce_STRING_to_ID_NE_LIST_OR_STRING(CT_string filename)) - - | VernacOpenCloseScope(true, true, s) -> CT_local_open_scope(CT_ident s) - | VernacOpenCloseScope(false, true, s) -> CT_open_scope(CT_ident s) - | VernacOpenCloseScope(true, false, s) -> CT_local_close_scope(CT_ident s) - | VernacOpenCloseScope(false, false, s) -> CT_close_scope(CT_ident s) - | VernacArgumentsScope(true, qid, l) -> - CT_arguments_scope(loc_qualid_to_ct_ID qid, - CT_id_opt_list - (List.map - (fun x -> - match x with - None -> ctv_ID_OPT_NONE - | Some x -> ctf_ID_OPT_SOME(CT_ident x)) l)) - | VernacArgumentsScope(false, qid, l) -> - xlate_error "TODO: Arguments Scope Global" - | VernacDelimiters(s1,s2) -> CT_delim_scope(CT_ident s1, CT_ident s2) - | VernacBindScope(id, a::l) -> - let xlate_class_rawexpr = function - FunClass -> CT_ident "Funclass" | SortClass -> CT_ident "Sortclass" - | RefClass qid -> loc_qualid_to_ct_ID qid in - CT_bind_scope(CT_ident id, - CT_id_ne_list(xlate_class_rawexpr a, - List.map xlate_class_rawexpr l)) - | VernacBindScope(id, []) -> assert false - | VernacNotation(b, c, (s,modif_list), opt_scope) -> - let translated_s = CT_string s in - let formula = xlate_formula c in - let translated_modif_list = - CT_modifier_list(List.map xlate_syntax_modifier modif_list) in - let translated_scope = match opt_scope with - None -> ctv_ID_OPT_NONE - | Some x -> ctf_ID_OPT_SOME(CT_ident x) in - if b then - CT_local_define_notation - (translated_s, formula, translated_modif_list, translated_scope) - else - CT_define_notation(translated_s, formula, - translated_modif_list, translated_scope) - | VernacSyntaxExtension(b,(s,modif_list)) -> - let translated_s = CT_string s in - let translated_modif_list = - CT_modifier_list(List.map xlate_syntax_modifier modif_list) in - if b then - CT_local_reserve_notation(translated_s, translated_modif_list) - else - CT_reserve_notation(translated_s, translated_modif_list) - | VernacInfix (b,(str,modl),id, opt_scope) -> - let id1 = loc_qualid_to_ct_ID id in - let modl1 = CT_modifier_list(List.map xlate_syntax_modifier modl) in - let s = CT_string str in - let translated_scope = match opt_scope with - None -> ctv_ID_OPT_NONE - | Some x -> ctf_ID_OPT_SOME(CT_ident x) in - if b then - CT_local_infix(s, id1,modl1, translated_scope) - else - CT_infix(s, id1,modl1, translated_scope) - | 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 *) - | Global -> CT_coerce_NONE_to_LOCAL_OPT CT_none - | Local -> CT_local 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 *) - | Global -> CT_coerce_NONE_to_LOCAL_OPT CT_none - | Local -> CT_local in - CT_coercion (local_opt, id_opt, xlate_ident id1, - xlate_class id2, xlate_class id3) - - (* Type Classes *) - | VernacDeclareInstance _|VernacContext _| - VernacInstance (_, _, _, _, _) -> - xlate_error "TODO: Type Classes commands" - - | VernacResetName id -> CT_reset (xlate_ident (snd id)) - | VernacResetInitial -> CT_restore_state (CT_ident "Initial") - | VernacExtend (s, l) -> - CT_user_vernac - (CT_ident s, CT_varg_list (List.map coerce_genarg_to_VARG l)) - | VernacList((_, a)::l) -> - CT_coerce_COMMAND_LIST_to_COMMAND - (CT_command_list(xlate_vernac a, - List.map (fun (_, x) -> xlate_vernac x) l)) - | VernacList([]) -> assert false - | VernacNop -> CT_proof_no_op - | VernacComments l -> - CT_scomments(CT_scomment_content_list (List.map xlate_comment l)) - | VernacDeclareImplicits(true, id, opt_positions) -> - CT_implicits - (reference_to_ct_ID id, - match opt_positions with - None -> CT_coerce_NONE_to_ID_LIST_OPT CT_none - | Some l -> - CT_coerce_ID_LIST_to_ID_LIST_OPT - (CT_id_list - (List.map - (function ExplByPos (x,_), _, _ - -> xlate_error - "explication argument by rank is obsolete" - | ExplByName id, _, _ -> CT_ident (string_of_id id)) l))) - | VernacDeclareImplicits(false, id, opt_positions) -> - xlate_error "TODO: Implicit Arguments Global" - | VernacReserve((_,a)::l, f) -> - CT_reserve(CT_id_ne_list(xlate_ident a, - List.map (fun (_,x) -> xlate_ident x) l), - xlate_formula f) - | VernacReserve([], _) -> assert false - | VernacLocate(LocateTerm id) -> CT_locate(reference_to_ct_ID id) - | VernacLocate(LocateLibrary id) -> CT_locate_lib(reference_to_ct_ID id) - | VernacLocate(LocateModule _) -> xlate_error "TODO: Locate Module" - | VernacLocate(LocateFile s) -> CT_locate_file(CT_string s) - | VernacLocate(LocateNotation s) -> CT_locate_notation(CT_string s) - | VernacTime(v) -> CT_time(xlate_vernac v) - | VernacSetOption (Goptions.SecondaryTable ("Implicit", "Arguments"), BoolValue true)->CT_user_vernac (CT_ident "IMPLICIT_ARGS_ON", CT_varg_list[]) - |VernacExactProof f -> CT_proof(xlate_formula f) - | VernacSetOption (table, BoolValue true) -> - let table1 = - match table with - PrimaryTable(s) -> CT_coerce_ID_to_TABLE(CT_ident s) - | SecondaryTable(s1,s2) -> CT_table(CT_ident s1, CT_ident s2) - | TertiaryTable(s1,s2,s3) -> xlate_error "TODO: TertiaryTable" in - CT_set_option(table1) - | VernacSetOption (table, v) -> - let table1 = - match table with - PrimaryTable(s) -> CT_coerce_ID_to_TABLE(CT_ident s) - | SecondaryTable(s1,s2) -> CT_table(CT_ident s1, CT_ident s2) - | TertiaryTable(s1,s2,s3) -> xlate_error "TODO: TertiaryTable" in - let value = - match v with - | BoolValue _ -> assert false - | StringValue s -> - CT_coerce_STRING_to_SINGLE_OPTION_VALUE(CT_string s) - | IntValue n -> - CT_coerce_INT_to_SINGLE_OPTION_VALUE(CT_int n) in - CT_set_option_value(table1, value) - | VernacUnsetOption(table) -> - let table1 = - match table with - PrimaryTable(s) -> CT_coerce_ID_to_TABLE(CT_ident s) - | SecondaryTable(s1,s2) -> CT_table(CT_ident s1, CT_ident s2) - | TertiaryTable(s1,s2,s3) -> xlate_error "TODO: TertiaryTable" in - CT_unset_option(table1) - | VernacAddOption (table, l) -> - let values = - List.map - (function - | QualidRefValue x -> - CT_coerce_ID_to_ID_OR_STRING(loc_qualid_to_ct_ID x) - | StringRefValue x -> - CT_coerce_STRING_to_ID_OR_STRING(CT_string x)) l in - let fst, values1 = - match values with [] -> assert false | a::b -> (a,b) in - let table1 = - match table with - PrimaryTable(s) -> CT_coerce_ID_to_TABLE(CT_ident s) - | SecondaryTable(s1,s2) -> CT_table(CT_ident s1, CT_ident s2) - | TertiaryTable(s1,s2,s3) -> xlate_error "TODO: TertiaryTable" in - CT_set_option_value2(table1, CT_id_or_string_ne_list(fst, values1)) - | VernacImport(true, a::l) -> - CT_export_id(CT_id_ne_list(reference_to_ct_ID a, - List.map reference_to_ct_ID l)) - | VernacImport(false, a::l) -> - CT_import_id(CT_id_ne_list(reference_to_ct_ID a, - List.map reference_to_ct_ID l)) - | VernacImport(_, []) -> assert false - | VernacProof t -> CT_proof_with(xlate_tactic t) - | (VernacGlobalCheck _|VernacPrintOption _| - VernacMemOption (_, _)|VernacRemoveOption (_, _) - | VernacBack _ | VernacBacktrack _ |VernacBackTo _|VernacRestoreState _| VernacWriteState _| - VernacSolveExistential (_, _)|VernacCanonical _ | - VernacTacticNotation _ | VernacUndoTo _ | VernacRemoveName _) - -> xlate_error "TODO: vernac" -and level_to_ct_LEVEL = function - Conv_oracle.Opaque -> CT_Opaque - | Conv_oracle.Level n -> CT_Level (CT_int n) - | Conv_oracle.Expand -> CT_Expand;; - - -let rec xlate_vernac_list = - function - | 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";; |