X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Focaml%2Fcic_notation%2FcicNotationUtil.ml;h=4dbc83f9eb7d4ffd275fd0be51b7f0bdacd0e2d0;hb=34113d572c334c351ba66f4b05db503eed4d48f2;hp=964c303ee91dbc27d646c191197a71b7193bfe77;hpb=3d63cb9ed38f05c679fc3284a5b3bb4d92e52296;p=helm.git diff --git a/helm/ocaml/cic_notation/cicNotationUtil.ml b/helm/ocaml/cic_notation/cicNotationUtil.ml index 964c303ee..4dbc83f9e 100644 --- a/helm/ocaml/cic_notation/cicNotationUtil.ml +++ b/helm/ocaml/cic_notation/cicNotationUtil.ml @@ -100,7 +100,6 @@ let fresh_name = let visit_ast ?(special_k = fun _ -> assert false) k = let rec aux = function - | Appl terms -> Appl (List.map k terms) | Binder (kind, var, body) -> Binder (kind, aux_capture_variable var, k body) @@ -117,13 +116,11 @@ let visit_ast ?(special_k = fun _ -> assert false) k = | Ident (name, Some substs) -> Ident (name, Some (aux_substs substs)) | Uri (name, Some substs) -> Uri (name, Some (aux_substs substs)) | Meta (index, substs) -> Meta (index, List.map aux_opt substs) - | (AttributedTerm _ | Layout _ | Literal _ | Magic _ | Variable _) as t -> special_k t - | (Ident _ | Implicit | Num _ @@ -131,24 +128,16 @@ let visit_ast ?(special_k = fun _ -> assert false) k = | Symbol _ | Uri _ | UserInput) as t -> t - and aux_opt = function | 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 ((head, vars), term) = ((head, List.map aux_capture_variable vars), k term) - and aux_subst (name, term) = (name, k term) - and aux_substs substs = List.map aux_subst substs - in - aux let visit_layout k = function @@ -161,15 +150,18 @@ let visit_layout k = function | Frac (t1, t2) -> Frac (k t1, k t2) | Sqrt t -> Sqrt (k t) | Root (arg, index) -> Root (k arg, k index) -(* | Break -> Break *) + | Break -> Break | Box (kind, terms) -> Box (kind, List.map k terms) + | Group terms -> Group (List.map k terms) let visit_magic k = function | List0 (t, l) -> List0 (k t, l) - | List1 (t, l) -> List1 (k t, l ) + | List1 (t, l) -> List1 (k t, l) | Opt t -> Opt (k t) | Fold (kind, t1, names, t2) -> Fold (kind, k t1, names, k t2) | Default (t1, t2) -> Default (k t1, k t2) + | If (t1, t2, t3) -> If (k t1, k t2, k t3) + | Fail -> Fail let variables_of_term t = let rec vars = ref [] in @@ -205,6 +197,23 @@ let names_of_term t = in List.map aux (variables_of_term t) +let keywords_of_term t = + let rec keywords = ref [] in + let add_keyword k = keywords := k :: !keywords in + let rec aux = function + | AttributedTerm (_, t) -> aux t + | Layout l -> Layout (visit_layout aux l) + | Literal (`Keyword k) as t -> + add_keyword k; + t + | Literal _ as t -> t + | Magic m -> Magic (visit_magic aux m) + | Variable _ as v -> v + | t -> visit_ast aux t + in + ignore (aux t) ; + !keywords + let rec strip_attributes t = let special_k = function | AttributedTerm (_, term) -> strip_attributes term @@ -275,6 +284,11 @@ let meta_names_of_term term = | Fold (_, t1, _, t2) -> aux t1 ; aux t2 + | If (t1, t2, t3) -> + aux t1 ; + aux t2 ; + aux t3 + | Fail -> () | _ -> assert false in aux term ; @@ -311,3 +325,43 @@ let boxify = function | [ a ] -> a | l -> Layout (Box ((H, false, false), l)) +let group = function + | [ a ] -> a + | l -> Layout (Group l) + +let ungroup = + let rec aux acc = + function + [] -> List.rev acc + | Layout (Group terms) :: terms' -> aux acc (terms @ terms') + | term :: terms -> aux (term :: acc) terms + in + aux [] + +let dress sauce = + let rec aux = + function + | [] -> [] + | [hd] -> [hd] + | hd :: tl -> hd :: sauce :: aux tl + in + aux + +let find_appl_pattern_uris ap = + let rec aux acc = + function + | GrafiteAst.UriPattern uri -> + (try + ignore (List.find (fun uri' -> UriManager.eq uri uri') acc); + acc + with Not_found -> uri :: acc) + | GrafiteAst.VarPattern _ -> acc + | GrafiteAst.ApplPattern apl -> List.fold_left aux acc apl + in + aux [] ap + +let rec find_branch = + function + Magic (If (_, Magic Fail, t)) -> find_branch t + | Magic (If (_, t, _)) -> find_branch t + | t -> t