Esiste un algoritmo generale per riempire i buchi in termini di calcolo delle costruzioni?


9

Supponi di estendere il calcolo delle costruzioni con "buchi", ovvero pezzi di codice incompleti che non hai ancora compilato. Mi chiedo se esiste un algoritmo per ricoprire automaticamente quei ruoli. Ad esempio (usando la sintassi di Morte ):

Caso A:

λ (pred : ?) 
-> λ (Nat : *) 
-> λ (Succ : Nat -> Nat) 
-> λ (Zero : Nat)
-> (Succ (pred Nat Succ Zero))

In questa situazione, un algoritmo di inferenza di tipo può identificare che ?può ovviamente essere solo ∀ (Nat : *) -> (Nat -> Nat) -> Nat -> Natperché predriceve Nat : *, Succ : Nat -> Nat, Zero : Nat, e deve tornare Nat, perché è il primo argomento Succ.

Caso B:

(Id ? 4)

Dove 4 è codificato λ ed Idè la funzione di identità (cioè, ∀ (t:*) -> λ (x:t) -> x). In quella situazione, "?" È di nuovo chiaramente ∀ (N:*) -> (N -> N) -> N -> N, perché questo è il tipo di 4.

Caso C:

(Id (Equals Nat 7 (add 3 ?)) (Refl 7))

Qui, Equalse Reflsono definiti in modo simile a Idris. ?ovviamente può essere solo 4, ma come lo capisci? Un modo sarebbe quello di usare il fatto che ? : Nat, ed Natè un tipo che sappiamo enumerare, quindi possiamo provare tutto Natsfino a quando non viene eseguito il controllo dei caratteri. Questo può essere fatto per qualsiasi tipo enumerabile.

Caso D:

(Id (Equal Nat 10 (MulPair ?)) 10)

Qui, ?può essere solo di tipo Pair Nat; ha solo più di una risposta valida, però: può essere (Pair 10 1), (Pair 2 5), (Pair 5 2)e (Pair 1 10).

Caso E:

(Id (Equal Nat 7 (Mul 2 ?)) 7)

Qui non esiste una risposta valida, poiché 7non è un multiplo di 2.


Tutti quegli esempi mi hanno fatto notare che possiamo creare un algoritmo generale che identifica alcuni schemi noti e dà una risposta selezionando manualmente un algoritmo specifico (inferenza di tipo, forza bruta e così via), un po 'come Wolfram Alpha capisce la strategia giusta per risolvere un integrale. Ma sembra un approccio ingegneristico / hardcoded. Esiste un modo di principio per risolvere questo problema? C'è qualche studio / area di ricerca su di esso?

Risposte:


9

C'è sicuramente molta ricerca su questo problema! Spesso va sotto il nome di elaborazione . È un problema indecidibile in generale, come avrete intuito. I "buchi" sono spesso chiamati meta-variabili o variabili di unificazione .

Come spiego un po 'in questa risposta , il problema si riduce all'unificazione di ordine superiore , su cui diverse persone hanno scritto intere tesi di dottorato.

Come noterai nei tuoi esempi, alcuni casi sono in qualche modo facili e possono essere risolti dall'applicazione di regole semplici, mentre alcuni sembrano significativamente più difficili e hanno una sensazione più "dimostrativa del teorema".

Un terzo possibile caso è un problema di tipo "tipo di classe", in cui ?rappresenta un tipo di struttura , come una struttura di gruppo o campo, come in

mul ? 2 3

con mul : forall G:Group, G.carrier -> G.carrier -> G.carriero qualche variante. Qui dobbiamo trovare un Gtale che G.carrier == nat.

In generale, si desidera avere 3 "regimi" diversi per ciascun tipo di problema, rispettivamente l'unificazione semplice, la dimostrazione del teorema e la risoluzione dei tipi di classe.

Lo spieghiamo un po 'nel seguente documento:

Elaborazione in Teoria di tipo dipendente , de Moura, Avigad, Kong & Roux.

Potresti voler guardare i riferimenti di quel documento per maggiori informazioni.


Ho uno stomaco forte, ecco l'open-source per l'elaborazione in Lean.

Ecco un post wiki che descrive l' interfaccia dell'elaboratore in Idris.


Quelle sono le parole che volevo sentire! Grazie per tutti quei link, riferimenti e parole chiave, mi hai dato molto da fare ora. Ci sono strumenti disponibili che posso usare per completare i programmi Morte oggi? Naturalmente non necessariamente Morte ma qualcosa di abbastanza vicino per estrarre i programmi Morte.
MaiaVictor,

1
Ogni dimostratore di teoremi e controllore di tipi per un sistema tipicamente dipendente (Idris, Agda, Coq, Lean) avrà un risolutore così profondo nelle loro viscere. Tendono ad essere molto specifici del programma, quindi non sono ottimista sul fatto che puoi usarli per i tuoi scopi senza pesanti modifiche.
codice
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.