Niech wyrażenie - Let expression

W informatyce wyrażenie „let” wiąże definicję funkcji z ograniczonym zakresem .

Wyrażenie „let” może być również zdefiniowane w matematyce, gdzie wiąże warunek logiczny z ograniczonym zakresem.

Wyrażenie „let” może być traktowane jako abstrakcja lambda zastosowana do wartości. W matematyce wyrażenie let może być również traktowane jako koniunkcja wyrażeń w egzystencjalnym kwantyfikatorze, który ogranicza zakres zmiennej.

Wyrażenie let jest obecne w wielu językach funkcjonalnych, aby umożliwić lokalną definicję wyrażenia do użycia przy definiowaniu innego wyrażenia. Wyrażenie let występuje w niektórych językach funkcjonalnych w dwóch formach; let lub „niech rec”. Let rec jest rozszerzeniem prostego wyrażenia let , które używa kombinatora stałoprzecinkowego do implementacji rekursji .

Historia

Dana Scott „s język LCF był etap w ewolucji rachunku lambda do współczesnych języków funkcjonalnych. Język ten wprowadził wyrażenie let, które od tego czasu pojawiało się w większości języków funkcjonalnych.

Języki Scheme , ML , a ostatnio Haskell odziedziczyły wyrażenia let z LCF.

Języki imperatywne stanowe, takie jak ALGOL i Pascal, zasadniczo implementują wyrażenie let, aby zaimplementować ograniczony zakres funkcji, w strukturach blokowych.

Ściśle związane z „ gdzie ” klauzula, wraz z rekurencyjnego wariant „ gdzie rec ”, pojawiła się już w Peter Landin „s Mechaniczne oceny wyrażeń .

Opis

Wyrażenie „let” definiuje funkcję lub wartość do użycia w innym wyrażeniu. Oprócz tego, że jest konstrukcją używaną w wielu funkcjonalnych językach programowania, jest to konstrukcja języka naturalnego często używana w tekstach matematycznych. Jest to alternatywna konstrukcja składniowa dla klauzuli where.

Niech wyrażenie Gdzie klauzula

Pozwolić

oraz

w

gdzie

oraz

W obu przypadkach cała konstrukcja jest wyrażeniem o wartości 5. Podobnie jak w przypadku if-then-else typ zwracany przez wyrażenie niekoniecznie musi być typu Boolean.

Wyrażenie let występuje w 4 głównych formach,

Formularz I Rekurencyjne Definicja / Ograniczenie Opis
Prosty Nie Nie Definicja Prosta definicja funkcji nierekurencyjnej.
Rekurencyjne Nie tak Definicja Definicja funkcji rekurencyjnej (implementowana za pomocą kombinatora Y ).
Wzajemne tak tak Definicja Wzajemnie rekurencyjna definicja funkcji.
Matematyczny tak tak Ograniczenie Matematyczna definicja wspierająca ogólny warunek boolowski.

W językach funkcyjnych wyrażenie let definiuje funkcje, które mogą być wywołane w wyrażeniu. Zakres nazwy funkcji jest ograniczony do struktury wyrażenia let.

W matematyce wyrażenie let definiuje warunek, który jest ograniczeniem wyrażenia. Składnia może również wspierać deklarację egzystencjalnie skwantyfikowanych zmiennych lokalnych względem wyrażenia let.

Terminologia, składnia i semantyka różnią się w zależności od języka. W Scheme , let jest używany dla formy prostej, a let rec dla formy rekurencyjnej. W ML let zaznacza tylko początek bloku deklaracji z zabawą oznaczającą początek definicji funkcji. W Haskell, niech będą wzajemnie rekurencyjne, z kompilatorem domyślającym się, co jest potrzebne.

Definicja

N poboru reprezentuje funkcję bez nazwy. To jest źródłem niespójności definicji abstrakcji lambda. Jednak abstrakcje lambda mogą być tworzone w celu reprezentowania funkcji o nazwie. W tej formie niezgodność jest usuwana. Termin lambda,

jest równoznaczne z określeniem funkcji przez w wyrażeniu , które można zapisać jako wyrażenie let ;

Wyrażenie let jest zrozumiałe jako wyrażenie w języku naturalnym. Wyrażenie let reprezentuje zastąpienie zmiennej wartością. Reguła substytucji opisuje implikacje równości jako substytucji.

Niech definicja w matematyce

W matematyce let ekspresja jest opisany jako koniunkcji wyrażeń. W językach funkcjonalnych wyrażenie let służy również do ograniczania zakresu. W matematyce zakres jest opisywany przez kwantyfikatory. Wyrażenie let jest koniunkcją w egzystencjalnym kwantyfikatorze.

gdzie E i F są typu Boolean.

Let ekspresja pozwala na zmianę do zastosowania innemu wyrażeniu. To podstawienie można zastosować w ograniczonym zakresie do wyrażenia podrzędnego. Naturalnym zastosowaniem wyrażenia let jest zastosowanie do ograniczonego zakresu (tzw. lambda dropping ). Zasady te określają, w jaki sposób można ograniczyć zakres;

