added some utility methods

git-svn-id: https://projects.brucker.ch/su4sml/svn/infsec-import/trunk/src/su4sml@4460 3260e6d1-4efc-4170-b0a7-36055960796d
This commit is contained in:
Achim D. Brucker 2006-04-28 08:12:27 +00:00
parent 67ffc91aef
commit 0289211732
1 changed files with 39 additions and 0 deletions

View File

@ -548,4 +548,43 @@ fun thy_name_of (C as Class{thyname,...}) =
| NONE => error ("Primitive "^((string_of_path o name_of) P)^
" has no thyname"))
fun class_of name cl = hd (filter (fn a => if ((name_of a) = name)
then true else false ) cl )
fun parent_of C cl = (class_of (parent_name_of C) cl)
fun parents_of C cl = case parent_name_of C of
[] => []
| class => (if( class = (name_of OclAnyC) )
then [(name_of OclAnyC)]
else [class]@(parents_of (class_of class cl) cl))
fun operation_of cl fq_name =
let
val classname = (rev o tl o rev) fq_name
val operations = operations_of (class_of classname cl)
val name = (hd o rev) fq_name
in
SOME(hd (filter (fn a => if ((name_of_op a) = name)
then true else false ) operations ))
end
(* topological sort of class lists *)
fun topsort_cl cl =
let val OclAny_subcl = filter (fn a => (parent_name_of a) = (name_of OclAnyC)) cl
fun subclasses_of cl c = filter (fn a => (parent_name_of a = (name_of c))) cl
fun sub [] _ = []
| sub cl c = c :: (foldl (op@) [] (map (fn a => sub cl a)
(subclasses_of cl c)))
in
foldl (op@) [] (map (fn a => sub cl a) (OclAny_subcl))
end
end