extracting variable names in a rule

This commit is contained in:
Felix Dilke 2026-01-27 17:55:19 +00:00
parent 4b358a8d6f
commit 429d64ee73

View File

@ -17,6 +17,7 @@ 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 GHC.TypeError (ErrorMessage(Text))
data Value data Value
= ValueInt Int = ValueInt Int
@ -104,8 +105,8 @@ data BodyConstraint = BodyConstraint
data RuleContext = RuleContext data RuleContext = RuleContext
{ __relation :: Relation { __relation :: Relation
, -- _variableNames :: [Text], , _variableNames :: [Text]
_headEntries :: [RuleElement] , _headEntries :: [RuleElement]
, _bodyConstraints :: [BodyConstraint] , _bodyConstraints :: [BodyConstraint]
, _db :: NaiveDatabase , _db :: NaiveDatabase
} }
@ -128,6 +129,7 @@ withFactsAndRules facts =
digestHead db relation (Literal neg relationName terms) = digestHead db relation (Literal neg relationName terms) =
RuleContext RuleContext
{ __relation = relation { __relation = relation
, _variableNames = extractVariableNames terms
, _headEntries = variables' , _headEntries = variables'
, _bodyConstraints = [] , _bodyConstraints = []
, _db = NaiveDatabase relationMap' constants' , _db = NaiveDatabase relationMap' constants'
@ -143,6 +145,7 @@ withFactsAndRules facts =
digestBody context (Literal neg subRelationName terms) = digestBody context (Literal neg subRelationName terms) =
RuleContext RuleContext
{ __relation = relation { __relation = relation
, _variableNames = _variableNames context
, _headEntries = variables' , _headEntries = variables'
, _bodyConstraints = constraints' , _bodyConstraints = constraints'
, _db = NaiveDatabase relationMap' constants' , _db = NaiveDatabase relationMap' constants'
@ -211,6 +214,11 @@ withFactsAndRules facts =
toElement :: Term -> RuleElement toElement :: Term -> RuleElement
toElement (Var name) = RuleElementVariable name toElement (Var name) = RuleElementVariable name
toElement constant = RuleElementConstant constant toElement constant = RuleElementConstant constant
extractVariableNames :: [Term] -> [Text]
extractVariableNames = mapMaybe extractVariableName where
extractVariableName :: Term -> Maybe Text
extractVariableName (Var name) = Just name
extractVariableName _ = Nothing
query :: NaiveDatabase -> Text -> Text query :: NaiveDatabase -> Text -> Text
query db qText = query db qText =