introduce Rules module to factpr out the rule stuff

This commit is contained in:
Felix Dilke 2026-01-29 16:30:47 +00:00
parent 396ef53b12
commit 0a1a39cfc9
4 changed files with 58 additions and 62 deletions

View File

@ -87,7 +87,12 @@ test-suite haskell-exps-test
library langfeatures library langfeatures
build-depends: base, containers, megaparsec, parser-combinators, text build-depends: base, containers, megaparsec, parser-combinators, text
hs-source-dirs: src hs-source-dirs: src
exposed-modules: Ologs, SimpleParser, ArithmeticParser, Datalog.DatalogParser, Datalog.NaiveDatabase exposed-modules: Ologs
SimpleParser
ArithmeticParser
Datalog.DatalogParser
Datalog.NaiveDatabase
Datalog.Rules
ghc-options: -Wall ghc-options: -Wall
default-extensions: default-extensions:
OverloadedStrings OverloadedStrings

View File

@ -17,40 +17,13 @@ import Data.Text (Text)
import Data.Void import Data.Void
import Datalog.DatalogParser (Head (HeadSingle), Literal (..), Statement (..), Term (..), parseDatalog) import Datalog.DatalogParser (Head (HeadSingle), Literal (..), Statement (..), Term (..), parseDatalog)
import Text.Megaparsec (ParseErrorBundle) import Text.Megaparsec (ParseErrorBundle)
import Datalog.Rules
data NaiveDatabase = NaiveDatabase data NaiveDatabase = NaiveDatabase
{ relations :: Map RelationId Relation { relations :: Map RelationId Relation
, constants :: Set Constant , constants :: Set Constant
} deriving (Show, Eq) } deriving (Show, Eq)
data RuleElement -- entry occurring in a head or body relation - constant or variable
= RuleElementConstant Constant
| RuleElementVariable Int
deriving (Show, Eq)
data RuleBodyElement = RuleBodyElement
{ _subRelationId :: RelationId
, _ruleElements :: [RuleElement]
}
deriving (Show, Eq)
data RelationRule = RelationRule
{ headVariables :: [Text]
, bodyElements :: [RuleBodyElement]
}
deriving (Show, Eq)
data Relation = Relation
{ _name :: RelationId
, _arity :: Int
, _tuples :: Set [Constant]
, _rules :: [RelationRule]
}
deriving (Show, Eq)
-- Our constants will be the terms of the Datalog grammar - ints/variables/symbols
type Constant = Term
type RelationId = Text
emptyDB :: NaiveDatabase emptyDB :: NaiveDatabase
emptyDB = emptyDB =
@ -200,38 +173,7 @@ addRule (ruleHead, body) db =
} }
relationMap' = Map.insert relationName relation' relationMap relationMap' = Map.insert relationName relation' relationMap
constants' = constants db' constants' = constants db'
-- addRule :: (Literal, [Literal]) -> NaiveDatabase -> NaiveDatabase
-- addRule (ruleHead, body) db =
-- NaiveDatabase relationMap' constants'
-- where
-- relationName = predName ruleHead
-- terms = arguments ruleHead
-- newArity = length terms
-- relation = lookupRelation relationName (relations db) newArity Set.empty
-- context = digestHead db relation ruleHead
-- context' = foldr digestBody context body
-- db' = _db context'
-- relationMap = relations db'
-- relation' =
-- Relation
-- { _name = _name relation
-- , _arity = newArity
-- , _tuples = _tuples relation
-- , _rules = newRule : _rules relation
-- } where
-- newRule =
-- RelationRule
-- { headVariables = _variableNames context'
-- , bodyElements = toRuleBodyElement <$> _bodyConstraints context'
-- }
-- toRuleBodyElement :: BodyConstraint -> RuleBodyElement
-- toRuleBodyElement (BodyConstraint subRelation elements) =
-- RuleBodyElement {
-- _subRelationId = _name subRelation
-- , _ruleElements = elements
-- }
-- relationMap' = Map.insert relationName relation' relationMap
-- constants' = constants db'
extractVariableNames :: [Term] -> [Text] extractVariableNames :: [Term] -> [Text]
extractVariableNames = mapMaybe extractVariableName where extractVariableNames = mapMaybe extractVariableName where
extractVariableName :: Term -> Maybe Text extractVariableName :: Term -> Maybe Text

View File

@ -0,0 +1,48 @@
{-# HLINT ignore "Redundant flip" #-}
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}
module Datalog.Rules 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)
data RuleElement -- entry occurring in a head or body relation - constant or variable
= RuleElementConstant Constant
| RuleElementVariable Int
deriving (Show, Eq)
data RuleBodyElement = RuleBodyElement
{ _subRelationId :: RelationId
, _ruleElements :: [RuleElement]
}
deriving (Show, Eq)
data RelationRule = RelationRule
{ headVariables :: [Text]
, bodyElements :: [RuleBodyElement]
}
deriving (Show, Eq)
data Relation = Relation
{ _name :: RelationId
, _arity :: Int
, _tuples :: Set [Constant]
, _rules :: [RelationRule]
}
deriving (Show, Eq)
-- Our constants will be the terms of the Datalog grammar - ints/variables/symbols
type Constant = Term
type RelationId = Text

View File

@ -17,6 +17,7 @@ module Test.Datalog.NaiveDatabaseSpec where
import Data.Map qualified as Map import Data.Map qualified as Map
import Data.Set qualified as Set import Data.Set qualified as Set
import Datalog.DatalogParser import Datalog.DatalogParser
import Datalog.Rules
import Datalog.NaiveDatabase import Datalog.NaiveDatabase
import Datalog.NaiveDatabase qualified as NaiveDatabase import Datalog.NaiveDatabase qualified as NaiveDatabase
import Test.Hspec import Test.Hspec