StaticAnalysis.hs revision 80875f917d741946a39d0ec0b5721e46ba609823
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder{- |
25cc5fbba63f84b47e389af749f55abbbde71c8cChristian MaederModule : ./RDF/StaticAnalysis.hs
25cc5fbba63f84b47e389af749f55abbbde71c8cChristian MaederCopyright : Felix Gabriel Mance
25cc5fbba63f84b47e389af749f55abbbde71c8cChristian MaederLicense : GPLv2 or higher, see LICENSE.txt
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederMaintainer : f.mance@jacobs-university.de
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederStability : provisional
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederPortability : portable
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederStatic analysis for RDF
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder-}
f2f9df2e17e70674f0bf426ed1763c973ee4cde0Christian Maeder
f2f9df2e17e70674f0bf426ed1763c973ee4cde0Christian Maedermodule RDF.StaticAnalysis where
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maederimport OWL2.AS
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maederimport Common.IRI
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maederimport OWL2.Parse
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maederimport RDF.AS
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maederimport RDF.Sign
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maederimport RDF.Parse (predefinedPrefixes)
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maederimport Data.Maybe
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maederimport qualified Data.Map as Map
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maederimport qualified Data.Set as Set
ce8b15da31cd181b7e90593cbbca98f47eda29d6Till Mossakowski
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian Maederimport Text.ParserCombinators.Parsec hiding (State)
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maederimport Common.AS_Annotation hiding (Annotation)
8f51f7ee933762df1a1e52caee78f5564fcf0730Christian Maederimport Common.Id
88c800932dd7053322501ea2039d9f234be6866cKlaus Luettichimport Common.Result
c0c2380bced8159ff0297ece14eba948bd236471Christian Maederimport Common.GlobalAnnotations
c0c2380bced8159ff0297ece14eba948bd236471Christian Maederimport Common.ExtSign
c0c2380bced8159ff0297ece14eba948bd236471Christian Maederimport Common.Lib.State
c0c2380bced8159ff0297ece14eba948bd236471Christian Maeder
8410667510a76409aca9bb24ff0eda0420088274Christian Maeder-- * URI Resolution
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederresolveFullIRI :: IRI -> IRI -> IRI
8410667510a76409aca9bb24ff0eda0420088274Christian MaederresolveFullIRI _absol rel = rel
404166b9366552e9ec5abb87a37c76ec8a815fb7Klaus Luettich {-if isAbsoluteIRI rel then rel else
404166b9366552e9ec5abb87a37c76ec8a815fb7Klaus Luettich let r = fromJust $ parseIRIReference $ fromJust $ expandCurie Map.empty rel
3474624438293363cada4e49225aae1e292fa597Christian Maeder a = fromJust $ parseIRI $ fromJust $ expandCurie Map.empty absol
404166b9366552e9ec5abb87a37c76ec8a815fb7Klaus Luettich Just ra = IRI.relativeTo r a
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder resolved = IRI.iriToStringUnsecure ra
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder Right new = parse uriQ "" $ "<" ++ resolved ++ ">"
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder in rel {expandedIRI = expandedIRI new}
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder -}
e593b89bfd4952698dc37feced21cefe869d87a2Christian Maeder
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian MaederresolveAbbreviatedIRI :: RDFPrefixMap -> IRI -> IRI
6e049108aa87dc46bcff96fae50a4625df1d9648Klaus LuettichresolveAbbreviatedIRI pm new = fromJust $ expandCurie pm new
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder {-case Map.lookup (namePrefix new) pm of
5d44c8cecd07b47ce537c7e14bf7b41a39f08507Christian Maeder Nothing -> error $ namePrefix new ++ ": prefix not declared"
a2d6702f18737cc5fff8e8631c08f221f8375c4bChristian Maeder Just iri -> let new2 = if null (namePrefix new)
a2d6702f18737cc5fff8e8631c08f221f8375c4bChristian Maeder {- FIXME: If null (localPart new)
c6fcd42c6d6d9dae8c7835c24fcb7ce8531a9050Christian Maeder then head will fail! -}
31c49f2fa23d4ac089f35145d80a224deb6ea7e4Till Mossakowski && null (localPart new)
c55a0f77be7e88d3620b419ec8961f4379a586e3Klaus Luettich && head (localPart new) == ':'
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder then new {localPart = tail $ localPart new}
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder else new
8cacad2a09782249243b80985f28e9387019fe40Christian Maeder in new2 {expandedIRI = expandedIRI iri ++ localPart new2}
8cacad2a09782249243b80985f28e9387019fe40Christian Maeder -}
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder
d3ae0072823e2ef0d41d4431fcc768e66489c20eChristian MaederresolveIRI :: Base -> RDFPrefixMap -> IRI -> IRI
9e748851c150e1022fb952bab3315e869aaf0214Christian MaederresolveIRI (Base current) pm new
f4505a64a089693012a3f5c3b1f12a82cd7a2a5aKlaus Luettich | hasFullIRI new = resolveFullIRI current new
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder | isBlankNode new = new
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder | otherwise = resolveAbbreviatedIRI pm new
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederresolveBase :: Base -> RDFPrefixMap -> Base -> Base
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederresolveBase b pm (Base new) = Base $ resolveIRI b pm new
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederresolvePrefix :: Base -> RDFPrefixMap -> Prefix -> (Prefix, RDFPrefixMap)
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederresolvePrefix b pm (PrefixR s new) = let res = resolveIRI b pm new
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder in (PrefixR s res, Map.insert s res pm)
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder
9e748851c150e1022fb952bab3315e869aaf0214Christian MaederresolvePredicate :: Base -> RDFPrefixMap -> Predicate -> Predicate
61fa0ac06ede811c7aad54ec4c4202346727368eChristian MaederresolvePredicate b pm (Predicate p) = Predicate $
c0c2380bced8159ff0297ece14eba948bd236471Christian Maeder if null (prefixName p) && show (iriPath p) == "a" then
c0c2380bced8159ff0297ece14eba948bd236471Christian Maeder p { iriScheme = "http",
fd09d0eee026d0db12542af37fd0fbd0790f0eeaChristian Maeder iriPath = stringToId "//www.w3.org/1999/02/22-rdf-syntax-ns#type"
fd09d0eee026d0db12542af37fd0fbd0790f0eeaChristian Maeder }
fd09d0eee026d0db12542af37fd0fbd0790f0eeaChristian Maeder else resolveIRI b pm p
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederresolveSubject :: Base -> RDFPrefixMap -> Subject -> Subject
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederresolveSubject b pm s = case s of
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder Subject iri -> Subject $ resolveIRI b pm iri
c0c2380bced8159ff0297ece14eba948bd236471Christian Maeder SubjectList ls -> SubjectList $ map (resolvePOList b pm) ls
549b97cfbe3a6687db74440a550b68b2fc19a272Christian Maeder SubjectCollection ls -> SubjectCollection $ map (resolveObject b pm) ls
549b97cfbe3a6687db74440a550b68b2fc19a272Christian Maeder
ca074a78b8dcccbb8c419586787882f98d0c6163Christian MaederresolvePOList :: Base -> RDFPrefixMap -> PredicateObjectList
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder -> PredicateObjectList
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederresolvePOList b pm (PredicateObjectList p ol) =
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder PredicateObjectList (resolvePredicate b pm p) $ map (resolveObject b pm) ol
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederresolveObject :: Base -> RDFPrefixMap -> Object -> Object
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederresolveObject b pm o = case o of
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder Object s -> Object $ resolveSubject b pm s
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder ObjectLiteral lit -> case lit of
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder RDFLiteral bool lf (Typed dt) ->
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder ObjectLiteral $ RDFLiteral bool lf $ Typed $ resolveIRI b pm dt
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder _ -> o
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederresolveTriples :: Base -> RDFPrefixMap -> Triples -> Triples
a3c6d8e0670bf2aa71bc8e2a3b1f45d56dd65e4cChristian MaederresolveTriples b pm (Triples s ls) =
f2f9df2e17e70674f0bf426ed1763c973ee4cde0Christian Maeder Triples (resolveSubject b pm s) $ map (resolvePOList b pm) ls
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder
ca074a78b8dcccbb8c419586787882f98d0c6163Christian MaederresolveStatements :: Base -> RDFPrefixMap -> [Statement] -> [Statement]
ca074a78b8dcccbb8c419586787882f98d0c6163Christian MaederresolveStatements b pm ls = case ls of
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder [] -> []
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder BaseStatement base : t -> let newBase = resolveBase b pm base
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder in BaseStatement newBase : resolveStatements newBase pm t
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder PrefixStatement pref : t -> let (newPref, newPrefMap) = resolvePrefix b pm pref
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder in PrefixStatement newPref : resolveStatements b newPrefMap t
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder Statement triples : t ->
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder Statement (resolveTriples b pm triples) : resolveStatements b pm t
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder
f2f9df2e17e70674f0bf426ed1763c973ee4cde0Christian MaederextractPrefixMap :: RDFPrefixMap -> [Statement] -> RDFPrefixMap
ca074a78b8dcccbb8c419586787882f98d0c6163Christian MaederextractPrefixMap pm ls = case ls of
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder [] -> pm
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder h : t -> case h of
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder PrefixStatement (PrefixR p iri) -> extractPrefixMap (Map.insert p iri pm) t
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder _ -> extractPrefixMap pm t
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder
ca074a78b8dcccbb8c419586787882f98d0c6163Christian MaederresolveDocument :: TurtleDocument -> TurtleDocument
ca074a78b8dcccbb8c419586787882f98d0c6163Christian MaederresolveDocument doc = let newStatements = resolveStatements
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder (Base $ documentName doc) predefinedPrefixes $ statements doc
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder in doc { statements = newStatements
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder , prefixMap = Map.union predefinedPrefixes $
f2f9df2e17e70674f0bf426ed1763c973ee4cde0Christian Maeder extractPrefixMap Map.empty newStatements }
f2f9df2e17e70674f0bf426ed1763c973ee4cde0Christian Maeder
f2f9df2e17e70674f0bf426ed1763c973ee4cde0Christian Maeder-- * Axiom extraction
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder
afa6ceaf4359ae437aaa6830949583143ace2752Christian MaedergenerateBNode :: Int -> IRI
c0c2380bced8159ff0297ece14eba948bd236471Christian MaedergenerateBNode i = nullIRI { iriPath = stringToId ("bnode" ++ show i)
f4505a64a089693012a3f5c3b1f12a82cd7a2a5aKlaus Luettich , isAbbrev = True
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder , isBlankNode = True}
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
f4505a64a089693012a3f5c3b1f12a82cd7a2a5aKlaus LuettichcollectionToPOList :: [Object] -> [PredicateObjectList]
f4505a64a089693012a3f5c3b1f12a82cd7a2a5aKlaus LuettichcollectionToPOList objs = case objs of
f4505a64a089693012a3f5c3b1f12a82cd7a2a5aKlaus Luettich [] -> []
5d4038657f6a63e131f5804af2f7957b69e15a43Klaus Luettich h : t -> [ PredicateObjectList (Predicate rdfFirst) [h]
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder , PredicateObjectList (Predicate rdfRest) [Object $ if null t
c0c2380bced8159ff0297ece14eba948bd236471Christian Maeder then Subject rdfNil else SubjectList $ collectionToPOList t]]
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
77a65251ee036c6aaf09c2775315a4ee24259fbdJorina Freya GerkenexpandPOList1 :: Triples -> [Triples]
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederexpandPOList1 (Triples s pols) = map (\ pol -> Triples s [pol]) pols
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
afa6ceaf4359ae437aaa6830949583143ace2752Christian Maeder-- | this assumes exactly one subject and one predicate
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederexpandPOList2 :: Triples -> [Triples]
97812b7ce9860bf514a8822a63503451795dbc65Klaus LuettichexpandPOList2 (Triples s pols) = case pols of
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder [PredicateObjectList p objs] ->
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder map (\ obj -> Triples s [PredicateObjectList p [obj]]) objs
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder _ -> error "unexpected ; abbreviated triple"
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder-- | converts a triple to a list of triples with one predicate and one object
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederexpandPOList :: Triples -> [Triples]
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederexpandPOList = concatMap expandPOList2 . expandPOList1
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder-- | this assumes exactly one subject, one predicate and one object
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederexpandObject1 :: Int -> Triples -> (Int, [Triples])
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaederexpandObject1 i t@(Triples s ls) = case ls of
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder [PredicateObjectList p [obj]] -> case obj of
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder ObjectLiteral _ -> (i, [t])
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder Object (Subject _) -> (i, [t])
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder Object (SubjectList pol) ->
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder let bnode = Subject $ generateBNode i
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder newTriple = Triples s [PredicateObjectList p [Object bnode]]
9df11f85fd7f8c4745d64464876e84ec4e263692Christian Maeder connectedTriples = expandPOList $ Triples bnode pol
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix Reckers (j, expandedTriples) = expandObject2 (i + 1) connectedTriples
9df11f85fd7f8c4745d64464876e84ec4e263692Christian Maeder in (j, newTriple : expandedTriples)
5b818f10e11fc79def1fdd5c8a080d64a6438d87Christian Maeder Object (SubjectCollection col) -> let pol = collectionToPOList col
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix Reckers in if null pol then
5d4038657f6a63e131f5804af2f7957b69e15a43Klaus Luettich (i, [Triples s [PredicateObjectList p [Object $ Subject rdfNil]]])
5d4038657f6a63e131f5804af2f7957b69e15a43Klaus Luettich else expandObject1 i $ Triples s [PredicateObjectList p [Object $ SubjectList pol]]
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder _ -> error "unexpected , or ; abbreviated triple"
c432483b64662e8db604a58758cd18ea7fa65659Christian Maeder
857992065be4ed40a72c6296b6c0aec62ab4c5b9Christian Maeder-- | this assumes each triple has one subject, one predicate and one object
857992065be4ed40a72c6296b6c0aec62ab4c5b9Christian MaederexpandObject2 :: Int -> [Triples] -> (Int, [Triples])
8659594bb40eb5f3da5439692f0908300947191eSonja GröningexpandObject2 i tl = case tl of
8c692d0cc44e7df93f58a3eed0d9774ba5908339Jorina Freya Gerken [] -> (i, [])
eeb419aa20c97b4af973e97ee6ae77a8eed29e15Till Mossakowski h : t -> let (j, triples1) = expandObject1 i h
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix Reckers (k, triples2) = expandObject2 j t
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder in (k, triples1 ++ triples2)
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder
61fa0ac06ede811c7aad54ec4c4202346727368eChristian MaederexpandObject :: Int -> Triples -> (Int, [Triples])
61fa0ac06ede811c7aad54ec4c4202346727368eChristian MaederexpandObject i t = expandObject2 i $ expandPOList t
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder
61fa0ac06ede811c7aad54ec4c4202346727368eChristian MaederexpandSubject :: Int -> Triples -> (Int, [Triples])
61fa0ac06ede811c7aad54ec4c4202346727368eChristian MaederexpandSubject i t@(Triples s ls) = case s of
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder Subject _ -> (i, [t])
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder SubjectList pol -> let bnode = Subject $ generateBNode i
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder in (i + 1, map (Triples bnode) [ls, pol])
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder SubjectCollection col -> let pol = collectionToPOList col
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder in if null col then (i, [Triples (Subject rdfNil) ls])
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder else expandSubject i $ Triples (SubjectList pol) ls
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder
afa6ceaf4359ae437aaa6830949583143ace2752Christian MaederexpandTriple :: Int -> Triples -> (Int, [Triples])
afa6ceaf4359ae437aaa6830949583143ace2752Christian MaederexpandTriple i t = let (j, sst) = expandSubject i t in case sst of
afa6ceaf4359ae437aaa6830949583143ace2752Christian Maeder [triple] -> expandObject j triple
8cacad2a09782249243b80985f28e9387019fe40Christian Maeder [triple, connectedTriple] ->
afa6ceaf4359ae437aaa6830949583143ace2752Christian Maeder let (k, tl1) = expandObject j triple
8cacad2a09782249243b80985f28e9387019fe40Christian Maeder (l, tl2) = expandObject k connectedTriple
afa6ceaf4359ae437aaa6830949583143ace2752Christian Maeder in (l, tl1 ++ tl2)
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder _ -> error "expanding triple before expanding subject"
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder
61fa0ac06ede811c7aad54ec4c4202346727368eChristian MaederexpandTripleList :: Int -> [Triples] -> (Int, [Triples])
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix ReckersexpandTripleList i tl = case tl of
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder [] -> (i, [])
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder h : t -> let (j, tl1) = expandTriple i h
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder (k, tl2) = expandTripleList j t
a02a4eb2a2029d27a11fff2ebcc6c460574a74fcKlaus Luettich in (k, tl1 ++ tl2)
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder
fdb2d618144159395f7bf8ce3327b3c112a17dd3Till MossakowskisimpleTripleToAxiom :: Triples -> Axiom
fdb2d618144159395f7bf8ce3327b3c112a17dd3Till MossakowskisimpleTripleToAxiom (Triples s pol) = case (s, pol) of
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder (Subject sub, [PredicateObjectList (Predicate pr) [o]]) ->
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder Axiom (SubjectTerm sub) (PredicateTerm pr) $ ObjectTerm $ case o of
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder ObjectLiteral lit -> Right lit
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder Object (Subject obj) -> Left obj
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder _ -> error "object should be an URI"
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder _ -> error "subject should be an URI or triple should not be abbreviated"
e2d849b4152a234bc0afaa2ab3a7c17d28de7565Christian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaedercreateAxioms :: TurtleDocument -> [Axiom]
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaedercreateAxioms doc = map simpleTripleToAxiom $ snd $ expandTripleList 1
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder $ triplesOfDocument $ resolveDocument doc
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder-- | takes an entity and modifies the sign according to the given function
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaedermodEntity :: (Term -> Set.Set Term -> Set.Set Term) -> RDFEntity -> State Sign ()
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian MaedermodEntity f (RDFEntity ty u) = do
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder s <- get
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder let chg = f u
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder put $ case ty of
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder SubjectEntity -> s { subjects = chg $ subjects s }
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder PredicateEntity -> s { predicates = chg $ predicates s }
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder ObjectEntity -> s { objects = chg $ objects s }
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder-- | adding entities to the signature
dbe752ee940baae7f9f231f29c62284bb0f90a25Christian MaederaddEntity :: RDFEntity -> State Sign ()
53818ced114da21321063fff307aa41c1ab31dd3Achim MahnkeaddEntity = modEntity Set.insert
53818ced114da21321063fff307aa41c1ab31dd3Achim Mahnke
53818ced114da21321063fff307aa41c1ab31dd3Achim MahnkecollectEntities :: Axiom -> State Sign ()
53818ced114da21321063fff307aa41c1ab31dd3Achim MahnkecollectEntities (Axiom sub pre obj) = do
53818ced114da21321063fff307aa41c1ab31dd3Achim Mahnke addEntity (RDFEntity SubjectEntity sub)
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder addEntity (RDFEntity PredicateEntity pre)
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder addEntity (RDFEntity ObjectEntity obj)
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder-- | collects all entites from the axioms
23ab8855c58adfbd03a0730584b917b24c603901Christian MaedercreateSign :: TurtleDocument -> State Sign ()
dd7b93bd69a40191907af1739db375ecc7e6cf18Christian MaedercreateSign = mapM_ collectEntities . createAxioms
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder
857992065be4ed40a72c6296b6c0aec62ab4c5b9Christian MaederanaAxiom :: Axiom -> Named Axiom
fdb2d618144159395f7bf8ce3327b3c112a17dd3Till MossakowskianaAxiom = makeNamed ""
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder-- | static analysis of document with incoming sign.
61fa0ac06ede811c7aad54ec4c4202346727368eChristian MaederbasicRDFAnalysis :: (TurtleDocument, Sign, GlobalAnnos)
ed9207cf24e96b0d6f59985822054ae28cb69b2eChristian Maeder -> Result (TurtleDocument, ExtSign Sign RDFEntity, [Named Axiom])
b49276c9f50038e0bd499ad49f7bd6444566a834Christian MaederbasicRDFAnalysis (doc, inSign, _) = do
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder let syms = Set.difference (symOf accSign) $ symOf inSign
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian Maeder accSign = execState (createSign doc) inSign
33d042fe6a9eb27a4c48f840b80838f3e7d98e34Christian Maeder axioms = map anaAxiom $ createAxioms doc
b10267ae0a6523b73113fc2dee9ea628266fce60Christian Maeder return (doc, ExtSign accSign syms, axioms)
fa21fba9ceb1ddf7b3efd54731a12ed8750191d8Christian Maeder