布尔代数可以用这种方式在(例如)无类型的lambda演算中表示。
true = \t. \f. t;
false = \t. \f. t;
not = \x. x false true;
and = \x. \y. x y false;
or = \x. \y. x true y;
布尔代数也可以通过以下方式在系统F中进行编码:
CBool = All X.X -> X -> X;
true = \X. \t:X. \f:X. t;
false = \X. \t:X. \f:X. f;
not = \x:CBool. x [CBool] false true;
and = \x:CBool. \y:CBool. x [CBool] y false;
or = \x:CBool. \y:CBool. x [CBool] true y;
有没有一种方法可以在简单类型的lambda演算中表达布尔代数?我认为答案是否定的。(例如,在简单类型的lambda演算中,Predecessor和list不能表示。)如果答案确实是“否”,是否有一个简单的直观解释,为什么不能在简单类型的lambda演算中编码布尔值?
更新:我们假设有基本类型。
更新:此处找到带有解释的否定答案(评论“这里是一个证明草图,它显示具有产品和无限多个基本类型的简单类型的lambda微积分没有布尔值。”)这就是我想要的。
2
尝试在Haskell中键入定义,然后看看为各种表达式提供类型时会发生什么。您会看到该代码严重依赖于多态性。
—
戴夫·克拉克
抱歉,这很古怪,但是只有明确了解“表达”,“编码”和“表示”的含义后,有关这种或那种演算的表达性的问题才变得有意义,因为有多种合理的方式可以理解这些术语。此外,由于您规定了基类型的存在,因此需要具体说明基类型是什么以及它们附带的构造函数/析构函数。
—
Martin Berger
对不起,我没有学步。答案在这里找到:math.andrej.com/2009/03/21/...
—
伊利亚Klyuchnikov
我觉得我应该因为经营这样一个漂亮的博客而获得荣誉:-)
—
Andrej Bauer