2015-02-08 13 views
5

Ho un malinteso durante la conversione di una formula logica semplice in un'espressione lambda (prova di tale formula).Espressioni lambda Haskell e formule a logica semplice

Quindi, ho la seguente formula: ((((A-> B) -> A) -> A) -> B) -> B dove -> significa operatore logico implicato.

Come posso scrivere un'espressione lambda in qualsiasi linguaggio funzionale (Haskell, preferibilmente) corrispondente ad esso?

devo alcuni "risultati" ma sono in realtà non sono sicuro che sia corretto modo per farlo:

  • (((lambda F -> lambda A) -> A) -> lambda B) -> B
  • ((((lambda a -> lambda B) -> a) -> a) -> B) -> B.

Come può essere possibile trasformata di formula in lambda espressione? Sarà molto utile se sai che alcuni materiali si riferiscono a questo problema.

Grazie

+2

Questo è un problema complesso. Il calcolo sequenziale intuizionista LJ e i suoi risultati correlati giocano ruoli chiave nella sua soluzione "standard". Lo strumento Djinn è un'implementazione "famosa" di una ricerca di prove in questo sistema (approssimativamente), e l'isomorfismo di Curry-Howard permette di presentare queste dimostrazioni come termini lambda. – chi

+3

Inoltre, non esiste una cosa come "convertire" una formula in un'espressione lambda.Ciò equivarrebbe a "convertire" i teoremi nelle loro dimostrazioni, che è una sciocchezza - i teoremi ammettono molte prove distinte, in generale. Nella migliore delle ipotesi, puoi eseguire la ricerca di prove, dove cerchi una di queste prove. – chi

+1

Grazie per i chiarimenti. Sono davvero contento di tante informazioni utili in breve tempo. –

risposta

10

Questo è un grande momento di utilizzare la modalità interattiva Agda s'. È come un gioco. Puoi anche farlo manualmente ma è più lavoro. Ecco quello che ho fatto:

f : {A B : Set} -> ((((A -> B) -> A) -> A) -> B) -> B 
f x = ? 

Goal: B 
x : (((A -> B) -> A) -> A) -> B 

In sostanza l'unica mossa che abbiamo è di applicare x, quindi cerchiamo di provare che.

f : {A B : Set} -> ((((A -> B) -> A) -> A) -> B) -> B 
f x = x ? 

Goal: ((A -> B) -> A) -> A 
x : (((A -> B) -> A) -> A) -> B 

Ora il nostro obiettivo è un tipo di funzione, quindi proviamo un lambda.

f : {A B : Set} -> ((((A -> B) -> A) -> A) -> B) -> B 
f x = x (\y -> ?) 

Goal: A 
x : (((A -> B) -> A) -> A) -> B 
y : (A -> B) -> A 

abbiamo bisogno di un A, e y può dare a noi se mettiamo a disposizione con l'argomento giusto. Non sono sicuro di cosa si tratta ancora, ma y è la nostra migliore scommessa:

f : {A B : Set} -> ((((A -> B) -> A) -> A) -> B) -> B 
f x = x (\y -> y ?) 

Goal: A -> B 
x : (((A -> B) -> A) -> A) -> B 
y : (A -> B) -> A 

Il nostro obiettivo è un tipo di funzione in modo usiamo un lambda.

f : {A B : Set} -> ((((A -> B) -> A) -> A) -> B) -> B 
f x = x (\y -> y (\z -> ?)) 

Goal: B 
x : (((A -> B) -> A) -> A) -> B 
y : (A -> B) -> A 
z : A 

Ora abbiamo bisogno di un B, e l'unica cosa che ci può dare una B è x, quindi proviamo di nuovo.

f : {A B : Set} -> ((((A -> B) -> A) -> A) -> B) -> B 
f x = x (\y -> y (\z -> x ?)) 

Goal: ((A -> B) -> A) -> A 
x : (((A -> B) -> A) -> A) -> B 
y : (A -> B) -> A 
z : A 

Ora il nostro obiettivo è un tipo di funzione che restituisce A, ma abbiamo z che è un A quindi non c'è bisogno di utilizzare l'argomento. Lo ignoreremo e restituiremo z.

f : {A B : Set} -> ((((A -> B) -> A) -> A) -> B) -> B 
f x = x (\y -> y (\z -> x (\_ -> z))) 

E ci si va!

+0

Wow! Questa è la risposta migliore e più veloce che abbia mai visto qui. Grazie mille. Ho installato Coq e ho provato ad usarlo ma non riesco a leggere l'output. È troppo complicato :( –

+0

Proverò ad usare Agda seguendo i tuoi consigli.È strano che non consideriamo tali applicazioni e facciamo tutte le cose a mano anche senza regole menzionate! Grazie mille –

+0

Ehm, se capisco si proprio la risposta può essere riscritta nel modo seguente:?. x (lambda y -> y (\ lambda z -> x (z))) –