gdzie F nie jest typu Boolean . Z tej definicji można wyprowadzić następującą standardową definicję wyrażenia let, używaną w języku funkcjonalnym.

Dla uproszczenia znacznik określający zmienną egzystencjalną , zostanie pominięty w wyrażeniu, jeśli jest on jasny z kontekstu.

Pochodzenie

Aby uzyskać ten wynik, najpierw załóżmy,

następnie

Stosując zasadę substytucji,

więc dla wszystkich L ,

Niech gdzie K jest nową zmienną. następnie,

Więc,

Ale z matematycznej interpretacji redukcji beta,

Tutaj, jeśli y jest funkcją zmiennej x, to nie jest to samo x jak w z. Można zastosować zmianę nazwy alfa. Więc musimy mieć,

więc,

Wynik ten jest reprezentowany w języku funkcjonalnym w formie skróconej, gdzie znaczenie jest jednoznaczne;

Tutaj zmienna x jest domyślnie uznawana zarówno za część równania definiującego x, jak i zmienną w kwantyfikatorze egzystencjalnym.

Brak podnoszenia z Boolean

Sprzeczność powstaje, jeśli E jest zdefiniowane przez . W tym przypadku,

staje się,

i za pomocą,

To jest fałszywe, jeśli G jest fałszywe. Aby uniknąć tej sprzeczności, F nie może być typu Boolean. Dla Boolean F poprawne stwierdzenie reguły odrzucania używa implikacji zamiast równości,

Może wydawać się dziwne, że dla Boolean obowiązuje inna reguła niż dla innych typów. Powodem tego jest to, że zasada

ma zastosowanie tylko wtedy, gdy F jest wartością logiczną. Połączenie tych dwóch zasad tworzy sprzeczność, więc tam, gdzie jedna zasada obowiązuje, druga nie.

Łączenie wyrażeń let

Wyrażenia niech mogą być definiowane z wieloma zmiennymi,

wtedy można go wyprowadzić,

więc,

Prawa dotyczące rachunku lambda i wyrażeń let

Redukcja Eta daje regułę opisującą abstrakcje lambda. Reguła ta wraz z dwoma wyprowadzonymi powyżej prawami określa związek między rachunkiem lambda a wyrażeniami let.

Nazwa Prawo
Równoważność redukcji eta
Równoważność let-lambda (gdzie jest nazwą zmiennej.)
Niech kombinacja

Niech definicja zdefiniowana z rachunku lambda

Aby uniknąć potencjalnych problemów związanych z definicją matematyczną , Dana Scott pierwotnie zdefiniowała wyrażenie let z rachunku lambda. Można to uznać za oddolną lub konstruktywną definicję wyrażenia let , w przeciwieństwie do odgórnej lub aksjomatycznej definicji matematycznej.

Proste, nierekurencyjne wyrażenie let zostało zdefiniowane jako cukier składniowy dla abstrakcji lambda zastosowanej do terminu. W tej definicji

Definicja prostego wyrażenia let została następnie rozszerzona, aby umożliwić rekursję przy użyciu kombinatora stałoprzecinkowego .

Kombinator stałopunktowy

Operator paradoksalny może być reprezentowany przez wyrażenie

Ta reprezentacja może zostać przekształcona w termin lambda. Abstrakcja lambda nie obsługuje odwołań do nazwy zmiennej w zastosowanym wyrażeniu, więc x musi być przekazany jako parametr do x .

Stosując zasadę redukcji eta,

daje,

Wyrażenie let może być wyrażone jako abstrakcja lambda przy użyciu,

daje,

Jest to prawdopodobnie najprostsza implementacja kombinatora stałoprzecinkowego w rachunku lambda. Jednak jedna redukcja beta daje bardziej symetryczną formę kombinatora Y Curry'ego.

Rekurencyjne wyrażenie niech

Rekurencyjne wyrażenie let o nazwie „let rec” jest definiowane za pomocą kombinatora Y dla rekurencyjnych wyrażeń let.

Wzajemnie rekurencyjne wyrażenie niech

To podejście jest następnie uogólniane w celu wspierania wzajemnej rekurencji. Wzajemnie rekurencyjne wyrażenie let może być skomponowane przez przeorganizowanie wyrażenia w celu usunięcia dowolnych warunków i . Osiąga się to poprzez zastąpienie wielu definicji funkcji jedną definicją funkcji, która ustawia listę zmiennych równą liście wyrażeń. Wersja kombinatora Y, zwana wielowariantowym kombinatorem stałopunktowym Y*, jest następnie używana do obliczania punktu stałego wszystkich funkcji w tym samym czasie. Rezultatem jest wzajemnie rekurencyjna implementacja wyrażenia let .

Wiele wartości

Wyrażenie let może służyć do reprezentowania wartości, która jest członkiem zbioru,

W ramach zastosowania funkcji, jednego wyrażenia do drugiego,

Ale inna zasada dotyczy zastosowania wyrażenia let do samego siebie.

