Definition av lambdakalkyl
Lambdakalkyl är ett formellt matematiskt system baserat på lambdaabstraktion och funktionstillämpning . Två definitioner av språket ges här: en standarddefinition och en definition med matematiska formler.
Standard Definition
Denna formella definition gavs av Alonzo Church .
Definition
Lambda-uttryck är sammansatta av
- variabler , , ..., , ...
- abstraktionssymbolerna lambda ' ' och punkt '.'
- parenteser ( )
Uppsättningen lambda-uttryck, , kan definieras induktivt :
- Om är en variabel, då
- Om är en variabel och , då
- Om , då
Förekomster av regel 2 är kända som abstraktioner och förekomster av regel 3 är kända som tillämpningar.
Notation
För att hålla notationen av lambda-uttryck ren, tillämpas vanligtvis följande konventioner.
- De yttersta parenteserna tas bort: istället för
- Applikationer antas vara vänsterassociativa: kan skrivas istället för
- Broppen i en abstraktion sträcker sig så långt till höger som möjligt : betyder och inte
- En sekvens av abstraktioner dras samman: förkortas till
Fria och bundna variabler
Abstraktionsoperatorn, , sägs binda sin variabel varhelst den förekommer i abstraktionens kropp. Variabler som faller inom ramen för en abstraktion sägs vara bundna . Alla andra variabler kallas fria . Till exempel, i följande uttryck en bunden variabel och är fri: . Observera också att en variabel är bunden av sin "närmaste" abstraktion. I följande exempel är den enda förekomsten av i uttrycket bunden av den andra lambda:
Uppsättningen av fria variabler för ett lambda-uttryck, , betecknas som och definieras av rekursion på termernas struktur, som följer:
- , där är en variabel
Ett uttryck som inte innehåller några fria variabler sägs vara stängt . Slutna lambda-uttryck är också kända som kombinatorer och är ekvivalenta med termer i kombinatorisk logik .
Minskning
Betydelsen av lambda-uttryck definieras av hur uttryck kan reduceras.
Det finns tre typer av reduktion:
- α-omvandling : ändra bundna variabler ( alfa );
- β-reduktion : tillämpa funktioner på deras argument ( beta );
- η-reduktion : som fångar en föreställning om extensionalitet ( eta ).
Vi talar också om de resulterande ekvivalenserna: två uttryck är β-ekvivalenta , om de kan β-konverteras till samma uttryck, och α/η-ekvivalens definieras på liknande sätt.
Termen redex , förkortning för reducerbart uttryck , syftar på deltermer som kan reduceras med någon av reduktionsreglerna. Till exempel, är en β-redex för att uttrycka ersättningen av för i ; om inte är ledig i , är en η-redex. Uttrycket som en redex reducerar till kallas dess reduktion; med föregående exempel är redukterna av dessa uttryck respektive .
α-omvandling
Alfa-konvertering, ibland känd som alfa-döpning, gör att bundna variabelnamn kan ändras. Till exempel alfa-omvandling av kan ge . Termer som skiljer sig endast genom alfa-omvandling kallas α-ekvivalent . Ofta vid användning av lambda-kalkyl anses α-ekvivalenta termer vara ekvivalenta.
De exakta reglerna för alfakonvertering är inte helt triviala. För det första, vid alfakonvertering av en abstraktion, är de enda variabla förekomsterna som byts om de som är bundna till samma abstraktion. Till exempel en alfa-omvandling av kan resultera i , men det kunde inte resultera i . Det senare har en annan betydelse än originalet.
För det andra är alfakonvertering inte möjlig om det skulle resultera i att en variabel fångas av en annan abstraktion. Till exempel, om vi ersätter med i , vi får , vilket inte alls är detsamma.
I programmeringsspråk med statisk omfattning kan alfakonvertering användas för att göra namnupplösning enklare genom att säkerställa att inget variabelnamn maskerar ett namn i ett innehållande omfång (se alfabyte för att göra namnupplösning trivialt ) .
Utbyte
Substitution, skriven , är processen att ersätta alla fria förekomster av variabeln i uttrycket med uttryck . Substitution på termer av lambda-kalkylen definieras av rekursion på strukturen av termer, enligt följande (notera: x och y är endast variabler medan M och N är vilket λ-uttryck som helst).
För att ersätta till en lambdaabstraktion är det ibland nödvändigt att α-konvertera uttrycket. Till exempel är det inte korrekt att resulterar i , eftersom den ersatta var tänkt att vara fri men slutade med att bindas. Den korrekta substitutionen i detta fall är , upp till α-ekvivalens. Observera att substitution definieras unikt upp till α-ekvivalens.
β-reduktion
β-reduktion fångar idén om funktionstillämpning. β-reduktion definieras i termer av substitution: β-reduktionen av är .
Om vi till exempel antar någon kodning av , har vi följande β-reduktion: .
η-reduktion
η-reduktion uttrycker idén om extensionalitet , som i detta sammanhang är att två funktioner är lika om och bara om de ger samma resultat för alla argument. η-reduktion konverterar mellan och när inte visas ledig i .
Normalisering
Syftet med β-reduktion är att beräkna ett värde. Ett värde i lambdakalkyl är en funktion. Så β-reduktion fortsätter tills uttrycket ser ut som en funktionsabstraktion.
Ett lambdauttryck som inte kan reduceras ytterligare med antingen β-redex eller η-redex är i normal form. Observera att alfakonvertering kan konvertera funktioner. Alla normalformer som kan omvandlas till varandra genom α-omvandling definieras som lika. Se huvudartikeln om Beta normal form för detaljer.
Normal formtyp | Definition. |
---|---|
Normal form | Inga β- eller η-reduktioner är möjliga. |
Huvud Normal Form | I form av en lambdaabstraktion vars kropp inte är reducerbar. |
Svagt huvud Normal form | I form av en lambdaabstraktion. |
Syntaxdefinition i BNF
Lambda Calculus har en enkel syntax. Ett lambdakalkylprogram har syntaxen för ett uttryck där,
namn | BNF | Beskrivning |
---|---|---|
Abstraktion | < uttryck > ::= λ < variabellista > . < uttryck >
|
Anonym funktionsdefinition. |
Ansökningsperiod | < expression > ::= < application-term >
|
|
Ansökan | < application-term > ::= < application-term > < item >
|
Ett funktionsanrop. |
Artikel | < application-term > ::= < item >
|
|
Variabel | < item > ::= < variabel >
|
T.ex. x, y, fakta, summa, ... |
Gruppering | < item > ::= ( < uttryck > ) |
Uttryck inom parentes. |
Variabellistan definieras som,
< variabel-lista > := < variabel > | < variabel > , < variabel-lista >
En variabel som används av datavetare har syntaxen,
< variabel > ::= < alpha > < extension > < extension > :: = < extension > :: = < extension -char > < extension > < extension-char > :: = < alpha > | < siffra > | _
Matematiker begränsar ibland en variabel till att vara ett enda alfabetiskt tecken. När du använder denna konvention utelämnas kommatecken från variabellistan.
En lambdaabstraktion har lägre prioritet än en applikation, så;
Ansökningar lämnas associativa;
En abstraktion med flera parametrar är likvärdig med flera abstraktioner av en parameter.
var,
- x är en variabel
- y är en variabellista
- z är ett uttryck
Definition som matematiska formler
Problemet med hur variabler kan döpas om är svårt. Denna definition undviker problemet genom att ersätta alla namn med kanoniska namn, som är konstruerade utifrån positionen för definitionen av namnet i uttrycket. Tillvägagångssättet är analogt med vad en kompilator gör, men har anpassats för att fungera inom matematikens begränsningar.
Semantik
Utförandet av ett lambdauttryck fortsätter med följande reduktioner och transformationer,
- α-omvandling -
- β-reduktion -
- η-reduktion -
var,
- canonym är ett byte av ett lambdauttryck för att ge uttrycket standardnamn, baserat på namnets position i uttrycket.
- Substitution Operator , är ersättningen av namnet med lambdauttrycket i lambdauttrycket .
- Fri variabeluppsättning är uppsättningen av variabler som inte tillhör en lambdaabstraktion i .
Exekvering är att utföra β-reduktioner och η-reduktioner på deluttryck i kanonymen till ett lambdauttryck tills resultatet är en lambdafunktion (abstraktion) i normalformen .
Alla α-omvandlingar av ett λ-uttryck anses vara ekvivalenta.
Canonym - kanoniska namn
Canonym är en funktion som tar ett lambda-uttryck och byter namn på alla namn kanoniskt, baserat på deras positioner i uttrycket. Detta kan implementeras som,
Där N är strängen "N", F är strängen "F", S är strängen "S", + är sammanlänkning och "namn" omvandlar en sträng till ett namn
Kartoperatörer
Karta från ett värde till ett annat om värdet finns i kartan. O är den tomma kartan.
Ersättningsoperatör
Om L är ett lambdauttryck är x ett namn och y ett lambdauttryck; betyder att ersätta x med y i L. Reglerna är,
Observera att regel 1 måste ändras om den ska användas på lambdauttryck som inte har ändrats till kanon. Se Ändringar av substitutionsoperatören .
Fria och bundna variabeluppsättningar
Uppsättningen av fria variabler för ett lambdauttryck, M, betecknas som FV(M). Detta är uppsättningen av variabelnamn som har instanser som inte är bundna (använda) i en lambdaabstraktion, inom lambdauttrycket. De är variabelnamnen som kan bindas till formella parametervariabler utanför lambda-uttrycket.
Uppsättningen av bundna variabler för ett lambda-uttryck, M, betecknas som BV(M). Detta är uppsättningen variabelnamn som har instanser bundna (använda) i en lambdaabstraktion, inom lambdauttrycket.
Reglerna för de två uppsättningarna ges nedan.
- Fri variabeluppsättning | Kommentar | - Bound Variable Set | Kommentar |
---|---|---|---|
där x är en variabel | där x är en variabel | ||
Fria variabler för M exklusive x | Bundna variabler för M plus x. | ||
Kombinera de fria variablerna från funktionen och parametern | Kombinera de bundna variablerna från funktionen och parametern |
Användande;
- Free Variable Set, FV används ovan i definitionen av η-reduktionen .
- Bound Variable Set, BV, används i regeln för β-redex av icke-kanoniskt lambdauttryck.
Utvärderingsstrategi
Denna matematiska definition är strukturerad så att den representerar resultatet och inte hur det beräknas. Men resultatet kan skilja sig mellan lat och ivrigt utvärdering. Denna skillnad beskrivs i utvärderingsformlerna.
Definitionerna som ges här förutsätter att den första definitionen som matchar lambda-uttrycket kommer att användas. Denna konvention används för att göra definitionen mer läsbar. Annars skulle vissa villkor krävas för att göra definitionen exakt.
Att köra eller utvärdera ett lambdauttryck L är,
där Q är ett namnprefix, möjligen en tom sträng och eval definieras av,
Då kan utvärderingsstrategin väljas som antingen,
Resultatet kan vara olika beroende på vilken strategi som används. Ivrig utvärdering kommer att tillämpa alla möjliga minskningar, vilket lämnar resultatet i normal form, medan lat utvärdering kommer att utelämna vissa minskningar av parametrar, vilket lämnar resultatet i "svag huvud normal form".
Normal form
Alla nedsättningar som kan tillämpas har tillämpats. Detta är resultatet från en ivriga utvärdering.
I alla andra fall,
Svagt huvud normal form
Reduktioner av funktionen (huvudet) har tillämpats, men inte alla minskningar av parametern har tillämpats. Detta är resultatet som erhålls från att tillämpa lat utvärdering.
I alla andra fall,
Härledning av standard från den matematiska definitionen
Standarddefinitionen av lambdakalkyl använder några definitioner som kan betraktas som teorem, vilket kan bevisas baserat på definitionen som matematiska formler .
Den kanoniska namndefinitionen behandlar problemet med variabelidentitet genom att konstruera ett unikt namn för varje variabel baserat på positionen för lambdaabstraktionen för variabelnamnet i uttrycket.
Denna definition introducerar reglerna som används i standarddefinitionen och relaterar förklarar dem i termer av den kanoniska omdöpningsdefinitionen.
Fria och bundna variabler
Lambdaabstraktionsoperatorn, λ, tar en formell parametervariabel och ett kroppsuttryck. När den utvärderas identifieras den formella parametervariabeln med värdet på den faktiska parametern.
Variabler i ett lambdauttryck kan antingen vara "bundna" eller "fria". Bundna variabler är variabelnamn som redan är kopplade till formella parametervariabler i uttrycket.
Den formella parametervariabeln sägs binda variabelnamnet varhelst den förekommer fritt i kroppen. Variabler (namn) som redan har matchats till formell parametervariabel sägs vara bundna . Alla andra variabler i uttrycket kallas fria .
Till exempel, i följande uttryck är y en bunden variabel och x är fri: . Observera också att en variabel är bunden av sin "närmaste" lambdaabstraktion. I följande exempel är den enda förekomsten av x i uttrycket bunden av den andra lambda:
Ändringar av substitutionsoperatören
I definitionen av substitutionsoperatören är regeln,
måste ersättas med,
Detta för att stoppa bundna variabler med samma namn som ersätts. Detta skulle inte ha inträffat i ett kanoniskt omdöpt lambdauttryck.
Till exempel skulle de tidigare reglerna ha översatts felaktigt,
De nya reglerna blockerar denna ersättning så att den förblir som,
Omvandling
Betydelsen av lambda-uttryck definieras av hur uttryck kan transformeras eller reduceras.
Det finns tre typer av transformation:
- α-omvandling : ändra bundna variabler ( alfa );
- β-reduktion : tillämpa funktioner på deras argument ( beta ), anropa funktioner;
- η-reduktion : som fångar en föreställning om extensionalitet ( eta ).
Vi talar också om de resulterande ekvivalenserna: två uttryck är β-ekvivalenta , om de kan β-konverteras till samma uttryck, och α/η-ekvivalens definieras på liknande sätt.
Termen redex , förkortning för reducerbart uttryck , syftar på deltermer som kan reduceras med någon av reduktionsreglerna.
α-omvandling
Alfa-konvertering, ibland känd som alfa-döpning, gör att bundna variabelnamn kan ändras. Till exempel alfa-omvandling av kan ge . Termer som skiljer sig endast genom alfa-omvandling kallas α-ekvivalent .
I en α-konvertering kan namn ersättas med nya namn om det nya namnet inte är fritt i kroppen, eftersom detta skulle leda till att fria variabler fångas in .
Observera att substitutionen inte kommer att återkomma i kroppen av lambda-uttryck med formell parameter på grund av ändringen av substitutionsoperatorn som beskrivs ovan.
Se exempel;
α-omvandling | λ-uttryck | Kanoniskt namn | Kommentar |
---|---|---|---|
Ursprungliga uttryck. | |||
byter namn på y korrekt till k, (eftersom k inte används i kroppen) | Ingen förändring av kanoniskt omdöpt uttryck. | ||
byter naivt namn på y till z, (fel eftersom z ledig i ) | fångas. |
β-reduktion (undviker infångning)
β-reduktion fångar idén om funktionstillämpning (även kallat ett funktionsanrop) och implementerar utbytet av det faktiska parameteruttrycket för den formella parametervariabeln. β-reduktion definieras i termer av substitution.
Om inga variabelnamn är fria i den aktuella parametern och bundna i kroppen, kan β-reduktion utföras på lambdaabstraktionen utan kanoniskt byte av namn.
Alfabyte kan användas på för att byta namn på namn som är fria i men bundna i , för att uppfylla förutsättningen för denna transformation.
Se exempel;
β-reduktion | λ-uttryck | Kanoniskt namn | Kommentar | ||||
---|---|---|---|---|---|---|---|
Ursprungliga uttryck. | |||||||
Naiv beta 1, |
|
x (P) och y (PN) har fångats i substitutionen. | |||||
Alpha byt namn på inre, x → a, y → b |
|||||||
Beta 2, |
|
x och y fångas inte. |
I det här exemplet,
- I β-redex,
- De fria variablerna är,
- De bundna variablerna är
- Den naiva β-redexen ändrade innebörden av uttrycket eftersom x och y från den faktiska parametern fångades när uttrycken ersattes i de inre abstraktionerna.
- Alfabytet tog bort problemet genom att ändra namnen på x och y i den inre abstraktionen så att de skiljer sig från namnen på x och y i den faktiska parametern.
- De fria variablerna är,
- De bundna variablerna är
- β-redexen fortsatte sedan med den avsedda betydelsen.
η-reduktion
η-reduktion uttrycker idén om extensionalitet , som i detta sammanhang är att två funktioner är lika om och bara om de ger samma resultat för alla argument.
η-reduktion kan användas utan förändring på lambda-uttryck som inte är kanoniskt byta namn.
Problemet med att använda en η-redex när f har fria variabler visas i detta exempel,
Minskning | Lambda uttryck | β-reduktion |
---|---|---|
Naiv η-reduktion |
Denna felaktiga användning av η-reduktion ändrar innebörden genom att lämna x i osubstituerad.