g2-0.2.0.0: tests_quasiquote/DeBruijn/Test.hs
{-# LANGUAGE QuasiQuotes #-}
module DeBruijn.Test where
import DeBruijn.Interpreter
import G2.QuasiQuotes.QuasiQuotes
import RegEx.RegEx as R
solveDeBruijn :: [([Expr], Expr)] -> IO (Maybe Expr)
solveDeBruijn =
[g2| \(es :: [([Expr], Expr)]) -> ?(func :: Expr) |
all (\e -> (eval (app (func:fst e))) == snd e) es |]
appFunc :: [([Expr], Expr)] -> Expr -> Bool
appFunc es func = all (\e -> (eval (app (func:fst e))) == snd e) es
idDeBruijn :: [([Expr], Expr)]
idDeBruijn = [ ([num 1], num 1)
, ([num 2], num 2) ]
const2Example :: [([Expr], Expr)]
const2Example =
[ ([num 1, num 2], num 1)
, ([num 2, num 3], num 2) ]
trueLam :: Expr
trueLam = Lam (Lam (Var 2))
falseLam :: Expr
falseLam = Lam (Lam (Var 1))
notExample :: [([Expr], Expr)]
notExample =
[ ([trueLam], falseLam)
, ([falseLam], trueLam) ]
orExample :: [([Expr], Expr)]
orExample =
[ ([trueLam, trueLam], trueLam)
, ([falseLam, falseLam], falseLam)
, ([falseLam, trueLam], trueLam)
, ([trueLam, falseLam], trueLam )]
andExample :: [([Expr], Expr)]
andExample =
[ ([trueLam, trueLam], trueLam)
, ([falseLam, falseLam], falseLam)
, ([falseLam, trueLam], falseLam)
, ([trueLam, falseLam], falseLam )]
-- runDeBruijnEval :: IO ()
-- runDeBruijnEval = do
-- putStrLn "------------------------"
-- putStrLn "-- DeBruijn Eval -------"
-- timeIOActionPrint $ solveDeBruijn idDeBruijn
-- timeIOActionPrint $ solveDeBruijn const2Example
-- -- timeIOActionPrint $ solveDeBruijn notExample
-- timeIOActionPrint $ solveDeBruijn orExample
-- -- timeIOActionPrint $ solveDeBruijn andExample
-- putStrLn ""