Rename.hs revision 9a46e7194fce1b73383479ba16f81e21c292722c
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak
fd9abdda70912b99b24e3bf1a38f26fde908a74cnd{- |
fd9abdda70912b99b24e3bf1a38f26fde908a74cndModule : $Header$
fd9abdda70912b99b24e3bf1a38f26fde908a74cndCopyright : (c) Felix Gabriel Mance
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakLicense : GPLv2 or higher, see LICENSE.txt
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakMaintainer : f.mance@jacobs-university.de
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakStability : provisional
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakPortability : portable
96ad5d81ee4a2cc66a4ae19893efc8aa6d06fae7jailletc
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakRenames prefixes in OntologyDocuments, so that there are
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakno prefix clashes
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen-}
2e545ce2450a9953665f701bb05350f0d3f26275nd
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowenmodule OWL2.Rename where
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakimport OWL2.AS
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakimport OWL2.MS
af33a4994ae2ff15bc67d19ff1a7feb906745bf8rbowenimport OWL2.Sign
3f08db06526d6901aa08c110b5bc7dde6bc39905ndimport OWL2.Function
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakimport Data.Maybe
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakimport Data.Char (isDigit)
3f08db06526d6901aa08c110b5bc7dde6bc39905ndimport Data.List (find, nub)
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakimport qualified Data.Map as Map
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakimport qualified Data.Set as Set
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak
c04f76acce77126cf88b09350e56ea8c6b4a064enilgunimport Common.Result
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak
91f378b5a10f2d83820902ed10ba7967a3920c18nilguntestAndInteg :: (String, String)
f086b4b402fa9a2fefc7dda85de2a3cc1cd0a654rjung -> (PrefixMap, StringMap) -> (PrefixMap, StringMap)
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniaktestAndInteg (pre, oiri) (old, tm) = case Map.lookup pre old of
4b575a6b6704b516f22d65a3ad35696d7b9ba372rpluem Just iri ->
4b575a6b6704b516f22d65a3ad35696d7b9ba372rpluem if oiri == iri then (old, tm)
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak else let pre' = disambiguateName pre old
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak in (Map.insert pre' oiri old, Map.insert pre pre' tm)
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak Nothing -> (Map.insert pre oiri old, tm)
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakdisambiguateName :: String -> PrefixMap -> String
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakdisambiguateName n nameMap =
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak let nm = if null n then "n" else n -- change other empty prefixes to "n..."
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak newname = reverse . dropWhile isDigit $ reverse nm
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak in fromJust $ find (not . flip Map.member nameMap)
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak [newname ++ show (i :: Int) | i <- [1 ..]]
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakuniteSign :: Sign -> Sign -> Result Sign
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakuniteSign s1 s2 = do
30471a4650391f57975f60bbb6e4a90be7b284bfhumbedooh let (pm, tm) = integPref (prefixMap s1) (prefixMap s2)
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak if Map.null tm then return (addSign s1 s2) {prefixMap = pm}
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak else fail "Static analysis could not unite signatures"
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakintersectSign :: Sign -> Sign -> Result Sign
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakintersectSign s1 s2 = do
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak let (pm, tm) = integPref (prefixMap s1) $ prefixMap s2
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak if Map.null tm then
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak return emptySign{
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak concepts = Set.intersection (concepts s1) $ concepts s2
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak , datatypes = Set.intersection (datatypes s1) $ datatypes s2
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak , objectProperties = Set.intersection (objectProperties s1) $ objectProperties s2
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak , dataProperties = Set.intersection (dataProperties s1) $ dataProperties s2
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak , annotationRoles = Set.empty
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak , individuals = Set.intersection (individuals s1) $ individuals s2
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak , labelMap = Map.empty
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak , prefixMap = pm
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak }
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak else fail "Static analysis could not intersect signatures"
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakintegPref :: PrefixMap -> PrefixMap
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak -> (PrefixMap, StringMap)
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakintegPref oldMap testMap =
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak foldr testAndInteg (oldMap, Map.empty) (Map.toList testMap)
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniaknewOid :: OntologyIRI -> OntologyIRI -> OntologyIRI
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniaknewOid id1 id2 =
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak let lid1 = localPart id1
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak lid2 = localPart id2
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak in if null lid1 then id2
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak else if null lid2 || id1 == id2 then id1
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak else id1 { localPart = uriToName lid1 ++ "_" ++ uriToName lid2 }
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakcombineDoc :: OntologyDocument -> OntologyDocument
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak -> OntologyDocument
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakcombineDoc od1@( OntologyDocument ns1
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak ( Ontology oid1 imp1 anno1 frames1))
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak od2@( OntologyDocument ns2
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak ( Ontology oid2 imp2 anno2 frames2)) =
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak if od1 == od2 then od1
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak else
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak let (newPref, tm) = integPref ns1 ns2
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak in OntologyDocument newPref
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak (Ontology (newOid oid1 oid2) (nub $ imp1 ++ map
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak (function Rename $ StringMap tm) imp2)
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak (nub $ anno1 ++ map (function Rename $ StringMap tm) anno2)
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak (nub $ frames1 ++ map (function Rename $ StringMap tm) frames2))
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakuriToName :: String -> String
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakuriToName str = let
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak str' = case str of
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak '"' : _ -> read str
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak _ -> str
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak in takeWhile (/= '.') $ reverse $ case takeWhile (/= '/') $ reverse str' of
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak '#' : r -> r
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak r -> r
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakunifyWith1 :: OntologyDocument -> [OntologyDocument] -> [OntologyDocument]
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakunifyWith1 d odl = case odl of
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak [] -> []
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak [doc] -> [snd $ unifyTwo d doc]
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak doc1 : docs ->
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak let (merged, newDoc1) = unifyTwo d doc1
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak in newDoc1 : unifyWith1 merged docs
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak{- | takes 2 docs and returns as snd the corrected first one
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak and as fst the merge of the two -}
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakunifyTwo :: OntologyDocument -> OntologyDocument ->
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak (OntologyDocument, OntologyDocument)
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakunifyTwo od1 od2 =
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak let (_, tm) = integPref (prefixDeclaration od1) (prefixDeclaration od2)
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak newod2 = function Rename (StringMap tm) od2
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak alld = combineDoc od1 od2
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak in (alld, newod2)
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakunifyDocs :: [OntologyDocument] -> [OntologyDocument]
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniakunifyDocs = unifyWith1 emptyOntologyDoc
5652dbe450e4fcfdf36d4cfb42d7f2345ded29a4maczniak