X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Focaml%2Fcic_annotations%2FcicXPath.ml;h=f2cb0ed409e4316155ab5036b0f868bbde9eea32;hb=b1fb6b8e1767d775bc452303629e95941d142bea;hp=776d229afaf826ecfa4216157352e89516577d5b;hpb=5a92117eeff70048d29e91ba24e113155d956e1b;p=helm.git diff --git a/helm/ocaml/cic_annotations/cicXPath.ml b/helm/ocaml/cic_annotations/cicXPath.ml index 776d229af..f2cb0ed40 100644 --- a/helm/ocaml/cic_annotations/cicXPath.ml +++ b/helm/ocaml/cic_annotations/cicXPath.ml @@ -33,45 +33,109 @@ (* *) (******************************************************************************) -let get_annotation_from_term annterm = - let module C = Cic in - match annterm with - C.ARel (_,ann,_,_) -> ann - | C.AVar (_,ann,_) -> ann - | C.AMeta (_,ann,_) -> ann - | C.ASort (_,ann,_) -> ann - | C.AImplicit (_,ann) -> ann - | C.ACast (_,ann,_,_) -> ann - | C.AProd (_,ann,_,_,_) -> ann - | C.ALambda (_,ann,_,_,_) -> ann - | C.ALetIn (_,ann,_,_,_) -> ann - | C.AAppl (_,ann,_) -> ann - | C.AConst (_,ann,_,_) -> ann - | C.AAbst (_,ann,_) -> ann - | C.AMutInd (_,ann,_,_,_) -> ann - | C.AMutConstruct (_,ann,_,_,_,_)-> ann - | C.AMutCase (_,ann,_,_,_,_,_,_) -> ann - | C.AFix (_,ann,_,_) -> ann - | C.ACoFix (_,ann,_,_) -> ann -;; - -let get_annotation_from_obj annobj = - let module C = Cic in - match annobj with - C.ADefinition (_,ann,_,_,_,_) -> ann - | C.AAxiom (_,ann,_,_,_) -> ann - | C.AVariable (_,ann,_,_,_) -> ann - | C.ACurrentProof (_,ann,_,_,_,_) -> ann - | C.AInductiveDefinition (_,ann,_,_,_) -> ann +let get_annotation ids_to_annotations xpath = + try + Some (Hashtbl.find ids_to_annotations xpath) + with + Not_found -> None ;; -exception IdUnknown of string;; +exception MoreThanOneTargetFor of Cic.id;; -let get_annotation (annobj,ids_to_targets) xpath = - try - match Hashtbl.find ids_to_targets xpath with - Cic.Object annobj -> get_annotation_from_obj annobj - | Cic.Term annterm -> get_annotation_from_term annterm - with - Not_found -> raise (IdUnknown xpath) +(* creates a hashtable mapping each unique id to a node of the annotated +object *) +let get_ids_to_targets annobj = + let module C = Cic in + let ids_to_targets = Hashtbl.create 503 in + let set_target id target = + try + ignore (Hashtbl.find ids_to_targets id) ; + raise (MoreThanOneTargetFor id) + with + Not_found -> Hashtbl.add ids_to_targets id target + in + let rec add_target_term t = + match t with + C.ARel (id,_,_) + | C.AVar (id,_) + | C.AMeta (id,_,_) + | C.ASort (id,_) + | C.AImplicit id -> + set_target id (C.Term t) + | C.ACast (id,va,ty) -> + set_target id (C.Term t) ; + add_target_term va ; + add_target_term ty + | C.AProd (id,_,so,ta) + | C.ALambda (id,_,so,ta) + | C.ALetIn (id,_,so,ta) -> + set_target id (C.Term t) ; + add_target_term so ; + add_target_term ta + | C.AAppl (id,l) -> + set_target id (C.Term t) ; + List.iter add_target_term l + | C.AConst (id,_,_) + | C.AMutInd (id,_,_,_) + | C.AMutConstruct (id,_,_,_,_) -> + set_target id (C.Term t) + | C.AMutCase (id,_,_,_,ot,it,pl) -> + set_target id (C.Term t) ; + List.iter add_target_term (ot::it::pl) + | C.AFix (id,_,ifl) -> + set_target id (C.Term t) ; + List.iter + (function (_,_,ty,bo) -> + add_target_term ty ; + add_target_term bo + ) ifl + | C.ACoFix (id,_,cfl) -> + set_target id (C.Term t) ; + List.iter + (function (_,ty,bo) -> + add_target_term ty ; + add_target_term bo + ) cfl + in + let add_target_obj annobj = + match annobj with + C.ADefinition (id,_,bo,ty,_) -> + set_target id (C.Object annobj) ; + add_target_term bo ; + add_target_term ty + | C.AAxiom (id,_,ty,_) -> + set_target id (C.Object annobj) ; + add_target_term ty + | C.AVariable (id,_,None,ty) -> + set_target id (C.Object annobj) ; + add_target_term ty + | C.AVariable (id,_,Some bo,ty) -> + set_target id (C.Object annobj) ; + add_target_term bo ; + add_target_term ty + | C.ACurrentProof (id,_,cl,bo,ty) -> + set_target id (C.Object annobj) ; + List.iter (function (cid,_,context, t) as annconj -> + set_target cid (C.Conjecture annconj) ; + List.iter + (function ((hid,h) as annhyp) -> + set_target hid (C.Hypothesis annhyp) ; + match h with + Some (_,C.ADecl at) -> add_target_term at + | Some (_,C.ADef at) -> add_target_term at + | None -> () + ) context; + add_target_term t) cl ; + add_target_term bo ; + add_target_term ty + | C.AInductiveDefinition (id,itl,_,_) -> + set_target id (C.Object annobj) ; + List.iter + (function (_,_,arity,cl) -> + add_target_term arity ; + List.iter (function (_,ty,_) -> add_target_term ty) cl + ) itl + in + add_target_obj annobj ; + ids_to_targets ;;