Składnia abstrakcyjna wyższego rzędu
W informatyce składnia abstrakcyjna wyższego rzędu (w skrócie HOAS ) to technika reprezentacji abstrakcyjnych drzew składniowych dla języków ze zmiennymi spoiwami .
Relacja do składni abstrakcyjnej pierwszego rzędu
Składnia abstrakcyjna jest abstrakcyjna , ponieważ jest reprezentowana przez obiekty matematyczne , które ze swej natury mają określoną strukturę. Na przykład w składni abstrakcyjnej pierwszego rzędu ( FOAS ), powszechnie stosowanych w kompilatorach , struktura drzewa implikuje relację podwyrażenia, co oznacza, że żadne nawiasy nie są wymagane do ujednoznacznienia programów (tak jak to jest w konkretnej składni ). HOAS ujawnia dodatkową strukturę: związek między zmiennymi a ich miejscami wiązania. W reprezentacjach FOAS zmienna jest zwykle reprezentowana za pomocą identyfikatora, przy czym związek między miejscem wiązania a zastosowaniem jest wskazywany za pomocą tego samego identyfikatora. W przypadku HOAS zmienna nie ma nazwy; każde użycie zmiennej odnosi się bezpośrednio do miejsca wiązania.
Istnieje wiele powodów, dla których ta technika jest przydatna. Po pierwsze, wyraźnie wyjaśnia strukturę powiązań programu: tak jak nie ma potrzeby wyjaśniania pierwszeństwa operatorów w reprezentacji FOAS, nie ma potrzeby posiadania pod ręką reguł powiązań i zakresu, aby interpretować reprezentację HOAS. Po drugie, programy, które są równoważne alfa (różniące się tylko nazwami powiązanych zmiennych) mają identyczne reprezentacje w HOAS, co może sprawić, że sprawdzanie równoważności będzie bardziej wydajne.
Realizacja
Jednym z obiektów matematycznych, który można wykorzystać do wdrożenia HOAS, jest wykres , w którym zmienne są powiązane z ich miejscami wiązania za pomocą krawędzi . Innym popularnym sposobem implementacji HOAS (na przykład w kompilatorach) są indeksy de Bruijna .
Zastosowanie w programowaniu logiki
Pierwszym językiem programowania, który bezpośrednio obsługiwał powiązania λ w składni, był język programowania logiki wyższego rzędu λProlog . Artykuł, który wprowadził termin HOAS, wykorzystał kod λProlog do jego zilustrowania. Niestety, kiedy przenosi się termin HOAS z programowania logicznego do programowania funkcjonalnego, termin ten implikuje identyfikację powiązań w składni z funkcjami nad wyrażeniami. W tym ostatnim ustawieniu HOAS ma inny i problematyczny sens. Termin składnia drzewa λ został wprowadzony, aby odnosić się konkretnie do stylu reprezentacji dostępnego w ustawieniach programowania logicznego. Chociaż różni się w szczegółach, traktowanie powiązań w λProlog jest podobne do ich traktowania w ramach logicznych, omówionych w następnej sekcji.
Użyj w ramach logicznych
W domenie struktur logicznych termin abstrakcyjna składnia wyższego rzędu jest zwykle używany w odniesieniu do określonej reprezentacji, która wykorzystuje wiązania metajęzyka do kodowania struktury powiązań języka obiektowego.
Na przykład struktura logiczna LF ma konstrukcję λ, która ma typ strzałki (→). Weźmy na przykład pod uwagę, że chcieliśmy sformalizować bardzo prymitywny język z wyrażeniami bez typów, wbudowanym zestawem zmiennych i konstrukcją let ( let <var> = <exp> in <exp'>
), która pozwala wiązać zmienne var
z definicją exp
w wyrażeniach exp'
. W Dwunastu moglibyśmy zrobić tak:
exp : typ . var : typ . v : var -> exp . niech : var -> exp -> exp -> exp .
Tutaj exp
jest typem wszystkich wyrażeń, a var
typem wszystkich wbudowanych zmiennych (zaimplementowanych być może jako liczby naturalne, czego nie pokazano). Stała v
działa jak funkcja rzutująca i świadczy o tym, że zmienne są wyrażeniami. Wreszcie, stała let
reprezentuje konstrukcje let w postaci let <var> = <exp> in <exp>
: akceptuje zmienną, wyrażenie (powiązane przez zmienną) i inne wyrażenie (w którym zmienna jest powiązana) .
Kanoniczna reprezentacja HOAS tego samego języka obiektowego byłaby następująca :
exp : typ . niech : exp -> ( exp -> exp ) -> exp .
W tej reprezentacji zmienne na poziomie obiektu nie pojawiają się jawnie. Stała let
przyjmuje wyrażenie (czyli wiązanie) i funkcję meta-poziomową exp
→ exp
(ciało let). Ta funkcja jest wyższego rzędu : wyrażenie ze zmienną wolną jest reprezentowane jako wyrażenie z lukami , które po zastosowaniu są wypełniane przez funkcję meta-poziomu. Jako konkretny przykład stworzylibyśmy wyrażenie na poziomie obiektu
niech x = 1 + 2 w x + 3
(zakładając naturalne konstruktory liczb i dodawania) przy użyciu powyższego podpisu HOAS as
niech ( plus 1 2 ) ([ y ] plus y 3 )
gdzie [y] e
jest składnią Dwunastu dla funkcji .
Ta specyficzna reprezentacja ma zalety wykraczające poza powyższe: po pierwsze, dzięki ponownemu wykorzystaniu pojęcia wiązania na poziomie meta, kodowanie ma właściwości, takie jak podstawienie zachowujące typ bez potrzeby ich definiowania/udowodniania. W ten sposób użycie HOAS może drastycznie zmniejszyć ilość kodu standardowego związanego z wiązaniem w kodowaniu.
Abstrakcyjna składnia wyższego rzędu ma generalnie zastosowanie tylko wtedy, gdy zmienne języka obiektowego można rozumieć jako zmienne w sensie matematycznym (to znaczy jako zamienniki dla dowolnych członków jakiejś domeny). Dzieje się tak często, ale nie zawsze: na przykład nie ma żadnych korzyści z kodowania dynamicznego zakresu HOAS , jakie pojawia się w niektórych dialektach Lispa , ponieważ zmienne o dynamicznym zasięgu nie działają jak zmienne matematyczne.
Zobacz też
- Uogólniony algebraiczny typ danych
- Parametryczna składnia abstrakcyjna wyższego rzędu (PHOAS)
Dalsza lektura
- J. Despeyroux; A. Felty; A. Hirschowitz (1995). Abstrakcyjna składnia wyższego rzędu w Coq . Notatki z wykładów z informatyki . Tom. 902. s. 124–138. doi : 10.1007/BFb0014049 . ISBN 978-3-540-59048-4 . Zarchiwizowane od oryginału w dniu 2006-08-30.
- Martina Hofmanna (1999). Analiza semantyczna składni abstrakcyjnej wyższego rzędu . 14. doroczne sympozjum IEEE na temat logiki w informatyce . P. 204. ISBN 0-7695-0158-3 .
- Eli Barzilay; Stuarta Allena (2002). Odzwierciedlając abstrakcyjną składnię wyższego rzędu w Nuprl (PDF) . Dowód twierdzenia w logice wyższego rzędu 2002. s. 23–32. ISBN 3-540-44039-9 . Zarchiwizowane od oryginału (PDF) w dniu 11.10.2006.
- Eli Barzilay (2006). Samoobsługowy oceniający przy użyciu HOAS (PDF) . Warsztaty ICFP na temat programowania schematów i funkcji 2006.