Algorytmy inwersji programów dla programów wyższego rzędu


10

Termin inwersja programu ma wiele odcieni znaczenia, ale prawdopodobnie zaczął się od pracy J. McCarthy'ego z 1956 r. Inwersja funkcji zdefiniowanych przez maszyny Turinga w kontekście sztucznej inteligencji. Do tej pory odkryto wiele połączeń między inwersją programu a innymi polami, np. Programowanie odwracalne (fizyczne i logiczne), częściowa ocena, weryfikacja, programowanie dwukierunkowe, programowanie logiki i uczenie maszynowe.

Co to jest inwersja programu? W pierwszym przybliżeniu jest to coś takiego: Biorąc pod uwagę program biorąc argumenty typu i zwracania wyników typu , produkować program , który jest „jakoś” odwrotność . Celowo jestem tutaj niejasny, ponieważ pojęcie to można (i jest) wyjaśnić na różne sposoby: np. Czy musi być iniekcyjne? Czy należy zwrócić wszystkie, czy tylko niektóre takie, że ?P.:ZAbZAbP.-1P.P.P.-1(b)zaP.(za)=b

Istnieją ogólne sposoby odwracania programu, np. Użycie diagonalizacji, jak już wskazał McCarthy, lub częściowa ocena, ale zwykle nie są one skuteczne. Również większość prac nad inwersją programów, które znam, nie dotyczy pełnych języków programowania wyższego rzędu (tj. -calculi).λ

Wniosek o referencję. Jaki jest stan techniki w jawnych algorytmach do odwracania programu -calculi (bez ograniczeń wyższych rzędów)?λ

Odpowiedzi:


5

W tej przestrzeni nie było dużo pracy, ale to, co tam jest, jest dość interesujące.

  1. Torben Mogensen pracował nad tym problemem. Oto dwa jego artykuły.

    Pierwszy artykuł zawiera algorytm dla programów funkcjonalnych pierwszego rzędu, a drugi rozszerza go na wyższy poziom. Dokładna charakterystyka, kiedy ten algorytm odniesie sukces, pozostawia się do przyszłej pracy.

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

    Opisuje to język programowania RFun, który odwraca programy funkcjonalne pierwszego rzędu, ale wymusza ograniczenia iniekcyjne i deterministyczne wstecz, które zapewniają, że ocena wstecz jest tak szybka, jak naprzód. (Napisali wiele innych artykułów na ten temat, z którymi miałem problemy.)

  3. Stefan Bohne i Baltasar Trancón Widemann.

    To naprawdę fajny papier! Zauważa, że ​​(a) możesz skonstruować kategorię, w której morfizmy są funkcjami sparowanymi z ich odwrotnością (dla dowolnego określonego pojęcia odwrotności, której używasz), oraz (b) ta kategoria ma zwartą strukturę sztyletu. Oznacza to, że możesz napisać program z nieco funky dyscypliną typu liniowego, a następnie odczytać interpretacje do przodu i do tyłu z semantyki.

    Dają funkcjonalny język z dość dziką składnią: prawie dowolne wyrażenia mogą być używane jako wzorce, a odwracalność czyni to sensownym.

  4. Francesco Tiezzia, Nobuko Yoshida

    Nie przeczytałem tego, ale odkryłem go dopiero, gdy Googling napisał o innych artykułach. Biorąc pod uwagę autorów i temat, podejrzewam, że to właśnie na twojej drodze!


Dzięki. (2, 3, 4) nie dokonują odwrócenia programu, lecz projektują języki programowania, w których programy są z definicji odwracalne / odwracalne. Jest to ściśle powiązany, ale inny problem. W rzeczywistości nie jestem całkowicie pewien, jak te problemy się odnoszą. Nie widziałem semi-inwersji, zanim może to już rozwiązało problem, ponieważ inwersja wydaje się być skrajnym przypadkiem semi-inwersji? Drugi artykuł BTW Mogensen idzie tylko do drugiego rzędu.
Martin Berger,

@MartinBerger: Myślę, że relacja zależy od tego, do czego chcesz użyć inwersji programu! Zainteresowałem się tym problemem, ponieważ patrzyłem na wnioskowanie o typie (jeśli masz funkcje na poziomie typu, dobrze jest móc odwrócić te funkcje, aby dowiedzieć się o instancjach kwantyfikatora), a więc ograniczenie języka nie było przeszkodą dla mnie. Co próbujesz zrobić?
Neel Krishnaswami,

W tej chwili interesuje mnie ogólny, abstrakcyjny problem. Moje zainteresowanie inwersją programu wynika z weryfikacji programu. I nie mogłem znaleźć nigdzie, który po prostu bierze termin lambda (z PCF powiedzmy lub STLC) i odwraca go. Czy to dlatego, że nie wyglądam we właściwym miejscu?
Martin Berger,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.