Nie ma prostej zasady łączenia wartości. Wymagana jest ogólna forma wyrażenia reprezentująca zmienną, której wartość należy do zbioru wartości. Wyrażenie powinno być oparte na zmiennej i zestawie.

Aplikacja funkcji zastosowana do tej formy powinna dawać inne wyrażenie w tej samej formie. W ten sposób każde wyrażenie dotyczące funkcji wielu wartości może być traktowane tak, jakby miało jedną wartość.

Nie wystarczy, aby formularz reprezentował tylko zbiór wartości. Każda wartość musi mieć warunek określający, kiedy wyrażenie przyjmuje wartość. Powstała konstrukcja to zestaw par warunków i wartości, zwany „zestawem wartości”. Zobacz zawężanie algebraicznych zbiorów wartości .

Zasady konwersji między rachunkiem lambda a wyrażeniami let

Zostaną podane meta-funkcje opisujące konwersję między wyrażeniami lambda i let . Meta-funkcja to funkcja, która przyjmuje program jako parametr. Program to dane dla meta-programu. Program i metaprogram znajdują się na różnych metapoziomach.

Następujące konwencje będą używane do odróżnienia programu od metaprogramu,

  • Nawiasy kwadratowe [] będą używane do reprezentowania aplikacji funkcji w programie meta.
  • W metaprogramie dla zmiennych będą używane wielkie litery. Małe litery reprezentują zmienne w programie.
  • będzie używany dla równych w programie meta.

Dla uproszczenia zastosowana zostanie pierwsza reguła podana, że ​​dopasowania. Reguły zakładają również, że wyrażenia lambda zostały wstępnie przetworzone, tak aby każda abstrakcja lambda miała unikatową nazwę.

Używany jest również operator substytucji. Wyrażenie oznacza zastąpienie każdego wystąpienia G w L przez S i zwrócenie wyrażenia. Użyta definicja została rozszerzona, aby objąć podstawienie wyrażeń, z definicji podanej na stronie rachunku Lambda . Dopasowywanie wyrażeń powinno porównywać wyrażenia pod kątem równoważności alfa (zmiany nazw zmiennych).

Konwersja z wyrażenia lambda do wyrażenia let

Poniższe reguły opisują sposób konwersji z wyrażenia lambda na wyrażenie let bez zmiany struktury.

Reguła 6 tworzy unikalną zmienną V jako nazwę funkcji.

Przykład

Na przykład kombinator Y ,

jest konwertowany na,

Reguła Wyrażenie lambda
6
4
5
3
8
8
4
2
1

Konwersja z wyrażeń let do lambda

Zasady te odwracają konwersję opisaną powyżej. Konwertują z wyrażenia let na wyrażenie lambda bez zmiany struktury. Nie wszystkie wyrażenia let mogą być konwertowane przy użyciu tych reguł. Reguły zakładają, że wyrażenia są już ułożone tak, jakby zostały wygenerowane przez de-lambda .

Nie ma dokładnego odpowiednika strukturalnego w rachunku lambda dla wyrażeń let, które mają wolne zmienne, które są używane rekurencyjnie. W takim przypadku wymagane jest dodanie pewnych parametrów. Reguły 8 i 10 dodają te parametry.

Reguły 8 i 10 są wystarczające dla dwóch wzajemnie rekurencyjnych równań w wyrażeniu let . Jednak nie będą działać dla trzech lub więcej wzajemnie rekurencyjnych równań. Ogólny przypadek wymaga dodatkowego poziomu pętli, co sprawia, że ​​funkcja meta jest nieco trudniejsza. Poniższe zasady zastępują zasady 8 i 10 we wdrażaniu przypadku ogólnego. Reguły 8 i 10 pozostawiono, aby najpierw przestudiować prostszy przypadek.

  1. lambda-form — przekonwertuj wyrażenie na połączenie wyrażeń, z których każdy ma postać zmienna = wyrażenie .
    1. ...... gdzie V jest zmienną.
  2. lift-vars — pobierz zestaw zmiennych, które wymagają X jako parametru, ponieważ wyrażenie ma X jako zmienną wolną.
  3. pod- zmienne - Dla każdej zmiennej w zestawie zastąp ją zmienną zastosowaną do X w wyrażeniu. To sprawia, że X jest zmienną przekazywaną jako parametr, zamiast być wolną zmienną po prawej stronie równania.
  4. de-let - Podnieś każdy warunek w E tak, że X nie jest wolną zmienną po prawej stronie równania.

Przykłady

Na przykład wyrażenie let uzyskane z kombinatora Y ,

jest konwertowany na,

Reguła Wyrażenie lambda
6
1
2
3
7
4
4
5
1
2
3
4
5

Jako drugi przykład weź podniesioną wersję kombinatora Y ,

jest konwertowany na,

Reguła Wyrażenie lambda
8
7
1, 2
7, 4, 5
1, 2

Dla trzeciego przykładu tłumaczenie,

jest,

Reguła Wyrażenie lambda
9
1
2
7
1
2

Kluczowi ludzie

Zobacz też

Bibliografia