diff --git a/propa-tools.cabal b/propa-tools.cabal index 4d4c553..0286fc7 100644 --- a/propa-tools.cabal +++ b/propa-tools.cabal @@ -22,6 +22,7 @@ library exposed-modules: Propa.Lambda.Display Propa.Lambda.Term + Propa.Prolog.Display Propa.Prolog.Example Propa.Prolog.Types Propa.Prolog.Unify diff --git a/src/Propa/Prolog/Display.hs b/src/Propa/Prolog/Display.hs new file mode 100644 index 0000000..17fb399 --- /dev/null +++ b/src/Propa/Prolog/Display.hs @@ -0,0 +1,39 @@ +{-# LANGUAGE OverloadedStrings #-} + +module Propa.Prolog.Display + ( displayTerm + , displayTerms + , displayDef + , displayDefs + , displayResult + ) where + +import qualified Data.Map as Map +import qualified Data.Text as T + +import Propa.Prolog.Types + +displayStat :: T.Text -> [Term T.Text] -> T.Text +displayStat name [] = name +displayStat name args = name <> "(" <> T.intercalate ", " (map displayTerm args) <> ")" + +displayTerm :: Term T.Text -> T.Text +displayTerm (Var v) = v +displayTerm (Stat name args) = displayStat name args + +displayTerms :: [Term T.Text] -> T.Text +displayTerms terms = T.intercalate ",\n" (map displayTerm terms) <> "." + +displayDef :: Def T.Text -> T.Text +displayDef (Def name args []) = displayStat name args <> "." +displayDef (Def name args terms) + = displayStat name args + <> " :-\n" + <> T.intercalate ",\n" (map (\t -> " " <> displayTerm t) terms) + <> "." + +displayDefs :: [Def T.Text] -> T.Text +displayDefs = T.intercalate "\n" . map displayDef + +displayResult :: Map.Map T.Text (Term T.Text) -> T.Text +displayResult = T.intercalate "\n" . map (\(k, v) -> k <> " = " <> displayTerm v) . Map.assocs