packages feed

lambda-cube-0.3.0.0: test/LambdaCube/SystemFwTestExample.hs

{-# LANGUAGE QuasiQuotes #-}
module LambdaCube.SystemFwTestExample where

import           LambdaCube.SystemFw

lcBaseId, lcBaseArrId :: ExtLCTerm
lcBaseId = [qTerm| \x : # . x |]
lcBaseArrId = [qTerm| \x : $lcBaseArr . x |]

lcBaseArr :: ExtLCType
lcBaseArr = [qType| # -> # |]

lcId :: ExtLCTerm
lcId = [qTerm| @\a : * . \x : a . x |]

------------------------------------------------------------
-- Church Pair examples
------------------------------------------------------------

lcCPPair :: ExtLCTerm
lcCPPair = [qTerm| @\a : * . @\b : * . \x : a . \y : b . @\r : * . \f : a -> b -> r . f x y |]

lcCPFst :: ExtLCTerm
lcCPFst = [qTerm| @\a : * . @\b : * . \p : $lcCPTy a b . p @a (\x : a . \y : b . x) |]

lcCPSnd :: ExtLCTerm
lcCPSnd = [qTerm| @\a : * . @\b : * . \p : $lcCPTy a b . p @b (\x : a . \y : b . y) |]

lcCPTy :: ExtLCType
lcCPTy = [qType| \a : * . \b : * . !r : * , (a -> b -> r) -> r |]

------------------------------------------------------------
-- Church Boolean examples
------------------------------------------------------------

lcCBTrue, lcCBFalse :: ExtLCTerm
lcCBTrue = [qTerm| @\r : * . \t : r . \f : r . t |]
lcCBFalse = [qTerm| @\r : * . \t : r . \f : r . f |]

lcCBIf :: ExtLCTerm
lcCBIf = [qTerm| \b : $lcCBTy . b |]

lcCBAnd, lcCBOr :: ExtLCTerm
lcCBAnd = [qTerm| \b1 : $lcCBTy . \b2 : $lcCBTy . @\r : * . \t : r . \f : r . b1 @r (b2 @r t f) f |]
lcCBOr = [qTerm| \b1 : $lcCBTy . \b2 : $lcCBTy . @\r : * . \t : r . \f : r . b1 @r t (b2 @r t f) |]

lcCBNot :: ExtLCTerm
lcCBNot = [qTerm| \b : $lcCBTy . @\r : * . \t : r . \f : r . b @r f t |]

lcCBTy :: ExtLCType
lcCBTy = [qType| !r : * , r -> r -> r |]

------------------------------------------------------------
-- Church Numeral examples
------------------------------------------------------------

lcCN1, lcCN2, lcCN3, lcCN4, lcCN5 :: ExtLCTerm
lcCN1 = [qTerm| @\r : * . \s : r -> r . \z : r . s z |]
lcCN2 = [qTerm| @\r : * . \s : r -> r . \z : r . s (s z) |]
lcCN3 = [qTerm| @\r : * . \s : r -> r . \z : r . s (s (s z)) |]
lcCN4 = [qTerm| @\r : * . \s : r -> r . \z : r . s (s (s (s z))) |]
lcCN5 = [qTerm| @\r : * . \s : r -> r . \z : r . s (s (s (s (s z)))) |]

lcCN0, lcCNSucc :: ExtLCTerm
lcCN0 = [qTerm| @\r : * . \s : r -> r . \z : r . z |]
lcCNSucc = [qTerm| \n : $lcCNTy . @\r : * . \s : r -> r . \z : r . s (n @r s z) |]

lcCNPred, lcCNPredDef :: ExtLCTerm
lcCNPred =
  [qTerm|
     \n : $lcCNTy .
     @\r : * . \s : r -> r . \z : r .
     n
     @((r -> r) -> r)
     (\p : (r -> r) -> r . \g : r -> r . g (p s))
     (\p : r -> r . z)
     (\p : r . p)
  |]
lcCNPredDef =
  [qTerm|
     \d : $lcCNTy .
     \n : $lcCNTy .
     n
     @(($lcCNTy -> $lcCNTy -> $lcCNTy) -> $lcCNTy)
     (\p : ($lcCNTy -> $lcCNTy -> $lcCNTy) -> $lcCNTy .
      \g : $lcCNTy -> $lcCNTy -> $lcCNTy .
      (\x : $lcCNTy . g ($lcCNSucc x) x) (p (\x : $lcCNTy . \y : $lcCNTy . x)))
     (\g : $lcCNTy -> $lcCNTy -> $lcCNTy . g $lcCN0 d)
     (\x : $lcCNTy . \y : $lcCNTy . y)
  |]

lcCNAdd, lcCNMul, lcCNMinus :: ExtLCTerm
lcCNAdd =
  [qTerm|
     \n : $lcCNTy . \m : $lcCNTy .
     @\r : * . \s : r -> r . \z : r . n @r s (m @r s z)
  |]
lcCNMul =
  [qTerm|
     \n : $lcCNTy . \m : $lcCNTy .
     @\r : * . \s : r -> r . \z : r . n @r (m @r s) z
  |]
lcCNMinus =
  [qTerm|
     \n : $lcCNTy . \m : $lcCNTy . m @$lcCNTy $lcCNPred n
  |]

lcCNIs0 :: ExtLCTerm
lcCNIs0 =
  [qTerm|
     \n : $lcCNTy . n @$lcCBTy (\x : $lcCBTy . $lcCBFalse) $lcCBTrue
  |]

lcCNTy :: ExtLCType
lcCNTy = [qType| !r : * , (r -> r) -> r -> r |]

------------------------------------------------------------
-- Church List examples
------------------------------------------------------------

lcCL_CN_0, lcCL_CN_0_1, lcCL_CN_0_1_2 :: ExtLCTerm
lcCL_CN_0 =
  [qTerm|
    $lcCLCons @$lcCNTy $lcCN0
    ($lcCLNil @$lcCNTy)
  |]
lcCL_CN_0_1 =
  [qTerm|
    $lcCLCons @$lcCNTy $lcCN0
    ($lcCLCons @$lcCNTy $lcCN1
    ($lcCLNil @$lcCNTy))
  |]
lcCL_CN_0_1_2 =
  [qTerm|
    $lcCLCons @$lcCNTy $lcCN0
    ($lcCLCons @$lcCNTy $lcCN1
    ($lcCLCons @$lcCNTy $lcCN2
    ($lcCLNil @$lcCNTy)))
  |]

lcCLNil, lcCLCons :: ExtLCTerm
lcCLNil = [qTerm| @\e : * . @\r : * . \c : e -> r -> r . \n : r . n |]
lcCLCons =
  [qTerm|
    @\e : * .
    \h : e . \t : $lcCLTy e .
    @\r : * . \c : e -> r -> r . \n : r . c h (t @r c n)
  |]

lcCLLength :: ExtLCTerm
lcCLLength = [qTerm| @\e : * . \l : $lcCLTy e . l @$lcCNTy (\h : e . \t : $lcCNTy . $lcCNSucc t) $lcCN0 |]

lcCLHeadDef :: ExtLCTerm
lcCLHeadDef = [qTerm| @\e : * . \d : e . \l : $lcCLTy e . l @e (\h : e . \t : e . h) d |]

lcCLTail, lcCLTailDef :: ExtLCTerm
lcCLTail =
  [qTerm|
    @\e : * .
    \l : $lcCLTy e .
    @\r : * . \c : e -> r -> r . \n : r .
    l
    @((e -> r -> r) -> r)
    (\h : e . \t : (e -> r -> r) -> r . \g : e -> r -> r . g h (t c))
    (\t : e -> r -> r . n)
    (\h : e . \t : r . t)
  |]
lcCLTailDef =
  [qTerm|
    @\e : * .
    \d : $lcCLTy e .
    \l : $lcCLTy e .
    l
    @(($lcCLTy e -> $lcCLTy e -> $lcCLTy e) -> $lcCLTy e)
    (\h : e .
     \t : ($lcCLTy e -> $lcCLTy e -> $lcCLTy e) -> $lcCLTy e .
     \g : $lcCLTy e -> $lcCLTy e -> $lcCLTy e .
     (\x : $lcCLTy e . g ($lcCLCons @e h x) x) (t (\x : $lcCLTy e . \y : $lcCLTy e . x)))
    (\g : $lcCLTy e -> $lcCLTy e -> $lcCLTy e . g ($lcCLNil @e) d)
    (\x : $lcCLTy e . \y : $lcCLTy e . y)
  |]

lcCLTy :: ExtLCType
lcCLTy = [qType| \e : * . !r : * , (e -> r -> r) -> r -> r |]