Inom datavetenskap associerar ett "låt" -uttryck en funktionsdefinition med ett begränsat omfång .
Den "låt" uttryck kan också definieras i matematik, där den associerar en Boolean tillstånd med en begränsad omfattning.
"Låt" -uttrycket kan betraktas som en lambda -abstraktion applicerad på ett värde. Inom matematik kan ett låtuttryck också betraktas som en sammansättning av uttryck, inom en existentiell kvantifierare som begränsar variabelns omfattning.
Låtuttrycket finns på många funktionella språk för att möjliggöra den lokala definitionen av uttryck, för att definiera ett annat uttryck. Låtuttrycket finns på vissa funktionella språk i två former; låt eller "låt rec". Let rec är en förlängning av det enkla let-uttrycket som använder fixpunkts-kombinatorn för att implementera rekursion .
Historia
Dana Scott 's LCF språket var ett steg i utvecklingen av lambdakalkyl till moderna funktionella språk. Detta språk introducerade let -uttrycket, som har dykt upp på de flesta funktionella språk sedan dess.
Språken Scheme , ML och på senare tid har Haskell ärvt låtuttryck från LCF.
Stateful imperative språk som ALGOL och Pascal implementerar i huvudsak ett let -uttryck, för att implementera begränsat funktionsomfång, i blockstrukturer.
Ett närbesläktat " där " klausul, tillsammans med sin rekursiva variant "där rec ", dök upp redan i Peter Landin 's Den mekaniska utvärderingen av uttryck .
Beskrivning
Ett "låt" -uttryck definierar en funktion eller ett värde för användning i ett annat uttryck. Förutom att den är en konstruktion som används i många funktionella programmeringsspråk, är den en naturlig språkkonstruktion som ofta används i matematiska texter. Det är en alternativ syntaktisk konstruktion för en var -sats.
| Låt uttryck |
Var klausul
|
|
Låta

och

i

|

var

och

|
I båda fallen är hela konstruktionen ett uttryck vars värde är 5. Liksom if-then-else är typen som uttrycket returnerar inte nödvändigtvis booleskt.
Ett låtuttryck finns i 4 huvudformer,
| Form |
Och |
Rekursiv |
Definition / begränsning |
Beskrivning
|
| Enkel |
Nej |
Nej |
Definition |
Enkel icke -rekursiv funktionsdefinition.
|
| Rekursiv |
Nej |
Ja |
Definition |
Rekursiv funktionsdefinition (implementerad med Y -kombinatorn ).
|
| Ömsesidig |
Ja |
Ja |
Definition |
Ömsesidigt rekursiv funktionsdefinition.
|
| Matematisk |
Ja |
Ja |
Begränsning |
Matematisk definition som stöder ett allmänt booleskt uthyrningsvillkor.
|
I funktionella språk den låt uttryck definierar funktioner som kan kallas i uttrycket. Omfattningen av funktionsnamnet är begränsad till strukturen för låta uttryck.
I matematik definierar låtuttrycket ett villkor, vilket är en begränsning för uttrycket. Syntaxen kan också stödja deklarationen av existentiellt kvantifierade variabler som är lokala för uthyrningsuttrycket.
Terminologin, syntaxen och semantiken varierar från språk till språk. I Scheme används let för den enkla formen och låt rec för den rekursiva formen. I ML låter bara markera starten på ett deklarationsblock med roligt som markerar starten på funktionsdefinitionen. I Haskell kan låt vara ömsesidigt rekursivt, med kompilatorn som räknar ut vad som behövs.
Definition
En lambda -abstraktion representerar en funktion utan namn. Detta är en källa till inkonsekvensen i definitionen av en lambda -abstraktion. Lambda -abstraktioner kan dock komponeras för att representera en funktion med ett namn. I denna form avlägsnas inkonsekvensen. Lambda -termen,

motsvarar att definiera funktionen med i uttrycket , som kan skrivas som låta uttryck;




Låtuttrycket är förståeligt som ett naturligt språkuttryck. Let -uttrycket representerar substitutionen av en variabel för ett värde. I substitutionsregeln beskrivs konsekvenserna av jämlikhet som substitution.
Låt definitionen i matematik
I matematiken den låt uttryck beskrivs som tillsammans uttryck. I funktionella språk används även uttrycket för att begränsa omfattningen. I matematik beskrivs omfattningen av kvantifierare. Låtuttrycket är en konjunktion inom en existentiell kvantifierare.

