From 210cae7ca6470eded3bbefb6474001fb393dd1c3 Mon Sep 17 00:00:00 2001 From: Felix Dilke Date: Tue, 27 Jan 2026 14:55:52 +0000 Subject: [PATCH] creating a list of head variables for a rule --- .../src/Datalog/NaiveDatabase.hs | 8 +++---- .../test/Test/Datalog/NaiveDatabaseSpec.hs | 24 +++++++++++++++++-- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/haskell-experiments/src/Datalog/NaiveDatabase.hs b/haskell-experiments/src/Datalog/NaiveDatabase.hs index 19c3d10..99aadc4 100644 --- a/haskell-experiments/src/Datalog/NaiveDatabase.hs +++ b/haskell-experiments/src/Datalog/NaiveDatabase.hs @@ -195,11 +195,11 @@ withFactsAndRules facts rules = toConstraintElement :: RuleElement -> ConstraintElement toConstraintElement (RuleElementConstant constant) = ConstraintElementConstant constant toConstraintElement (RuleElementVariable varName) = ConstraintElementIndex (varIndex varName) - extractVarName :: RuleElement -> Text - extractVarName (RuleElementVariable varName) = varName - extractVarName (RuleElementConstant constant) = throw $ UnexpectedConstantException constant + extractVarName :: RuleElement -> Maybe Text + extractVarName (RuleElementVariable varName) = Just varName + extractVarName (RuleElementConstant constant) = Nothing newRule = RelationRule { - headVariables = extractVarName <$> variables', + headVariables = catMaybes $ extractVarName <$> variables', bodyElements = fromBodyConstraint <$> (_bodyConstraints context'') } where fromBodyConstraint :: BodyConstraint -> RuleBodyElement diff --git a/haskell-experiments/test/Test/Datalog/NaiveDatabaseSpec.hs b/haskell-experiments/test/Test/Datalog/NaiveDatabaseSpec.hs index b6a67b3..2694dc2 100644 --- a/haskell-experiments/test/Test/Datalog/NaiveDatabaseSpec.hs +++ b/haskell-experiments/test/Test/Datalog/NaiveDatabaseSpec.hs @@ -22,8 +22,6 @@ import qualified Data.Map as Map spec :: Spec spec = do describe "NaiveDatabase operations" $ do - it "..." $ do - 1 `shouldBe` (1 :: Int) it "can ingest facts into relations & a universe" $ do let db = NaiveDatabase.withFacts [ "parent(\"alice\", \"bob\")." @@ -79,6 +77,28 @@ spec = do ("parent", parentRelation ) ] + it "can ingest facts and rules with constants" $ do + let db = NaiveDatabase.withFactsAndRules + [] + [ "ancestor(X,\"patriarch\") :- ." ] + let ancestorRule = RelationRule { + headVariables = [ "X" ], + bodyElements = [] + } + let ancestorRelation = Relation { + _arity = 2, + _name = "ancestor", + _tuples = Set.empty, + _rules = [ ancestorRule ] + } + relations db `shouldBe` + Map.fromList [ + ("ancestor", ancestorRelation) + ] + + constants db `shouldBe` + (Set.fromList $ Sym <$> ["patriarch"]) + it "can do basic queries" $ do let db = NaiveDatabase.withFacts [ "parent(\"alice\", \"bob\")."