AS.hs revision 63946b0fc89de113d5bf4819f9c8cc5d6adce810
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder{-# LANGUAGE DeriveDataTypeable #-}
1549f3abf73c1122acff724f718b615c82fa3648Till MossakowskiModule : $Header$
97018cf5fa25b494adffd7e9b4e87320dae6bf47Christian MaederCopyright : (c) C. Maeder, Felix Gabriel Mance
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaederLicense : GPLv2 or higher, see LICENSE.txt
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaederMaintainer : Christian.Maeder@dfki.de
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaederStability : provisional
f3a94a197960e548ecd6520bb768cb0d547457bbChristian MaederPortability : portable
1549f3abf73c1122acff724f718b615c82fa3648Till MossakowskiOWL 2 Functional Syntax constructs
1549f3abf73c1122acff724f718b615c82fa3648Till Mossakowski <http://www.w3.org/TR/2009/REC-owl2-syntax-20091027/#Functional-Style_Syntax>
1549f3abf73c1122acff724f718b615c82fa3648Till Mossakowski <http://www.w3.org/TR/owl2-manchester-syntax/>
5e46b572ed576c0494768998b043d9d340594122Till Mossakowskiimport Data.Char (intToDigit)
575a55eadc8dcab8ee350324b417cbd9e52e69c0Christian Maederimport qualified Data.Map as Map
575a55eadc8dcab8ee350324b417cbd9e52e69c0Christian Maederimport qualified Data.Set as Set
575a55eadc8dcab8ee350324b417cbd9e52e69c0Christian Maederdata IRIType = Full | Abbreviated | NodeID
575a55eadc8dcab8ee350324b417cbd9e52e69c0Christian Maeder deriving (Show, Eq, Ord, Typeable, Data)
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder{- | full or abbreviated IRIs with a possible uri for the prefix
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski or a local part following a hash sign -}
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maederdata QName = QN
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder { namePrefix :: String
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder -- ^ the name prefix part of a qualified name \"namePrefix:localPart\"
ca020e82eb3567e7bdbb1cf70729efbd07e9caa4Klaus Luettich , localPart :: String
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder -- ^ the local part of a qualified name \"namePrefix:localPart\"
ca020e82eb3567e7bdbb1cf70729efbd07e9caa4Klaus Luettich , iriType :: IRIType
ca020e82eb3567e7bdbb1cf70729efbd07e9caa4Klaus Luettich , expandedIRI :: String
ca020e82eb3567e7bdbb1cf70729efbd07e9caa4Klaus Luettich -- ^ the associated namespace uri (not printed)
ca020e82eb3567e7bdbb1cf70729efbd07e9caa4Klaus Luettich , iriPos :: Range
ca020e82eb3567e7bdbb1cf70729efbd07e9caa4Klaus Luettich } deriving (Show, Typeable, Data)
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maederinstance Eq QName where
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski p == q = compare p q == EQ
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maederinstance Ord QName where
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder compare (QN p1 l1 b1 n1 _) (QN p2 l2 b2 n2 _) =
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maeder if null n1 || null n2 then compare (b1, p1, l1) (b2, p2, l2) else
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder compare n1 n2 -- compare fully expanded names only
b10d6cef708b7a659f2d3b367e8e0db0d03ae3f5Till MossakowskiqNameRange :: QName -> [Pos]
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaederqNameRange q = let Range rs = iriPos q in case rs of
26d11a256b1433604a3dbc69913b520fff7586acChristian Maeder p0 = if iriType q == Full then incSourceColumn p (-1) else p
26d11a256b1433604a3dbc69913b520fff7586acChristian Maeder in tokenRange $ Token (showQN q) $ Range [p0]
26d11a256b1433604a3dbc69913b520fff7586acChristian Maederinstance GetRange QName where
26d11a256b1433604a3dbc69913b520fff7586acChristian Maeder getRange = iriPos
26d11a256b1433604a3dbc69913b520fff7586acChristian Maeder rangeSpan = qNameRange
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian MaedershowQN :: QName -> String
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian MaedershowQN q = (if iriType q == Full then showQI else showQU) q
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian Maeder-- | show QName as abbreviated iri
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian MaedershowQU :: QName -> String
4fc727afa544a757d1959ce77c02208f8bf330dcChristian MaedershowQU (QN pre local _ _ _) =
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder if null pre then local else pre ++ ":" ++ local
5e46b572ed576c0494768998b043d9d340594122Till Mossakowski-- | show QName in angle brackets as full iris
5e46b572ed576c0494768998b043d9d340594122Till MossakowskishowQI :: QName -> String
5e46b572ed576c0494768998b043d9d340594122Till MossakowskishowQI n = '<' : showQU n ++ ">"
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian MaedernullQName :: QName
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian MaedernullQName = QN "" "" Abbreviated "" nullRange
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian MaederisNullQName :: QName -> Bool
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian MaederisNullQName qn = case qn of
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder QN "" "" _ "" _ -> True
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian MaederunamedS :: String
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill MossakowskiunamedS = "//www." ++ dnamedS
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill MossakowskidnamedS :: String
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill MossakowskidnamedS = "dfki.de/sks/hets/ontology/unamed"
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian MaederdummyQName :: QName
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian MaederdummyQName = QN "http" unamedS Full ("http:" ++ unamedS) nullRange
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian MaedermkQName :: String -> QName
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian MaedermkQName s = nullQName { localPart = s }
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian MaedersetQRange :: Range -> QName -> QName
4601edb679f0ba530bbb085b25d82a411cd070aaChristian MaedersetQRange r q = q { iriPos = r }
4601edb679f0ba530bbb085b25d82a411cd070aaChristian MaedersetPrefix :: String -> QName -> QName
4601edb679f0ba530bbb085b25d82a411cd070aaChristian MaedersetPrefix s q = q { namePrefix = s }
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian MaedersetFull :: QName -> QName
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaedersetFull q = q {iriType = Full}
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maedertype IRI = QName
4601edb679f0ba530bbb085b25d82a411cd070aaChristian Maeder-- | checks if an IRI is an anonymous individual
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaederisAnonymous :: IRI -> Bool
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaederisAnonymous iri = iriType iri == NodeID || namePrefix iri == "_"
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder-- | checks if a string (bound to be localPart of an IRI) contains \":\/\/\"
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaedercssIRI :: String -> IRIType
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaedercssIRI iri = if isInfixOf "://" iri then Full else Abbreviated
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder-- | prefix -> localname
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maedertype PrefixMap = Map.Map String String
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaederpredefPrefixes :: PrefixMap
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaederpredefPrefixes = Map.fromList
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder [ ("owl", "http://www.w3.org/2002/07/owl#")
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder , ("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#")
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder , ("rdfs", "http://www.w3.org/2000/01/rdf-schema#")
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder , ("xsd", "http://www.w3.org/2001/XMLSchema#")
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder , ("", showQU dummyQName ++ "#") ]
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maedertype LexicalForm = String
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maedertype LanguageTag = String
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maedertype ImportIRI = IRI
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maedertype OntologyIRI = IRI
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian Maedertype Class = IRI
5e46b572ed576c0494768998b043d9d340594122Till Mossakowskitype Datatype = IRI
612749008484b6773aedf4d6bbc85b8d074d15c6Christian Maedertype ObjectProperty = IRI
612749008484b6773aedf4d6bbc85b8d074d15c6Christian Maedertype DataProperty = IRI
5e46b572ed576c0494768998b043d9d340594122Till Mossakowskitype AnnotationProperty = IRI
1f086d5155f47fdad9a0de4e46bbebb2c4b33d30Christian Maedertype Individual = IRI
88ece6e49930670e8fd3ee79c89a2e918d2fbd0cChristian Maederdata EquivOrDisjoint = Equivalent | Disjoint
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder deriving (Show, Eq, Ord, Typeable, Data)
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian MaedershowEquivOrDisjoint :: EquivOrDisjoint -> String
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian MaedershowEquivOrDisjoint ed = case ed of
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder Equivalent -> equivalentToC
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder Disjoint -> disjointWithC
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maederdata DomainOrRange = ADomain | ARange
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder deriving (Show, Eq, Ord, Typeable, Data)
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill MossakowskishowDomainOrRange :: DomainOrRange -> String
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill MossakowskishowDomainOrRange dr = case dr of
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski ADomain -> domainC
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski ARange -> rangeC
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowskidata SameOrDifferent = Same | Different
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski deriving (Show, Eq, Ord, Typeable, Data)
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill MossakowskishowSameOrDifferent :: SameOrDifferent -> String
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill MossakowskishowSameOrDifferent sd = case sd of
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder Same -> sameAsC
575a55eadc8dcab8ee350324b417cbd9e52e69c0Christian Maeder Different -> differentFromC
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowskidata Relation =
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski EDRelation EquivOrDisjoint
26d11a256b1433604a3dbc69913b520fff7586acChristian Maeder | SubPropertyOf
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski | DRRelation DomainOrRange
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski | SDRelation SameOrDifferent
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski deriving (Show, Eq, Ord, Typeable, Data)
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaedershowRelation :: Relation -> String
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaedershowRelation r = case r of
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder EDRelation ed -> showEquivOrDisjoint ed
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski SubPropertyOf -> subPropertyOfC
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski InverseOf -> inverseOfC
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian Maeder SubClass -> subClassOfC
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski Types -> typesC
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder DRRelation dr -> showDomainOrRange dr
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski SDRelation sd -> showSameOrDifferent sd
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian MaedergetED :: Relation -> EquivOrDisjoint
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian MaedergetED r = case r of
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder EDRelation ed -> ed
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder _ -> error "not domain or range"
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian MaedergetDR :: Relation -> DomainOrRange
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian MaedergetDR r = case r of
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski DRRelation dr -> dr
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski _ -> error "not domain or range"
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian MaedergetSD :: Relation -> SameOrDifferent
575a55eadc8dcab8ee350324b417cbd9e52e69c0Christian MaedergetSD s = case s of
575a55eadc8dcab8ee350324b417cbd9e52e69c0Christian Maeder SDRelation sd -> sd
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder _ -> error "not same or different"
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maederdata Character =
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder | InverseFunctional
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder | Irreflexive
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder | Antisymmetric
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder deriving (Enum, Bounded, Show, Eq, Ord, Typeable, Data)
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maederdata PositiveOrNegative = Positive | Negative
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder deriving (Show, Eq, Ord, Typeable, Data)
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maederdata QuantifierType = AllValuesFrom | SomeValuesFrom
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder deriving (Show, Eq, Ord, Typeable, Data)
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian MaedershowQuantifierType :: QuantifierType -> String
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill MossakowskishowQuantifierType ty = case ty of
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder AllValuesFrom -> onlyS
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder SomeValuesFrom -> someS
200849122a9c65773e5b2ba8084ac3490d0490b5Christian Maeder-- * Predefined IRI checkings
200849122a9c65773e5b2ba8084ac3490d0490b5Christian MaederthingMap :: PreDefMaps
200849122a9c65773e5b2ba8084ac3490d0490b5Christian MaederthingMap = makeOWLPredefMaps predefClass
200849122a9c65773e5b2ba8084ac3490d0490b5Christian MaederisThing :: IRI -> Bool
200849122a9c65773e5b2ba8084ac3490d0490b5Christian MaederisThing = checkPredef thingMap
200849122a9c65773e5b2ba8084ac3490d0490b5Christian MaedermakePredefObjProp :: PreDefMaps
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian MaedermakePredefObjProp = makeOWLPredefMaps predefObjProp
200849122a9c65773e5b2ba8084ac3490d0490b5Christian MaederisPredefObjProp :: IRI -> Bool
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian MaederisPredefObjProp = checkPredef makePredefObjProp
0b6f6d3eeb7b3b36292e60f1b3da5a5ce42eef1aChristian MaedermakePredefDataProp :: PreDefMaps
200849122a9c65773e5b2ba8084ac3490d0490b5Christian MaedermakePredefDataProp = makeOWLPredefMaps predefDataProp
200849122a9c65773e5b2ba8084ac3490d0490b5Christian MaederisPredefDataProp :: IRI -> Bool
200849122a9c65773e5b2ba8084ac3490d0490b5Christian MaederisPredefDataProp = checkPredef makePredefDataProp
200849122a9c65773e5b2ba8084ac3490d0490b5Christian MaedermakePredefRDFSAnnoProp :: PreDefMaps
0b6f6d3eeb7b3b36292e60f1b3da5a5ce42eef1aChristian MaedermakePredefRDFSAnnoProp = preDefMaps predefRDFSAnnoProps "rdfs"
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian MaederisPredefRDFSAnnoProp :: IRI -> Bool
200849122a9c65773e5b2ba8084ac3490d0490b5Christian MaederisPredefRDFSAnnoProp = checkPredef makePredefRDFSAnnoProp
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill MossakowskimakePredefOWLAnnoProp :: PreDefMaps
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill MossakowskimakePredefOWLAnnoProp = makeOWLPredefMaps predefOWLAnnoProps
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian MaederisPredefOWLAnnoProp :: IRI -> Bool
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian MaederisPredefOWLAnnoProp = checkPredef makePredefOWLAnnoProp
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian MaederisPredefAnnoProp :: IRI -> Bool
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaederisPredefAnnoProp iri = isPredefOWLAnnoProp iri || isPredefRDFSAnnoProp iri
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian MaederisPredefPropOrClass :: IRI -> Bool
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian MaederisPredefPropOrClass iri = isPredefAnnoProp iri || isPredefDataProp iri
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian Maeder || isPredefObjProp iri || isThing iri
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian MaederpredefIRIs :: Set.Set IRI
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian MaederpredefIRIs = Set.fromList $ map (setPrefix "xsd" . mkQName) xsdKeys
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian Maeder ++ map (setPrefix "owl" . mkQName) owlNumbers
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder ++ map (setPrefix "rdf" . mkQName) [rdfsLiteral, stringS]
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder ++ [setPrefix "rdfs" $ mkQName xmlLiteral]
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian MaederisDatatypeKey :: IRI -> Bool
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian MaederisDatatypeKey = not . null . isDatatypeKeyAux
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian MaederxsdMap :: PreDefMaps
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian MaederxsdMap = makeXsdMap xsdKeys
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaederowlNumbersMap :: PreDefMaps
4b6aa93c12e4db86ccc7694a48a73e9cf7262d06Christian MaederowlNumbersMap = makeOWLPredefMaps owlNumbers
01aafb6a9520f05df5ff467b591ecb5474dcfc86Christian MaederrdfMap :: PreDefMaps
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian MaederrdfMap = preDefMaps [xmlLiteral, stringS] "rdf"
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian MaederrdfsMap :: PreDefMaps
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian MaederrdfsMap = preDefMaps [rdfsLiteral] "rdfs"
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian MaederisDatatypeKeyAux :: IRI -> [(String, String)]
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian MaederisDatatypeKeyAux iri = mapMaybe (`checkPredefAux` iri)
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder [ xsdMap, owlNumbersMap, rdfMap, rdfsMap ]
4601edb679f0ba530bbb085b25d82a411cd070aaChristian Maedertype PreDefMaps = ([String], String, String)
5e46b572ed576c0494768998b043d9d340594122Till MossakowskipreDefMaps :: [String] -> String -> PreDefMaps
4601edb679f0ba530bbb085b25d82a411cd070aaChristian MaederpreDefMaps sl pref = let
578b677874296e4ba48e57b5e4b4b0270d995603Christian Maeder Just puri = Map.lookup pref predefPrefixes
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder Just sp = stripPrefix "http://www.w3.org/" puri
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder in (sl, pref, sp)
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian MaedercheckPredefAux :: PreDefMaps -> IRI -> Maybe (String, String)
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian MaedercheckPredefAux (sl, pref, exPref) u = case expandedIRI u of
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian Maeder "" -> Nothing
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder _ -> let lp = localPart u in case namePrefix u of
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder "http" -> case stripPrefix "//www." lp of
e01299e9b22b96b31b720ca1e9f9f5f25af9b024Christian Maeder Just q -> case stripPrefix "w3.org/" q of
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder Just r -> case stripPrefix exPref r of
4fc727afa544a757d1959ce77c02208f8bf330dcChristian Maeder Just s | elem s sl -> Just (pref, s)
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian Maeder Nothing -> case stripPrefix (dnamedS ++ "#") q of
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian Maeder Just s | elem s sl -> Just (pref, s)
329d1810c6d5a5a0827e1d07503d94431578d176Christian Maeder Nothing -> Nothing
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian Maeder pu | elem pu ["", pref] && elem lp sl -> Just (pref, lp)
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian MaedercheckPredef :: PreDefMaps -> IRI -> Bool
4fc727afa544a757d1959ce77c02208f8bf330dcChristian MaedercheckPredef ms = isJust . checkPredefAux ms
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian MaedermakeOWLPredefMaps :: [String] -> PreDefMaps
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian MaedermakeOWLPredefMaps sl = preDefMaps sl "owl"
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder-- | sets the correct prefix for the predefined datatypes
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian MaedersetDatatypePrefix :: IRI -> IRI
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian MaedersetDatatypePrefix iri = case isDatatypeKeyAux iri of
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian Maeder (p, l) : _ -> setPrefix p $ mkQName l
4fc727afa544a757d1959ce77c02208f8bf330dcChristian Maeder _ -> error $ showQU iri ++ " is not a predefined datatype"
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder-- | checks if the IRI is part of the built-in ones and puts the correct prefix
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian MaedersetReservedPrefix :: IRI -> IRI
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian MaedersetReservedPrefix iri = case namePrefix iri of
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian Maeder | isDatatypeKey iri -> setDatatypePrefix iri
68138d26bcddf5e89c30206aa83ab5ec006d170dChristian Maeder | isThing iri || isPredefDataProp iri || isPredefOWLAnnoProp iri
4601edb679f0ba530bbb085b25d82a411cd070aaChristian Maeder || isPredefObjProp iri -> setPrefix "owl" iri
b1caf27fb0c879dd39600d09d501074a2dfd865aChristian Maeder | isPredefRDFSAnnoProp iri -> setPrefix "rdfs" iri
1f086d5155f47fdad9a0de4e46bbebb2c4b33d30Christian MaederstripReservedPrefix :: IRI -> IRI
5e46b572ed576c0494768998b043d9d340594122Till MossakowskistripReservedPrefix = mkQName . getPredefName
88ece6e49930670e8fd3ee79c89a2e918d2fbd0cChristian Maeder{- | returns the name of the predefined IRI (e.g <xsd:string> returns "string"
5e46b572ed576c0494768998b043d9d340594122Till Mossakowski or <http://www.w3.org/2002/07/owl#real> returns "real") -}
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian MaedergetPredefName :: IRI -> String
5e46b572ed576c0494768998b043d9d340594122Till MossakowskigetPredefName iri =
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder if namePrefix iri `elem` ["", "xsd", "rdf", "rdfs", "owl"]
5e46b572ed576c0494768998b043d9d340594122Till Mossakowski then localPart iri
5e46b572ed576c0494768998b043d9d340594122Till Mossakowski else case mapMaybe (`stripPrefix` showQU iri)
5e46b572ed576c0494768998b043d9d340594122Till Mossakowski $ Map.elems predefPrefixes of
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder _ -> showQN iri
5e46b572ed576c0494768998b043d9d340594122Till Mossakowski-- | Extracts Token from IRI
329d1810c6d5a5a0827e1d07503d94431578d176Christian MaederuriToTok :: IRI -> Token
5e46b572ed576c0494768998b043d9d340594122Till MossakowskiuriToTok urI = mkSimpleId $ getPredefName urI
329d1810c6d5a5a0827e1d07503d94431578d176Christian Maeder-- | Extracts Id from IRI
329d1810c6d5a5a0827e1d07503d94431578d176Christian MaederuriToId :: IRI -> Id
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian MaederuriToId = simpleIdToId . uriToTok
329d1810c6d5a5a0827e1d07503d94431578d176Christian Maeder-- | Extracts Id from Entities
329d1810c6d5a5a0827e1d07503d94431578d176Christian MaederentityToId :: Entity -> Id
329d1810c6d5a5a0827e1d07503d94431578d176Christian MaederentityToId = uriToId . cutIRI
329d1810c6d5a5a0827e1d07503d94431578d176Christian MaederprintDatatype :: IRI -> String
329d1810c6d5a5a0827e1d07503d94431578d176Christian MaederprintDatatype dt = showQU $
329d1810c6d5a5a0827e1d07503d94431578d176Christian Maeder if isDatatypeKey dt then stripReservedPrefix dt else dt
329d1810c6d5a5a0827e1d07503d94431578d176Christian Maederdata DatatypeCat = OWL2Number | OWL2String | OWL2Bool | Other
329d1810c6d5a5a0827e1d07503d94431578d176Christian Maeder deriving (Show, Eq, Ord, Typeable, Data)
329d1810c6d5a5a0827e1d07503d94431578d176Christian MaedergetDatatypeCat :: IRI -> DatatypeCat
329d1810c6d5a5a0827e1d07503d94431578d176Christian MaedergetDatatypeCat iri = case isDatatypeKey iri of
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder | checkPredef xsdBooleanMap iri -> OWL2Bool
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder | checkPredef xsdNumbersMap iri || checkPredef owlNumbersMap iri
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian Maeder -> OWL2Number
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder | checkPredef xsdStringsMap iri -> OWL2String
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder | otherwise -> Other
243b39800f5ea9033daca8ce5475531d114e1877Christian Maeder False -> Other
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian MaedermakeXsdMap :: [String] -> PreDefMaps
0e2ae85e2453466d03c1fc5884a3d693235bb9d9Christian MaedermakeXsdMap sl = preDefMaps sl "xsd"
746440cc1b984a852f5864235b8fa3930963a081Christian MaederxsdBooleanMap :: PreDefMaps
746440cc1b984a852f5864235b8fa3930963a081Christian MaederxsdBooleanMap = makeXsdMap [booleanS]
7a47fbe6b987bd69a5056ce5d00fc8710f6c5e8aChristian MaederxsdNumbersMap :: PreDefMaps
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian MaederxsdNumbersMap = makeXsdMap xsdNumbers
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian MaederxsdStringsMap :: PreDefMaps
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian MaederxsdStringsMap = makeXsdMap xsdStrings
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian MaederfacetToIRI :: DatatypeFacet -> ConstrainingFacet
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian MaederfacetToIRI = setPrefix "xsd" . mkQName . showFacet
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maeder-- * Cardinalities
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maederdata CardinalityType = MinCardinality | MaxCardinality | ExactCardinality
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maeder deriving (Show, Eq, Ord, Typeable, Data)
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian MaedershowCardinalityType :: CardinalityType -> String
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian MaedershowCardinalityType ty = case ty of
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maeder MinCardinality -> minS
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maeder MaxCardinality -> maxS
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maeder ExactCardinality -> exactlyS
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maederdata Cardinality a b = Cardinality CardinalityType Int a (Maybe b)
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maeder deriving (Show, Eq, Ord, Typeable, Data)
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maederdata JunctionType = UnionOf | IntersectionOf
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maeder deriving (Show, Eq, Ord, Typeable, Data)
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maedertype ConstrainingFacet = IRI
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maedertype RestrictionValue = Literal
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maederdata Entity = Entity
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maeder { label :: Maybe String
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maeder , entityKind :: EntityType
575a55eadc8dcab8ee350324b417cbd9e52e69c0Christian Maeder , cutIRI :: IRI }
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maeder deriving (Show, Typeable, Data)
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian MaedermkEntity :: EntityType -> IRI -> Entity
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian MaedermkEntity = Entity Nothing
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian MaedermkEntityLbl :: String -> EntityType -> IRI -> Entity
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian MaedermkEntityLbl = Entity . Just
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maederinstance Ord Entity where
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maeder compare (Entity _ ek1 ir1) (Entity _ ek2 ir2) = compare (ek1, ir1) (ek2, ir2)
575a55eadc8dcab8ee350324b417cbd9e52e69c0Christian Maederinstance Eq Entity where
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maeder e1 == e2 = compare e1 e2 == EQ
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maederinstance GetRange Entity where
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maeder getRange = iriPos . cutIRI
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maeder rangeSpan = qNameRange . cutIRI
746440cc1b984a852f5864235b8fa3930963a081Christian Maederdata EntityType =
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maeder | ObjectProperty
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maeder | DataProperty
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maeder | AnnotationProperty
d79a4d0d842c212f82f9507fff178ffe4ba2e214Christian Maeder | NamedIndividual
746440cc1b984a852f5864235b8fa3930963a081Christian Maeder deriving (Enum, Bounded, Show, Read, Eq, Ord, Typeable, Data)
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill MossakowskishowEntityType :: EntityType -> String
3b70d8ee5c2927f843d5d907e6ef724f867f1b40Till MossakowskishowEntityType e = case e of
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder Datatype -> datatypeC
a001917177db7ae636853b37c0d0f9f4e90a83ffChristian Maeder Class -> classC
3b70d8ee5c2927f843d5d907e6ef724f867f1b40Till Mossakowski ObjectProperty -> objectPropertyC
3b70d8ee5c2927f843d5d907e6ef724f867f1b40Till Mossakowski DataProperty -> dataPropertyC
3b70d8ee5c2927f843d5d907e6ef724f867f1b40Till Mossakowski AnnotationProperty -> annotationPropertyC
3b70d8ee5c2927f843d5d907e6ef724f867f1b40Till Mossakowski NamedIndividual -> individualC
ca732bc259f74cb4f3f725daab7fe80fc7e1d9a0Till MossakowskientityTypes :: [EntityType]
ca732bc259f74cb4f3f725daab7fe80fc7e1d9a0Till MossakowskientityTypes = [minBound .. maxBound]
ca732bc259f74cb4f3f725daab7fe80fc7e1d9a0Till MossakowskipairSymbols :: Entity -> Entity -> Result Entity -- TODO: improve!
ca732bc259f74cb4f3f725daab7fe80fc7e1d9a0Till MossakowskipairSymbols (Entity lb1 k1 i1) (Entity lb2 k2 i2) =
ca732bc259f74cb4f3f725daab7fe80fc7e1d9a0Till Mossakowski if k1 /= k2 then
ca732bc259f74cb4f3f725daab7fe80fc7e1d9a0Till Mossakowski error "can't pair symbols of different kind"
db453fe9625a9dab5d108f7a5e464598814144b8Jian Chun Wang let rest x = drop 1 $ dropWhile (/= '#') x
239fe94380bba365636e6ac48e094fc92cae30c7Christian Maeder pairLables lbl1 lbl2 = case (lbl1, lbl2) of
db453fe9625a9dab5d108f7a5e464598814144b8Jian Chun Wang (Nothing, _) -> pairLables lbl2 lbl1
db453fe9625a9dab5d108f7a5e464598814144b8Jian Chun Wang (Just l1, Just l2) | l1 /= l2 -> Just $ l1 ++ ", " ++ l2
db453fe9625a9dab5d108f7a5e464598814144b8Jian Chun Wang pairIRIs (QN p1 l1 t1 _e1 r1)
db453fe9625a9dab5d108f7a5e464598814144b8Jian Chun Wang (QN _p2 l2 _t2 _e2 _r2) =
db453fe9625a9dab5d108f7a5e464598814144b8Jian Chun Wang { namePrefix = p1
db453fe9625a9dab5d108f7a5e464598814144b8Jian Chun Wang , localPart = if rest l1 == rest l2 then l1 else l1 ++ "_" ++ rest l2
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder , iriType = t1
db453fe9625a9dab5d108f7a5e464598814144b8Jian Chun Wang , expandedIRI = ""
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder , iriPos = r1
db453fe9625a9dab5d108f7a5e464598814144b8Jian Chun Wang return $ Entity (pairLables lb1 lb2) k1 $ pairIRIs i1 i2
db453fe9625a9dab5d108f7a5e464598814144b8Jian Chun Wangdata TypedOrUntyped = Typed Datatype | Untyped (Maybe LanguageTag)
db453fe9625a9dab5d108f7a5e464598814144b8Jian Chun Wang deriving (Show, Eq, Ord, Typeable, Data)
db453fe9625a9dab5d108f7a5e464598814144b8Jian Chun Wangdata Literal = Literal LexicalForm TypedOrUntyped | NumberLit FloatLit
58b671de3fe578346fef9642ffa3c5a0a0edb3cbTill Mossakowski deriving (Show, Eq, Ord, Typeable, Data)
db453fe9625a9dab5d108f7a5e464598814144b8Jian Chun Wang-- | non-negative integers given by the sequence of digits
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maederdata NNInt = NNInt [Int] deriving (Eq, Ord, Typeable, Data)
db453fe9625a9dab5d108f7a5e464598814144b8Jian Chun Wanginstance Show NNInt where
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder show (NNInt l) = map intToDigit l
db453fe9625a9dab5d108f7a5e464598814144b8Jian Chun WangzeroNNInt :: NNInt
db453fe9625a9dab5d108f7a5e464598814144b8Jian Chun WangzeroNNInt = NNInt []
db453fe9625a9dab5d108f7a5e464598814144b8Jian Chun WangisZeroNNInt :: NNInt -> Bool