| tento článek potřebuje další citace pro ověření. Prosím pomozte vylepšit tento článek podle přidávání citací ke spolehlivým zdrojům. Zdroj bez zdroje může být napaden a odstraněn. Najít zdroje: "Nechť výraz" – zprávy · noviny · knihy · učenec · JSTOR (Březen 2017) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) |
V počítačové vědě, a „nech“ výraz spolupracovníci a funkce definice s omezením rozsah.
The „nech“ výraz mohou být také definovány v matematice, kde spojuje booleovskou podmínku s omezeným rozsahem.
Výraz „let“ lze považovat za a lambda abstrakce aplikován na hodnotu. V rámci matematiky lze výraz let také považovat za a spojení výrazů v rámci existenční kvantifikátor což omezuje rozsah proměnné.
Výraz let je přítomen v mnoha funkčních jazycích, což umožňuje místní definici výrazu pro použití při definování jiného výrazu. Let-výraz je v některých funkčních jazycích přítomen ve dvou formách; nechat nebo „nechat rec“. Let rec je rozšíření jednoduchého výrazu let, který používá kombinátor pevných bodů provádět rekurze.
Dějiny
Dana Scott je Jazyk LCF[1] byla etapou ve vývoji lambda kalkulu do moderních funkčních jazyků. Tento jazyk zavedl výraz let, který se od té doby objevil ve většině funkčních jazyků.
Jazyky Systém,[2] ML a nověji Haskell[3] zdědili letové výrazy z LCF.
Stavové imperativní jazyky jako ALGOL a Pascal v podstatě implementovat let výraz, implementovat omezený rozsah funkcí v blokových strukturách.[Citace je zapotřebí ]
Úzce související "kde"klauzule, spolu s její rekurzivní variantou"kde rec", se již objevil v Peter Landin je Mechanické vyhodnocení výrazů.[4]
Popis
Výraz „let“ definuje funkci nebo hodnotu pro použití v jiném výrazu. Kromě konstrukce používané v mnoha funkčních programovacích jazycích se jedná o konstrukci přirozeného jazyka, která se často používá v matematických textech. Jedná se o alternativní syntaktický konstrukt pro klauzuli where.
Nechť výraz | Kde klauzule |
---|
Nechat 
a 
v 
| 
kde 
a 
|
V obou případech je celý konstrukt výrazem, jehož hodnota je 5. Stejně jako Jestliže pak jinak typ vrácený výrazem nemusí být nutně booleovský.
Letový výraz má 4 hlavní formy,
Formulář | A | Rekurzivní | Definice / omezení | Popis |
---|
Jednoduchý | Ne | Ne | Definice | Jednoduchá nerekurzivní definice funkce. |
Rekurzivní | Ne | Ano | Definice | Definice rekurzivní funkce (implementována pomocí Y kombinátor ). |
Vzájemné | Ano | Ano | Definice | Vzájemně rekurzivní definice funkce. |
Matematický | Ano | Ano | Omezení | Matematická definice podporující obecnou podmínku Boolean Let. |
Ve funkčních jazycích nechat výraz definuje funkce, které lze ve výrazu volat. Rozsah názvu funkce je omezen na strukturu výrazu let.
V matematice výraz let definuje podmínku, která je omezením výrazu. Syntaxe může také podporovat deklaraci existenčně kvantifikovaných proměnných lokálních k výrazu let.
Terminologie, syntaxe a sémantika se liší jazyk od jazyka. v Systém, nechat se používá pro jednoduchou formu a nechť rec pro rekurzivní formu. V ML nechat označí pouze začátek bloku deklarací pomocí zábava označení začátku definice funkce. V Haskellu, nechat může být vzájemně rekurzivní, přičemž kompilátor přijde na to, co je potřeba.
Definice
A lambda abstrakce představuje funkci bez názvu. Tohle je zdroj nekonzistence v definici lambda abstrakce. Lambda abstrakce však mohou být složeny tak, aby představovaly funkci se jménem. V této formě je nekonzistence odstraněna. Termín lambda,

je ekvivalentní definování funkce
podle
ve výrazu
, které lze zapsat jako nechat výraz;

Let výraz je pochopitelný jako výraz přirozeného jazyka. Výraz let představuje náhradu proměnné za hodnotu. Pravidlo substituce popisuje důsledky rovnosti jako substituci.
Nechť definice v matematice
v matematika the nechat výraz je popsán jako spojení výrazů. Ve funkčních jazycích se výraz let také používá k omezení rozsahu. V matematice je rozsah popsán kvantifikátory. Let výraz je konjunkce v existenciálním kvantifikátoru.

kde E a F jsou typu Boolean.
The nechat výraz umožňuje použít substituci na jiný výraz. Tuto substituci lze použít v omezeném rozsahu na dílčí výraz. Přirozené použití výrazu let je v aplikaci v omezeném rozsahu (tzv lambda klesá ). Tato pravidla definují, jak může být rozsah omezen;

