Szukam prostego rachunku, który obsługuje rozumowanie na temat refleksji , a mianowicie introspekcji i manipulacji uruchomionymi programami.
Czy istnieje nietypowe rozszerzenie -calculus, które umożliwia konwersję -terms do postaci, którą można manipulować składniowo, a następnie oceniać?λ
Wyobrażam sobie, że rachunek składa się z dwóch głównych dodatkowych terminów:
- : przyjmuje i tworzy reprezentację podlegającą modyfikacjom w manipulacji składniowej.v
- : przyjmuje składniową reprezentację terminu i ocenia go.
Aby wesprzeć refleksję, wymagana jest składniowa reprezentacja terminów. Wyglądałoby to tak:
- ( L A M R ( e ) ) R ( e ) e byłby reprezentowany jako termin , gdzie jest odzwierciedloną wersją ,
- byłoby reprezentowane jako termin , a
- byłoby reprezentowane jako .
Dzięki tej reprezentacji dopasowanie wzorców może być użyte do manipulowania terminami.
Ale mamy problem. i muszą być zakodowane jako terminy, podobnie jak dopasowanie wzorca. Radzenie sobie z tym wydaje się proste, dodając , i , ale czy będę musiał dodać inne warunki, aby wesprzeć ich manipulację?e v a l R E F L E C T E V A L M A T C H
Należy dokonać wyboru projektu. Do czego powyższa funkcja powinna z i ? Czy przekształca ciało, czy nie?r e f l e c t e v a l R ( - )
Ponieważ nie jestem tak bardzo zainteresowany badaniem samego odbicia - rachunek różniłby się jako narzędzie do innych badań - nie chcę wymyślać koła na nowo.
Czy są jakieś kalkulatory, które pasują do tego, co właśnie opisałem?
O ile mogę stwierdzić, kalkulacje takie jak MetaML, zasugerowane w komentarzu, idą daleko, ale nie obejmują zdolności do dopasowywania wzorców i dekonstruowania fragmentów kodu, które zostały już zbudowane.
Jedno, co chciałbym móc zrobić, to:
Następnie wykonaj dopasowanie wzorca dla wyniku, aby zbudować zupełnie inne wyrażenie.
Z pewnością nie jest to konserwatywne rozszerzenie rachunku -kalkultu, a meta-teoria prawdopodobnie będzie brzydka, ale taki jest sens mojej aplikacji. Chcę rozbić -abstrakcje na części.λ
źródło
Odpowiedzi:
Jean Louis Krivine wprowadził abstrakcyjny rachunek różniczkowy, który rozszerza „Krivine Machine” w bardzo nietrywialny sposób (zauważ, że maszyna Krivine już obsługuje instrukcję call / cc z lisp):
Wprowadza operator „cytowania” w tym artykule zdefiniowanym w następujący sposób: jeśli jest -term, zanotuj obraz przez jakiś bijection od terminów lambda do liczb naturalnych. Zanotuj cyfrę kościoła, która odpowiada . Krivine definiuje operatora według reguły oceny: Wierzę, że czarodziejstwo Kleene pokaże, że to wystarczy, aby zrobić to, co chcesz: tj. Zdefiniować ofertę i ewaluację operatory, jeśli jest obliczalne.λ n ϕ ϕ π : Λ → N ¯ n n ∈ N χ χ ϕ → ϕ ¯ n ϕ πϕ λ nϕ ϕ π:Λ→N n¯¯¯ n∈N χ
Pamiętaj, że Krivine jest niezwykle trudny do przeczytania (proszę nie wściekaj się, jeśli to przeczytasz, Jean-Louis!), A niektórzy badacze podjęli charytatywną próbę wydobycia treści technicznych w bardziej czytelny sposób. Możesz spróbować zapoznać się z tymi notatkami Christophe Raffali.
Mam nadzieję że to pomoże!
Przyszło mi do głowy, że istnieje inne odniesienie, które może być istotne dla twoich zainteresowań: rachunek czystego wzoru Jaya i Kesnera formalizuje wariant -kalkusa, który rozciąga prostą abstrakcję nad zmienną na abstrakcję nad wzorem reprezentującym wzór rachunek różniczkowy. Jest to fenomenalnie ekspresyjne, a w szczególności pozwala dekonstruować samą aplikację: jeśli się nie mylę, termin:λ
redukuje do . Znowu, ja wierzę, że to jest więcej niż wystarczająco, aby wdrożyć cytat i eval operatorów.λx.x x
źródło
Jest to bardzo trudne, jeśli nie niemożliwe, bez rezygnacji z połączenia. Innymi słowy, podejrzewam, że masz rację co do owłosionej meta-teorii. Z drugiej strony możliwe jest zaprojektowanie rachunku kombinatora, który może wyrażać wszystkie funkcje obliczeniowe Turinga i który ma pełną zdolność do sprawdzania jego warunków: patrz Jay i Give-Wilson .
Uważam jednak, że posiadanie tej umiejętności ma negatywne skutki dla teorii równań. W szczególności będziesz w stanie udowodnić, że dwie wartości są równe, jeśli są równe do równoważności alfa.
Nie czytałem jeszcze związanej z nim papierowej kody, ale powinienem zauważyć, że w logice klasycznej zasadniczo masz tylko dwie rzeczy: prawdę i fałsz. Wszystko jest równoważne jednemu z nich. Oznacza to, że i tak masz tendencję do załamania się teorii równań.
źródło
W teorii języków programowania funkcja, o której mówisz, jest zwykle określana jako „cytat”. Na przykład John Longley napisał o tym w niektórych swoich pracach, patrz ten artykuł .
Jeśli zastanawiasz się nad teoretycznymi rozważaniami (w przeciwieństwie do faktycznie użytecznej implementacji), możesz uprościć rzeczy, stwierdzając, że
quote
(lubreflect
jak to nazywacie) mapuje się na typ liczb całkowitychnat
, zwracając kod Gödel z jego argumentu. Następnie możesz rozłożyć liczbę, tak jak abstrakcyjne drzewo składniowe. Co więcej, nie potrzebujesz,eval
ponieważ można to zaimplementować w języku - jest to w zasadzie tłumacz języka.quote
Jeśli powiesz mi, czego szukasz, być może będę w stanie podać ci bardziej szczegółowe referencje.
Nawiasem mówiąc, oto otwarty problem:
quote
quote
quote
źródło
quote
Oto alternatywna odpowiedź, zamiast korzystać z mojego nominalnego podejścia, które wciąż jest eksperymentalne, istnieje bardziej ugruntowane podejście, które wraca do artykułu:
LEAP: język z ewaluacją i polimorfizmem
Frank Pfenning i Peter Lee
https://www.cs.cmu.edu/~fp/papers/tapsoft89.pdf
Artykuł zaczyna się od:
Należy pamiętać, że LEAP jest znacznie silniejszy niż to, czego chce PO. Przede wszystkim jest napisane na maszynie. Po drugie, prosi o metakrążenie, co oznacza na przykład, że eval może wykonać własną definicję. W Prologu otrzymujesz metakołowość dla rozwiązania / 1:
Jeśli dodasz następującą klauzulę, aby rozwiązać / 1:
A jeśli zajmiesz się tym, ta klauzula / 2 zwróci również klauzule sol / 1. Następnie możesz wywołać polecenie Rozwiąż (rozwiązać (...)) i zobaczyć, jak wykonuje się ono sam.
Pytania o samo reprezentację wciąż pobudzają niektóre badania, patrz na przykład:
Autoprezentacja w systemie Girards U
Matt Brown, Jens Palsberg
http://compilers.cs.ucla.edu/popl15/popl15-full.pdf
źródło
Problem został zidentyfikowany w pobliżu asystentów dowodowych, takich jak Coq i Isabelle / HOL. Pod nazwą akronim HOAS . Istnieją pewne twierdzenia na temat λ-Prolog, że dzięki nowemu kwantyfikatorowi things można tego dokonać. Ale nie mogłem jeszcze uchwycić tego twierdzenia. Wydaje mi się, że głównym spostrzeżeniem, jakie dotychczas uzyskałem, jest to, że nie ma określonego podejścia, istnieje kilka możliwych podejść.
Moje własne zdanie , jeszcze nie skończone , inspirowane jest niedawnym artykułem Paulsona na temat udowodnienia niekompletności Gödla. Używałbym obiektów wiążących na poziomie obiektu w połączeniu z pewną strukturą danych, która ma nazwy na poziomie meta. Zasadniczo podobna, ale odrębna struktura danych, jak ta z PO, oraz z kodowaniem Kościoła, ponieważ interesują mnie typy zależne:
Wyrażenia na poziomie meta można odróżnić od wyrażeń na poziomie obiektu, ponieważ używamy nazw zmiennych n, m, ... itd. Do oznaczenia nazw. Podczas gdy używamy nazw zmiennych x, y, .. itd. Na poziomie obiektu. Interpretacja meta terminu w logice obiektowej działałaby wówczas w następujący sposób. Napiszmy [t] σ do interpretacji terminu nominalnego t w kontekście nominalnym σ, który powinien dać termin obiektowy. Mielibyśmy wtedy:
Powyższe zdefiniowałoby, co OP nazywa funkcją EVAL. Mała różnica w stosunku do Paulsona, σ jest tylko skończoną listą, a nie funkcją. Moim zdaniem byłoby możliwe jedynie wprowadzenie funkcji EVAL, a nie funkcji REFLECT. Ponieważ na poziomie obiektu możesz mieć pewną równość, aby różne wyrażenia lambda były takie same. To, co musisz zrobić, to użyć ewaluacji do rozumowania, być może także do refleksji, jeśli czujesz taką potrzebę.
Musisz przejść do skrajności, takich jak Prolog, gdzie nic się nie rozszerza, jeśli chcesz zburzyć ścianę między wartością nominalną a wartością nominalną. Ale jak pokazuje przykład systemu λ-Prolog, w przypadku wyższego rzędu pojawiają się dodatkowe problemy, które można na przykład rozwiązać tylko logicznie, wprowadzając nowe środki, takie jak kwantyfikator ∇!
źródło