Algoritmi di inversione di programma per programmi di ordine superiore


10

Il termine inversione di programma ha molteplici sfumature di significato, ma probabilmente è iniziato con il lavoro di J. McCarthy del 1956 The Inversion of Functions definito da Turing Machines nel contesto dell'IA. Ormai sono state scoperte molte connessioni tra inversione di programma e altri campi, ad esempio programmazione reversibile (fisica e logica), valutazione parziale, verifica, programmazione bidirezionale, programmazione logica e apprendimento automatico.

Che cos'è l'inversione del programma? In prima approssimazione si tratta di qualcosa di simile: Dato un programma prendendo argomenti di tipo A e di restituire i risultati di tipo B , produrre un programma P - 1 che è "in qualche modo" l'inverso di P . Sono deliberatamente vago qui, dal momento che il concetto può essere (ed è) chiarito in vari modi: ad esempio, deve essere iniettivo? dovrebbe restituire tutto o solo alcuni tale che ?P:UNBUNBP-1PPP-1(B)un'P(un')=B

Esistono modi generici di invertire un programma, ad esempio utilizzando la diagonalizzazione come già sottolineato da McCarthy o utilizzando una valutazione parziale, ma tendono a non essere efficienti. Inoltre, la maggior parte dei lavori sull'inversione del programma con cui ho familiarità non sembra avere a che fare con linguaggi di programmazione di ordine superiore (ad esempio -calculi).λ

Richiesta di riferimento Qual è lo stato dell'arte degli algoritmi espliciti per l'inversione del programma di -calculi (senza alcuna limitazione sull'ordine superiore)?λ

Risposte:


5

Non c'è stata un'enorme quantità di lavoro in questo spazio, ma quello che c'è è molto interessante.

  1. Torben Mogensen ha lavorato su questo problema. Ecco due suoi documenti.

    Il primo documento fornisce un algoritmo per i programmi funzionali di primo ordine e il secondo lo estende a un ordine superiore. La precisa caratterizzazione di quando questo algoritmo avrà successo viene lasciata al lavoro futuro.

  2. Tetsuo Yokoyama, Holger Bock Axelsen e Robert Glück.

    Questo descrive il linguaggio di programmazione RFun, che inverte i programmi funzionali del primo ordine, ma applica vincoli di iniettività e determinismo all'indietro che assicurano che la valutazione all'indietro sia rapida quanto in avanti. (Hanno scritto una serie di altri articoli su questo argomento, che ho avuto difficoltà a trovare.)

  3. Stefan Bohne e Baltasar Trancón Widemann.

    Questa è una carta davvero ordinata! Osserva che (a) è possibile costruire una categoria in cui i morfismi sono funzioni accoppiate al loro inverso (per qualunque nozione particolare di inverso che si sta utilizzando), e (b) questa categoria ha una struttura compatta del pugnale. Ciò significa che è possibile scrivere un programma con una disciplina di tipo lineare leggermente funky e quindi leggere le interpretazioni in avanti e all'indietro dalla semantica.

    Offrono un linguaggio funzionale con una sintassi abbastanza selvaggia: espressioni quasi arbitrarie possono essere usate come schemi e la reversibilità lo rende sensato.

  4. Francesco Tiezzia, Nobuko Yoshida

    Non l'ho letto, ma l'ho scoperto solo quando ho cercato su Google gli altri articoli. Dati gli autori e l'argomento, sospetto che questo sia proprio il tuo vicolo!


Grazie. (2, 3, 4) non eseguono l'inversione del programma, ma progettano linguaggi di programmazione in cui i programmi sono reversibili / invertibili per definizione. Questo è un problema strettamente correlato, ma diverso. In realtà non sono del tutto chiaro su come questi problemi siano collegati. Non avevo mai visto la semi-inversione prima che forse risolva già il problema poiché l'inversione sembra essere un caso limite di semi-inversione? Il secondo articolo di BTW Mogensen arriva solo al 2 ° ordine.
Martin Berger,

@MartinBerger: immagino che la relazione dipenda da ciò per cui vuoi usare l'inversione del programma! Mi sono interessato al problema perché stavo guardando l'inferenza del tipo (se si dispone di funzioni a livello di tipo, è utile poter invertire tali funzioni per capire le istanze dei quantificatori), e quindi limitare la lingua non è stato uno spettacolo per me. Cosa stai cercando di fare?
Neel Krishnaswami,

In questo momento mi interessa il problema generale, astratto. Il mio interesse per l'inversione del programma viene dalla verifica del programma. E non sono riuscito a trovare da nessuna parte che semplicemente prende un termine lambda (da PCF dire o STLC) e lo inverte. È perché non sto cercando nel posto giusto?
Martin Berger,
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.