• Nem Talált Eredményt

Listakifejezések mintával

6. Listakifejezések átalakítása a kib ˝ovített λ -kalkulusba 106

6.3. Listakifejezések mintával

nil :nil

consx xs : if(evenx) (cons(∗x 2) ( f xs)) ( f xs) kifejezést állítjuk el˝o.

6.3. Listakifejezések mintával

Az el˝oz˝o szakaszokban olyan listakifejezéseket vizsgáltunk, ahol a generátorban, a nyíl baloldalán egy változó szerepelt. Azonban ezen a helyen tetsz˝oleges minta is el˝ofordulhat.

hgenerátori := hmintai<− hlistai

Változó használata esetén a generátort tartalmazó listakifejezés redukciójára a következ˝o két szabályt adtuk meg:

(1) [E |x<−[ ]; Q] →[ ]

(2) [E |x<−y:ys; Q][E |Q][x :=y]++[E | x<−ys; Q]

Minta használatakor az els˝o szabály természetesen változatlan marad. A második szabályban az [E | Q][x := y] helyettesítés a (λx.[E | Q])y függvényapplikációra vezethet˝o vissza, hiszen

(λx.[E|Q])y[E|Q][x :=y]

Ezt az ötletet felhasználva, és már ismerve a minta-absztrakciókat, tudjuk képezni a (λp.[E | Q]) y absztrakciót. Az applikáció azonban false eredményt is adhat, ha a mintaillesztés nem volt sikeres. A 8vastagvonal operátort éppen erre a célra vezettük be, így megadhatjuk, hogy sikertelen mintaillesztés esetén a generátor által generált lista legyen üres.

A mintát tartalmazó listakifejezések redukciós szabályai tehát a következ˝ok:

(6) [E | p<−[ ]; Q] → [ ]

(7) [E | p<−y:ys; Q] → ( ((λp.[E |Q]) y) 8 [ ]

)

++[E| x<−ys; Q]

Vissza a tartalomhoz

6.3.1. Példa. (Listakifejezés mintával) A listakifejezés legyen

[pairx y|pairx y <− [1,pair2 3,cons4 [5],leaf6]]

A kifejezés redukálása a következ˝o:

[pairx y|pairx y <− [1,pair2 3,cons4 [5],leaf6] ] → ( ((λ(pairx y).pairx y) 1)8[ ])

++[pairx y|pairx y <− [pair2 3,cons4 [5],leaf6]] →+ (fail8[ ])++[pairx y|pairx y <− [pair2 3,cons4 [5],leaf6]] → [ ]++[pairx y|pairx y <− [pair2 3,cons4 [5],leaf6]] → [pairx y|pairx y <− [pair2 3,cons4 [5],leaf6]] → a generátorlista második elemével folytatva,

( ((λ(pairx y).pairx y)pair2 3)8[ ])

++[pairx y|pairx y <− [cons4 [5],leaf6]] →+ [pair2 3]++[pairx y|pairx y <− [cons4 [5],leaf6]] → . . .

Látható, hogy a listagenerátor további elemeire a mintaillesztés fail lesz, így a lis-takifejezés a

[pair2 3]

listát generálja.

A változós listakifejezésekhez hasonlóan, a mintát tartalmazó listakife-jezéseknek a kib˝ovített λ-kalkulusba történ˝o átalakítása is a listakifejezések redukciós szabályain alapul. A (6) és (7) redukciós szabályoknak megfelel˝o átalakításokat most is aflatmapfüggvénnyel írjuk le.

TEL[E | p<−L; Q]M =⇒ flatmap(λx. ( ((λTELpM.TEL[E |Q]M) x) 8 [ ]

) ) TELLM

A mintát tartalmazó listakifejezés is leírható acaseutasítás felhasználásával.

TEL[E | p<−L; Q]M =⇒ letrec f =λy. caseyof

nil :nil consx xs : append

( ((λTELpM.TEL[E|Q]M) x) 8 [ ]

) ( f xs) in( f TELLM)

ahol f,y és xs új változók.

6.3.2. Példa. Listakifejezés mintával)

Alakítsuk át az el˝oz˝o, 6.3.1. példában szerepl˝o listakifejezést:

[pairx y|pairx y <− [1,pair2 3,cons4 [5],leaf6]]

