简单类型Lambda微积分中的咖喱类型

时间:2015-04-16 15:41:36

标签: haskell type-inference lambda-calculus

我正在按照L.Paulson的模型用Haskell写一个玩具定理证明者;伊莎贝尔的创造者之一。

根据他的一篇文章,可以使用Simply Typed Lambda Calculus构建定理证明器。我用

创建了数据类型
data TLTerms = Var Id
| Const Id Types
| Lambda Id Types TLTerms
| Comp TLTerms TLTerms
deriving (Eq)

即。以下类型àlaChurch。但是,我想实现àCurry的类型系统。也许它不是用于此目的的最佳系统;但我想试试咖喱式,以判断哪种款式更好。第一个问题是类型推断。

checkType :: TypeContext -> TLTerms -> Maybe Types
-- Given a context, if i is in the context
-- i has its type assigned in the context
checkType ls (Var i) = case lookup i ls of
    Just t -> Just t
    Nothing -> Nothing
-- the constants come predefined by the alphabet
checkType _ (Const _ typ) = Just typ
-- the abstractions have type sigma -> tau
checkType ls (Lambda x typ terms) = do
    t <- checkType ((x,typ): ls) terms
    return $ Arrow typ t

checkType ls (Comp term1 term2) = do
    x <- checkType ls term1
    y <- checkType ls term2
    case (x,y) of
        (Arrow a b, c) -> if a==c then Just b else Nothing
        _ -> Nothing

我从另一个相关问题中获取了代码。我当然相信有一个更优雅的算法来验证一个lambda-term是否是良好类型的。我的问题是:

  1. 应更改/添加/删除哪些部分(除了删除 在抽象中输入类型);
  2. 哪个错误monad应该更好: MaybeEither或其他(我想返回一个值,意思是 失败);
  3. 或者我是否应该从头开始创建另一个功能。
  4. PD:我是Haskell的新手,虽然我已经编写了双数字或幂级数等示例程序。只是为了解释我对这个主题的知识水平。

0 个答案:

没有答案