Yksinkertaiset tyypit TIES542 Ohjelmointikielten periaatteet, kevät 2007 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 13. helmikuuta 2007
Tyypitön puhdas λ-laskento E ::= I E 1 E 2 λi.e E 1 E 1 E 1 E 2 E 1 E 2 E 2 E 2 E 1 E 2 E 1 E 2 E E λi.e λi.e (λi.e 1 ) E 2 E 1 [I := E 2 ]
Normaalijärjestys E ::= I E 1E 2 λi.e V ::= λi.v R R ::= I RV S ::= I E 1E 2 S S SE S E E E RE RE E E λi.e λi.e (λi.e 1)E 2 E 1[I := E 2]
Applikatiivinen järjestys E ::= I E 1E 2 λi.e V ::= I λi.v E 1 E 1 E 1E 2 E 1E 2 E E VE VE E E λi.e λi.e (λi.e)v E[I := V ]
Arvovälitteinen järjestys E ::= I E 1 E 2 λi.e V ::= λi.e E 1 E 1 E 1 E 2 E 1 E 2 E E VE VE (λi.e)v E[I := V ]
Nimivälitteinen järjestys E ::= I E 1 E 2 λi.e V ::= λi.e E 1 E 1 E 1 E 2 E 1 E 2 (λi.e)v E[I := V ]
Currying λx 1 x 2.E = λx 1.λx 2.E λx 1 x 2 x 3.E = λx 1.λx 2.λx 3.E λx 1... x n.e = λx 1..λx n.e
Churchin koodaukset 0 = λfx.x 1 = λfx.fx 2 = λfx.ffx... add = λmnfx.mf (nfx) iszero = λm.m(λx.false) true true = λab.a false = λab.b if = λa.a
Kiintopisteoperaattori Lauseke F on kiintopisteoperaattori, jos pätee kaikilla lausekkeilla g. Fg = gfg Rekursiivisesti määritelty funktio g = E (missä g esiintyy vapaana E:ssä) voidaan määritellä ei-rekursiivisesti funktiona g = F (λg.e)
Laajennettu tyypitön λ-laskento 1 E ::= true false if E 1 E 2 E 3 V ::= truefalse E 1 E 1 if E 1 E 2 E 3 if E 1 E 2 E 3 if true E 1 E 2 E 1 if false E 1 E 2 E 2
Laajennettu tyypitön λ-laskento 2 E ::= 0 succ E pred E iszero E ispos E V ::= V n V n+ ::= succ 0 succ V n+ V n ::= pred 0 pred V n V n ::= 0 V n+ V n E E succ E succ E E E iszero E iszero E E E ispos E ispos E E E pred E pred E iszero 0 true ispos 0 false pred(succ V n) V n iszero V n+ false ispos V n+ true succ(pred V n) V n iszero V n false ispos V n false
Laajennettu tyypitön λ-laskento 3 E ::= fix E fix(λi.e) E[I := fix(λi.e)]
Yksinkertaisesti tyypitetty λ-laskento E ::= I E 1 E 2 λi : T.E T ::= T T Γ, I : T I : T Γ E 1 : T 1 T 2 Γ E 2 : T 1 Γ E 1 E 2 : T 2 (λi : T.E 1 ) E 2 E 1 [I := E 2 ] Muut puhtaan λ-laskennon laskentasäännöt eivät muutu. Γ, I : T 1 E : T 2 Γ λi : T 1.E : T 1 T 2
Ehdot T ::= Bool Γ true : Bool Γ false : Bool Γ E 1 : Bool Γ E 2 : T Γ E 3 : T Γ if E 1 E 2 E 3 : T
Luvut T ::= Int Γ 0 : Int Γ E : Int Γ succ E : Int Γ E : Int Γ pred E : Int Γ E : Int Γ iszero E : Bool Γ E : Int Γ ispos E : Bool
Kiintopisteoperaattori Γ E : T T Γ fix E : T
Tyyppiturvallisuus Hyvältä tyyppijärjestelmältä vaaditaan seuraavat ominaisuudet: Eteneminen Lauseke, joka ei ole arvo 1, ei ole jumissa 2. Säilyminen Lausekkeen tyyppi säilyy laskentasääntöjä sovellettaessa. 1 Arvoja ovat V :hen sopivat lausekkeet. 2 Lauseke on jumissa, jos siihen ei voida soveltaa jotain laskusääntöä.
Inversio Lemma (Tyyppirelaation käänteinen eli inversio) 1. Jos Γ true : T, niin T on Bool. 2. Jos Γ false : T, niin T on Bool. 3. Jos Γ if E 1 E 2 E 3 : T, niin Γ E 1 : Bool, Γ E 2 : T ja Γ E 3 : T. 4. Jos Γ iszero E : T, niin T on Bool ja Γ E : Int. 5. Jos Γ ispos E : T, niin T on Bool ja Γ E : Int. 6. Jos Γ 0 : T, niin T on Int. 7. Jos Γ succ E : T, niin T on Int ja Γ E : Int. 8. Jos Γ pred E : T, niin T on Int ja Γ E : Int. 9. Jos E 1E 2 : T, niin jollakin tyypillä T pätevät Γ E 1 : T T ja Γ E 2 : T. 10. Jos Γ (λi : T.E) : T, niin jollakin tyypillä T pätevät T = T T ja Γ, I : T E : T pätevät. Todistus. Seuraa suoraan määritelmästä.
Kanoniset muodot Lemma (Kanoniset muodot) 1. Bool-tyypin arvot ovat true ja false. 2. Int-tyypin arvot ovat V n -lausekkeet. 3. T T -tyypin arvot ovat muotoa λi : T.E. Todistus. Seuraa suoraan määritelmistä ja inversiolemmasta.
Eteneminen Theorem Olkoon E tyypillinen lauseke ilman vapaita muuttujia (eli jollekin T pätee E : T ). Nyt E on joko arvo tai on olemassa jokin E siten, että E E pätee. Todistus. Induktiolla Γ t : T -väittämän johdon suhteen.
Säilyminen Theorem Jos E : T ja E E pätevät, niin E : T pätee myös. Todistus. Seuraa induktiolla kuten eteneminen paitsi funktiotyyppien osalta. Tarkemmin mahdollisesti myöhemmin.
Huomioita Puhtaassa tyypitetyssä λ-laskennossa ei ole juuri mieltä (toisin kuin tyypittömässä). Tyypitetty λ-laskento ilman primitiivistä kiintopisteoperaattoria ei ole Turing-täydellinen, sillä jokaisella tyypillisellä lausekkeella on tällöin normaalimuoto!