El˝oször határozzuk meg a listakifejezésλ-kifejezését aflatmapfelhasználásával.

[pairx y|pairx y <− [1,pair2 3,cons4 [5],leaf6]]=⇒ flatmap (λx.( ((λ(pairu v).pairu v)x)

8 [ ] ) )

TEL[1,pair2 3,cons4 [5],leaf6]M

Írjuk fel aλ-kifejezést acaseutasítás használatával, a fenti átalakítási szabály sze-rint

TEL[pairx y|pairx y <− [1,pair2 3,cons4 [5],leaf6]]M=⇒ letrec f =λy. caseyof

nil :nil consx xs : append

( ((λ(pairu v).pairu v) x) 8 [ ]

) ( f xs) in( f TEL[1,pair2 3,cons4 [5],leaf6]M)

Ez egy egydefiníciós egyszer˝u letrec-kifejezés, és erre alkalmazhatjuk a 6.2.3.

példában már használt átalakítási lépéseket.

A kifejezés a 3.3.1.-ben megadott átalakítással, az Y fixpont-kombinátor fel-használásával egy egydefiníciós egyszer˝u let-kifejezéssé alakítható át:

let f =Y(λf.(λy. caseyof

nil :nil consx xs : append

( ((λ(pairu v).pairu v) x) 8 [ ]

)

( f xs) ) ) in( f TEL[1,pair2 3,cons4 [5],leaf6] M)

Ez pedig a 3.4.3. pontban megadott átalakítással, majd egyβ-redukcióval (λf.f TEL[1,pair2 3,cons4 [5],leaf6]M)

Y(λf.(λy. caseyof

nil : nil consx xs : append

( ((λ(pairu v).pairu v) x) 8 [ ]

)

( f xs) ) )

Y(λf.(λy. caseyof

nil : nil consx xs : append

( ((λ(pairu v).pairu v) x) 8 [ ]

)

( f xs) ) ) TEL[1,pair2 3,cons4 [5],leaf6]M

Az eredményül kapott kifejezés alakja most isY(λxy.E) F, amire alkalmazható az el˝oz˝opontban is megadott

Y(λxy.E) F = E [x :=Y(λxy.E) F] [y := F]

egyenl˝oség. Így, ha a rövidebb leírás érdekében acaserészkifejezést most is E-vel jelöljük, azaz a kifejezésünk

Y(λf. λy.E) TEL[1,pair2 3,cons4 [5],leaf6]M (**) alakú, akkor

(case yof

nil :nil consx xs : append

( ((λ(pairu v).pairu v) x) 8 [ ]

) ( f xs) )

[ f :=Y(λf. λy.E)] [y :=TEL[1,pair2 3,cons4 [5],leaf6]M]

Az TEL[1,pair2 3,cons4 [5],leaf6]Mlistát most átírva

