F. Drewes, Inst. f. datavetenskap1 Föreläsning 12: -kalkylen allmänt om -kalkylen syntax semantik att programmera i -kalkylen
F. Drewes, Inst. f. datavetenskap2 Allmänt om -kalkylen På 1930-talet besvarades några grundläggande frågor Vilka principiella begränsningar gäller för formella bevissystem och deras härledningar (Gödel 1936)? Hur kan begreppet algoritm formaliseras (Turing 1939)? Var ligger gränsen mellan algoritmisk lösbarhet och olösbarhet (Turing 1939)? Men det var inte bara Turing som föreslog en modell. Samma år (1939) definierade Alonzo Church -kalkylen – ett enkelt system i vilket beräkningsbara funktioner kan definieras och evalueras.
F. Drewes, Inst. f. datavetenskap3 Allmänt om -kalkylen (2) Medan Turings maskinmodell liknar imperativa språk, är -kalkylen ett abstrakt sätt att definiera och kombinera funktioner, liknar alltså funktionella språk Det överraskande är att båda är precis lika kraftfulla Church-Turing-tes funktionellimperativ -kalkyl Turingmaskin
F. Drewes, Inst. f. datavetenskap4 -kalkylens syntax Låt var stå för en oändlig mängd av variabler (vanligtvis används små bokstäver). Mängden av alla -uttryck definieras med hjälp av följande kontextfria regler: expr var | ( expr expr ) | var . expr x (y x) x.(y x) y) x.(y x) y. x.(y x) y) ( x. y.( x.x (x x)) x.(x y))
F. Drewes, Inst. f. datavetenskap5 Funktionsapplikation och funktionsdefinition Tanken bakom syntaxen är… (E 1 E 2 )står för funktionsapplikation: E 1 appliceras till E 2 x.Ebeskriver en funktion: x är den (enda) formella parametern och E är bodyn. Uttrycket x.E kallas -abstraktion Vanlig programspråkssyntax för x.E vore t.ex. fun f(x) = E. Den viktigaste skillnaden är att -kalkylens funktioner är anonyma – de bär inga namn!
F. Drewes, Inst. f. datavetenskap6 Bundna och fria variabler I x.E är x. ”funktionshuvudet” som ”deklarerar” en formell parameter x. Där x förekommer i E används alltså funktionens formella parameter – x sägs vara bunden. Variabler som förekommer i ett uttryck på ställen där de inte är bundna är fria variabler. ( x. y.( x.x (x x)) x.(x y)) bound(E) = {x,y} och free(E) = {y} i det här fallet ( x. y.( x.x (x x)) x.(x y)) fri
F. Drewes, Inst. f. datavetenskap7 -konversion och -reduktion Notation: Att ersätta alla fria förekomster av x i E 1 med E 2 skrivs som E 1 [x E 2 ]. -konversion Formella parametrar får alltid döpas om, dvs varje underuttryck x.E får bytas ut mot y.E[x y] om y inte är fri i E. Man skriver E 1 E 2. -reduktion Genom att använda -reduktion evalueras -uttryck. Varje underuttryck ( x.E E') får bytas ut mot E[x := E'] om bound(E) free(E') = . Man skriver E 1 E 2. (Om bound(E) free(E') används -konversion först.)
F. Drewes, Inst. f. datavetenskap8 Church-Rosser-teoremet En beräkning i -kalkylen är en sekvens E 1 E 2 av -reduktioner (och eventuella -konversioner). E 2 är på normalform om inga fler -reduktioner är möjliga (E 2 betraktas som beräkningens resultat, dvs E 1 s värde) Men kan ett uttryck inte ha flera olika värden då??? Church-Rosser-teorem Om E E 1 och E E 2 så finns det ett uttryck E' sådant att både E 1 E' och E 2 E'. E E2E2 E1E1 E'
F. Drewes, Inst. f. datavetenskap9 Att programmera i -kalkylen Hur kan de vanliga datatyperna definieras i -kalkylen? operationer är -uttryck dataelement är också -uttryck TRUE = x. y.x FALSE = x. y.y IF B THEN E ELSE E' = ((B E) E') B AND B' = ((B B') FALSE ) Datatyp boolean
F. Drewes, Inst. f. datavetenskap10 Att programmera i -kalkylen (2) PAIR E E' = x. IF x THEN E ELSE E' FIRST P = (P TRUE ) SECOND P = (P FALSE ) Datatyp pair Datatyp integer 0 = x.x SUCC N = PAIR FALSE N IS_ZERO N = FIRST N PRED N = IF IS_ZERO N THEN 0 ELSE SECOND N