där E och F är av typen booleskt.
Det låter uttrycket tillåter substitution som skall tillämpas på ett annat uttryck. Denna substitution kan tillämpas inom ett begränsat omfång, på ett subuttryck. Den naturliga användningen av let -uttrycket gäller för ett begränsat omfång (kallat lambda -dropping ). Dessa regler definierar hur omfattningen kan begränsas.

där F är inte av typen Boolean . Från denna definition kan följande standarddefinition av ett låtuttryck, som används i ett funktionellt språk, härledas.
![x \ inte \ i \ operatornamn {FV} (y) \ innebär (\ operatornamn {låt} x: x = y \ operatornamn {in} z) = z [x: = y] = (\ lambda xz) \ y](/criselda-https-wikimedia.org/api/rest_v1/media/math/render/svg/f81eac6e91e95d921c9394ea1a0bf03c75fa04bc)
För enkelhetens skull kommer markören som specificerar den existentiella variabeln ,, att utelämnas från uttrycket där det framgår av sammanhanget.

![x \ inte \ i \ operatornamn {FV} (y) \ innebär (\ operatorname {let} x = y \ operatorname {in} z) = z [x: = y] = (\ lambda xz) \ y](/criselda-https-wikimedia.org/api/rest_v1/media/math/render/svg/57e111c0893f106c22e85dd1fe949354b3b0a348)
Härledning
För att härleda detta resultat, anta först,

sedan

Med hjälp av substitutionsregeln,
![{\ displaystyle {\ begin {align} & \ iff x = y \ land (L \ z) [x: = y] \\ & \ iff x = y \ land (L [x: = y] \ z [x : = y]) \\ & \ iff x = y \ land L \ z [x: = y] \\ & \ innebär L \ z [x: = y] \ end {align}}}](/criselda-https-wikimedia.org/api/rest_v1/media/math/render/svg/6c7398de56fc1b42dbfb49d5a68ff2e1f7bac64c)
så för alla L ,
![L \ operatorname {låt} x: x = y \ operatorname {in} z \ innebär L \ z [x: = y]](/criselda-https-wikimedia.org/api/rest_v1/media/math/render/svg/d587c9dc81797c6072bff072d2423720fdf45b64)
Låt där K är en ny variabel. sedan,

![(\ operatorname {let} x: x = y \ operatorname {in} z) = K \ innebär z [x: = y] = K](/criselda-https-wikimedia.org/api/rest_v1/media/math/render/svg/f9daffc57101f507dedd3a3cc49b0f7821ace954)
Så,
![\ operatorname {låt} x: x = y \ operatorname {in} z = z [x: = y]](/criselda-https-wikimedia.org/api/rest_v1/media/math/render/svg/b61107edd6e0ebf29b86f858071985c945ef019b)
Men från den matematiska tolkningen av en betareduktion,
![(\ lambda xz) \ y = z [x: = y]](/criselda-https-wikimedia.org/api/rest_v1/media/math/render/svg/ba408977fa51632f2ed9a40ad81da9ceb47adc14)
Här om y är en funktion av en variabel x är det inte samma x som i z. Alpha -namnbyte kan tillämpas. Så vi måste ha,

så,

Detta resultat representeras i ett funktionellt språk i en förkortad form, där innebörden är entydig;
![x \ inte \ i \ operatornamn {FV} (y) \ innebär (\ operatorname {let} x = y \ operatorname {in} z) = z [x: = y] = (\ lambda xz) \ y](/criselda-https-wikimedia.org/api/rest_v1/media/math/render/svg/57e111c0893f106c22e85dd1fe949354b3b0a348)
Här erkänns variabeln x implicit som både en del av ekvationen som definierar x, och variabeln i den existentiella kvantifieraren.
Inga lyft från booleskt
En motsättning uppstår om E definieras av . I detta fall,


blir,

och använder,



Detta är falskt om G är falskt. För att undvika denna motsägelse får F inte vara av typen booleskt. För booleska F använder det korrekta uttalandet av släppregeln implikation istället för jämlikhet,

Det kan verka konstigt att en annan regel gäller för booleska än andra typer. Anledningen till detta är att regeln,

gäller endast där F är booleskt. Kombinationen av de två reglerna skapar en motsättning, så där en regel håller, gör den andra inte.
Gå med låt uttryck
Låt uttryck definieras med flera variabler,

