Lógica Combinatória Simplesmente Digitada?

8

Como existe um cálculo lambda sem tipo e um cálculo lambda com tipo simples (como descrito, por exemplo, no livro Tipos e linguagens de programação de Benjamin Pierce), existe uma lógica combinatória de tipo simples?

Por exemplo, parece que os tipos naturais para os combinadores S, K e eu seriam

S : (a -> b -> c) -> (a -> b) -> a -> c
K : a -> b -> a
I : a -> a

onde a, bec são variáveis ​​de tipo que variam sobre um conjunto de tipos T. Agora, talvez possamos começar com um único tipo base, Bool. Nosso conjunto de tipos T é então Bool, juntamente com quaisquer tipos que possam ser formados usando os três padrões

(a -> b -> c) -> (a -> b) -> a -> c
a -> b -> a
a -> a

onde a, b, c em T.

Haveria duas novas constantes no idioma.

T : Bool
F : Bool

Portanto, esse idioma consiste nos símbolos S, K, I, T e F, além de parênteses. Ele tem um tipo base Bool e os "tipos de funções" que podem ser criados a partir dos padrões combinadores S, K e I.

Este sistema pode ser feito para funcionar? Por exemplo, existe uma construção bem-digitada se-então-outro que pode ser formada apenas a partir de S, K, I, T, F?

Rodrigo de Azevedo
fonte
Pesquisa "álgebra combinatória digitada".
Andrej Bauer
Curiosamente, digitado lógica combinatória é onde o mal chamada correspondência "Curry-Howard" foi notado pela primeira vez, devido à semelhança com axiomas lógicos Hilbert de estilo: en.wikipedia.org/wiki/Hilbert_system#Logical_axioms
Cody

Respostas:

11

Nota rápida, eu permitir que o polimorfismo paramétrico (Sistema F) neste sistema para que S, Ke Ipode trabalhar sobre todos os tipos.

Observe que, sem a correspondência de padrões, não podemos escrever um, ifnão importa o que façamos. Não temos absolutamente nenhuma operação em booleanos. Não há nenhuma maneira de distinguir Truea partir False. Em vez disso, tente

true : a -> a -> a
true = \t -> \f -> t

false : a -> a -> a
false = \t -> \f -> f

Vamos Bool = a -> a -> aesclarecer.

 if : Bool -> a -> a -> a
 if = \bool -> \a -> \b -> bool a b

Agora é apenas uma questão de compilar algumas expressões de cálculo lambda em combinadores, o que é bastante trivial.

if : Bool -> a -> a -> a -- Or just Bool -> Bool
if    = I

true : a -> a -> a
true  = K

false : a -> a -> a
false = K I
Daniel Gratzer
fonte