• Nem Talált Eredményt

Függvénydefiníciók egy mintával

3. Programok átalakítása a kib ˝ovített λ -kalkulusba 13

3.5. Mintákkal megadott függvénydefiníciók

3.5.1. Függvénydefiníciók egy mintával

hfüggvényi hmintai=hkifejezési

alakú. A minta természetesen itt is egy változó vagy egy konstans lehet, és ha a minta konstruktorral van megadva, akkor ez egy szorzattípusú konstruktor a megfe-lel˝o argumentumokkal.

Az egysoros és a minta helyén egy változót tartalmazó függvénydefiníció pon-tosan a 3.2.2. pontban leírt egyváltozós függvénydefiníciónak felel meg, és ennek az átalakítása

TDL f x= EM =⇒ f =λx.TELEM

volt. Ezt általánosítva, a mintát tartalmazó függvénydefinícióra a TDL f p=EM =⇒ f =λTELpM.TELEM

átalakítást kapjuk. Látható, hogy az átalakítás a kiterjesztett λ-kalkulus egy olyan λ-absztrakcióját adja meg, amelyben az absztrakció változójának helyén egy áta-lakított minta van. Az ilyen absztrakciót mintaabsztrakciónak nevezzük.

3.5.2. Példa. (Függvények egy mintával, els˝o kísérlet) TDL f 0=0M =⇒ f =λ0.0

TDLg 1=100M =⇒ g=λ1.100

és a 3.5.1. példában szerepl˝o first függvényre:

TDLfirst (pairx y)=xM =⇒ first=λ(pairx y).x Mit jelent az, hogy az absztrakció változójának helyén minta van, és hogyan m ˝uködik a minta illesztése? Egy mintaillesztés sikertelen is lehet, mi lesz ebben az esetben az átalakítás eredménye? Ezeket a problémákat általánosan a többsoros definícióval megadott függvényekre nézzük meg, azaz azokra, amelyeknél több mintaillesztés is lehetséges, és utána visszatérünk az f p= E definíció pontos áta-lakítására.

A többsoros és minden sorban egy mintával megadott függvények alakja

hfüggvényi hmintai1 = hkifejezési1 . . .

hfüggvényi hmintaim = hkifejezésim (m>1)

Megjegyezzük, hogy ha a sorokban lev˝o minták konstruktorokat tartalmaznak, akkor m = 1 esetén ez egy szorzattípusú konstruktor, m > 1 esetén pedig ezeknek összegtípusú konstruktoroknak kell lenniük.

Ez a függvénymegadás azt jelenti, hogy el˝oször az els˝o mintával kell a minta-illesztést elvégezni, ha ez sikeres, akkor a függvény értéke az els˝o kifejezés lesz, ha nem, akkor a második mintát kell illeszteni. Ha ez sikeres, akkor a függvény értéke a második kifejezés, ha nem, akkor a harmadik mintát kell illeszteni, és így tovább.

A mintaillesztések a függvényt leíró sorok sorrendjében történnek, ezt a m ˝uveletet funkcionális kiértékelésnek nevezzük.

Mint majd látni fogjuk (3.7. szakasz), a mintaillesztés egy olyan EF appliká-cióval írható le, ahol E egy a változójában mintát tartalmazó absztrakció, F pedig erre a mintára illesztett kifejezés. Ha a mintaillesztés nem sikeres, akkor az EF kife-jezés, azaz a mintaillesztés eredménye legyen egyfail-nek,

”sikertelennek” nevezett konstans, és azt mondjuk, hogy ekkor az EF kifejezést afail konstansra redukáljuk.

Mivel itt redukciókról van szó, a kib˝ovítettλ-kalkulus konstansai közé vezessük be a ⊥jellel jelölt bottom konstanst is, ezt a konstanst annak a jelölésére fogjuk majd használni, hogy egy kifejezésnek nincs normál formája. Az E =⊥egyenl˝oség tehát azt jelenti, hogy az E normál sorrend˝u redukciós sorozata nem terminál.

A funkcionális kiértékelés m ˝uveletének leírásához vezettük be a 2.3. sza-kaszban a8jellel jelölt operátort, amit

”vastagvonal”-nak nevezünk. Természetesen ennek a jelnek a kib˝ovítettλ-kalkulus ábécéjében is benne kell lennie. Láttuk, hogy a kib˝ovítettλ-kalkulusλ-kifejezései egy új szabállyal is b˝ovültek:

hλ-kifejezési::=hλ-kifejezési8hλ-kifejezési

A vastagvonal tehát egy infix m ˝uveletet jelöl, a m ˝uvelet jelentését a következ˝o leírással adjuk meg:

E 8 FE, ha E ,⊥és E ,fail, fail 8 FF,

⊥ 8 F → ⊥.

A vastagvonal operátor tehát el˝oször meghatározza a baloldali argumentumát, ha ez a kifejezés terminál és nemfail, akkor befejezi a m ˝uködését és eredményül adja

