X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Facic_content%2FcicNotationUtil.ml;h=7eccd79017d309044abe9e35f17355b4d01872b4;hb=f9abd21eb0d26cf9b632af4df819225be4d091e3;hp=d4a55b353adf41221cd44958e294c6ef38ee59a9;hpb=bcf9a65332d321c25761207e2fb17110dbdc8241;p=helm.git diff --git a/helm/software/components/acic_content/cicNotationUtil.ml b/helm/software/components/acic_content/cicNotationUtil.ml index d4a55b353..7eccd7901 100644 --- a/helm/software/components/acic_content/cicNotationUtil.ml +++ b/helm/software/components/acic_content/cicNotationUtil.ml @@ -27,13 +27,19 @@ module Ast = CicNotationPt -let visit_ast ?(special_k = fun _ -> assert false) k = +let visit_ast ?(special_k = fun _ -> assert false) + ?(map_xref_option= fun x -> x) ?(map_case_indty= fun x -> x) + ?(map_case_outtype= + fun k x -> match x with None -> None | Some x -> Some (k x)) + k += let rec aux = function | Ast.Appl terms -> Ast.Appl (List.map k terms) | Ast.Binder (kind, var, body) -> Ast.Binder (kind, aux_capture_variable var, k body) | Ast.Case (term, indtype, typ, patterns) -> - Ast.Case (k term, indtype, aux_opt typ, aux_patterns patterns) + Ast.Case (k term, map_case_indty indtype, map_case_outtype k typ, + aux_patterns map_xref_option patterns) | Ast.Cast (t1, t2) -> Ast.Cast (k t1, k t2) | Ast.LetIn (var, t1, t3) -> Ast.LetIn (aux_capture_variable var, k t1, k t3) @@ -56,7 +62,9 @@ let visit_ast ?(special_k = fun _ -> assert false) k = | Ast.Magic _ | Ast.Variable _) as t -> special_k t | (Ast.Ident _ - | Ast.Implicit + | Ast.NRef _ + | Ast.NCic _ + | Ast.Implicit _ | Ast.Num _ | Ast.Sort _ | Ast.Symbol _ @@ -66,11 +74,11 @@ let visit_ast ?(special_k = fun _ -> assert false) k = | None -> None | Some term -> Some (k term) and aux_capture_variable (term, typ_opt) = k term, aux_opt typ_opt - and aux_patterns patterns = List.map aux_pattern patterns - and aux_pattern = + and aux_patterns k_xref patterns = List.map (aux_pattern k_xref) patterns + and aux_pattern k_xref = function Ast.Pattern (head, hrefs, vars), term -> - Ast.Pattern (head, hrefs, List.map aux_capture_variable vars), k term + Ast.Pattern (head, k_xref hrefs, List.map aux_capture_variable vars), k term | Ast.Wildcard, term -> Ast.Wildcard, k term and aux_subst (name, term) = (name, k term) and aux_substs substs = List.map aux_subst substs @@ -85,11 +93,15 @@ let visit_layout k = function | Ast.Over (t1, t2) -> Ast.Over (k t1, k t2) | Ast.Atop (t1, t2) -> Ast.Atop (k t1, k t2) | Ast.Frac (t1, t2) -> Ast.Frac (k t1, k t2) + | Ast.InfRule (t1, t2, t3) -> Ast.InfRule (k t1, k t2, k t3) | Ast.Sqrt t -> Ast.Sqrt (k t) | Ast.Root (arg, index) -> Ast.Root (k arg, k index) | Ast.Break -> Ast.Break | Ast.Box (kind, terms) -> Ast.Box (kind, List.map k terms) | Ast.Group terms -> Ast.Group (List.map k terms) + | Ast.Mstyle (l, term) -> Ast.Mstyle (l, List.map k term) + | Ast.Mpadded (l, term) -> Ast.Mpadded (l, List.map k term) + | Ast.Maction terms -> Ast.Maction (List.map k terms) let visit_magic k = function | Ast.List0 (t, l) -> Ast.List0 (k t, l) @@ -197,7 +209,7 @@ let meta_names_of_term term = | Ast.Ident (_, Some substs) -> aux_substs substs | Ast.Meta (_, substs) -> aux_meta_substs substs - | Ast.Implicit + | Ast.Implicit _ | Ast.Ident _ | Ast.Num _ | Ast.Sort _ @@ -316,13 +328,21 @@ let dressn ~sep:sauces = let find_appl_pattern_uris ap = let rec aux acc = function - | Ast.UriPattern uri -> uri :: acc + | Ast.UriPattern uri -> `Uri uri :: acc + | Ast.NRefPattern nref -> `NRef nref :: acc | Ast.ImplicitPattern | Ast.VarPattern _ -> acc | Ast.ApplPattern apl -> List.fold_left aux acc apl in let uris = aux [] ap in - HExtlib.list_uniq (List.fast_sort UriManager.compare uris) + let cmp u1 u2 = + match u1,u2 with + `Uri u1, `Uri u2 -> UriManager.compare u1 u2 + | `NRef r1, `NRef r2 -> NReference.compare r1 r2 + | `Uri _,`NRef _ -> -1 + | `NRef _, `Uri _ -> 1 + in + HExtlib.list_uniq (List.fast_sort cmp uris) let rec find_branch = function @@ -352,7 +372,8 @@ let fresh_id () = !fresh_index (* TODO ensure that names generated by fresh_var do not clash with user's *) -let fresh_name () = "fresh" ^ string_of_int (fresh_id ()) + (* FG: "η" is not an identifier (it is rendered, but not be parsed) *) +let fresh_name () = "eta" ^ string_of_int (fresh_id ()) let rec freshen_term ?(index = ref 0) term = let freshen_term = freshen_term ~index in @@ -386,11 +407,11 @@ let freshen_obj obj = indtypes in CicNotationPt.Inductive (freshen_capture_variables params, indtypes) - | CicNotationPt.Theorem (flav, n, t, ty_opt) -> + | CicNotationPt.Theorem (flav, n, t, ty_opt,p) -> let ty_opt = match ty_opt with None -> None | Some ty -> Some (freshen_term ty) in - CicNotationPt.Theorem (flav, n, freshen_term t, ty_opt) + CicNotationPt.Theorem (flav, n, freshen_term t, ty_opt,p) | CicNotationPt.Record (params, n, ty, fields) -> CicNotationPt.Record (freshen_capture_variables params, n, freshen_term ty, freshen_name_ty_b fields)