¿Se puede expresar el álgebra booleana en un simple lambda caclulus?

15

El álgebra booleana se puede expresar en cálculo lambda sin tipo de (por ejemplo) de esta manera.

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;

También el álgebra booleana se puede codificar en el Sistema F de esta manera :

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;

¿Hay alguna manera de expresar el álgebra booleana en un cálculo lambda simplemente escrito? Supongo que la respuesta es NO. ( Por ejemplo, el predecesor y las listas no son representables en cálculo lambda simplemente tipado ). Si la respuesta es NO, ¿existe una explicación intuitiva simple, por qué es imposible codificar booleanos en cálculo lambda simplemente tipado?

ACTUALIZACIÓN: Suponemos que hay tipos base.

ACTUALIZACIÓN: La respuesta negativa con explicación se encontró aquí (Comentario "Aquí hay un bosquejo de prueba para mostrar que el cálculo lambda de tipo simple con productos e infinitos tipos de bases no tiene booleanos"). Esto es lo que estaba buscando.

Ilya Klyuchnikov
fuente
2
Intente escribir las definiciones en Haskell y vea qué sucede cuando asigna tipos a varias expresiones. Verá que el código depende en gran medida del polimorfismo.
Dave Clarke
2
Lamento ser pedante, pero las preguntas sobre la expresividad de este o aquel cálculo se vuelven significativas solo con una comprensión clara de lo que quiere decir con "expresado", "codificado" y "representado", ya que hay múltiples formas razonables de entender estos términos. Además, dado que estipulas la existencia de tipos base, deberías ser específico sobre cuáles son y con qué constructores / destructores vienen.
Martin Berger
3
Lamento no haber sido pedante. La respuesta se encontró aquí: math.andrej.com/2009/03/21/…
Ilya Klyuchnikov
3
Siento que debería obtener algo de crédito por ejecutar un blog tan ingenioso :-)
Andrej Bauer
77
Osi=OOOtrtumi=λX:O.λy:O.XFunlsmi=λX:O.λy:O.ynorteot=λun:si.λX:O.λy:O.unyXunnortere=λun:si.λsi:si.λX:O.λy:O.un(siXy)yor=λun:si.λsi:si.λX:O.λy:O.unX(siXy)

Respuestas: