From b997ee635e8db42362ac9e321ba5a6f9b3e1c28e Mon Sep 17 00:00:00 2001 From: Felix Dilke Date: Fri, 30 Jan 2026 10:27:26 +0000 Subject: [PATCH] rearranging modules --- haskell-experiments/haskell-experiments.cabal | 1 + haskell-experiments/src/Datalog/DatalogDB.hs | 25 +++++++++++++++++++ .../src/Datalog/NaiveDatabase.hs | 24 +----------------- haskell-experiments/src/Datalog/Rules.hs | 22 +++++++++++++--- 4 files changed, 45 insertions(+), 27 deletions(-) create mode 100644 haskell-experiments/src/Datalog/DatalogDB.hs diff --git a/haskell-experiments/haskell-experiments.cabal b/haskell-experiments/haskell-experiments.cabal index 5d9f7db..e9ef842 100644 --- a/haskell-experiments/haskell-experiments.cabal +++ b/haskell-experiments/haskell-experiments.cabal @@ -93,6 +93,7 @@ library langfeatures Datalog.DatalogParser Datalog.NaiveDatabase Datalog.Rules + Datalog.DatalogDB ghc-options: -Wall default-extensions: OverloadedStrings diff --git a/haskell-experiments/src/Datalog/DatalogDB.hs b/haskell-experiments/src/Datalog/DatalogDB.hs new file mode 100644 index 0000000..2dba7b6 --- /dev/null +++ b/haskell-experiments/src/Datalog/DatalogDB.hs @@ -0,0 +1,25 @@ +{-# HLINT ignore "Redundant flip" #-} +{-# LANGUAGE ImportQualifiedPost #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE ScopedTypeVariables #-} +{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} + +module Datalog.DatalogDB where + +import Control.Exception.Base +import Data.List +import Data.Map (Map) +import Data.Map qualified as Map +import Data.Maybe +import Data.Set (Set) +import Data.Set qualified as Set +import Data.Text (Text) +import Data.Void +import Datalog.DatalogParser (Head (HeadSingle), Literal (..), Statement (..), Term (..), parseDatalog) +import Text.Megaparsec (ParseErrorBundle) +import Datalog.Rules + +class DatalogDB db where + emptyDB :: db + lookupRelation :: db -> Text -> Maybe Relation + insertRelation :: db -> Relation -> db diff --git a/haskell-experiments/src/Datalog/NaiveDatabase.hs b/haskell-experiments/src/Datalog/NaiveDatabase.hs index 732cb52..e88c2f9 100644 --- a/haskell-experiments/src/Datalog/NaiveDatabase.hs +++ b/haskell-experiments/src/Datalog/NaiveDatabase.hs @@ -20,6 +20,7 @@ import Data.Void import Datalog.DatalogParser (Head (HeadSingle), Literal (..), Statement (..), Term (..), parseDatalog) import Text.Megaparsec (ParseErrorBundle) import Datalog.Rules +import Datalog.DatalogDB data NaiveDatabase = NaiveDatabase { relations :: Map RelationId Relation @@ -95,11 +96,6 @@ withFacts = newRelationMap = Map.insert relationName newRelation relationMap newConstantSet = Set.union constantSet $ Set.fromList terms -data BodyConstraint = BodyConstraint - { _subRelation :: Relation - , _elements :: [RuleElement] - } - data RuleContext = RuleContext { __relation :: Relation , _variableNames :: [Text] @@ -108,24 +104,6 @@ data RuleContext = RuleContext , _db :: NaiveDatabase } -appendRule :: Relation -> RelationRule -> Relation -appendRule relation rule = - relation { - _rules = rule : (_rules relation) - } - -- Relation { _name = _name relation - -- , _arity = _arity relation - -- , _tuples = _tuples relation - -- , _rules = rule : (_rules relation) - -- } - -toRuleBodyElement :: BodyConstraint -> RuleBodyElement -toRuleBodyElement (BodyConstraint subRelation elements) = - RuleBodyElement { - _subRelationId = _name subRelation - , _ruleElements = elements - } - withFactsAndRules :: [Text] -> [Text] -> NaiveDatabase withFactsAndRules facts = foldr (addRule . extractRule) (withFacts facts) where diff --git a/haskell-experiments/src/Datalog/Rules.hs b/haskell-experiments/src/Datalog/Rules.hs index 14d160d..5104ad7 100644 --- a/haskell-experiments/src/Datalog/Rules.hs +++ b/haskell-experiments/src/Datalog/Rules.hs @@ -47,7 +47,21 @@ data Relation = Relation type Constant = Term type RelationId = Text -class DatalogDB db where - emptyDB :: db - lookupRelation :: db -> Text -> Maybe Relation - insertRelation :: db -> Relation -> db +data BodyConstraint = BodyConstraint + { _subRelation :: Relation + , _elements :: [RuleElement] + } + +appendRule :: Relation -> RelationRule -> Relation +appendRule relation rule = + relation { + _rules = rule : (_rules relation) + } + +toRuleBodyElement :: BodyConstraint -> RuleBodyElement +toRuleBodyElement (BodyConstraint subRelation elements) = + RuleBodyElement { + _subRelationId = _name subRelation + , _ruleElements = elements + } +