Logica combinatoria tipizzata semplicemente?


8

Poiché esiste un calcolo lambda non tipizzato e un calcolo lambda tipicamente semplice (come descritto, ad esempio, nel libro Tipi e linguaggi di programmazione di Benjamin Pierce), esiste una logica combinatoria tipizzata semplicemente?

Ad esempio, sembrerebbe che sarebbero i tipi naturali per i combinatori S, K e io

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

dove a, b e c sono variabili di tipo che vanno oltre una serie di tipi T. Ora, forse potremmo iniziare con un solo tipo di base, Bool. La nostra serie di tipi T è quindi Bool insieme a qualsiasi tipo che può essere formato utilizzando i tre modelli

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

dove a, b, c in T.

Ci sarebbero due nuove costanti nella lingua.

T : Bool
F : Bool

Quindi, questa lingua è composta dai simboli S, K, I, T e F, insieme alle parentesi. Ha un tipo di base Bool e i "tipi di funzione" che possono essere creati dai modelli combinatori S, K e I.

Questo sistema può funzionare? Ad esempio, esiste una costruzione if-then-else ben tipizzata che può essere formata solo da S, K, I, T, F?


Cerca "algebra combinatoria tipizzata".
Andrej Bauer,

È interessante notare che la logica combinatoria tipizzata è il luogo in cui è stata notata per la prima volta la corrispondenza "Curry-Howard" mal denominata, a causa della somiglianza con gli assiomi logici in stile Hilbert: en.wikipedia.org/wiki/Hilbert_system#Logical_axioms
cody

Risposte:


11

Nota veloce, ho consentire il polimorfismo parametrico (Sistema F) in questo sistema in modo tale che S, Ke Ipuò funzionare su tutti i tipi.

Notare che senza la corrispondenza dei modelli, non possiamo scrivere ifindipendentemente da ciò che facciamo. Non abbiamo assolutamente operazioni su valori booleani. Non c'è modo di distinguere Trueda False. Invece prova

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

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

Facciamo Bool = a -> a -> achiarezza.

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

Ora si tratta solo di compilare alcune espressioni di calcolo lambda per i combinatori, il che è piuttosto banale.

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

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

false : a -> a -> a
false = K I
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.