Strategia redukcji - Reduction strategy
W przepisywanie , a strategię redukcji lub przepisanie strategii jest relacją określając przepisać dla każdego obiektu lub terminu, zgodnego z danym zakresie redukcji. Niektórzy autorzy używają tego terminu w odniesieniu do strategii ewaluacji .
Definicje
Formalnie dla abstrakcyjnego systemu przepisywanie , strategia redukcji jest binarna relacja na z , gdzie jest przechodni zamknięcie z (ale nie refleksyjnym zamknięcia).
Krok strategia redukcji jest jednym gdzie . W przeciwnym razie jest to strategia wielu kroków .
Deterministyczny strategia jest jednym gdzie jest częściowe funkcja , czyli dla każdego istnieje co najwyżej jeden taki, że . W przeciwnym razie jest to strategia niedeterministyczna .
Przepisywanie terminów
W systemie przepisywania terminów strategia przepisywania określa, ze wszystkich redukowalnych podwarunków ( redeksów ), który należy skrócić ( zakontraktować ) w ciągu terminu.
Jednoetapowe strategie przepisywania terminów obejmują:
- leftmost-innermost: w każdym kroku skrajny lewy z najbardziej wewnętrznych przebudów jest skracany, gdzie najbardziej wewnętrzny przerób jest przeróbką niezawierającą żadnych przeróbek
- leftmost-outermost: w każdym kroku skracany jest skrajny lewy z najbardziej zewnętrznych przebudów, gdzie skrajny przekształcenie jest przeróbką niezawartą w żadnym przebudowie
- prawy najbardziej-wewnętrzny, prawy-najbardziej zewnętrzny: podobnie
Strategie wieloetapowe obejmują:
- Parallel-innermost: jednocześnie redukuje wszystkie najbardziej wewnętrzne redeksy. Jest to dobrze zdefiniowane, ponieważ redexes są parami rozłączne.
- równolegle-zewnętrzny: podobnie
- Redukcja Grossa-Knutha, zwana także pełną substytucją lub redukcją Kleene'a: wszystkie redeksy w tym okresie są jednocześnie redukowane
Równoległa redukcja skrajna zewnętrzna i redukcja Grossa-Knutha hipernormalizują się dla wszystkich prawie ortogonalnych systemów przepisywania terminów, co oznacza, że strategie te ostatecznie osiągną normalną formę, jeśli taka istnieje, nawet podczas wykonywania (skończenie wielu) arbitralnych redukcji między kolejnymi zastosowaniami strategii.
Stratego to język specyficzny dla domeny, zaprojektowany specjalnie do programowania strategii przepisywania terminów.
Rachunek lambda
W kontekście rachunku lambda , redukcja normalnego rzędu odnosi się do redukcji najbardziej od lewej do skrajnej w sensie podanym powyżej . Redukcja po lewej stronie jest czasami używana w odniesieniu do normalnej redukcji kolejności, ponieważ w przypadku przechodzenia przez drzewo w przedsprzedaży pojęcia są zbieżne, ale przy bardziej typowym przechodzeniu w kolejności pojęcia są odrębne. Na przykład, w pojęciu z zdefiniowanym tutaj , tekstowo skrajny lewy przekształcenie jest, podczas gdy skrajnie lewy-oddalony przekształcenie jest całym wyrażeniem. Redukcja normalnego rzędu jest normalizacją w tym sensie, że jeśli termin ma postać normalną, to w końcu do niego dojdzie, stąd nazwa normalny. Jest to znane jako twierdzenie o standaryzacji.
Redukcja rzędu aplikacyjnego odnosi się do redukcji najbardziej od lewej do wewnętrznej. W przeciwieństwie do zwykłego zamówienia, obowiązkowa redukcja zamówienia nie może się zakończyć, nawet jeśli termin ma normalną formę. Na przykład przy zastosowaniu redukcji zamówień aplikacyjnych możliwa jest następująca sekwencja redukcji:
Ale stosując redukcję normalnego rzędu, ten sam punkt początkowy szybko redukuje się do normalnej postaci:
Pełna β-redukcja odnosi się do niedeterministycznej strategii jednoetapowej, która pozwala zredukować dowolny redeks na każdym kroku. Równoległa β-redukcja Takahashiego jest strategią, która jednocześnie redukuje wszystkie redeksy.
Słaba redukcja
Redukcja rzędów normalnych i aplikacyjnych są silne, ponieważ pozwalają na redukcję w ramach abstrakcji lambda. W przeciwieństwie do tego, słaba redukcja nie zmniejsza się przy abstrakcji lambda. Redukcja call-by-name jest słabą strategią redukcji, która redukuje skrajny lewy zewnętrzny redex poza abstrakcją lambda, podczas gdy redukcja call-by-value jest słabą strategią redukcji, która redukuje skrajny lewy wewnętrzny redex poza abstrakcją lambda. Strategie te zostały opracowane w celu odzwierciedlenia strategii oceny call-by-name i call-by-value . W rzeczywistości, oryginalna redukcja kolejności aplikacji została również wprowadzona w celu modelowania techniki przekazywania parametrów call-by-value, którą można znaleźć w Algolu 60 i nowoczesnych językach programowania. W połączeniu z ideą słabej redukcji, wynikowa redukcja call-by-value jest rzeczywiście wiernym przybliżeniem.
Niestety słaba redukcja nie jest konfluentna, a tradycyjne równania redukcyjne rachunku lambda są bezużyteczne, ponieważ sugerują zależności, które naruszają reżim słabej oceny. Możliwe jest jednak rozszerzenie systemu tak, aby był konfluentny, poprzez dopuszczenie ograniczonej formy redukcji w ramach abstrakcji, w szczególności gdy redex nie obejmuje zmiennej ograniczonej abstrakcją. Na przykład λ x .(λ y . x ) z jest w normalnej postaci dla strategii słabej redukcji, ponieważ redeks (λ y . x ) z jest zawarty w abstrakcji lambda. Ale termin λ x .(λ y . y ) z można nadal zredukować w ramach rozszerzonej strategii słabej redukcji, ponieważ redeks (λ y . y ) z nie odnosi się do x .
Optymalna redukcja
Optymalna redukcja jest motywowana istnieniem wyrazów lambda, w których nie istnieje ciąg redukcji, który je redukuje bez powielania pracy. Rozważmy na przykład
((λg.(g(g(λx.x)))) (λh.((λf(f(f(λz.z)))) (λw(h(w(λy.y)))) )))
Składa się z trzech podobnych wyrazów, x=((λg. ... ) (λh.y)) i y=((λf. ...) (λw.z) ) ) i wreszcie z=λw.(h (w(λy.y))) . Można tu dokonać tylko dwóch β-redukcji, na x i na y. Zmniejszenie zewnętrznego terminu x spowoduje, że wewnętrzny termin y zostanie zduplikowany, a każda kopia będzie musiała zostać zmniejszona, ale zmniejszenie wewnętrznego terminu y najpierw zduplikuje jego argument z, co spowoduje, że praca zostanie zduplikowana, gdy wartości h i zostaliśmy poinformowani.
Optymalna redukcja nie jest strategią redukcyjną dla rachunku lambda w ścisłym tego słowa znaczeniu, ponieważ przeprowadzanie β-redukcji powoduje utratę informacji o współdzieleniu podstawionych redeksów. Zamiast tego jest zdefiniowany dla etykietowanego rachunku lambda , rachunku lambda z adnotacjami, który przechwytuje dokładne pojęcie pracy, którą należy udostępnić.
Etykiety składają się z przeliczalnie nieskończonego zestawu etykiet atomowych oraz konkatenacji , podkreśleń i podkreśleń etykiet. Termin oznaczony to termin rachunku lambda, w którym każdy podtermin ma etykietę. Standardowe początkowe oznaczenie terminu lambda daje każdemu podterminowi unikalną etykietę atomową. Oznaczona β-redukcja jest wyrażona wzorem:
gdzie konkatenuje etykiety, i podstawienie jest zdefiniowane w następujący sposób (przy użyciu konwencji Barendregt ):
Praktyczny algorytm optymalnej redukcji został po raz pierwszy opisany w 1989 roku, ponad dekadę po tym, jak optymalną redukcję zdefiniowano w 1974 roku. Bolońska Optimal Higher-order Machine (BOHM) jest prototypową implementacją rozszerzenia tej techniki na sieci interakcji . Lambdascope to nowsza implementacja optymalnej redukcji, również wykorzystująca sieci interakcji.
Zadzwoń według potrzeby redukcji
Redukcja wywołania według potrzeby może być zdefiniowana podobnie do redukcji optymalnej jako słaba redukcja skrajnie od lewej do skrajnej przy użyciu równoległej redukcji redeksów z tym samym znacznikiem, dla nieco inaczej oznaczonego rachunku lambda. Alternatywna definicja zmienia regułę beta, aby znaleźć „wymagane” obliczenie. Wymaga to rozszerzenia reguły beta, aby umożliwić redukcję terminów, które nie sąsiadują składniowo, więc ta definicja jest podobna do definicji etykietowanej, ponieważ obie są strategiami redukcji dla odmian rachunku lambda. Podobnie jak w przypadku połączenia według nazwy i wartości połączenia, redukcja połączeń według potrzeby została opracowana w celu naśladowania zachowania strategii oceny znanej jako „zadzwoń według potrzeby” lub ocena z opóźnieniem .