我正在按照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是否是良好类型的。我的问题是:
Maybe
或Either
或其他(我想返回一个值,意思是
失败);