AS.hs revision 544989bc1f6ed4bc0813334ffd934db0fb0010ea
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaederModule : $Header$
e6d40133bc9f858308654afb1262b8b483ec5922Till MossakowskiCopyright : (c) C. Maeder, Felix Gabriel Mance
1549f3abf73c1122acff724f718b615c82fa3648Till MossakowskiLicense : GPLv2 or higher, see LICENSE.txt
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaederMaintainer : Christian.Maeder@dfki.de
3f69b6948966979163bdfe8331c38833d5d90ecdChristian MaederStability : provisional
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaederPortability : portable
f3a94a197960e548ecd6520bb768cb0d547457bbChristian MaederOWL 2 Functional Syntax constructs
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder <http://www.w3.org/TR/2009/REC-owl2-syntax-20091027/#Functional-Style_Syntax>
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder <http://www.w3.org/TR/owl2-manchester-syntax/>
23a00c966f2aa8da525d7a7c51933c99964426c0Christian Maederimport Data.Char (intToDigit)
db453fe9625a9dab5d108f7a5e464598814144b8Jian Chun Wangimport qualified Data.Map as Map
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maederdata IRIType = Full | Abbreviated | NodeID
575a55eadc8dcab8ee350324b417cbd9e52e69c0Christian Maeder deriving (Show, Eq, Ord)
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder{- | full or abbreviated IRIs with a possible uri for the prefix
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski or a local part following a hash sign -}
aea143fff7a50aceb809845fbc42698b0b3f545aChristian Maederdata QName = QN
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder { namePrefix :: String
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder -- ^ the name prefix part of a qualified name \"namePrefix:localPart\"
90c174bac60a72ffd81bc3bf5ae2dd9a61943b8bChristian Maeder , localPart :: String
2561b4bfc45d280ee2be8a7870314670e4e682e4Christian Maeder -- ^ the local part of a qualified name \"namePrefix:localPart\"
ca020e82eb3567e7bdbb1cf70729efbd07e9caa4Klaus Luettich , iriType :: IRIType
aea143fff7a50aceb809845fbc42698b0b3f545aChristian Maeder , expandedIRI :: String
ca020e82eb3567e7bdbb1cf70729efbd07e9caa4Klaus Luettich -- ^ the associated namespace uri (not printed)
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder , iriPos :: Range
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder } deriving Show
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maederinstance Eq QName where
c7e03d0708369f944b6f235057b39142a21599f2Mihai Codescu p == q = compare p q == EQ
986d3f255182539098a97ac86da9eeee5b7a72e3Christian Maederinstance Ord QName where
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder compare (QN p1 l1 b1 n1 _) (QN p2 l2 b2 n2 _) =
8e80792f474d154ff11762fac081a422e34f1accChristian Maeder if null n1 || null n2 then compare (b1, p1, l1) (b2, p2, l2) else
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder compare n1 n2 -- compare fully expanded names only
03136b84a0c70d877e227444f0875e209506b9e4Christian Maederinstance GetRange QName where
9ecf13b5fd914bc7272f1fc17348d7f4a8c77061Christian Maeder getRange = iriPos
03136b84a0c70d877e227444f0875e209506b9e4Christian MaedershowQN :: QName -> String
d0c66a832d7b556e20ea4af4852cdc27a5463d51Christian MaedershowQN q = (if iriType q /= Abbreviated then showQI else showQU) q
9eb39c7a0e7a1ddad1eec1d23c6d4e3a99c54023Christian Maeder-- | show QName as abbreviated iri
9eb39c7a0e7a1ddad1eec1d23c6d4e3a99c54023Christian MaedershowQU :: QName -> String
9eb39c7a0e7a1ddad1eec1d23c6d4e3a99c54023Christian MaedershowQU (QN pre local _ _ _) =
9eb39c7a0e7a1ddad1eec1d23c6d4e3a99c54023Christian Maeder if null pre then local else pre ++ ":" ++ local
9eb39c7a0e7a1ddad1eec1d23c6d4e3a99c54023Christian Maeder-- | show QName in ankle brackets as full iris
9eb39c7a0e7a1ddad1eec1d23c6d4e3a99c54023Christian MaedershowQI :: QName -> String
9eb39c7a0e7a1ddad1eec1d23c6d4e3a99c54023Christian MaedershowQI = ('<' :) . (++ ">") . showQU
351145cfe8c03b4d47133c96b209f2bd6cfbf504Christian MaedernullQName :: QName
81101b83a042f5a1bdeeef93b1b49aff05817e44Christian MaedernullQName = QN "" "" Abbreviated "" nullRange
81101b83a042f5a1bdeeef93b1b49aff05817e44Christian MaederisNullQName :: QName -> Bool
81101b83a042f5a1bdeeef93b1b49aff05817e44Christian MaederisNullQName qn = case qn of
351145cfe8c03b4d47133c96b209f2bd6cfbf504Christian Maeder QN "" "" _ "" _ -> True
81101b83a042f5a1bdeeef93b1b49aff05817e44Christian MaederdummyQName :: QName
81101b83a042f5a1bdeeef93b1b49aff05817e44Christian Maeder QN "http" "//www.dfki.de/sks/hets/ontology/unamed" Full "" nullRange
351145cfe8c03b4d47133c96b209f2bd6cfbf504Christian MaedermkQName :: String -> QName
81101b83a042f5a1bdeeef93b1b49aff05817e44Christian MaedermkQName s = nullQName { localPart = s }
81101b83a042f5a1bdeeef93b1b49aff05817e44Christian MaedersetQRange :: Range -> QName -> QName
81101b83a042f5a1bdeeef93b1b49aff05817e44Christian MaedersetQRange r q = q { iriPos = r }
9eb39c7a0e7a1ddad1eec1d23c6d4e3a99c54023Christian MaedersetPrefix :: String -> QName -> QName
d0c66a832d7b556e20ea4af4852cdc27a5463d51Christian MaedersetPrefix s q = q { namePrefix = s }
9ecf13b5fd914bc7272f1fc17348d7f4a8c77061Christian MaedersetFull :: QName -> QName
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaedersetFull q = q {iriType = Full}
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maedertype IRI = QName
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maeder-- | checks if an IRI is an anonymous individual
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian MaederisAnonymous :: IRI -> Bool
03136b84a0c70d877e227444f0875e209506b9e4Christian MaederisAnonymous iri = iriType iri == NodeID
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maeder-- | checks if a string (bound to be localPart of an IRI) contains \":\/\/\"
9ecf13b5fd914bc7272f1fc17348d7f4a8c77061Christian MaedercssIRI :: String -> IRIType
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian MaedercssIRI iri = if isInfixOf "://" iri then Full else Abbreviated
9ecf13b5fd914bc7272f1fc17348d7f4a8c77061Christian Maeder-- | prefix -> localname
03136b84a0c70d877e227444f0875e209506b9e4Christian Maedertype PrefixMap = Map.Map String String
03136b84a0c70d877e227444f0875e209506b9e4Christian MaederpredefPrefixes :: PrefixMap
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian MaederpredefPrefixes = Map.fromList
9ecf13b5fd914bc7272f1fc17348d7f4a8c77061Christian Maeder [ ("owl", "http://www.w3.org/2002/07/owl#")
9ecf13b5fd914bc7272f1fc17348d7f4a8c77061Christian Maeder , ("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#")
6a22b2854c3bc9cb4877cb7d29049d6559238639Christian Maeder , ("rdfs", "http://www.w3.org/2000/01/rdf-schema#")
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder , ("xsd", "http://www.w3.org/2001/XMLSchema#")
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian Maeder , ("", showQU dummyQName ++ "#") ]
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maedertype LexicalForm = String
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowskitype LanguageTag = String
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowskitype ImportIRI = IRI
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowskitype OntologyIRI = IRI
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maedertype Class = IRI
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maedertype Datatype = IRI
03136b84a0c70d877e227444f0875e209506b9e4Christian Maedertype ObjectProperty = IRI
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maedertype DataProperty = IRI
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian Maedertype AnnotationProperty = IRI
9ecf13b5fd914bc7272f1fc17348d7f4a8c77061Christian Maedertype NamedIndividual = IRI
9ecf13b5fd914bc7272f1fc17348d7f4a8c77061Christian Maedertype Individual = IRI
03136b84a0c70d877e227444f0875e209506b9e4Christian Maederdata EquivOrDisjoint = Equivalent | Disjoint
26d11a256b1433604a3dbc69913b520fff7586acChristian Maeder deriving (Show, Eq, Ord)
03136b84a0c70d877e227444f0875e209506b9e4Christian MaedershowEquivOrDisjoint :: EquivOrDisjoint -> String
03136b84a0c70d877e227444f0875e209506b9e4Christian MaedershowEquivOrDisjoint ed = case ed of
9ecf13b5fd914bc7272f1fc17348d7f4a8c77061Christian Maeder Equivalent -> equivalentToC
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder Disjoint -> disjointWithC
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maederdata DomainOrRange = ADomain | ARange
aea143fff7a50aceb809845fbc42698b0b3f545aChristian Maeder deriving (Show, Eq, Ord)
aea143fff7a50aceb809845fbc42698b0b3f545aChristian MaedershowDomainOrRange :: DomainOrRange -> String
aea143fff7a50aceb809845fbc42698b0b3f545aChristian MaedershowDomainOrRange dr = case dr of
aea143fff7a50aceb809845fbc42698b0b3f545aChristian Maeder ADomain -> domainC
6a22b2854c3bc9cb4877cb7d29049d6559238639Christian Maeder ARange -> rangeC
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maederdata SameOrDifferent = Same | Different
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian Maeder deriving (Show, Eq, Ord)
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaedershowSameOrDifferent :: SameOrDifferent -> String
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian MaedershowSameOrDifferent sd = case sd of
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder Same -> sameAsC
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian Maeder Different -> differentFromC
03136b84a0c70d877e227444f0875e209506b9e4Christian Maederdata Relation =
aea143fff7a50aceb809845fbc42698b0b3f545aChristian Maeder EDRelation EquivOrDisjoint
5e46b572ed576c0494768998b043d9d340594122Till Mossakowski | SubPropertyOf
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder | DRRelation DomainOrRange
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder | SDRelation SameOrDifferent
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder deriving (Show, Eq, Ord)
03136b84a0c70d877e227444f0875e209506b9e4Christian MaedershowRelation :: Relation -> String
03136b84a0c70d877e227444f0875e209506b9e4Christian MaedershowRelation r = case r of
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder EDRelation ed -> showEquivOrDisjoint ed
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder SubPropertyOf -> subPropertyOfC
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian Maeder InverseOf -> inverseOfC
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian Maeder SubClass -> subClassOfC
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian Maeder Types -> typesC
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian Maeder DRRelation dr -> showDomainOrRange dr
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian Maeder SDRelation sd -> showSameOrDifferent sd
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian MaedergetED :: Relation -> EquivOrDisjoint
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian MaedergetED r = case r of
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski EDRelation ed -> ed
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski _ -> error "not domain or range"
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian MaedergetDR :: Relation -> DomainOrRange
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian MaedergetDR r = case r of
ee152ae82dc19d6415119c0019ae1bfa991b1f02Christian Maeder DRRelation dr -> dr
ee152ae82dc19d6415119c0019ae1bfa991b1f02Christian Maeder _ -> error "not domain or range"
ee152ae82dc19d6415119c0019ae1bfa991b1f02Christian MaedergetSD :: Relation -> SameOrDifferent
ee152ae82dc19d6415119c0019ae1bfa991b1f02Christian MaedergetSD s = case s of
ee152ae82dc19d6415119c0019ae1bfa991b1f02Christian Maeder SDRelation sd -> sd
ee152ae82dc19d6415119c0019ae1bfa991b1f02Christian Maeder _ -> error "not same or different"
ee152ae82dc19d6415119c0019ae1bfa991b1f02Christian Maederdata Character =
ee152ae82dc19d6415119c0019ae1bfa991b1f02Christian Maeder | InverseFunctional
ee152ae82dc19d6415119c0019ae1bfa991b1f02Christian Maeder | Irreflexive
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder | Antisymmetric
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder deriving (Enum, Bounded, Show, Eq, Ord)
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowskidata PositiveOrNegative = Positive | Negative
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian Maeder deriving (Show, Eq, Ord)
99476ac2689c74251219db4782e57fe713a24a52Christian Maederdata QuantifierType = AllValuesFrom | SomeValuesFrom
99476ac2689c74251219db4782e57fe713a24a52Christian Maeder deriving (Show, Eq, Ord)
99476ac2689c74251219db4782e57fe713a24a52Christian MaedershowQuantifierType :: QuantifierType -> String
99476ac2689c74251219db4782e57fe713a24a52Christian MaedershowQuantifierType ty = case ty of
99476ac2689c74251219db4782e57fe713a24a52Christian Maeder AllValuesFrom -> onlyS
99476ac2689c74251219db4782e57fe713a24a52Christian Maeder SomeValuesFrom -> someS
99476ac2689c74251219db4782e57fe713a24a52Christian Maeder-- * Predefined IRI checkings
ee152ae82dc19d6415119c0019ae1bfa991b1f02Christian MaederisThing :: IRI -> Bool
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian MaederisThing = isOWLPredef predefClass
88124ca824f94153b0a2a24ea1e4b089fff7011fChristian MaederisPredefObjProp :: IRI -> Bool
88124ca824f94153b0a2a24ea1e4b089fff7011fChristian MaederisPredefObjProp = isOWLPredef predefObjProp
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian MaederisPredefDataProp :: IRI -> Bool
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian MaederisPredefDataProp = isOWLPredef predefDataProp
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian MaederisPredefAnnoProp :: IRI -> Bool
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian MaederisPredefAnnoProp iri = isOWLPredef predefOWLAnnoProps iri
88124ca824f94153b0a2a24ea1e4b089fff7011fChristian Maeder || checkPredef predefRDFSAnnoProps "rdfs" iri
88124ca824f94153b0a2a24ea1e4b089fff7011fChristian MaederisPredefPropOrClass :: IRI -> Bool
88124ca824f94153b0a2a24ea1e4b089fff7011fChristian MaederisPredefPropOrClass iri = isPredefAnnoProp iri || isPredefDataProp iri
88124ca824f94153b0a2a24ea1e4b089fff7011fChristian Maeder || isPredefObjProp iri || isThing iri
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian MaederpredefIRIs :: [IRI]
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian MaederpredefIRIs = map (setPrefix "xsd" . mkQName) xsdKeys
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian Maeder ++ map (setPrefix "owl" . mkQName) owlNumbers
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder ++ [setPrefix "rdf" (mkQName rdfsLiteral),
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder setPrefix "rdfs" $ mkQName xmlLiteral]
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian MaederisDatatypeKey :: IRI -> Bool
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian MaederisDatatypeKey iri = any (\ (l, p) -> checkPredef l p iri) [(xsdKeys, "xsd"),
8c63cd89ef840cd7a3d3b75f0207dc800388c800Christian Maeder (owlNumbers, "owl"), ([xmlLiteral], "rdf"), ([rdfsLiteral], "rdfs")]
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaedercheckPredef :: [String] -> String -> IRI -> Bool
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill MossakowskicheckPredef sl pref u =
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder localPart u `elem` sl && elem (namePrefix u) ["", pref]
ee152ae82dc19d6415119c0019ae1bfa991b1f02Christian Maeder || showQU u `elem` map (Map.findWithDefault
ee152ae82dc19d6415119c0019ae1bfa991b1f02Christian Maeder (error $ "not predefined prefix: " ++ show pref)
ee152ae82dc19d6415119c0019ae1bfa991b1f02Christian Maeder pref (predefPrefixes `Map.difference`
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder Map.fromList [("", showQU dummyQName ++ "#")]) ++) sl
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill MossakowskiisOWLPredef :: [String] -> IRI -> Bool
03136b84a0c70d877e227444f0875e209506b9e4Christian MaederisOWLPredef sl = checkPredef sl "owl"
575a55eadc8dcab8ee350324b417cbd9e52e69c0Christian Maeder-- | sets the correct prefix for the predefined datatypes
575a55eadc8dcab8ee350324b417cbd9e52e69c0Christian MaedersetDatatypePrefix :: IRI -> IRI
03136b84a0c70d877e227444f0875e209506b9e4Christian MaedersetDatatypePrefix iri = let lp = localPart iri in
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder if lp `elem` xsdKeys
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder then setPrefix "xsd" iri
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder else if lp `elem` owlNumbers
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder then setPrefix "owl" iri
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder else case lp of
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder "XMLLiteral" -> setPrefix "rdf" iri
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder "Literal" -> setPrefix "rdfs" iri
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder _ -> error $ showQU iri ++ " is not a predefined datatype"
99476ac2689c74251219db4782e57fe713a24a52Christian Maeder-- | checks if the IRI is part of the built-in ones and puts the correct prefix
99476ac2689c74251219db4782e57fe713a24a52Christian MaedersetReservedPrefix :: IRI -> IRI
99476ac2689c74251219db4782e57fe713a24a52Christian MaedersetReservedPrefix iri
99476ac2689c74251219db4782e57fe713a24a52Christian Maeder | isDatatypeKey iri && null (namePrefix iri) = setDatatypePrefix iri
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder | (isThing iri || isPredefAnnoProp iri || isPredefDataProp iri
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder || isPredefObjProp iri) && null (namePrefix iri) = setPrefix "owl" iri
99476ac2689c74251219db4782e57fe713a24a52Christian Maeder | otherwise = iri
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian MaederstripReservedPrefix :: IRI -> IRI
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian MaederstripReservedPrefix = mkQName . getPredefName
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder{- | returns the name of the predefined IRI (e.g <xsd:string> returns "string"
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder or <http://www.w3.org/2002/07/owl#real> returns "real") -}
6a22b2854c3bc9cb4877cb7d29049d6559238639Christian MaedergetPredefName :: IRI -> String
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill MossakowskigetPredefName iri =
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder if namePrefix iri `elem` ["", "xsd", "rdf", "rdfs", "owl"]
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder then localPart iri
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder else case mapMaybe (flip stripPrefix $ showQU iri)
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder $ Map.elems predefPrefixes of
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian Maeder _ -> error $ showQU iri ++ " is not a predefined IRI"
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maederdata DatatypeCat = OWL2Number | OWL2String | OWL2Bool | Other
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder deriving (Show, Eq, Ord)
200849122a9c65773e5b2ba8084ac3490d0490b5Christian MaedergetDatatypeCat :: IRI -> DatatypeCat
9ecf13b5fd914bc7272f1fc17348d7f4a8c77061Christian MaedergetDatatypeCat iri = case isDatatypeKey iri of
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian Maeder | hasPrefXSD [booleanS] iri -> OWL2Bool
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder | hasPrefXSD xsdNumbers iri || checkPredef owlNumbers "owl" iri
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder -> OWL2Number
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder | hasPrefXSD xsdStrings iri -> OWL2String
6a22b2854c3bc9cb4877cb7d29049d6559238639Christian Maeder | otherwise -> Other
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder False -> Other
200849122a9c65773e5b2ba8084ac3490d0490b5Christian MaederhasPrefXSD :: [String] -> IRI -> Bool
200849122a9c65773e5b2ba8084ac3490d0490b5Christian MaederhasPrefXSD sl = checkPredef sl "xsd"
200849122a9c65773e5b2ba8084ac3490d0490b5Christian MaederfacetToIRI :: DatatypeFacet -> ConstrainingFacet
0b6f6d3eeb7b3b36292e60f1b3da5a5ce42eef1aChristian MaederfacetToIRI = setPrefix "xsd" . mkQName . showFacet
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder-- * Cardinalities
03136b84a0c70d877e227444f0875e209506b9e4Christian Maederdata CardinalityType = MinCardinality | MaxCardinality | ExactCardinality
9ecf13b5fd914bc7272f1fc17348d7f4a8c77061Christian Maeder deriving (Show, Eq, Ord)
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian MaedershowCardinalityType :: CardinalityType -> String
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian MaedershowCardinalityType ty = case ty of
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder MinCardinality -> minS
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder MaxCardinality -> maxS
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder ExactCardinality -> exactlyS
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maederdata Cardinality a b = Cardinality CardinalityType Int a (Maybe b)
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian Maeder deriving (Show, Eq, Ord)
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian Maederdata JunctionType = UnionOf | IntersectionOf
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder deriving (Show, Eq, Ord)
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maedertype ConstrainingFacet = IRI
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maedertype RestrictionValue = Literal
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maederdata Entity = Entity EntityType IRI deriving (Show, Eq, Ord)
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maederinstance GetRange Entity where
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder getRange (Entity _ iri) = iriPos iri
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maederdata EntityType =
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder | ObjectProperty
e82587ca2892d246aa4405c2f5b9f30f287f9ebfChristian Maeder | DataProperty
2561b4bfc45d280ee2be8a7870314670e4e682e4Christian Maeder | AnnotationProperty
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder | NamedIndividual
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder deriving (Enum, Bounded, Show, Read, Eq, Ord)
fa167e362877db231378e17ba49c66fbb84862fcChristian MaedershowEntityType :: EntityType -> String
fa167e362877db231378e17ba49c66fbb84862fcChristian MaedershowEntityType e = case e of
fa167e362877db231378e17ba49c66fbb84862fcChristian Maeder Datatype -> datatypeC
aea143fff7a50aceb809845fbc42698b0b3f545aChristian Maeder Class -> classC
aea143fff7a50aceb809845fbc42698b0b3f545aChristian Maeder ObjectProperty -> objectPropertyC
aea143fff7a50aceb809845fbc42698b0b3f545aChristian Maeder DataProperty -> dataPropertyC
aea143fff7a50aceb809845fbc42698b0b3f545aChristian Maeder AnnotationProperty -> annotationPropertyC
aea143fff7a50aceb809845fbc42698b0b3f545aChristian Maeder NamedIndividual -> individualC
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian MaederentityTypes :: [EntityType]
b10d6cef708b7a659f2d3b367e8e0db0d03ae3f5Till MossakowskientityTypes = [minBound .. maxBound]
d0c66a832d7b556e20ea4af4852cdc27a5463d51Christian MaedercutIRI :: Entity -> IRI
86b1d0c80abdd4ca36491cf7025b718a5fea5080Christian MaedercutIRI (Entity _ iri) = iri
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maederdata TypedOrUntyped = Typed Datatype | Untyped (Maybe LanguageTag)
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian Maeder deriving (Show, Eq, Ord)
9ecf13b5fd914bc7272f1fc17348d7f4a8c77061Christian Maederdata Literal = Literal LexicalForm TypedOrUntyped | NumberLit FloatLit
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian Maeder deriving (Show, Eq, Ord)
9ecf13b5fd914bc7272f1fc17348d7f4a8c77061Christian Maeder-- | non-negative integers given by the sequence of digits
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maederdata NNInt = NNInt [Int] deriving (Eq, Ord)
44d2a211a352759ee988ed8353026f5fa9511209Christian Maederinstance Show NNInt where
44d2a211a352759ee988ed8353026f5fa9511209Christian Maeder show (NNInt l) = map intToDigit l
9ecf13b5fd914bc7272f1fc17348d7f4a8c77061Christian MaederzeroNNInt :: NNInt
4fc727afa544a757d1959ce77c02208f8bf330dcChristian MaederzeroNNInt = NNInt []
9ecf13b5fd914bc7272f1fc17348d7f4a8c77061Christian MaederisZeroNNInt :: NNInt -> Bool
9ecf13b5fd914bc7272f1fc17348d7f4a8c77061Christian MaederisZeroNNInt (NNInt l) = null l
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maederdata IntLit = IntLit
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder { absInt :: NNInt
6a22b2854c3bc9cb4877cb7d29049d6559238639Christian Maeder , isNegInt :: Bool }
03136b84a0c70d877e227444f0875e209506b9e4Christian Maeder deriving (Eq, Ord)
4fc727afa544a757d1959ce77c02208f8bf330dcChristian Maederinstance Show IntLit where
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder show (IntLit n b) = (if b then ('-' :) else id) $ show n
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian MaederzeroInt :: IntLit
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian MaederzeroInt = IntLit zeroNNInt False
86b1d0c80abdd4ca36491cf7025b718a5fea5080Christian MaederisZeroInt :: IntLit -> Bool
86b1d0c80abdd4ca36491cf7025b718a5fea5080Christian MaederisZeroInt (IntLit n _) = isZeroNNInt n
86b1d0c80abdd4ca36491cf7025b718a5fea5080Christian MaedernegNNInt :: Bool -> NNInt -> IntLit
86b1d0c80abdd4ca36491cf7025b718a5fea5080Christian MaedernegNNInt b n = IntLit n b
86b1d0c80abdd4ca36491cf7025b718a5fea5080Christian MaedernegInt :: IntLit -> IntLit
86b1d0c80abdd4ca36491cf7025b718a5fea5080Christian MaedernegInt (IntLit n b) = IntLit n $ not b
74d9a385499bf903b24848dff450a153f525bda7Christian Maederdata DecLit = DecLit
5e46b572ed576c0494768998b043d9d340594122Till Mossakowski { truncDec :: IntLit
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder , fracDec :: NNInt }
88ece6e49930670e8fd3ee79c89a2e918d2fbd0cChristian Maeder deriving (Eq, Ord)
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maederinstance Show DecLit where
5e46b572ed576c0494768998b043d9d340594122Till Mossakowski show (DecLit t f) = show t
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder ++ if isZeroNNInt f then "" else
5e46b572ed576c0494768998b043d9d340594122Till MossakowskiisDecInt :: DecLit -> Bool
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian MaederisDecInt = isZeroNNInt . fracDec
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian MaedernegDec :: Bool -> DecLit -> DecLit
5e46b572ed576c0494768998b043d9d340594122Till MossakowskinegDec b (DecLit t f) = DecLit (if b then negInt t else t) f
22eea35d0effc6582b2951a28b5240fa7a82f3dfChristian Maederdata FloatLit = FloatLit
22eea35d0effc6582b2951a28b5240fa7a82f3dfChristian Maeder { floatBase :: DecLit
22eea35d0effc6582b2951a28b5240fa7a82f3dfChristian Maeder , floatExp :: IntLit }
22eea35d0effc6582b2951a28b5240fa7a82f3dfChristian Maeder deriving (Eq, Ord)
22eea35d0effc6582b2951a28b5240fa7a82f3dfChristian Maederinstance Show FloatLit where
22eea35d0effc6582b2951a28b5240fa7a82f3dfChristian Maeder show (FloatLit b e) = show b
22eea35d0effc6582b2951a28b5240fa7a82f3dfChristian Maeder ++ if isZeroInt e then "" else
22eea35d0effc6582b2951a28b5240fa7a82f3dfChristian Maeder 'E' : show e ++ "F"
22eea35d0effc6582b2951a28b5240fa7a82f3dfChristian MaederisFloatDec :: FloatLit -> Bool
22eea35d0effc6582b2951a28b5240fa7a82f3dfChristian MaederisFloatDec = isZeroInt . floatExp
22eea35d0effc6582b2951a28b5240fa7a82f3dfChristian MaederisFloatInt :: FloatLit -> Bool
22eea35d0effc6582b2951a28b5240fa7a82f3dfChristian MaederisFloatInt f = isFloatDec f && isDecInt (floatBase f)
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian MaederfloatToInt :: FloatLit -> IntLit
d058429727dd696a0327cdc28cadd268c34c36baChristian MaederfloatToInt = truncDec . floatBase
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian MaederintToDec :: IntLit -> DecLit
d058429727dd696a0327cdc28cadd268c34c36baChristian MaederintToDec i = DecLit i zeroNNInt
d058429727dd696a0327cdc28cadd268c34c36baChristian MaederdecToFloat :: DecLit -> FloatLit
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian MaederdecToFloat d = FloatLit d zeroInt
d058429727dd696a0327cdc28cadd268c34c36baChristian MaederintToFloat :: IntLit -> FloatLit
ebc51e8081f6f1fe2f3d39ceff81d8dd0169c0b0Christian MaederintToFloat = decToFloat . intToDec
329d1810c6d5a5a0827e1d07503d94431578d176Christian MaederabInt :: IntLit -> IntLit
5e46b572ed576c0494768998b043d9d340594122Till MossakowskiabInt int = int {isNegInt = False}
329d1810c6d5a5a0827e1d07503d94431578d176Christian MaederabDec :: DecLit -> DecLit
d058429727dd696a0327cdc28cadd268c34c36baChristian MaederabDec dec = dec {truncDec = abInt $ truncDec dec}
03136b84a0c70d877e227444f0875e209506b9e4Christian MaederabFloat :: FloatLit -> FloatLit
5a9a06d23910b9521e1d1cd39865ac7912ccee4bChristian MaederabFloat f = f {floatBase = abDec $ floatBase f}
9ecf13b5fd914bc7272f1fc17348d7f4a8c77061Christian MaederisNegDec :: DecLit -> Bool
d058429727dd696a0327cdc28cadd268c34c36baChristian MaederisNegDec d = isNegInt $ truncDec d
5e46b572ed576c0494768998b043d9d340594122Till MossakowskinumberName :: FloatLit -> String
9ecf13b5fd914bc7272f1fc17348d7f4a8c77061Christian Maeder | isFloatInt f = integerS
86b1d0c80abdd4ca36491cf7025b718a5fea5080Christian Maeder | isFloatDec f = decimalS
40d15f6c5f4d15866e085c588f8b5130dfd6cf63Christian Maeder | otherwise = floatS
40d15f6c5f4d15866e085c588f8b5130dfd6cf63Christian MaedercTypeS :: String
40d15f6c5f4d15866e085c588f8b5130dfd6cf63Christian Maeder-- * PROPERTY EXPRESSIONS
40d15f6c5f4d15866e085c588f8b5130dfd6cf63Christian Maedertype InverseObjectProperty = ObjectPropertyExpression
40d15f6c5f4d15866e085c588f8b5130dfd6cf63Christian Maederdata ObjectPropertyExpression = ObjectProp ObjectProperty
27b37f8e6b165f7abb653a54b45ffcdb81cec561Christian Maeder | ObjectInverseOf InverseObjectProperty
86b1d0c80abdd4ca36491cf7025b718a5fea5080Christian Maeder deriving (Show, Eq, Ord)
27b37f8e6b165f7abb653a54b45ffcdb81cec561Christian Maedertype DataPropertyExpression = DataProperty
27b37f8e6b165f7abb653a54b45ffcdb81cec561Christian Maeder-- * DATA RANGES
40d15f6c5f4d15866e085c588f8b5130dfd6cf63Christian Maederdata DataRange =
27b37f8e6b165f7abb653a54b45ffcdb81cec561Christian Maeder DataType Datatype [(ConstrainingFacet, RestrictionValue)]
27b37f8e6b165f7abb653a54b45ffcdb81cec561Christian Maeder | DataJunction JunctionType [DataRange]
27b37f8e6b165f7abb653a54b45ffcdb81cec561Christian Maeder | DataComplementOf DataRange
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski | DataOneOf [Literal]
32562a567baac248a00782d2727716c13117dc4aChristian Maeder deriving (Show, Eq, Ord)
32562a567baac248a00782d2727716c13117dc4aChristian Maeder-- * CLASS EXPERSSIONS
32562a567baac248a00782d2727716c13117dc4aChristian Maederdata ClassExpression =
32562a567baac248a00782d2727716c13117dc4aChristian Maeder Expression Class
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder | ObjectJunction JunctionType [ClassExpression]
4601edb679f0ba530bbb085b25d82a411cd070aaChristian Maeder | ObjectComplementOf ClassExpression
32562a567baac248a00782d2727716c13117dc4aChristian Maeder | ObjectOneOf [Individual]
32562a567baac248a00782d2727716c13117dc4aChristian Maeder | ObjectValuesFrom QuantifierType ObjectPropertyExpression ClassExpression
32562a567baac248a00782d2727716c13117dc4aChristian Maeder | ObjectHasValue ObjectPropertyExpression Individual
32562a567baac248a00782d2727716c13117dc4aChristian Maeder | ObjectHasSelf ObjectPropertyExpression
32562a567baac248a00782d2727716c13117dc4aChristian Maeder | ObjectCardinality (Cardinality ObjectPropertyExpression ClassExpression)
32562a567baac248a00782d2727716c13117dc4aChristian Maeder | DataValuesFrom QuantifierType DataPropertyExpression DataRange
746440cc1b984a852f5864235b8fa3930963a081Christian Maeder | DataHasValue DataPropertyExpression Literal
32562a567baac248a00782d2727716c13117dc4aChristian Maeder | DataCardinality (Cardinality DataPropertyExpression DataRange)
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian Maeder deriving (Show, Eq, Ord)
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maeder-- * ANNOTATIONS
e68f45f355ed9d4026ee9baff5aa75aa7c911cc2Christian Maederdata Annotation = Annotation [Annotation] AnnotationProperty AnnotationValue
e68f45f355ed9d4026ee9baff5aa75aa7c911cc2Christian Maeder deriving (Show, Eq, Ord)
9ecf13b5fd914bc7272f1fc17348d7f4a8c77061Christian Maederdata AnnotationValue =
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maeder | AnnValLit Literal
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maeder deriving (Show, Eq, Ord)