diff --git a/haskell-experiments/src/Datalog/NaiveDatabase.hs b/haskell-experiments/src/Datalog/NaiveDatabase.hs index 0c62e92..5361918 100644 --- a/haskell-experiments/src/Datalog/NaiveDatabase.hs +++ b/haskell-experiments/src/Datalog/NaiveDatabase.hs @@ -17,7 +17,6 @@ import Data.Text (Text) import Data.Void import Datalog.DatalogParser (Head (HeadSingle), Literal (..), Statement (..), Term (..), parseDatalog) import Text.Megaparsec (ParseErrorBundle) -import GHC.TypeError (ErrorMessage(Text)) data Value = ValueInt Int @@ -66,7 +65,7 @@ emptyDB = withFacts :: [Text] -> NaiveDatabase withFacts facts = - foldl addFact emptyDB (extractFact <$> facts) + foldr addFact emptyDB (extractFact <$> facts) where extractFact :: Text -> Literal extractFact factText = @@ -74,8 +73,8 @@ withFacts facts = Right (Fact fact) -> fact Right otherStatement -> throw $ NonFactException factText otherStatement Left ex -> throw $ CannotParseStatementException factText ex - addFact :: NaiveDatabase -> Literal -> NaiveDatabase - addFact (NaiveDatabase relationMap constantSet) (Literal neg relationName terms) = + addFact :: Literal -> NaiveDatabase -> NaiveDatabase + addFact (Literal neg relationName terms) (NaiveDatabase relationMap constantSet) = NaiveDatabase newRelationMap newConstantSet where newArity = length terms @@ -94,7 +93,7 @@ lookupRelation relationName relationMap newArity tuples = else throw $ BadArityException relationName newArity data BodyConstraint = BodyConstraint - { _relation :: Relation + { _subRelation :: Relation , _elements :: [RuleElement] } @@ -142,8 +141,8 @@ withFactsAndRules facts = foldr (addRule . extractRule) (withFacts facts) entries' = nub extraVariables extraConstants = mapMaybe maybeConstant entries' constants' = Set.union (constants db) $ Set.fromList extraConstants - digestBody :: RuleContext -> Literal -> RuleContext - digestBody context (Literal neg subRelationName terms) = + digestBody :: Literal -> RuleContext -> RuleContext + digestBody (Literal neg subRelationName terms) context = RuleContext { __relation = relation , _variableNames = variableNames @@ -170,7 +169,7 @@ withFactsAndRules facts = foldr (addRule . extractRule) (withFacts facts) constants' = Set.union (constants (_db context)) $ Set.fromList extraConstants constraints = _bodyConstraints context newConstraint = BodyConstraint subRelation variables' - constraints' = constraints ++ [newConstraint] + constraints' = newConstraint : constraints -- varIndex :: Text -> Int -- varIndex name = -- case elemIndex (RuleElementVariable name) variables' of @@ -188,7 +187,7 @@ withFactsAndRules facts = foldr (addRule . extractRule) (withFacts facts) newArity = length terms relation = lookupRelation relationName (relations db) newArity Set.empty context = digestHead db relation ruleHead - context' = foldl digestBody context body + context' = foldr digestBody context body db' = _db context' relationMap = relations db' -- variables' = _headEntries context'