då kan det härledas,

så,

Lagar som rör lambda -beräkning och låt uttryck
Den Eta reduktionen ger en regel för att beskriva lambda abstraktioner. Denna regel tillsammans med de två lagarna som härleds ovan definierar förhållandet mellan lambda calculus och let uttryck.
| namn |
Lag
|
| Eta-reduktion ekvivalens |
|
| Låt-lambda-ekvivalens |
(där är ett variabelnamn.)
 |
| Låt kombinationen |
|
Låt definitionen definieras från lambda calculus
För att undvika eventuella problem i samband med matematiska definition , Dana Scott ursprungligen definierat låt uttryck från lambdakalkyl. Detta kan betraktas som den nedifrån uppåt eller konstruktiva, definitionen av låta uttryck, i motsats till uppifrån och ner, eller axiomatisk matematisk definition.
Det enkla, icke rekursiva låtuttrycket definierades som syntaktiskt socker för lambda -abstraktionen som tillämpas på en term. I den definitionen,

Den enkla låtauttrycksdefinitionen utökades sedan för att möjliggöra rekursion med hjälp av fastpunktskombinatorn .
Fixat-punkts kombinator
Den fast punkt combinator kan representeras av uttrycket,

Denna representation kan omvandlas till en lambda -term. En lambda -abstraktion stöder inte referens till variabelnamnet i det tillämpade uttrycket, så x måste skickas in som en parameter till x .

Med hjälp av eta -reduceringsregeln,

ger,

Ett låtuttryck kan uttryckas som en lambda -abstraktion med,

ger,

Detta är möjligen den enklaste implementeringen av en fixpunktskombinator i lambda -kalkyl. Men en betareduktion ger den mer symmetriska formen av Currys Y -kombinator.

Rekursivt låtuttryck
Det rekursiva let -uttrycket som kallas "let rec" definieras med hjälp av Y -kombinatorn för rekursiva let -uttryck.

Ömsesidigt rekursivt låt uttryck
Detta tillvägagångssätt generaliseras sedan för att stödja ömsesidig rekursion. Ett inbördes rekursivt låtuttryck kan komponeras genom att ordna om uttrycket för att ta bort alla villkor. Detta uppnås genom att ersätta flera funktionsdefinitioner med en enda funktionsdefinition, som anger en lista med variabler som är lika med en lista med uttryck. En version av Y-kombinatorn, kallad Y* poly-variadic fix-point-kombinatorn, används sedan för att beräkna fixpunkten för alla funktioner samtidigt. Resultatet är en ömsesidigt rekursiv implementering av låtuttrycket .
Flera värden
Ett låtuttryck kan användas för att representera ett värde som är medlem i en uppsättning,

Under funktionsapplikation, av ett låt uttryck till ett annat,

Men en annan regel gäller för att tillämpa let -uttrycket på sig själv.

