packages feed

hydra-0.15.0: src/main/haskell/Hydra/Sources/Other/Datalog.hs

module Hydra.Sources.Other.Datalog where

-- Standard imports for type-level sources outside of the kernel
import           Hydra.Kernel
import           Hydra.Dsl.Annotations
import           Hydra.Dsl.Bootstrap
import           Hydra.Dsl.Types                 ((>:))
import qualified Hydra.Dsl.Types                 as T


ns :: Namespace
ns = Namespace "hydra.datalog.syntax"

define :: String -> Type -> Binding
define = defineType ns

dl :: String -> Type
dl = typeref ns

module_ :: Module
module_ = Module {
            moduleNamespace = ns,
            moduleDefinitions = (map toTypeDef definitions),
            moduleTermDependencies = [],
            moduleTypeDependencies = [],
            moduleDescription = Just "A basic Datalog model"}
  where
    definitions = [
      constant,
      relation,
      variable,
      program,
      program_Elmt,
      fact,
      rule_,
      atom,
      atomList,
      atomList_Multiple,
      term,
      termList,
      termList_Multiple,
      constantList,
      constantList_Multiple]

constant :: Binding
constant = define "Constant" $ T.wrap T.string

relation :: Binding
relation = define "Relation" $ T.wrap T.string

variable :: Binding
variable = define "Variable" $ T.wrap T.string

program :: Binding
program = define "Program" $ T.wrap $ T.list $ dl "Program_Elmt"

program_Elmt :: Binding
program_Elmt = define "Program_Elmt" $
  T.union [
    "Fact">: dl "Fact",
    "Rule">: dl "Rule"]

fact :: Binding
fact = define "Fact" $
  T.record [
    "Relation">: dl "Relation",
    "ConstantList">: dl "ConstantList"]

rule_ :: Binding
rule_ = define "Rule" $
  T.record [
    "Atom">: dl "Atom",
    "AtomList">: dl "AtomList"]

atom :: Binding
atom = define "Atom" $
  T.record [
    "Relation">: dl "Relation",
    "TermList">: dl "TermList"]

atomList :: Binding
atomList = define "AtomList" $
  T.union [
    "single">: dl "Atom",
    "multiple">: dl "AtomList_Multiple"]

atomList_Multiple :: Binding
atomList_Multiple = define "AtomList_Multiple" $
  T.record [
    "Atom">: dl "Atom",
    "AtomList">: dl "AtomList"]

term :: Binding
term = define "Term" $
  T.union [
    "Constant">: dl "Constant",
    "Variable">: dl "Variable"]

termList :: Binding
termList = define "TermList" $
  T.union [
    "single">: dl "Term",
    "multiple">: dl "TermList_Multiple"]

termList_Multiple :: Binding
termList_Multiple = define "TermList_Multiple" $
  T.record [
    "Term">: dl "Term",
    "TermList">: dl "TermList"]

constantList :: Binding
constantList = define "ConstantList" $
  T.union [
    "single">: dl "Constant",
    "multiple">: dl "ConstantList_Multiple"]

constantList_Multiple :: Binding
constantList_Multiple = define "ConstantList_Multiple" $
  T.record [
    "Constant">: dl "Constant",
    "ConstantList">: dl "ConstantList"]