TEL[1,pair2 3,cons4 [5],leaf6]M=⇒cons1 (TEL[pair2 3,cons4 [5],leaf6]M végrehajthatjuk acaseutasítást, ekkor az

append

( ((λ(pairu v).pairu v) 1) 8 [ ]

)

((Y(λf. λy.E) TEL[pair2 3,cons4 [5],leaf6]M) kifejezést kapjuk, melyb˝ol látható, hogy a

(λ(pairu v).pairu v) 1

mintaillesztés nem lesz sikeres, azaz az append els˝o listája üres lesz. Így a kife-jezésünk az

(Y(λf. λy.E) TEL[pair2 3,cons4 [5],leaf6]M)

kifejezésre egyszer˝usödik. Látható, hogy visszakaptuk a fenti **-gal megjelölt kife-jezést, csak eggyel rövidebb listára.

Tovább folytatva a kifejezés kiértékelését, a fentiekhez teljesen hasonló lépése-ket alkalmazva, csak egy mintaillesztés lesz sikeres, így végül a [pair2 3] eredményt

kapjuk.

7. FEJEZET

Kib˝ovített λ -kalkulusból a kombinátor logikába

Ebben a fejezetben el˝oször megmutatjuk a konstansos λ-kalkulus λ-kifejezéseinek kombinátor logikai kifejezésekre történ˝o átalakítását, majd egy módszert adunk a kib˝ovítettλ-kalkulus néhány egyszer˝u kifejezésének, a mintaabsztrakcióknak az áta-lakítására.

7.1. λ -kifejezés átalakítása kombinátor logika kifejezésére

Jelöljük egyλ-kifejezésnek CL-kifejezésbe történ˝o átalakítását a{K nyíllal, és az Eλ-kifejezésnek a CL-kifejezésbe átalakított formáját (E)K-val, azaz E{K (E)K. A 2. fejezetben bevezetett jelölések szerintΛaλ-kifejezések, K a CL-kifejezések halmaza, tehát most aΛ {K K átalakításról lesz szó.

Az E λ-kifejezésb˝ol származó (E)K kifejezést az E szerkezete szerint adjuk meg.

x {K (x)Kx,

k {K (k)Kk, ahol k konstans,

E F {K (E F)K(E)K (F)K, λx.E {K (λx.E)K ≡ λx.(E)K

jel a 2.2. szakaszban leírt zárójeles absztrakciót jelöli.

7.1.1. Példa. (Az f (x)=x2+2x+1 kifejezés és az f (3) értéke)

Tekintsünk egy egyszer˝u programot, legyen f (x) = x2+2x+1 és határozzuk meg az f (3) értéket. A funkcionális program a 3. fejezetben leírtak alapján a

letrec f x= +(+(∗x x)(∗2 x)) 1 in f 3

Vissza a tartalomhoz

kifejezés lesz. A letrec-kifejezés definíciós részéb˝ol az f =λx. +(+(∗x x)(∗2 x)) 1

összefüggést kapjuk, a let-kifejezés törzsének λ-kifejezése pedig f 3. Ezeket fel-használva, szintén a 3. fejezetben megadott átalakítások szerint meghatározhatjuk a programλ-kifejezését:

f.f 3)(λx. +(+(∗x x)(∗2 x)) 1)

Alakítsuk át a λ-kifejezést CL-kifejezéssé, alkalmazzuk a fenti átalakítási szabá-lyokat.

f.f 3)(λx. +(+(∗x x)(2 x)) 1){Kf.f 3)(λx. +(+(∗x x)(∗2 x)) 1)K ≡ (λf.f 3)K(λx. +(+(∗x x)(∗2 x)) 1)K ≡ (λf.( f 3)K)(λx. +(+(∗x x)(∗2 x)) 1))K+f.f 3)(λx. +(+(∗x x)(∗2 x)) 1))K+ (C I3)(λx. +(+(∗x x)(∗2 x)) 1))K

Az applikáció második tagját külön levezetve:

(λx. +(+(∗x x)(2 x)) 1))K+ λx. + (+(∗x x)(∗2 x)) 1≡ C’+ (λx. + (∗x x)(∗2 x)) 1

C’+ (S’+ (λx. ∗ x x)(λx. ∗ 2 x)) 1

C’+ (S’+ (S’∗ (λx.x)(λx. x))(λx. ∗ 2 x)) 1+ C’+ (S’+ (S’∗ I I)(λx. ∗ 2 x)) 1+

C’+ (S’+ (S’∗ I I)(B’∗ 2I)) 1 Így tehát a program CL-kifejezése:

(C I3)(C’+ (S’+ (S’∗ I I)(B’∗ 2I)) 1)

A program eredményének a meghatározásához ezek után már csak a gyenge reduk-ciókat kell végrehajtanunk,

C I3 (C’+ (S’+ (S’∗ I I)(B’∗ 2I)) 1) →w I(C’+ (S’+ (S’∗ I I)(B’∗ 2I)) 1) 3 →w C’+(S’+ (S’∗ I I)(B’∗ 2I)) 1 3→w +(S’+(S’∗ I I) (B’∗ 2I) 3) 1 →w

122 7. Kib˝ovítettλ-kalkulusból a kombinátor logikába +(+(S’∗ I I3)(B’∗ 2I3)) 1 →w

+(+(∗(I3)(I3))(B’∗ 2I3)) 1 →+w +(+(∗ 3 3)(B’∗ 2I3)) 1 →+w +(+(∗ 3 3)(∗2 3)) 1→+δ +(+9 6) 1→+δ

16

7.2. A mintaabsztrakció átalakítása a kombinátor logika kifejezésére

El˝oször a konstansos absztrakciók átalakítását vizsgáljuk, és csak ezek után foglalkozunk az összeg- és szorzatkonstruktoros absztrakciók CL-kifejezésekre történ˝o transzformációjával. Az egyszer˝uség kedvéért most nem foglalkozunk a⊥ konstans problémájával.

7.2.1. Konstansos absztrakciók

Aλk.E λ-kifejezés szemantikáját a 3.7.1. pontban adtuk meg. Az értelmezés sze-rint ha egy konstansos absztrakcióra egy olyan kifejezést applikálunk, aminek az értéke megegyezik az absztrakció konstansával, akkor a mintaillesztés eredményéül az absztrakció törzsét kapjuk, ha az érték nem azonos az absztrakció konstansával, akkor a mintaillesztés afail eredményt adja.

A (λx.E)K ≡ λx.(E)K azonossághoz hasonlóan a konstansos absztrakció átalakítását is aλzárójeles absztrakcióval adjuk meg.

λk.E {K (λk.E)K ≡ λk.(E)K

Bevezetünk egy új speciális kombinátort, a kombinátor neve legyen Match, és a konstansos absztrakció jelentését ezzel a kombinátorral írjuk le:

λk.E ≡ Matchk E

AMatchkombinátor gyenge redukciós szabályai pedig legyenek a következ˝ok:

Match E F Gw F, ha E =G, Match E F Gw fail egyébként

Vissza a tartalomhoz

7.2.1. Példa. (Konstansos absztrakció)

A kib˝ovítettλ-kalkulusban az f 1=2 definícióból az f -re aλ1.2 kifejezést kapjuk, és például

f 1 = (λ1.2)1 → 2 f 3 = (λ1.2)3 → fail

Az f ≡λ1.2 λ-kifejezést CL-kifejezésre alakítva (λ1.2)K ≡λ1.2≡Match1 2

és

f 1 ≡ Match1 2 1 →w 2

f 3 ≡ Match1 2 3 →w fail

7.2.2. Összegkonstruktoros absztrakciók

Az összegkonstruktoros absztrakciók értelmezésével a 3.7.2. pontban foglalkoz-tunk, és láttuk, hogy egy mintaapplikációból nemfail eredményt akkor kapunk, ha az absztrakcióban és az argumentumában szerepl˝o konstruktor megegyezik. Hason-lóan értelmezzük az összegkonstruktoros mintákat a kombinátor logikában is.

Ha s az absztrakció konstruktora, akkor legyen

λ(s p1p2. . .pn).E) {K (λ(s p1p2. . .pn).E)K ≡ λ(s p1p2. . .pn).(E)K

Az összegkonstruktoros kifejezésre vonatkozó zárójeles absztrakció jelentését app-likációval adjuk meg. A konstruktorok vizsgálatát egy új,U_s nev˝u kombinátorral hajtjuk végre, az U név az

”uncurrying” szóból származik, spedig az absztrakció kombinátora.

λ(s p1p2. . .pn).E ≡U_s (λp1. λp2.· · · . λpn.E)

AzU_skombinátor gyenge redukciós szabályai legyenek a következ˝ok:

U_s f (s F1F2. . .Fn) →w f F1F2. . .Fn

U_s f (s0F1F2. . .Fn) →w fail, ha s,s0

7.2.2. Példa. (Összegkonstruktoros absztrakció)

Tegyük fel, hogy egy definíció átalakításának egyik sora a kib˝ovítettλ-kalkulusban λ(consx xs).E

Határozzuk meg ennek a CL-kifejezését. Ha E {K E0, akkor (consx xs).E {+

K

λ(consx xs).E0 ≡ U_cons(λx. λxs.E0)

Applikáljuk a kifejezésre a cons1 nil, majd a branch F G kifejezéseket. Legyen F{K F0és G{KG0. Mivel

cons1nil{+

K cons1nil és

branchF G{+

K branchF0G0, a következ˝o eredményt kapjuk:

(consx xs).E0) (cons1nil)≡ U_cons(λx. λxs.E0) (cons1nil) →wx. λxs.E0) 1nil

és

(consx xs).E0) (branchF0G0)≡ U_cons(λx. λxs.E0) (branchF0G0) →w

fail

A kiterjesztettλ-kalkulusban az összegkonstruktoros minták mintaillesztésének λ-kifejezésében a mintaillesztést a 8 vastagvonal operátorral oldottuk meg.

Vezessünk be a mintaillesztésre is egy új kombinátort, amelyet nevezzünkTry-nak, és a gyenge redukciós szabályok legyenek a következ˝ok:

Try fail Fw F

Try E Fw Try E0 F, ha EE0

Try E Fw E, egyébként

Az E 8 F λ-kifejezésnek a kombinátor logikában a Try(E)K(F)K kifejezést feleltessük meg.

E8F {K (E8F)K ≡ Try(E)K (F)K

Ezzel a kib˝ovített λ-kalkulusban lev˝o vastagvonal operátorokat tartalmazó kifejezéseket a kombinátor logikában applikációkra alakítottuk át.

Most nézzük meg, hogy a bevezetett Try kombinátor felhasználásával hogyan lehet az összegkonstruktoros mintákat tartalmazóλ-kifejezéseket CL-kifejezésekké átalakítani.

El˝oször nézzünk meg egy egymintás és kétsoros függvénydefiníciót. Tegyük fel, hogy a definícióból a kib˝ovítettλ-kalkulusban a következ˝o kifejezést kaptuk:

f =λx. ( ((λp1.E1) x) 8 ((λp2.E2) x) 8 ERROR )

Ha E1 {K E10,E2 {K E02 és p1 {K p01,p2 {K p02, ebb˝ol a kombinátor logikában a következ˝o kifejezést kapjuk:

f {+

K λx.Try ((λp01.E10)x) (Try((λp01.E20)x)ERROR)

Az egyszer˝uség kedvéért jelöljük a ((λp01.E10)x) kifejezést E100-vel, a ((λp01.E02)x) kifejezést E002-vel, így az f átalakítását a

λx.Try E100 (TryE002 ERROR)

kifejezéssel írhatjuk le. Mivel a Try konstans, alkalmazhatjuk a λ zárójeles absztrakció

λx.E F G ≡S’E (λx.F)(λx.G) átalakítási szabályát, így az fK-ra az S’ Try(λx.E100) (λx.(TryE002 ERROR))

kifejezést kapjuk. A jobb oldali kifejezésre ismét alkalmazva a zárójeles absztrakció szabályát, az fK kifejezés alakja

S’ Try(λx.E100) (S’ Try(λx.E002)ERROR))

Ezt a kifejezést tovább tudjuk egyszer˝usíteni, írjuk ki részletesen az E100kifejezést:

λx.E001 ≡ λx.(λp01.E01)x,

amire ha E01nem tartalmaz szabad x változót, alkalmazható a zárójeles absztrakció

λx.E xE

szabálya, így ebb˝ol a λp1.E01 ≡ λp1.(E1)K kifejezést kapjuk. Hasonló mód-szerrel a λx.E200 kifejezés aλp2.(E2)K-ra egyszer˝usíthet˝o. Tehát az f kifejezés alakja a kombinátor logikában

λx. ( ((λp1.E1) x) 8 ((λp2.E2) x) 8 ERROR )

{K

S’ Try (λp1.(E1)K)

(S’ Try (λp2.(E2)K) ERROR )

Ebb˝ol már következtethetünk a többmintás, több soros, összegtípusú konstruk-torokat tartalmazó definíció átalakítási szabályára is.

λx1. . .xn. ( ((λp1,1.· · ·. λp1,n.E1)x1. . .xn) 8 ((λp2,1.· · ·. λp2,n.E2)x1. . .xn) . . .

8 ((λpm,1. · · ·. λpm,n.Em)x1. . .xn) 8 ERROR

) {K

S’ Try (λp1,1.· · ·. λp1,n.(E1)K) (S’ Try (λp2,1.· · · . λp2,n.(E2)K)

. . .

(S’ Try (λpm,1.· · ·. λpm,n.(Em)K) ERROR). . .)

Megjegyezzük, hogy ha a zárójeles absztrakciók végrehajtásánál egy S’-s sza-bálytól különböz˝o szabály alkalmazásának feltétele is teljesül, akkor a fenti átalakításban azS’-s szabály helyett ez a zárójeles absztrakció is alkalmazható.

7.2.3. Példa. (Egymintás, kétsoros definíció) A 3.5.4. példában adtuk meg a flip függvény

flip 0 = 1 flip 1 = 0

definícióját, és itt szerepelt a függvény λx. ( ((λ0.1) x)

8 ((λ1.0) x) 8 ERROR )

λ-kifejezése is. A flip függvénydefiníció CL-kifejezése:

S’ Try(λ0.1) (S’ Try(λ1.0) (ERROR) ) A konstansos absztrakciókat is beírva, az S’ Try (Match0 1)

(S’ Try (Match1 0) (ERROR) ) kifejezést kapjuk.

Most határozzuk meg a flip 1 kifejezés értékét.

(S’ Try(Match0 1) (S’ Try(Match1 0) (ERROR) ) ) 1 →w Try((Match0 1) 1) ((S’ Try(Match1 0) (ERROR) ) 1)→w Try fail((S’ Try(Match1 0) (ERROR) ) 1)→w

S’ Try(Match1 0) (ERROR) ) 1→w Try((Match1 0) 1) ((ERROR) 1) →w

0

7.2.4. Példa. (Mintaillesztés összegkonstruktoros absztrakciókkal) A 3.5.5. példában szerepl˝o

reflect (leafn) = leafn

reflect (brancht1t2) = branch(reflect t2) (reflect t1) függvényλ-kifejezését a 3.7.5. példában adtuk meg:

reflect=λx. ( ((λ(leafn).leafn) x)

8 ((λ(brancht1t2).branch(reflect t2) (reflect t1)) x) 8 ERROR

)

Határozzuk meg a reflect függvény CL-kifejezését. El˝oször alakítsuk át az els˝o mintához tartozóλ-kifejezést, és használjuk a mintákra megadott átalakításokat is.

λ(leafn).(leafn)K ≡ λ(leafn).leafn ≡ U_leaf(λn.leafn)≡ U_leaf leaf

A második mintaλ-kifejezésének az átalakítása:

(brancht1t2).(branch(reflect t2) (reflect t1))K ≡ λ(brancht1t2).branch(reflect t2) (reflect t1) ≡ U_branch(λt1t2.branch(reflect t2) (reflect t1))≡ U_branch(λt1.(C’ branch(λt2.reflect t2) (reflect t1))≡ U_branch(λt1.(C’ branchreflect) (reflect t1))≡

U_branch(B(C’ branchreflect) (λt1.reflect t1))≡ U_branch(B(C’ branchreflect) reflect)

így a mintákat összefogva azS’ésTry kombinátorokkal:

reflect=

S’ Try (U_leaf leaf)

(S’ Try (U_branch(B(C’ branchreflect) reflect)) (ERROR) )

és ezzel a reflect függvény CL-kifejezését meghatároztuk.

7.2.5. Példa. (A reflect (leafE) kifejezés)

Az el˝oz˝o példában meghatároztuk a reflect kifejezését, most határozzuk meg a reflect (leafE) kifejezés értékét.

reflect (leafE)≡ (S’ Try(U_leaf leaf)

(S’ Try(U_branch(B(C’ branchreflect) reflect))(ERROR) ) ) (leafE)w Try(U_leaf leaf(leafE))

(S’ Try(U_branch(B(C’ branchreflect) reflect))(ERROR) (leafE))w Try(leafE)

(Try(U_branch(B(C’ branchreflect) reflect))(ERROR) ) (leafE))w

leafE

7.2.6. Példa. (A reflect (branch(leafE)(leafF)) kifejezés)

Határozzuk meg a reflect (branch(leafE)(leafF)) kifejezés értékét is.

reflect (branch(leafE)(leafF)))≡ S’ Try(U_leaf leaf)

(S’ Try(U_branch(B(C’ branchreflect) reflect))(ERROR) ) (branch(leafE)(leafF))w

Try(U_leaf leaf(branch(leafE)(leafF)))

(S’ Try(U_branch(B(C’ branchreflect) reflect))(ERROR) (branch(leafE)(leafF)))w

Try fail

(S’ Try(U_branch(B(C’ branchreflect) reflect))(ERROR) ) (branch(leafE)(leafF)))w

S’ Try(U_branch(B(C’ branchreflect) reflect))(ERROR) (branch(leafE)(leafF))w

Try(U_branch(B(C’ branchreflect) reflect)) (branch(leafE)(leafF))) ((ERROR) (branch(leafE)(leafF))w

Try((B(C’ branchreflect) reflect) (leafE) (leafF)) ((ERROR) (branch(leafE)(leafF))w Try((C’ branchreflect) (reflect (leafE)) (leafF))

((ERROR) (branch(leafE)(leafF))w Try(branch(reflectleafF)) (reflect (leafE)))

((ERROR) (branch(leafE)(leafF))w

branch(reflectleafF)) (reflect (leafE))

7.2.3. Szorzatkonstruktoros absztrakciók

A szorzatkonstruktoros applikációk értelmezését a 3.7.3. szakaszban vizsgáltuk.

Az összegkonstruktoros absztrakcióhoz hasonlóan legyen

λ(t p1 p2. . .pn).E {K (λ(t p1 p2. . .pn).E)K ≡λ(t p1 p2. . .pn).(E)K

ahol t a szorzatkonstruktort jelöli. Most is egy olyan megoldást keresünk, hogy a konstruktorok összehasonlítását az absztrakció argumentumában lev˝o konstruktor paramétereinek, azaz mintáinak feldolgozásáig elhalasszuk.

A szorzatkonstruktort tartalmazó kifejezés zárójeles absztrakcióját egy új,V_t

kombinátorral adjuk meg:

λ(t p1 p2. . .pn).E ≡ V_t (λp1. λp2. · · ·. λpn.E) ahol aV_t kombinátor gyenge redukciós szabálya a következ˝o:

V_t f Fw f (VSEL_t_1 F) (VSEL_t_2 F). . .(VSEL_t_n F)

A konstruktorok összehasonlítását aVSEL_..._...operátor végzi, ennek az operátor-nak a redukciós szabálya megfelel a kib˝ovítettλ-kalkulusban megadottSEL_..._...

operátor szabályának.

VSEL_t_i (t F1F2. . .Fn) →w Fi (1≤in) VSEL_t_i (t0F1F2. . .Fn) →w fail, ha t,t0

Az átalakítások megadott szabályai szerint tehát a szorzatkonstruktorok összeha-sonlítására csak akkor kerül sor, ha az F paraméter adataira szükség van.

Mint a 3. fejezetben láttuk, egy egymintás szorzatkonstruktorral megadott definíciónak a kib˝ovítettλ-kalkulusban az

f =λx. ( ((λp.E) x) 8 ERROR )

kifejezést feleltettük meg. Ez a kifejezés az el˝oz˝o pontban bevezetettTry kombiná-torral könnyen átalakítható CL-kifejezésre:

f {+

K λx.Try ((λp.E)x) ERROR

Mivel aTryés azERRORkonstans, alkalmazhatjuk a zárójeles absztrakció λx.E F G ≡C’E (λx.F)G

szabályát, így a következ˝o kifejezést kapjuk:

C’ Try(λx.((λp.E)x))ERROR

A kifejezésben lév˝oλx zárójeles absztrakcióra alkalmazva a λx.E xE

szabályt, a kifejezés még egyszer˝ubb lesz. Tehát a kifejezés alakja a kombinátor

logikában

f =λx. ( ((λp.E) x) 8 ERROR )

{K

C’ Try(λp.E)ERROR

Ennek alapján már megadhatjuk a többmintás, szorzatkonstruktorokat tartalmazó definíció átalakítási szabályát is:

λx1. . .xn. ( ((λp1. · · ·. λpn.E)x1. . .xn) 8 ERROR

) {K

C’ Try(λp1.· · ·. λpn.(E)K) ERROR

7.2.7. Példa. (Szorzatkonstruktoros absztrakció) A 3.7.8. példában láttuk, hogy az

add_pair (pairx y)= + x y definícióλ-kifejezése

add_pair =λz. ( ((λ(pairx y). + x y) z) 8ERROR

)

Alakítsuk át ezt a kifejezést CL-kifejezésre.

add_pair {K

(λz. ( ((λ(pairx y). + x y) z) 8ERROR

) )K

C’ Try(λ(pairx y).(+ x y)K)ERROR

El˝oször a kifejezésben lev˝o zárójeles absztrakció törzsét alakítva, majd az absztrak-ciókat elvégezve:

λ(pairx y).(+ x y)K ≡ λ(pairx y).+ x y≡ V_pair(λx. λy.+ x y))≡ V_pair(λx.+ x)≡ V_pair+

Így az add_pair kifejezésre a C’ Try(V_pair+)ERROR

kifejezést kaptuk.

7.2.8. Példa. (Az add_pair (pair3 4) kifejezés)

Az el˝oz˝o példában határozzuk meg az add_pair definíciójának CL-kifejezését, most számoljuk ki az add_pair (pair3 4) kifejezés értékét.

add_pair (pair3 4)≡

C’ Try(V_pair+)ERROR(pair3 4)→w Try(V_pair+(pair3 4))ERROR →w

Try(+(VSEL_pair_1 (pair3 4)) (VSEL_pair_2 (pair3 4))ERROR→+w Try(+3 4)ERROR →δ

Try 7 ERROR→w

7

7.2.9. Példa. (A zero_pair kifejezés) A 3.7.7. példában láttuk a

zero_pair (pairx y)=0

függvénydefiníciót, és itt mutattuk meg, hogy a zero_pair függvénnyel képzett függvényapplikációban a függvény argumentumának kiértékelésére nem kerül sor.

Most megmutatjuk, hogy ez a tulajdonság teljesül akkor is, ha a függvényappliká-ciót a kombinátor logika kifejezéseivel végezzük el.

El˝oször határozzuk meg a zero_pair CL-kifejezését.

zero_pair {K

(λz. ( ((λ(pairx y).0) z)

| ERROR ) )K

C’ Try (λ(pairx y).0) ERROR

Hajtsuk végre a zárójeles absztrakciót:

λ(pairx y).0≡ V_pair(λx.(λy.0))≡ V_pair(λx.(K0))≡ V_pair(K(K0))

Tehát a zero_pair CL-kifejezése:

C’ Try (V_pair(K(K0))) ERROR

Határozzuk meg a zero_pair (pair2 3) kifejezés értékét.

zero_pair (pair2 3)≡

C’ Try(V_pair(K(K0)))ERROR(pair2 3)→w Try(V_pair(K(K0)) (pair2 3))ERROR→w

Try(K(K0) (VSEL_pair_1 (pair3 4)) (VSEL_pair_2 (pair3 4)))ERROR→w Try(K0 (VSEL_pair_2 (pair3 4)))ERROR→w

Try 0 ERROR→w 0

A levezetésb˝ol látható, hogy a zero_pair függvény pair2 3 argumentumának

ki-értékélésére valóban nem kerül sor.

Irodalomjegyzék

[1] Appel, Andrew W.: Modern Compiler Implementation in C. Cambridge Univer-sity Press, 2004.

[2] Csörnyei Zoltán: Lambda-kalkulus, a funkcionális programozás alapjai. Typo-tex, Budapest, 2007.

[3] Csörnyei Zoltán: Programozási nyelvek típusrendszerei. kézirat, 2010.

URL"http://people.inf.elte.hu/csz".

[4] Diller, Antoni: Compiling Functional Languages. John Wiley & Sons, 1988.

[5] Peyton Jones, Simon L.: The implementation of functional languages. Prentice Hall, 1987.

[6] Peyton Jones, Simon L. – Lester, David R.: Implementing Functional Lan-guages: a tutorial. Prentice Hall, 2000.

[7] Plasmeijer, Marinus J. – van Eekelen, Marko C. J. D.: Functional Programming and Parallel Graph Rewriting. Addison-Wesley, 1993.

[8] Terese: Term Rewriting Systems. Cambridge University Press, 2003.

Vissza a tartalomhoz

Tárgy- és névmutató

azonos minták, 56

Church, Alonzo, 1, 4, 8 CL-kifejezés, 6

Eekelen van, Marko C. J. D., 134 egy definíciós

kiértékelés, 30, 42, 68, 74 függvény, 15

kalkulus

funkcionális, 30, 42, 68, 74 lusta, 55, 108

m˝uvelet jele, 14

Peyton Jones, Simon L., 134 Plasmeijer, Marinus J., 134 precedencia, 2

R

redex lásd redukálható kifejezés, 4 redukálási stratégia, 4

van Eekelen, Marko C. J. D., 134 vastagvonal, lásd8