g2-0.1.0.1: quasiquote/DeBruijn/Test.hs
{-# LANGUAGE QuasiQuotes #-}
module DeBruijn.Test where
import DeBruijn.Interpreter
import G2.QuasiQuotes.QuasiQuotes
solveDeBruijn1 :: IO (Maybe Expr)
solveDeBruijn1 =
[g2| \(x :: Int) -> ?(syExpr :: Expr) |
let expr = App syExpr in
eval (expr (Lam (Var 1))) == (Lam (Var 1))
&& eval (expr (Lam (Var 2))) == (Lam (Var 2)) |] 6
solveDeBruijn :: [([Expr], Expr)] -> IO (Maybe Expr)
solveDeBruijn =
[g2| \(es :: [([Expr], Expr)]) -> ?(func :: Expr) |
all (\e -> (eval (app (func:fst e))) == snd e) es |]
solveDeBruijnI :: IO (Maybe Expr)
solveDeBruijnI = solveDeBruijn [ ([num 1], num 1)
, ([num 2], num 2) ]
solveDeBruijnK :: IO (Maybe Expr)
solveDeBruijnK = solveDeBruijn [ ([num 1, num 2], num 2)
, ([num 2, num 3], num 3)]
trueLam :: Expr
trueLam = Lam (Lam (Var 2))
falseLam :: Expr
falseLam = Lam (Lam (Var 1))
solveDeBruijnAnd :: IO (Maybe Expr)
solveDeBruijnAnd = solveDeBruijn [ ([trueLam, trueLam], trueLam)
, ([falseLam, falseLam], falseLam)
, ([falseLam, trueLam], falseLam)
, ([trueLam, falseLam], falseLam) ]
solveDeBruijnOr :: IO (Maybe Expr)
solveDeBruijnOr = solveDeBruijn [ ([trueLam, trueLam], trueLam)
, ([falseLam, falseLam], falseLam)
, ([falseLam, trueLam], trueLam)
, ([trueLam, falseLam], trueLam) ]
solveDeBruijnIte :: IO (Maybe Expr)
solveDeBruijnIte = solveDeBruijn [ ([trueLam, Var 2, Var 4], Var 2)
, ([falseLam, Var 2, Var 4], Var 4) ]
solveDeBruijnS :: IO (Maybe Expr)
solveDeBruijnS =
solveDeBruijn
[ ([Lam (Lam (Var 1)), Lam (Var 1), num 2], num 2)
, ([Lam (Lam (Var 1)), Lam (Lam (Var 2)), num 3], num 3) ]
-- [g2| \(_ :: ()) -> ?(func :: Expr) |
-- let
-- k = Lam (Lam (Var 2))
-- in
-- eval (App func (App k (App (num 1) (num 2)))) == num 2
-- |] ()
-- , ([Lam (Lam (Var 1)), Lam (num 3), num 1], num 3)]
-- , ([Lam (Lam (Lam (Var 2))), Lam (Lam (Var 1)), num 1], Lam (Lam (num 1)))]