packages feed

testing-feat-0.3: examples/lambda-terms/lambdas.hs

-- This module contains an enumeration of well scoped lambda terms

{-#LANGUAGE DeriveDataTypeable#-}
import Test.Feat
import Test.Feat.Enumerate
import Test.Feat.Access
import Data.MemoCombinators(bits) -- From package data-memocombinators


-- De Bruijn style lambda calculus
data Lam = Lam Lam
         | App Lam Lam
         | Var Integer
         deriving (Show,Eq,Ord, Typeable)


enumLamPair :: Integer -> Enumerate (Lam,Lam)
enumLamPair = bits enumLamPair' where
  enumLamPair' n = (,) <$> enumLam n <*> enumLam n

enumLam :: Integer -> Enumerate Lam
enumLam = bits enumLam' where
  enumLam' n = 
    let e = consts $
         [ App <$> e <*> e
         , fmap Lam $ enumLam (n+1)
         , fromParts [Finite n Var]
         ] 
    in e 

instance Enumerable Lam where
  enumerate = noOptim $ enumLam 0



test n = take n $ values :: [(Integer,[Lam])]