布尔代数可以用简单类型的lambda caclulus表示吗?


15

布尔代数可以用这种方式在(例如)无类型的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中键入定义,然后看看为各种表达式提供类型时会发生什么。您会看到该代码严重依赖于多态性。
戴夫·克拉克

2
抱歉,这很古怪,但是只有明确了解“表达”,“编码”和“表示”的含义后,有关这种或那种演算的表达性的问题才变得有意义,因为有多种合理的方式可以理解这些术语。此外,由于您规定了基类型的存在,因此需要具体说明基类型是什么以及它们附带的构造函数/析构函数。
Martin Berger

3
对不起,我没有学步。答案在这里找到:math.andrej.com/2009/03/21/...
伊利亚Klyuchnikov

3
我觉得我应该因为经营这样一个漂亮的博客而获得荣誉:-)
Andrej Bauer

7
Ø=ØØØŤ[RüË=λXØλÿØXF一种sË=λXØλÿØÿñØŤ=λ一种λXØλÿØ一种ÿX一种ñd=λ一种λbλXØλÿØ一种bXÿÿØ[R=λ一种λbλXØλÿØ一种XbXÿ

Answers:


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.