Det finns ingen enkel regel för att kombinera värden. Det som krävs är en allmän uttrycksform som representerar en variabel vars värde är medlem i en uppsättning värden. Uttrycket bör baseras på variabeln och uppsättningen.
Funktionsapplikation som tillämpas på det här formuläret bör ge ett annat uttryck i samma form. På detta sätt kan alla uttryck på funktioner med flera värden behandlas som om de hade ett värde.
Det är inte tillräckligt att formuläret endast representerar mängden värden. Varje värde måste ha ett villkor som avgör när uttrycket tar värdet. Den resulterande konstruktionen är en uppsättning par av villkor och värden, kallade en "värdeuppsättning". Se förminskning av algebraiska värdeuppsättningar .
Regler för konvertering mellan lambda -kalkyl och let -uttryck
Meta-funktioner kommer att ges som beskriver konverteringen mellan lambda och låt uttryck. En metafunktion är en funktion som tar ett program som parameter. Programmet är data för metaprogrammet. Programmet och metaprogrammet har olika metanivåer.
Följande konventioner kommer att användas för att skilja program från metaprogrammet,
- Kvadratparenteser [] kommer att användas för att representera funktionsapplikationen i metaprogrammet.
- Versaler kommer att användas för variabler i metaprogrammet. Små bokstäver representerar variabler i programmet.
-
kommer att användas för lika med metaprogrammet.
För enkelhetens skull den första regeln med tanke på att matchningar kommer att tillämpas. Reglerna förutsätter också att lambdauttrycken har förbehandlats så att varje lambda-abstraktion har ett unikt namn.
Substitutionsoperatören används också. Uttrycket betyder att varje förekomst av G i L ersätts med S och returnerar uttrycket. Definitionen som används utvidgas till att täcka substitution av uttryck, från definitionen på Lambda -kalkylsidan . Matchning av uttryck bör jämföra uttryck för alfaekvivalens (byta namn på variabler).
![L [G: = S]](/criselda-https-wikimedia.org/api/rest_v1/media/math/render/svg/7716db852899ef7e3eb2a00dbbea76bc11279afb)
Konvertering från lambda till let uttryck
Följande regler beskriver hur man konverterar från ett lambda -uttryck till ett let -uttryck utan att ändra strukturen.
![\ operatorname {de-lambda} [V] \ equiv V](/criselda-https-wikimedia.org/api/rest_v1/media/math/render/svg/d0de3dc641d38384f918a819d631abebb34ecbaf)
![\ operatorname {de-lambda} [M \ N] \ equiv \ operatorname {de-lambda} [M] \ \ operatorname {de-lambda} [N]](/criselda-https-wikimedia.org/api/rest_v1/media/math/render/svg/b5efb4a24f7d8e6b766adc58d0c70bfba8afaf5b)
![\ operatorname {de-lambda} [F = \ lambda PE] \ equiv \ operatorname {de-lambda} [F \ P = E]](/criselda-https-wikimedia.org/api/rest_v1/media/math/render/svg/e43437dbae7c4406b94f3a4e8ef1b53fcad6c9dc)
![\ operatorname {de-lambda} [E = F] \ equiv \ operatorname {de-lambda} [E] = \ operatorname {de-lambda} [F]](/criselda-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 ]](/criselda-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 {i} V]](/criselda-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 { låt} V, W: E \ land F \ operatorname {i} G}](/criselda-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](/criselda-https-wikimedia.org/api/rest_v1/media/math/render/svg/dcdf7a95bed9af991b9bf78be112f172ebae2744)
Regel 6 skapar en unik variabel V, som ett namn för funktionen.
Exempel
Till exempel Y -kombinatorn ,

konverteras till,

