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:UN→BUNBP-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.