ezt a kifejezést. Ha a bal oldal kiértékelése fail, akkor eredményül a jobboldali kifejezést kapjuk. A harmadik sorban lev˝o szabály azt mondja ki, hogy ha a kifejezés nem terminál, akkor függetlenül az operátor jobboldalán lev˝o kifejezést˝ol, a teljes kifejezés bottom lesz.

A vastagvonal m ˝uvelet jobbasszociatív, azaz E8(F8G)E8F8G,

így ha az E kiértékelésefaillesz, akkor az F8G kiszámítása következik.

A zárójelek nélküli E18E28. . .8Em−18Em

kifejezésben tehát balról-jobbra értékel˝odnek ki a vastagvonal m ˝uvelettel elválasz-tott kifejezések, egészen addig, amíg egy Ei (1 ≤ im−1) kifejezés nem lesz fail. Ha az Em−1isfail, akkor a kifejezés értéke Emlesz. Ezt felhasználva, vezessünk be egy újERROR konstanst annak a jelzésére, hogy egyik mintaillesztés sem volt sikeres. B ˝ovítsük az m darab mintaillesztést egy m+1-edik kifejezéssel, amelyik ezt azERROR-t tartalmazza:

E18E28. . .8Em−18Em8ERROR

és ez jelentse azt, hogy ha az E1,E2, . . . ,Emminták egyike sem illeszthet˝o, akkor az ERROReredményt, azaz hibajelzést kapunk. AzERRORkonstansnak természete-sen nincs szerepe akkor, ha a definícióban a típus minden konstruktora szerepel, hiszen ekkor a futási id˝oben legalább egy mintának illeszkednie kell.

Megjegyezzük, hogyλ-kalkulusban megszokottakkal ellentétben, a vastagvonal operátor infix, azaz az operandusai közé írandó, de ez csak a könnyebb olvashatóság miatt van, és kés˝obb majd megadjuk a prefix vastagvonal operátorλ-kifejezés-t is.

Ezek után most már megadhatjuk az egysoros és egymintás függvénydefiníció pontos átalakítási szabályát:

TDL f p=EM =⇒ f =λx. ( ((λTELpM.TELEM) x) 8 ERROR

) ahol x egy új változó.

Megjegyezzük, hogy ha a fordítóprogram olyan típusellen˝orzést végez, amivel ellen˝orizni tudja a függvénydefiníció argumentumának és a függvényre applikált kifejezésnek a típushelyességét, akkor a fenti átalakításban szerepl˝o vastagvonal opcióra, azaz azERROR-ra nincs is szükség.

3.5.3. Példa. (Függvények egy mintával)

A 3.5.2. példában szerepl˝o függvénydefiníciók pontos átalakítása a következ˝o:

TDL f 0=0M=⇒+ f =λx. ( ((λ0.0) x)

8 ERROR )

TDLg 1=100M=⇒+ g=λx. ( ((λ1.100) x)

8 ERROR )

és a first függvényre:

TDLfirst (pairx y)=xM=⇒+ first=λz. ( ((λ(pairx y).x) z)

8 ERROR )

Megfelel˝o típusellen˝orzést végz˝o fordítóprogram esetén, azaz ha nincs szükség az ERROR-ra, a kifejezések alakja:

f = λx.(λ0.0) x g = λx.(λ1.100) x

first = λz.(λ(pairx y).x) z

A többsoros és minden sorban egy mintával megadott függvények alakja f p1 = E1

f p2 = E2

. . .

f pm = Em

A 8 operátort használva meg tudjuk adni ennek a függvénydefiníciónak is az átalakítását:

TDL f p1 =E1 f p2 =E2

. . .

f pm= Em M =⇒ f =λx. ( ((λTELp1M.TELE1M) x) 8 ((λTELp2M.TELE2M) x) . . .

8 ((λTELpmM.TELEmM) x) 8 ERROR

) ahol x egy új változó.

3.5.4. Példa. (Többsoros egymintás függvénydefiníció)

A flip függvény mintákkal történ˝o megadása legyen a következ˝o:

flip 0 = 1 flip 1 = 0

Ez egy többsoros és egymintás függvénydefiníció, aλ-kifejezése:

flip=

λx. ( ((λTEL0M.TEL1M)x) 8 ((λTEL1M.TEL0M)x) 8 ERROR

)

=⇒+

λx. ( ((λ0.1)x) 8 ((λ1.0)x) 8 ERROR

)

3.5.5. Példa. (Többsoros egymintás függvénydefiníció) A 3.5.1. példában szerepl˝o

reflect (leafn) = leafn

reflect (brancht1t2) = branch(reflect t2) (reflect t1) függvény alakja a kib˝ovítettλ-kalkulusban a következ˝o:

reflect=

λx. ( ((λTELleafnM.TELleafnM) x)

8 ((λTELbrancht1t2M.TELbranch(reflect t2) (reflect t1)M) x) 8 ERROR

)

=⇒+

λx. ( ((λ(leafn).leafn) x)

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

)