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 :

  1. Om är en variabel, då
  2. Om är en variabel och , då
  3. 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:

  1. , 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,

  1. α-omvandling -
  2. β-reduktion -
  3. η-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;

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,
Kanonisk
Naturlig
x (P) och y (PN) har fångats i substitutionen.

Alpha byt namn på inre, x → a, y → b

Beta 2,
Kanonisk
Naturlig
x och y fångas inte.

I det här exemplet,

  1. I β-redex,
    1. De fria variablerna är,
    2. De bundna variablerna är
  2. 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.
  3. 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.
    1. De fria variablerna är,
    2. De bundna variablerna är
  4. β-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.