| Regel |
Lambda uttryck
|
| 6 |
|
|
|
|
|
| 4 |
|
|
|
|
|
|
|
|
| 5 |
|
|
|
|
|
|
|
| 3 |
|
|
|
|
|
|
|
| 8 |
|
|
|
|
|
|
|
| 8 |
|
|
|
|
|
|
| 4 |
|
|
|
|
|
|
|
| 2 |
|
|
|
|
|
|
|
| 1 |
|
|
|
|
|
|
Konvertering från låt till lambda uttryck
Dessa regler vänder omvandlingen som beskrivs ovan. De konverterar från ett låt -uttryck till ett lambda -uttryck, utan att ändra strukturen. Alla låt -uttryck kan inte konverteras med hjälp av dessa regler. Reglerna förutsätter att uttrycken redan är ordnade som om de hade genererats av de-lambda .
![\ operatorname {get-lambda} [F, G \ V = E] = \ operatorname {get-lambda} [F, G = \ lambda VE]](/criselda-https-wikimedia.org/api/rest_v1/media/math/render/svg/4ebe7c990955401b0e7b09f2ce999efc2d3aa880)
![\ operatorname {get-lambda} [F, F = E] = \ operatorname {de-let} [E]](/criselda-https-wikimedia.org/api/rest_v1/media/math/render/svg/cf2c34813e9a28ad6599cde30756f34399bb75aa)
![\ operatorname {de-let} [\ lambda VE] \ equiv \ lambda V. \ operatorname {de-let} [E]](/criselda-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]](/criselda-https-wikimedia.org/api/rest_v1/media/math/render/svg/5c876a5018468b6518441738d9e5203aba224f92)
![\ operatorname {de-let} [V] \ equiv V](/criselda-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]}](/criselda-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]}](/criselda-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]}](/criselda-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 {i} L [ V: = V \ V]]}](/criselda-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]]}](/criselda-https-wikimedia.org/api/rest_v1/media/math/render/svg/5eadaab087243563e90735087c573a09f4c0ecd1)
Det finns ingen exakt strukturell ekvivalent i lambda -beräkning för uthyrningsuttryck som har fria variabler som används rekursivt. I detta fall krävs vissa tillägg av parametrar. Regel 8 och 10 lägger till dessa parametrar.
Reglerna 8 och 10 är tillräckliga för två inbördes rekursiva ekvationer i let -uttrycket. Men de fungerar inte för tre eller flera ömsesidigt rekursiva ekvationer. Det allmänna fallet kräver en extra looping vilket gör metafunktionen lite svårare. Reglerna som följer ersätter reglerna 8 och 10 vid genomförandet av det allmänna ärendet. Regel 8 och 10 har lämnats så att det enklare fallet kan studeras först.
-
lambda -form - Konvertera uttrycket till en kombination av uttryck, var och en av formvariabeln = uttryck .
![\ operatorname {lambda-form} [G \ V = E] = \ operatorname {lambda-form} [G = \ lambda VE]](/criselda-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]}](/criselda-https-wikimedia.org/api/rest_v1/media/math/render/svg/61282e56970fc6cecb987f58e6332b6ee5aed60e)
-
...... där V är en variabel.
-
lift -vars - Få uppsättningen variabler som behöver X som parameter, eftersom uttrycket har X som en fri variabel.
![X \ in \ operatorname {FV} [E] \ to \ operatorname {lift-vars} [X, V = E] = \ {V \}](/criselda-https-wikimedia.org/api/rest_v1/media/math/render/svg/781f4c031aa544d4609a24d1296e693a9200964b)
![X \ not \ in \ operatorname {FV} [E] \ to \ operatorname {lift-vars} [X, V = E] = \ {\}](/criselda-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} [XF]}](/criselda-https-wikimedia.org/api/rest_v1/media/math/render/svg/fef8f757579f1f0e70c9f3efc0771ebaf4cee899)
-
sub -vars - För varje variabel i uppsättningen ersätt den med variabeln som tillämpas på X i uttrycket. Detta gör X till en variabel som skickas in som en parameter, istället för att vara en ledig variabel på ekvationens högra sida.
![\ operatorname {sub-vars} [E, \ {V \} \ cup S, X] = \ operatorname {sub-vars} [E [V: = V \ X], S, X]](/criselda-https-wikimedia.org/api/rest_v1/media/math/render/svg/d65e0d873c3c7806828ca58dd88f821f21193c97)
![\ operatorname {sub-vars} [E, \ {\}, X] = E](/criselda-https-wikimedia.org/api/rest_v1/media/math/render/svg/19c8d37c0478acf003ef19a2687b889a9f5c8a8b)
-
de -let - Lyft varje villkor i E så att X inte är en ledig variabel till höger om ekvationen.
![{\ displaystyle {\ begin {align} L & = \ operatorname {lambda-form} [E] \ land S = \ operatorname {lift-vars} [X, L] \ to \ operatorname {de-let} [\ operatorname { låt} V \ ldots W, X: E \ land F \ \ operatorname {in} G] \\ & \ 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]] \ end {align}}}](/criselda-https-wikimedia.org/api/rest_v1/media/math/render/svg/dec69c81e23f469d3f6e09fbc140c95413643727)
Exempel
Till exempel, låt -uttrycket erhållet från Y -kombinatorn ,

konverteras till,

| Regel |
Lambda uttryck
|
| 6 |
|
|
|
|
|
| 1 |
|
|
|
|
|
| 2 |
|
|
|
|
|
| 3 |
|
|
|
|
|
| 7 |
|
|
|
|
|
|
| 4 |
|
|
|
|
|
|
|
| 4 |
|
|
|
|
|
|
|
| 5 |
|
|
|
|
| 1 |
|
|
|
|
|
|
|
| 2 |
|
|
|
|
|
|
|
| 3 |
|
|
|
|
|
|
|
| 4 |
|
|
|
|
|
|
|
|
|
|
| 5 |
|
|
|
|
|
|
|
För ett andra exempel, ta den lyftade versionen av Y -kombinatorn ,

konverteras till,

| Regel |
Lambda uttryck
|
| 8 |
|
| 7 |
|
| 1, 2 |
|
| 7, 4, 5 |
|
| 1, 2 |
|
|
|
För ett tredje exempel översättningen av,

är,

| Regel |
Lambda uttryck
|
| 9 |
|
| 1 |
|
| 2 |
|
|
|
| 7 |
|
| 1 |
|
| 2 |
|
|
|
Nyckelpersoner
Se även
Referenser