kde F je není typu Boolean. Z této definice lze odvodit následující standardní definici výrazu let, jak se používá ve funkčním jazyce.
![x
ot in operatorname {FV}(y)implies (operatorname {let}x:x=yoperatorname {in}z)=z[x:=y]=(lambda x.z) y](https://wikimedia.org/api/rest_v1/media/math/render/svg/f81eac6e91e95d921c9394ea1a0bf03c75fa04bc)
Pro jednoduchost značka specifikující existenční proměnnou,
, bude z výrazu vynechán, pokud je to zřejmé z kontextu.
![x
ot in operatorname {FV}(y)implies (operatorname {let}x=yoperatorname {in}z)=z[x:=y]=(lambda x.z) y](https://wikimedia.org/api/rest_v1/media/math/render/svg/57e111c0893f106c22e85dd1fe949354b3b0a348)
Derivace
Chcete-li odvodit tento výsledek, nejprve předpokládejte,

pak

Pomocí pravidla substituce
![{displaystyle {egin{aligned}&iff x=yland (L z)[x:=y]&iff x=yland (L[x:=y] z[x:=y])&iff x=yland L z[x:=y]&implies L z[x:=y]end{aligned}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/6c7398de56fc1b42dbfb49d5a68ff2e1f7bac64c)
tak pro všechny L,
![Loperatorname {let}x:x=yoperatorname {in}zimplies L z[x:=y]](https://wikimedia.org/api/rest_v1/media/math/render/svg/d587c9dc81797c6072bff072d2423720fdf45b64)
Nechat
kde K. je nová proměnná. pak,
![( operatorname {let} x: x = y operatorname {in} z) = K implikuje z [x: = y] = K](https://wikimedia.org/api/rest_v1/media/math/render/svg/f9daffc57101f507dedd3a3cc49b0f7821ace954)
Tak,
![operatorname {let} x: x = y operatorname {in} z = z [x: = y]](https://wikimedia.org/api/rest_v1/media/math/render/svg/b61107edd6e0ebf29b86f858071985c945ef019b)
Ale z matematické interpretace redukce beta,
![( lambda x.z) y = z [x: = y]](https://wikimedia.org/api/rest_v1/media/math/render/svg/ba408977fa51632f2ed9a40ad81da9ceb47adc14)
Zde, pokud je y funkcí proměnné x, není to stejné x jako v z. Může být použito alfa přejmenování. Takže musíme mít,

tak,

Tento výsledek je reprezentován ve funkčním jazyce ve zkrácené formě, kde je význam jednoznačný;
![x not in operatorname {FV} (y) implikuje ( operatorname {let} x = y operatorname {in} z) = z [x: = y] = ( lambda x.z) y](https://wikimedia.org/api/rest_v1/media/math/render/svg/57e111c0893f106c22e85dd1fe949354b3b0a348)
Zde proměnná X je implicitně uznána jako součást rovnice definující x a proměnná v existenciálním kvantifikátoru.
Žádné zvedání z Boolean
Rozpor nastává, pokud je E definováno
. V tomto případě,

se stává

a pomocí,



To je nepravdivé, pokud G je nepravdivé. Aby se zabránilo tomuto rozporu F není povoleno být typu Boolean. Pro booleovské F správné tvrzení pravidla zrušení používá implikaci místo rovnosti,

Může se zdát divné, že pro Boolean platí jiné pravidlo než jiné typy. Důvodem je to, že pravidlo,

platí pouze tam, kde F je booleovský. Kombinace těchto dvou pravidel vytváří rozpor, takže pokud jedno pravidlo platí, druhé nikoli.
Spojování let výrazů
Nechť výrazy mohou být definovány s více proměnnými,

pak to může být odvozeno,

tak,

Zákony týkající se lambda kalkulu a nechat výrazy
The Snížení Eta dává pravidlo pro popis lambda abstrakcí. Toto pravidlo spolu se dvěma výše odvozenými zákony definuje vztah mezi lambda kalkulem a výrazy let.

Nechť je definice definována z lambda kalkulu
Aby se zabránilo Potenciální problémy spojené s matematická definice, Dana Scott původně definoval nechat výraz z lambda kalkulu. To lze považovat za zdola nahoru nebo za konstruktivní definici nechat výraz, na rozdíl od shora dolů, nebo axiomatická matematická definice.
Jednoduché, nerekurzivní nechat výraz byl definován jako syntaktický cukr pro lambda abstrakci aplikovanou na výraz. V této definici

Jednoduché nechat definice výrazu byla poté rozšířena, aby umožnila rekurzi pomocí kombinátor pevných bodů.
Kombinátor s pevným bodem
The kombinátor pevných bodů mohou být reprezentovány výrazem,

Toto vyjádření lze převést na lambda výraz. Abstrakce lambda nepodporuje odkaz na název proměnné v použitém výrazu, takže X musí být předáno jako parametr do X.

Pomocí pravidla eta redukce

dává,

Let výraz může být vyjádřen jako lambda abstrakce pomocí,

dává,

Toto je možná nejjednodušší implementace kombinátoru pevných bodů v lambda kalkulu. Jedna redukce beta však dává symetrickější formu Curryho Y kombinátoru.

Rekurzivní letový výraz
Rekurzivní nechat výraz s názvem „let rec“ je definován pomocí kombinátoru Y pro rekurzivní výrazy let.

Vzájemně rekurzivní letový výraz
Tento přístup je poté zobecněn na podporu vzájemné rekurze. Vzájemně rekurzivní výraz let může být složen přeuspořádáním výrazu, aby se odstranily všechny podmínky. Toho je dosaženo nahrazením více definic funkcí jednou definicí funkce, která nastaví seznam proměnných rovný seznamu výrazů. Verze kombinátoru Y s názvem Y * polyvariadický kombinátor fixních bodů[5] se pak používá k výpočtu pevného bodu všech funkcí současně. Výsledkem je vzájemně rekurzivní implementace nechat výraz.
Více hodnot
Pro vyjádření hodnoty, která je členem množiny, lze použít výraz let

V rámci aplikace funkcí, z jednoho nechat výraz do druhého,



Pro použití výrazu let na sebe ale platí jiné pravidlo.


Zdá se, že neexistuje žádné jednoduché pravidlo pro kombinování hodnot. Vyžaduje se obecná forma vyjádření, která představuje proměnnou, jejíž hodnota je členem sady hodnot. Výraz by měl být založen na proměnné a množině.
Aplikace funkcí použitá v tomto formuláři by měla dát další výraz ve stejné podobě. Tímto způsobem lze s jakýmkoli výrazem na funkcích více hodnot zacházet, jako by měl jednu hodnotu.
Nestačí, aby formulář představoval pouze množinu hodnot. Každá hodnota musí mít podmínku, která určuje, kdy má výraz hodnotu. Výsledný konstrukt je sada dvojic podmínek a hodnot, která se nazývá „sada hodnot“. Vidět zúžení množin algebraických hodnot.
Pravidla pro převod mezi lambda kalkulem a výrazy let
Meta-funkce bude uveden popis konverze mezi lambda a nechat výrazy. Meta-funkce je funkce, která bere program jako parametr. Program je údajem pro metaprogram. Program a meta program jsou na různých metaúrovních.
K rozlišení programu od meta programu se použijí následující konvence,
- Hranaté závorky [] budou použity k reprezentaci aplikace funkcí v meta programu.
- Velká písmena budou použita pro proměnné v meta programu. Malá písmena představují proměnné v programu.
bude použito pro rovné v meta programu.
Pro zjednodušení bude použito první pravidlo, že se shodují. Pravidla také předpokládají, že výrazy lambda byly předem zpracovány, takže každá abstrakce lambda má jedinečný název.
Používá se také operátor substituce. Výraz
znamená nahradit každý výskyt G v L podle S a vrátit výraz. Použitá definice je rozšířena o náhradu výrazů z definice uvedené na Lambda kalkul strana. Shoda výrazů by měla porovnávat výrazy pro alfa ekvivalenci (přejmenování proměnných).
Převod z lambda na nechat výrazy
Následující pravidla popisují, jak převést z výrazu lambda na a nechat výraz bez změny struktury.
![operatorname {de-lambda} [V] equiv V](https://wikimedia.org/api/rest_v1/media/math/render/svg/d0de3dc641d38384f918a819d631abebb34ecbaf)
![operatorname {de-lambda} [M N] ekviv operatorname {de-lambda} [M] operatorname {de-lambda} [N]](https://wikimedia.org/api/rest_v1/media/math/render/svg/b5efb4a24f7d8e6b766adc58d0c70bfba8afaf5b)
![operatorname {de-lambda} [F = lambda P.E] equiv operatorname {de-lambda} [F P = E]](https://wikimedia.org/api/rest_v1/media/math/render/svg/e43437dbae7c4406b94f3a4e8ef1b53fcad6c9dc)
![operatorname {de-lambda} [E = F] ekviv operatorname {de-lambda} [E] = operatorname {de-lambda} [F]](https://wikimedia.org/api/rest_v1/media/math/render/svg/a3cfbac0a8cd94ec34f53ba953dd3ec4ab880983)
![operatorname {de-lambda} [( lambda FE) L] equiv operatorname {let-combine} [ operatorname {let} F: operatorname {de-lambda} [F = L] operatorname {in} E ]](https://wikimedia.org/api/rest_v1/media/math/render/svg/3e58135f7eeeed6d46554387e773918f06e75192)
![V not in operatorname {FV} [ lambda FE] to operatorname {de-lambda} [ lambda FE] equiv operatorname {let-combine} [ operatorname {let} V: operatorname {de -lambda} [V F = E] operatorname {in} V]](https://wikimedia.org/api/rest_v1/media/math/render/svg/0783bf1eeef16742355b1604ac7c49f690df9899)
![{ displaystyle V neq W to operatorname {let-combine} [ operatorname {let} V: E operatorname {in} operatorname {let} W: F operatorname {in} G] equiv operatorname { let} V, W: E land F operatorname {in} G}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ab5c94d973f7d9b8430c467eb6c85be0818bd406)
![operatorname {let-combine} [ operatorname {let} V: E operatorname {in} F] equiv operatorname {let} V: E operatorname {in} F](https://wikimedia.org/api/rest_v1/media/math/render/svg/dcdf7a95bed9af991b9bf78be112f172ebae2744)
Pravidlo 6 vytváří jedinečnou proměnnou V jako název funkce.
Příklad
Například Y kombinátor,

je převeden na,

Pravidlo | Lambda výraz |
---|
6 | ![operatorname {de-lambda} [ lambda f. ( lambda x.f (x x)) ( lambda x.f (x x))]](https://wikimedia.org/api/rest_v1/media/math/render/svg/dfc8e3c48d21e1c3461b168a49ac7b272033983b) |
---|
![V not in operatorname {FV} [ lambda F.E] to operatorname {de-lambda} [ lambda F.E]](https://wikimedia.org/api/rest_v1/media/math/render/svg/a72de502b4dd9bd462869c49e809e6ab4c576266) |  | ![operatorname {let-combine} [ operatorname {let} V: operatorname {de-lambda} [V F = E] operatorname {in} V]](https://wikimedia.org/api/rest_v1/media/math/render/svg/d6af8323dc2b1debb31a587de246e8823bf12bb0) |
|
4 | ![operatorname {let-combine} [ operatorname {let} p: operatorname {de-lambda} [p f = ( lambda xf (x x)) ( lambda xf (x x)) ] operatorname {in} p]](https://wikimedia.org/api/rest_v1/media/math/render/svg/2dac43ea95c9c78acf236fb9617729b511edfaa0) |
---|
![operatorname {de-lambda} [p f = ( lambda x.f (x x)) ( lambda x.f (x x))]](https://wikimedia.org/api/rest_v1/media/math/render/svg/fad21d59ee4947595a069e864aed22f95bd44c0a) | ![operatorname {de-lambda} [E = F]](https://wikimedia.org/api/rest_v1/media/math/render/svg/eab35a85b1ec150a00fe1a7974eb242ac27c7826) |  | ![operatorname {de-lambda} [E] = operatorname {de-lambda} [F]](https://wikimedia.org/api/rest_v1/media/math/render/svg/dbb26cf7e0a93bf1c795bec332c5ce3b78e6cae9) | ![operatorname {de-lambda} [p f] = operatorname {de-lambda} [( lambda x.f (x x)) ( lambda x.f (x x))]](https://wikimedia.org/api/rest_v1/media/math/render/svg/07e3f407b9817a16531861570568ce1799069636) | ![operatorname {let-combine} [ operatorname {let} p: operatorname {de-lambda} [p f] = operatorname {de-lambda} [( lambda xf (x x)) ( lambda xf (x x))] operatorname {v} p]](https://wikimedia.org/api/rest_v1/media/math/render/svg/b66d701622d32f67f5a0493287fa678b5fad8ac3) |
---|
|
5 | ![operatorname {let-combine} [ operatorname {let} p: operatorname {de-lambda} [p f] = operatorname {de-lambda} [( lambda xf (x x)) ( lambda xf (x x))] operatorname {v} p]](https://wikimedia.org/api/rest_v1/media/math/render/svg/b66d701622d32f67f5a0493287fa678b5fad8ac3) |
---|
![operatorname {de-lambda} [( lambda x.f (x x)) ( lambda x.f (x x))]](https://wikimedia.org/api/rest_v1/media/math/render/svg/f4ecc68b56237237e724f61ab338d29bf394ac15) | ![operatorname {de-lambda} [( lambda F.E) L]](https://wikimedia.org/api/rest_v1/media/math/render/svg/df5d46bb0d7e45cf35c6c278858512973a0220fc) |  | ![operatorname {let-combine} [ operatorname {let} F: operatorname {de-lambda} [F = L] operatorname {in} E]](https://wikimedia.org/api/rest_v1/media/math/render/svg/49a1d5088d051d8f7ec4e322d8a003ca66f8f27b) | ![operatorname {let-combine} [ operatorname {let} x: operatorname {de-lambda} [x = lambda x.f (x x)] operatorname {in} f (x x)]](https://wikimedia.org/api/rest_v1/media/math/render/svg/e2d81492114061e99b1fb95fc13a3db92c027b35) |
|
3 | ![operatorname {let-combine} [ operatorname {let} p: operatorname {de-lambda} [p f] = operatorname {let-combine} [ operatorname {let} x: operatorname {de-lambda} [x = lambda xf (x x)] operatorname {in} f (x x)] operatorname {in} p]](https://wikimedia.org/api/rest_v1/media/math/render/svg/b11e42fdeab23b8146680e33a3134c9887befe63) |
---|
![operatorname {de-lambda} [x = lambda x.f (x x)]](https://wikimedia.org/api/rest_v1/media/math/render/svg/eb6e5e6c04c2826975bc8dc1e97d895eea68dc2e) | ![operatorname {de-lambda} [F = lambda P.E]](https://wikimedia.org/api/rest_v1/media/math/render/svg/bc6ccb3bc568b55bac9b99ed3bff946e8e1c284a) |  | ![operatorname {de-lambda} [F P = E]](https://wikimedia.org/api/rest_v1/media/math/render/svg/00576c98275cebfb554e43c30aecd53d17d1e5a5) | ![operatorname {de-lambda} [x x = f (x x)]](https://wikimedia.org/api/rest_v1/media/math/render/svg/fb52ee78f23b4502aada39a439c6fce50a825ac8) |
|
8 | ![operatorname {let-combine} [ operatorname {let} p: operatorname {de-lambda} [p f] = operatorname {let-combine} [ operatorname {let} x: operatorname {de-lambda} [x x = f (x x)] operatorname {in} f (x x)] operatorname {in} p]](https://wikimedia.org/api/rest_v1/media/math/render/svg/3af9efd711c0a9693c21e31d5cd3fa13becee9d6) |
---|
![operatorname {let-combine} [ operatorname {let} x: operatorname {de-lambda} [x x = f (x x)] operatorname {in} f (x x)]](https://wikimedia.org/api/rest_v1/media/math/render/svg/369c417ae986aa1ccae4e7cb4f75ff86ed596ba6) | ![operatorname {let-combine} [Y]](https://wikimedia.org/api/rest_v1/media/math/render/svg/d0edd376a3807815ce840f5916572f38874c3d84) | ![Y = operatorname {let} x: operatorname {de-lambda} [x x = f (x x)] operatorname {in} f (x x)](https://wikimedia.org/api/rest_v1/media/math/render/svg/4c0eb5e6a7dd6afc361f2301489a25624b804433) |  | ![operatorname {let} x: operatorname {de-lambda} [x x = f (x x)] operatorname {in} f (x x)](https://wikimedia.org/api/rest_v1/media/math/render/svg/357671794cb0b40ead6a94495ddcd902369c24e6) |
|
8 | ![operatorname {let-combine} [ operatorname {let} p: operatorname {de-lambda} [p f] = operatorname {let} x: operatorname {de-lambda} [x x = f ( x x)] operatorname {in} f (x x) operatorname {in} p]](https://wikimedia.org/api/rest_v1/media/math/render/svg/0bba3b08006c2fa0e011f20e5765bdd844bafbfa) |
---|
![operatorname {let-combine} [Y]](https://wikimedia.org/api/rest_v1/media/math/render/svg/d0edd376a3807815ce840f5916572f38874c3d84) | ![Y = operatorname {let} p: operatorname {de-lambda} [p f = operatorname {let} x: operatorname {de-lambda} [x x = f (x x)] operatorname {in} f (x x)] operatorname {in} str](https://wikimedia.org/api/rest_v1/media/math/render/svg/7b9d281e5043f1879b09c356ed769a89b4e88658) |  | ![operatorname {let} p: p f = operatorname {let} x: operatorname {de-lambda} [x x = f (x x)] operatorname {in} f (x x) operatorname {v} str](https://wikimedia.org/api/rest_v1/media/math/render/svg/be4eeb696c5350daf7c5205fc8a7748e064fb066) |
|
4 | ![operatorname {let} p: operatorname {de-lambda} [p f] = operatorname {let} x: operatorname {de-lambda} [x x = f (x x)] operatorname { in} f (x x) operatorname {in} str](https://wikimedia.org/api/rest_v1/media/math/render/svg/e49dc2877bb18e3ca9c5724238e5bc1e757e7310) |
---|
![operatorname {de-lambda} [x x = f (x x)]](https://wikimedia.org/api/rest_v1/media/math/render/svg/fb52ee78f23b4502aada39a439c6fce50a825ac8) | ![operatorname {de-lambda} [E = F]](https://wikimedia.org/api/rest_v1/media/math/render/svg/eab35a85b1ec150a00fe1a7974eb242ac27c7826) |  | ![operatorname {de-lambda} [E] = operatorname {de-lambda} [F]](https://wikimedia.org/api/rest_v1/media/math/render/svg/dbb26cf7e0a93bf1c795bec332c5ce3b78e6cae9) | ![operatorname {de-lambda} [x x] = operatorname {de-lambda} [f (x x)]](https://wikimedia.org/api/rest_v1/media/math/render/svg/f5a199d50357c05dd4189713f8759c601a80af5a) |
|
2 | ![operatorname {let} p: operatorname {de-lambda} [p f] = operatorname {let} x: operatorname {de-lambda} [x x] = operatorname {de-lambda} [f (x x)] operatorname {in} f (x x) operatorname {in} p](https://wikimedia.org/api/rest_v1/media/math/render/svg/15ac532177ae510f8a11e7fac25cad5069c53952) |
---|
![operatorname {de-lambda} [x x], operatorname {de-lambda} [f (x x)]](https://wikimedia.org/api/rest_v1/media/math/render/svg/440eb41db8fd0954fe8c9eaa406778d4985fa6ff) | ![operatorname {de-lambda} [p f], operatorname {de-lambda} [M_ {1} N_ {1}], operatorname {de-lambda} [M_ {2} N_ {2}] ,](https://wikimedia.org/api/rest_v1/media/math/render/svg/690e0bff212f8b1ed0d112cb1137dc440a6f018c) |  | ![operatorname {de-lambda} [M_ {1}] operatorname {de-lambda} [N_ {1}], operatorname {de-lambda} [M_ {2}] operatorname {de-lambda} [ N_ {2}], operatorname {de-lambda} [M_ {3}] operatorname {de-lambda} [N_ {3}]](https://wikimedia.org/api/rest_v1/media/math/render/svg/a96e111c3abcb3d4b90a543292a38870f351f58f) | ![operatorname {de-lambda} [p] operatorname {de-lambda} [f], operatorname {de-lambda} [x] operatorname {de-lambda} [x], operatorname {de-lambda } [f] operatorname {de-lambda} [x] operatorname {de-lambda} [x]](https://wikimedia.org/api/rest_v1/media/math/render/svg/ed1b1f9b086138e8289983409ea724b408c305c9) |
|
1 | ![operatorname {let} p: operatorname {de-lambda} [p] operatorname {de-lambda} [f] = operatorname {let} x: operatorname {de-lambda} [x] operatorname { de-lambda} [x] = operatorname {de-lambda} [f] ( operatorname {de-lambda} [x] operatorname {de-lambda} [x]) operatorname {in} f ( x x)] operatorname {v} str](https://wikimedia.org/api/rest_v1/media/math/render/svg/680ddbbf0aca672464bd8a7367db1819248d9f21) |
---|
![operatorname {de-lambda} [V]](https://wikimedia.org/api/rest_v1/media/math/render/svg/8d4a1270727a7a13e9b3ba285bc022fd888f545b) |  |
|
| ![operatorname {let} p: p f = operatorname {let} x: x x = f (x x) operatorname {in} f (x x)] operatorname {in} p](https://wikimedia.org/api/rest_v1/media/math/render/svg/6bdac5ddfcc6f25aa2872b00a61cbbd7925cc478) |
Převod z let na lambda výrazy
Tato pravidla zvrátí výše popsanou konverzi. Konvertují z a nechat výraz na výraz lambda bez změny struktury. Pomocí těchto pravidel nelze převést všechny letové výrazy. Pravidla předpokládají, že výrazy jsou již uspořádány, jako by byly generovány de-lambda.
![operatorname {get-lambda} [F, G V = E] = operatorname {get-lambda} [F, G = lambda V.E]](https://wikimedia.org/api/rest_v1/media/math/render/svg/4ebe7c990955401b0e7b09f2ce999efc2d3aa880)
![operatorname {get-lambda} [F, F = E] = operatorname {de-let} [E]](https://wikimedia.org/api/rest_v1/media/math/render/svg/cf2c34813e9a28ad6599cde30756f34399bb75aa)
![operatorname {de-let} [ lambda V.E] equiv lambda V. operatorname {de-let} [E]](https://wikimedia.org/api/rest_v1/media/math/render/svg/26d291dbf31803a054bd445a1066e8cbf4ae9bbc)
![operatorname {de-let} [M N] equiv operatorname {de-let} [M] operatorname {de-let} [N]](https://wikimedia.org/api/rest_v1/media/math/render/svg/5c876a5018468b6518441738d9e5203aba224f92)
![operatorname {de-let} [V] equiv V](https://wikimedia.org/api/rest_v1/media/math/render/svg/23c944cdb61bb1733806f6baf95a4cef7d406112)
![{ displaystyle V not in FV [ operatorname {get-lambda} [V, E]] to operatorname {de-let} [ operatorname {let} V: E operatorname {in} V] equiv operatorname {get-lambda} [V, E]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/3c24acfa12980073afc4f2a54ce80561396ca401)
![{ displaystyle V not in FV [ operatorname {get-lambda} [V, E]] to operatorname {de-let} [ operatorname {let} V: E operatorname {in} L] equiv ( lambda V. operatorname {de-let} [L]) operatorname {get-lambda} [V, E]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/3e0a7613d63994c0a89b90abb14262845e30da74)
![{ displaystyle W not in operatorname {FV} [ operatorname {get-lambda} [V, E]] to operatorname {de-let} [ operatorname {let} V, W: E land F operatorname {in} G] equiv operatorname {de-let} [ operatorname {let} V: E operatorname {in} operatorname {let} W: F operatorname {in} G]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/63b3bb04975aee17d86003a77bb817c2e3d47090)
![{ displaystyle V in operatorname {FV} [ operatorname {get-lambda} [V, E]] to operatorname {de-let} [ operatorname {let} V: E operatorname {in} L ] equiv operatorname {de-let} [ operatorname {let} V: V V = operatorname {get-lambda} [V, E] [V: = V V] operatorname {in} L [ V: = V V]]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/33fd9a064d9680ba5a82296a94207a5820d8d92e)
![{ displaystyle W in operatorname {FV} [ operatorname {get-lambda} [V, E]] to operatorname {de-let} [ operatorname {let} V, W: E land F operatorname {in} L] equiv operatorname {de-let} [ operatorname {let} V: V W = operatorname {get-lambda} [V, E] [V: = V W] operatorname {in} operatorname {let} W: F [V: = V W] operatorname {in} L [V: = V W]]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/5eadaab087243563e90735087c573a09f4c0ecd1)
V lambda kalkulu neexistuje žádný přesný strukturní ekvivalent nechat výrazy, které mají volné proměnné, které se používají rekurzivně. V tomto případě je nutné přidat nějaké parametry. Pravidla 8 a 10 přidávají tyto parametry.
Pravidla 8 a 10 jsou dostatečná pro dvě vzájemně se rekurzivní rovnice v nechat výraz. Nebudou však fungovat pro tři nebo více vzájemně rekurzivních rovnic. Obecný případ vyžaduje další úroveň opakování, což meta funkci trochu ztěžuje. Následující pravidla nahrazují pravidla 8 a 10 při provádění obecného případu. Pravidla 8 a 10 byla ponechána, aby bylo možné nejprve prostudovat jednodušší případ.
- lambda forma - Převést výraz na spojení výrazů, každý z formulářů proměnná = výraz.
![operatorname {lambda-form} [G V = E] = operatorname {lambda-form} [G = lambda V.E]](https://wikimedia.org/api/rest_v1/media/math/render/svg/a529daca5a067b288ced8e70265306e75c7c6f7d)
![{ displaystyle operatorname {lambda-form} [E land F] = operatorname {lambda-form} [E] land operatorname {lambda-form} [F]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/61282e56970fc6cecb987f58e6332b6ee5aed60e)
...... kde PROTI je proměnná.
- lift-vars - Získejte sadu proměnných, které potřebujete X jako parametr, protože výraz má X jako volná proměnná.
![X in operatorname {FV} [E] to operatorname {lift-vars} [X, V = E] = {V }](https://wikimedia.org/api/rest_v1/media/math/render/svg/781f4c031aa544d4609a24d1296e693a9200964b)
![X not in operatorname {FV} [E] to operatorname {lift-vars} [X, V = E] = {}](https://wikimedia.org/api/rest_v1/media/math/render/svg/2abd2c0de357d206d497fcba9fc1465840a3d468)
![{ displaystyle operatorname {lift-vars} [X, E land F] = operatorname {lift-vars} [X, E] cup operatorname {lift-vars} [X.F]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/fef8f757579f1f0e70c9f3efc0771ebaf4cee899)
- dílčí var - Pro každou proměnnou v sadě ji nahraďte proměnnou aplikovanou na X ve výrazu. To dělá X proměnná předaná jako parametr, místo aby byla volnou proměnnou na pravé straně rovnice.
![operatorname {sub-vars} [E, {V } cup S, X] = operatorname {sub-vars} [E [V: = V X], S, X]](https://wikimedia.org/api/rest_v1/media/math/render/svg/d65e0d873c3c7806828ca58dd88f821f21193c97)
![operatorname {sub-vars} [E, {}, X] = E](https://wikimedia.org/api/rest_v1/media/math/render/svg/19c8d37c0478acf003ef19a2687b889a9f5c8a8b)
- de-let - Výtah každá podmínka v E aby X není volná proměnná na pravé straně rovnice.
![{ displaystyle L = operatorname {lambda-form} [E] land S = operatorname {lift-vars} [X, L] to operatorname {de-let} [ operatorname {let} V ldots W , X: E land F operatorname {in} G]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/9018553ddb5947489c64630a174d427f38a821e1)
![{ displaystyle equiv operatorname {de-let} [ operatorname {let} V ldots W: operatorname {sub-vars} [L, S, X] operatorname {in} operatorname {let} operatorname {sub-vars} [ operatorname {lambda-form} [F], S, X] operatorname {in} operatorname {sub-vars} [G, S, X]]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/6baffeecd48c83258f32f5c44b153fae5fd1a427)
Příklady
Například nechat výraz získaný z Y kombinátor,

je převeden na,

Pravidlo | Lambda výraz |
---|
6 | ![{ displaystyle operatorname {de-let} [ operatorname {let} p: p f = operatorname {let} x: x q = f (q q) operatorname {in} f (x x) operatorname {in} p]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/060ccb2e76e9ffc68c2aea46a1bbc45d48d1bf9d) |
---|
![{ displaystyle operatorname {de-let} [ operatorname {let} V: E operatorname {in} V]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/6349026df0c417689ed310a06f94b1b1654b336d) |  | ![operatorname {get-lambda} [V, E]](https://wikimedia.org/api/rest_v1/media/math/render/svg/35cec842e117892dcfd9f5aa7f539843ab98a866) |
|
1 | ![{ displaystyle operatorname {get-lambda} [p, p f = operatorname {let} x: x q = f (q q) operatorname {in} f (x x)]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/fd736209fd0b0ac4952fedbb591c00c88c3e01aa) |
---|
![operatorname {get-lambda} [F, G V = E]](https://wikimedia.org/api/rest_v1/media/math/render/svg/9a15b4906111c9a1797fce3ccd787b127627b4c3) |  | ![operatorname {get-lambda} [F, G = lambda V.E]](https://wikimedia.org/api/rest_v1/media/math/render/svg/9d6f13b3bcb0ebce5b1a1ccee45f295c23e4d637) |
|
2 | ![{ displaystyle operatorname {get-lambda} [p, p = lambda f. operatorname {let} x: x q = f (q q) operatorname {in} f (x x) ]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/8124337afe174611a37ae0a2f6342db2b396c38c) |
---|
![operatorname {get-lambda} [F, F = E]](https://wikimedia.org/api/rest_v1/media/math/render/svg/fb457fd8361f051e4f27201c49f7e50173838699) |  | ![operatorname {de-let} [E]](https://wikimedia.org/api/rest_v1/media/math/render/svg/da1f180f637034c5b09784eebdcc65853a620a9a) |
|
3 | ![{ displaystyle operatorname {de-let} [ lambda f. operatorname {let} x: x q = f (q q) operatorname {in} f (x x)]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a7415b25827ab77c5f8820e005011ad91f845b0f) |
---|
![operatorname {de-let} [ lambda V.E]](https://wikimedia.org/api/rest_v1/media/math/render/svg/b134911fd89f15523a49fbd8b3c0abbf701c85b4) |  | ![lambda V. operatorname {de-let} [E]](https://wikimedia.org/api/rest_v1/media/math/render/svg/2683303011d8de1723f852a3c73f0efeafe7a381) |
|
7 | ![{ displaystyle lambda f. operatorname {de-let} [ operatorname {let} x: x q = f (q q) operatorname {in} f (x x)]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/349f2af1e6b5e48e3a5d05a8d49d1b00dcfdde53) |
---|
![{ displaystyle operatorname {de-let} [ operatorname {let} x: x q = f (q q) operatorname {in} f (x x)]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a579fe259ea9d08bcd163d0b72c528f7c7fd19b4) | ![{ displaystyle V not in FV [ operatorname {get-lambda} [V, E]] to operatorname {de-let} [ operatorname {let} V: E operatorname {in} L]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/2a72dfdde3d0e6e35b0dde246b7641a38ba76da5) |  | ![( lambda V. operatorname {de-let} [L]) operatorname {get-lambda} [V, E]](https://wikimedia.org/api/rest_v1/media/math/render/svg/185aa16c7f9d1c684b22b69c134521d95f94de51) |
|
4 | ![( lambda x. operatorname {de-let} [f (x x)]) operatorname {get-lambda} [x, x q = f (q q)]](https://wikimedia.org/api/rest_v1/media/math/render/svg/379ea4ef911b84fe2686471434c7b5881db553b0) |
---|
![operatorname {de-let} [f (x x)]](https://wikimedia.org/api/rest_v1/media/math/render/svg/387628cd1c2e1f498d6379f6b52ccb00a5da31bb) | ![operatorname {de-let} [M N]](https://wikimedia.org/api/rest_v1/media/math/render/svg/8e75e2d0f35c9a877b139ae7b3b6a225988be2f4) |  | ![operatorname {de-let} [M] operatorname {de-let} [N]](https://wikimedia.org/api/rest_v1/media/math/render/svg/59c2eeb85fe1db7f878a2eaa315f2ac10ae96823) | ![operatorname {de-let} [f] operatorname {de-let} [x x]](https://wikimedia.org/api/rest_v1/media/math/render/svg/7d21ab71c9e25f89e51e33c477f8b4cc9bedd964) |
|
4 | ![( lambda x. operatorname {de-let} [f] operatorname {de-let} [x x]) operatorname {get-lambda} [x, x q = f (q q )]](https://wikimedia.org/api/rest_v1/media/math/render/svg/942b80b5e21db74c239e2db9866441938e9dcd7f) |
---|
![operatorname {de-let} [x x]](https://wikimedia.org/api/rest_v1/media/math/render/svg/96693d9e25adffb19eb0c719c323ab958f45741f) | ![operatorname {de-let} [M N]](https://wikimedia.org/api/rest_v1/media/math/render/svg/8e75e2d0f35c9a877b139ae7b3b6a225988be2f4) |  | ![operatorname {de-let} [M] operatorname {de-let} [N]](https://wikimedia.org/api/rest_v1/media/math/render/svg/59c2eeb85fe1db7f878a2eaa315f2ac10ae96823) | ![operatorname {de-let} [x] operatorname {de-let} [x]](https://wikimedia.org/api/rest_v1/media/math/render/svg/3af1511e5c7ff0799a4e280b7ce2750563dd9074) |
|
5 | ![( lambda x. operatorname {de-let} [f] ( operatorname {de-let} [x] operatorname {de-let} [x])) operatorname {get-lambda} [x , x q = f (q q)]](https://wikimedia.org/api/rest_v1/media/math/render/svg/0dba5d9475d1ba786dbf5c42dd36d0c46d4592a7) |
---|
![operatorname {de-let} [V]](https://wikimedia.org/api/rest_v1/media/math/render/svg/7a5434e47a37bdde6d3e3d8d682bbf0f804d6058) |  |
|
1 | ![( lambda x.f (x x)) operatorname {get-lambda} [x, x q = f (q q)]](https://wikimedia.org/api/rest_v1/media/math/render/svg/d5582d1ad337e68579c5c782e75b99a0de8b602b) |
---|
![operatorname {get-lambda} [x, x q = f (q q)]](https://wikimedia.org/api/rest_v1/media/math/render/svg/dc6fd0ed4e360860031a742c8344a66c59b7f26d) | ![operatorname {get-lambda} [F, G V = E]](https://wikimedia.org/api/rest_v1/media/math/render/svg/9a15b4906111c9a1797fce3ccd787b127627b4c3) |  | ![operatorname {get-lambda} [F, G = lambda V.E]](https://wikimedia.org/api/rest_v1/media/math/render/svg/9d6f13b3bcb0ebce5b1a1ccee45f295c23e4d637) | ![operatorname {get-lambda} [x, x = lambda q.f (q q)]](https://wikimedia.org/api/rest_v1/media/math/render/svg/75cf1aa279e29d474fb17f4ebc5cc4f5defb52c9) |
|
2 | ![( lambda x.f (x x)) operatorname {get-lambda} [x, x = lambda q.f (q q)]](https://wikimedia.org/api/rest_v1/media/math/render/svg/48982f92b0dd3cd90baacd0535d9ee2892151d4e) |
---|
![operatorname {get-lambda} [x, x = lambda q.f (q q)]](https://wikimedia.org/api/rest_v1/media/math/render/svg/75cf1aa279e29d474fb17f4ebc5cc4f5defb52c9) | ![operatorname {get-lambda} [F, F = E]](https://wikimedia.org/api/rest_v1/media/math/render/svg/fb457fd8361f051e4f27201c49f7e50173838699) |  | ![operatorname {de-let} [E]](https://wikimedia.org/api/rest_v1/media/math/render/svg/da1f180f637034c5b09784eebdcc65853a620a9a) | ![operatorname {de-let} [ lambda q.f (q q)]](https://wikimedia.org/api/rest_v1/media/math/render/svg/814f281b8beddb0bc1a7a6aeab517b5002ddfb0a) |
|
3 | ![( lambda x.f (x x)) operatorname {de-let} [ lambda q.f (q q)]](https://wikimedia.org/api/rest_v1/media/math/render/svg/f2a6ed52b3681844c1124a3be966ebdd4028d89f) |
---|
![operatorname {de-let} [ lambda q.f (q q)]](https://wikimedia.org/api/rest_v1/media/math/render/svg/814f281b8beddb0bc1a7a6aeab517b5002ddfb0a) | ![operatorname {de-let} [ lambda V.E]](https://wikimedia.org/api/rest_v1/media/math/render/svg/b134911fd89f15523a49fbd8b3c0abbf701c85b4) |  | ![lambda V. operatorname {de-let} [E]](https://wikimedia.org/api/rest_v1/media/math/render/svg/2683303011d8de1723f852a3c73f0efeafe7a381) | ![lambda q. operatorname {de-let} [f (q q)]](https://wikimedia.org/api/rest_v1/media/math/render/svg/5a2660370566c50314d4b8215200ec2849c9d652) |
|
4 | ![( lambda x.f (x x)) ( lambda q. operatorname {de-let} [f (q q)])](https://wikimedia.org/api/rest_v1/media/math/render/svg/db1257c95b087859328d26f1d420d9cd14081304) |
---|
![operatorname {de-let} [f (q q)]](https://wikimedia.org/api/rest_v1/media/math/render/svg/231e07bbd0ebb6d8af2a8a79c623d945ab41ee0f) | ![operatorname {de-let} [M_ {1} N_ {1}]](https://wikimedia.org/api/rest_v1/media/math/render/svg/5f26c5ad209de349ab41f3927fd3d2828adcbe0f) |  | ![operatorname {de-let} [M_ {1}] operatorname {de-let} [N_ {1}]](https://wikimedia.org/api/rest_v1/media/math/render/svg/af82cbe2c7ecc59768f024d6d8f6a3a8b1c761c4) | ![operatorname {de-let} [f] operatorname {de-let} [q q]](https://wikimedia.org/api/rest_v1/media/math/render/svg/84fe5f42cd47e697c7d8aa58b92f91638506476d) | ![operatorname {de-let} [M_ {2} N_ {2}]](https://wikimedia.org/api/rest_v1/media/math/render/svg/2c661cf033de8426a29b368adbe48afb43a64c02) |  | ![operatorname {de-let} [q] operatorname {de-let} [q]](https://wikimedia.org/api/rest_v1/media/math/render/svg/ae26a059875a2f904c35e31b9ed9e064cfa02d0a) |
|
5 | ![( lambda xf (x x)) ( lambda q. operatorname {de-let} [f] ( operatorname {de-let} [q] operatorname {de-let} [q] ))](https://wikimedia.org/api/rest_v1/media/math/render/svg/a5bfce1b42e25e7fb55d6835d2c05a24124a4c83) |
---|
![operatorname {de-let} [V]](https://wikimedia.org/api/rest_v1/media/math/render/svg/7a5434e47a37bdde6d3e3d8d682bbf0f804d6058) | |  |
|
|  |
Jako druhý příklad si vezměte zvednutou verzi Y kombinátor,

je převeden na,

Pravidlo | Lambda výraz |
---|
8 | ![{ displaystyle operatorname {de-let} [ operatorname {let} p, q: p f x = f (x x) přistát q p f = (p f) (p f) operatorname {in} q p]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/2a3ce5b0a6240331d58e9f461167d91987480b4e) |
7 | ![{ displaystyle operatorname {de-let} [ operatorname {let} p: p f x = f (x x) operatorname {in} operatorname {let} q: q p f = (p f) (p f) operatorname {in} q p]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/28135191be9d81a2d353d075f03f6a3811f8c0d8) |
1, 2 | ![{ displaystyle ( lambda p. operatorname {de-let} [ operatorname {let} q: q p f = (p f) (p f) operatorname {in} q p] ) operatorname {get-lambda} [p, p f x = f (x x)]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/412a908181486d232a045ff5e8d7e97ced4e79d6) |
7, 4, 5 | ![{ displaystyle ( lambda p. operatorname {de-let} [ operatorname {let} q: q p f = (p f) (p f) operatorname {in} q p] ) lambda f. lambda xf (x x)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/2f6a06fc779c37752eb653c01d5efa43f5702da3) |
1, 2 | ![( lambda p. ( lambda qq p) operatorname {get-lambda} [q, q p f = (p f) (p f)]) lambda f. lambda xf (x x)](https://wikimedia.org/api/rest_v1/media/math/render/svg/12c54fd2563f751cb8da941fc0e9776b2fc59818) |
|  |
For a third example the translation of,

je,

Pravidlo | Lambda výraz |
---|
9 |  |
1 | ![{ displaystyle operatorname {let} x: operatorname {get-lambda} [x, x f = f (x f)] [x: = x x] operatorname {in} x [x: = x x]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/2e6cbe9f3fae3cf7549e04ab538fe522b2c8f1be) |
2 | ![{ displaystyle operatorname {let} x: operatorname {get-lambda} [x, x = lambda f.f (x f)] [x: = x x] operatorname {in} x x}](https://wikimedia.org/api/rest_v1/media/math/render/svg/13286233cd6401f54831c22c7e9f1947b8042aad) |
| ![{ displaystyle operatorname {let} x: (x = lambda f.f (x f)) [x: = x x] operatorname {in} x x}](https://wikimedia.org/api/rest_v1/media/math/render/svg/38d83c8c5ae15268eb8a23db0d1d3b67b64c9306) |
7 |  |
1 | ![( lambda x.x x) operatorname {get-lambda} [x, x x = lambda f.f (x x f)]](https://wikimedia.org/api/rest_v1/media/math/render/svg/ad5d914121974ea870197522719b9831ace2a34f) |
2 | ![( lambda x.x x) operatorname {get-lambda} [x, x = lambda x. lambda f.f (x x f)]](https://wikimedia.org/api/rest_v1/media/math/render/svg/4579dd21410fabbb333f7653bc2c1ad6dab058cf) |
|  |
Klíčoví lidé
Viz také
Reference