packages feed

lambda-calculator-3.1.0.0: test/Language/Lambda/SystemF/Examples/BoolSpec.hs

module Language.Lambda.SystemF.Examples.BoolSpec where

import RIO
import Test.Hspec

import Language.Lambda.SystemF.HspecUtils

spec :: Spec
spec = describe "Bool" $ do
  -- Bool is the definition of Booleans. We represent bools
  -- using Church Encodings:
  --
  -- true:  \T. \t:T f:T. t
  -- false: \T. \t:T f:T. f
  -- false: \T. \t:T f:T. f
  describe "not" $ do
    -- not takes a Bool and returns its opposite value
    --
    -- not(true)  = false
    -- not(false) = true
    --
    -- not is defined by
    -- not = \x. x (\t f. f) (\t f. t)
    it "not true = false" $
      "(\\x:(forall T. T -> T -> T). \\X. \\t:X f:X. (x [X]) f t) (\\U. \\t:U f:U. t)"
        `shouldEvalTo` "\\X. \\t:X f:X. f"

    it "not false = true" $
      "(\\x:(forall T. T-> T -> T). \\X. \\t:X f:X. (x [X]) f t) (\\U. \\t:U f:U. f)"
        `shouldEvalTo` "\\X. \\t:X f:X. t"