module Test.Main where import Prelude import Language.Bergamot.Syntax import Language.Bergamot.Rules import Language.Bergamot.Unifier import Language.Bergamot.Parser import Control.Apply import Control.Monad.Logic.Trans import Control.Monad.Logic.Class import Control.Monad.Unify.Trans import Control.Monad.Unify.Class import Data.List (List(..), (:)) import Data.Array (fromFoldable) import Data.Foldable import Data.Maybe tType et tt = Atom "type" $ et : tt : Nil tInt = Atom "int" Nil tString = Atom "string" Nil tProd t1 t2 = Atom "prod" $ t1 : t2 : Nil tIntExpr = Atom "n" Nil tStringExpr = Atom "s" Nil tPlusExpr et1 et2 = Atom "plus" $ et1 : et2 : Nil tProdExpr et1 et2 = Atom "pair" $ et1 : et2 : Nil tFstExpr et = Atom "fst" $ et : Nil tSndExpr et = Atom "snd" $ et : Nil toLatexExpr :: Expr String -> String toLatexExpr (Atom "type" (t1 : t2 : Nil)) = toLatexExpr t1 <> " : " <> toLatexExpr t2 toLatexExpr (Atom "int" Nil) = "\\text{int}" toLatexExpr (Atom "string" Nil) = "\\text{string}" toLatexExpr (Atom "prod" (t1 : t2 : Nil)) = toLatexExpr t1 <> "\\times " <> toLatexExpr t2 toLatexExpr (Atom "n" Nil) = "n" toLatexExpr (Atom "s" Nil) = "s" toLatexExpr (Atom "plus" (t1 : t2 : Nil)) = toLatexExpr t1 <> " + " <> toLatexExpr t2 toLatexExpr (Atom "pair" (t1 : t2 : Nil)) = "(" <> toLatexExpr t1 <> ", " <> toLatexExpr t2 <> ")" toLatexExpr (Atom "fst" (t : Nil)) = "\\text{fst}\\ " <> toLatexExpr t toLatexExpr (Atom "snd" (t : Nil)) = "\\text{snd}\\ " <> toLatexExpr t toLatexExpr (Atom s xs) = "\\text{" <> s <> "}(" <> intercalate ", " (toLatexExpr <$> xs) <> ")" toLatexExpr (Var x) = x toLatexRule :: Rule String -> String toLatexRule (MkRule {head, tail}) = "\\cfrac{" <> intercalate "\\quad " (toLatexExpr <$> tail) <> "}{" <> toLatexExpr head <> "}" toLatexProofTree :: ProofTree String -> String toLatexProofTree (MkProofTree {claim, witnesses}) = "\\cfrac{" <> intercalate "\\quad " (toLatexProofTree <$> witnesses) <> "}{" <> toLatexExpr claim <> "}" main :: String -> String -> Maybe String main rs q = map (toLatexProofTree <<< map (const "?")) $ join $ lift2 runUnifier (fromFoldable <$> parseRules rs) (query <$> parseQuery q) -- main = map toLatexProofTree $ runUnifier rules $ query $ tType (tSndExpr (tProdExpr tStringExpr (tPlusExpr tIntExpr tIntExpr))) (Var "T")