A programozás alapfogalmai Ahhoz, hogy a programozásról beszélhessünk, definiálnunk kell, hogy mit értünk a programozás egyes fogalmain. Ha belegondolunk, nem is olyan könnyű megfogalmazni, mi is az a program, vagy hogy mikor old meg egy program egy feladatot. Amikor programot írunk, általában egy a külvilágban adott feladatot akarunk számítógéppel megoldani. Ehhez kiválasztjuk a külvilág azon elemeit, amelyek kapcsolódnak a feladathoz, és megpróbáljuk elkészíteni ezeknek az elemeknek egy számítógépes modelljét. Ám a számítógépek változnak! Ezért a továbbiakban bevezetünk egy absztrakt modellt, amelyben leírjuk azokat fogalmakat, amelyek a programozás során előkerülnek, és e modell segítségével a gyakorlatban használható eszközöket adunk. 2.1. Az állapottér fogalma Az elsőként bevezetendő absztrakt fogalom tulajdonképpen a számítógép memóriájának ad egy a továbbiakban kényelmesen használható megfelelőt. 1. DEFINÍCIÓ: ÁLLAPOTTÉR Legyenek tetszőleges véges vagy megszámlálható nem üres halmazok. Ekkor az halmazt állapottérnek, az halmazokat pedig típusértékhalmazoknak nevezzük. Amikor egy modellt készítünk, el kell döntenünk, hogy a valóság mely részét kívánjuk modellezni, és melyek azok a jellemzők és milyen értékeket vehetnek fel amiket a modellünkben figyelembe akarunk venni. 19
20 2. A PROGRAMOZÁS ALAPFOGALMAI Az állapottér fenti definíciójában az egyes komponenseket tekintsük úgy, mint egyes jellemzők lehetséges értékeinek halmazát. A típusértékhalmaz elnevezés arra utal, hogy ezek a halmazok bizonyos közös tulajdonsággal rendelkező elemekből állnak. A későbbiekben majd kitérünk arra is, hogy ez a közös tulajdonság mit is jelent. Mivel a jellemzők értékhalmaza lehet azonos, az állapottér komponensei között egy halmaz többször is szerepelhet. 2.2. A feladat Az állapottér fogalmának segítségével könnyen megfogalmazhatjuk, hogy mit értünk programozási feladaton. Azt kell megfogalmaznunk, hogy a memória egy adott állapotából (azaz az állapottér egy pontjából) milyen memóriaállapotba (azaz az állapottér mely pontjába) akarunk eljutni. 2. DEFINÍCIÓ: FELADAT Feladatnak nevezzük az relációt. A feladat fenti definíciója, ha belegondolunk, természetes módon adódik, hiszen a feladatot legegyszerűbben úgy formalizálhatjuk, ha a feladatot egy leképezésnek tekintjük az állapottéren, és az állapottér minden pontjára megmondjuk, hogy hova kell belőle eljutni. Az, hogy egy feladatnak mi lesz az állapottere, természetesen magától a feladattól függ, ám még a feladat ismeretében sem egyértelmű. Például egy pont síkbeli koordinátáit megadhatjuk a derészögű koordináta-rendszerben, de megadhatjuk polárkoordinátákkal is. Mégis, az, hogy mit választunk állapottérnek, nagyon fontos dolog, hiszen meghatározza, hogy a továbbiakban mit, és hogyan tudunk leírni. Ha túl kevés jellemzőt vizsgálunk azaz az állapottér túl kevés komponensből áll akkor lehetnek olyan fogalmak, amiket nem tudunk benne leírni, ha túl sok a komponens, akkor túl bonyolult lesz a modell. 2.3. A program Ha a gyakorlatban azt mondjuk, egy program fut, akkor amögött azt értjük, hogy a számítógép memóriájának tartalma folyamatosan változik. A programfutás tehát egy időben dinamikus folyamat. Vezessünk be egy könynyebben kezelhető statikus modellt! Hogyan kaphatunk egy ilyen statikus modellt? Tekintsük például az alábbi a programozástól igazán messze eső problémát: Adott egy kémiai kísérlet, amely túl gyorsan játszódik le ahhoz, hogy az ember pontosan regisztrálni tudja az egymásutáni eseményeket. Ez a programfutáshoz hasonlóan egy időben dinamikusan lejátszódó folyamat. Hogyan követhető nyomon mégis a kísérlet? Például úgy, hogy a kísérletet filmre vesszük, és a továbbiakban a képkockák által rögzített statikus állapotokat vizsgáljuk. Így az időben változó folyamatot egy statikus állapotsorozattal írjuk le.
2.4. A PROGRAMFÜGGVÉNY 21 A fenti példa szemléletesen mutatja, hogyan adhatunk statikus modellt egy dinamikus folyamat leírására. A program definíciójában a program időbeni futásának jellemzésére az előbbi páldával analóg módon vezetünk be egy statikus modellt: a futást állapottérbeli sorozatokkal írjuk le. Ahogy a program futása során a memóriatartalom változik, úgy jutunk az állapottér újabb és újabb pontjaiba, így ezeket a pontokat egy sorozatba fűzve valójában "filmre vesszük" a programfutást. 3. DEFINÍCIÓ: PROGRAM Programnak nevezzük az! "#" relációt, ha 1. $&%', 2. (*)+,.-/(102+3546)87-90 ), 3. (*02+;:;%<- 0=?> @BAC4D0E7. Az absztrakt program értékkészlete olyan sorozatokat tartalmaz, amelyek a konkrét program egy végrehajtását jellemzik. A fenti megszorítások értelemszerűek: az első azt kívánja meg, hogy a program futását jellemző sorozat abból a pontból induljon el, amihez hozzárendeltük. A programnak tetszőleges állapotból el kell indulnia, hiszen egy program és annak sincs értelme, hogy a program egy állapotban egymás után véges sokszor lehessen (a program áll?). 2.4. A programfüggvény Ahhoz, hogy egy program és egy feladat viszonyát megvizsgáljuk, elegendő, ha a programról tudjuk, hogy az állapottér egy adott pontjából kiindulva, az állapottér mely pontjába jut, mert a megoldás szempontjából a közbülső állapotok lényegtelenek. Természetesen vannak olyan a programok minőségére vonatkozó további kritériumok, amelyek szempontjából egyáltalán nem mindegy, hogy a program hogyan oldja meg a feladatot (ilyen lehet például a hatékonyság, program idő- és tárigénye), de mi a továbbiakban ezekkel egyelőre nem foglalkozunk. Ezért vezetjük be a programfüggvény fogalmát, amely tehát csak a program futásának eredményét jellemzi. 4. DEFINÍCIÓ: PROGRAMFÜGGVÉNY A FG4HI7J! reláció az J "#" program programfüggvénye, ha 1. $K L %NM OB)P+!QB54D)R7SJ "UT, 2. FV46I74D)R7I!O W+<!QXY0Z+<54D)R7S-U[\460V7?W T. Az első követelmény azt fogalmazza meg, hogy csak azokban a pontokban van értelme azt vizsgálni, hogy hova jut egy program, ahonnét kiindulva a program nem "száll el". A második pont értelemszerűen azt írja le, hogy ahova a program eljut, az a sorozat utolsó eleme. A programfüggvény elnevezés megtévesztő lehet, hiszen egy program programfüggvénye nem feltétlenül függvény, sőt az sem biztos, hogy determinisztikus reláció
) 22 2. A PROGRAMOZÁS ALAPFOGALMAI (parciális függvény). Történeti megfontolások alapján azonban mégis megtartottuk ezt az elnevezést. 2.5. Megoldás Vegyük észre, hogy a programfüggvény ugyanolyan típusú reláció mint a feladat volt. Így tehát a programfüggvény fogalmának bevezetésével lehetőségünk nyílik arra, hogy kapcsolatot teremtsünk egy adott feladat és egy adott program között. Természetesen ennek a kapcsolatnak azt kell leírnia, hogy mikor mondjuk egy programról azt, hogy megold egy adott feladatot. 5. DEFINÍCIÓ: MEGOLDÁS Azt mondjuk, hogy az program megoldja az feladatot, ha 1. $^]$K/L %9M, 2. (1)+,$ ] -_FG4HI7_46)8754D)R7. Ezzel a definícióval végül is azt kívánjuk meg, hogy az állapottér olyan pontjaihoz, ahol a feladat értelmezve van, a program csak véges sorozatokat rendeljen (termináljon) és a sorozatok végpontjait a feladat hozzárendelje a kezdőponthoz. $K L %NM $ ] 4D)R7 FV46I74D)R7 2.1. ábra. Megoldás 2.6. Példák 1. példa: Legyen `ONa #b T 1 O9a9 b T c d!ona #br feg ihc j T Y kl * G d. mno84i4d)c #W/ fo7_ 46Ag @9 #p*7i7^qcp!q)pr`w T g4sa9 a ab7p? Hány olyan pontja van az állapottérnek, amelyekhez a feladat ugyanazt rendeli, mint az 4sa9 a9 ab7 -hez?
~ 2.6. PÉLDÁK 23 Megoldás: 4sa9 a9 ab7ton4ia a9 b97u 4ia #br b97u B46bR a #b 7u B46bY br #b 7 T Mivel a feladat hozzárendelése nem függ az állapottér harmadik komponensétől, a feladat ugyanezeket a pontokat rendeli az összes 4ia a #v 7 alakú ponthoz. Más pontokhoz viszont nem rendelheti ugyanezeket a pontokat, mert akkor az összeg nem lehetne b! Tehát öt olyan pontja van az állapottérnek amelyhez a feladat ugyanazt rendeli, mint az 4sa9 a9 ab7 -hez. 2. példa: Legyen k`ona #br feg ihc j T =!, "#". 2O 4sa Bwsa/b jra/xi7_ 4sa9 wsah9enj b xf7u 4ia wiaenbsixi7u y46by w6byabxf7u 46bR Bw6bUhNxi7_ 4Deg wde9e e9e e ezxi7_ {4Dhg wdhga/jrah8xi7_ 4 hc w hneya/b jra/xi7_ 4 hg Bw hcabj h8b xf7u }46jY w6j9b h8xi7u 4HjR whjue hnxi7_ 46jY w6j9bue hnxi7 T!O846bR ab7*4hbr fhn7*4dhg a/7*4 hc b97*4 hc j 7 T. a) Adjuk meg FG4HI7 -t! b) Megoldja-e a feladatot? Megoldás: a) Mivel a program az a -hez és a e -hoz végtelen sorozatot is rendel, a programfüggvény értelmezési tartománya: $K L %NM O/bY ihg #j T Ekkor a programfüggvény: FV46I7ION4HbR a/7u B46bR fhn7_ 4 hc ih87u 4Dhg ab7u B4 hc b 7_ 4HjR ih87 T b) A megoldás definíciója két pontjának teljesülését kell belátnunk. $ ]!O br ih T O/bY ihg #j T J$K L %NM. ~~ EFV46I746b 7IO9a9 ih T O9a fh T?4Hb 7, FV46I74 hn7iohc a9 b T ONa #br j T 4 h87u tehát az program nem megoldása az feladatnak. " T " T 3. példa: Fejezzük ki a programok uniójának programfüggvényét a programok programfüggvényeivel! Megoldás: Legyenek / #* ƒ, "#" programok. Ekkor a programfüggvény értelmezési tartományának definíciójából kiindulva: $K L % i R% im OB)+ `QfFV46 t 7_46)875 OB)+ `QfFV46 7_4D)R7S " ˆ FG46 7_46)R7S $K L %9 zm1š $K L % M Legyen )P+;$K/L % sm1š $K/L % fm. Ekkor FV46 \ 7_46)R7 OB[\4D0E7QB0Œ+Œ4H * B74D)R7 T OB[\4D0E7QB0Œ+3 U4D)R7\,0Œ+<* N4D)R7 T FV46 7_4D)R7 FV46* B7_4D)R7_
~ 24 2. A PROGRAMOZÁS ALAPFOGALMAI 4. példa: Legyen t és V egy-egy feladat ugyanazon az állapottéren! Igaz-e, hogy ha minden program, ami megoldása t -nek, az megoldása V -nek is, és minden program, ami megoldása G -nek, az megoldása E -nek is, akkor t és G megegyeznek? Megoldás: A leggyakoribb hiba, amit ennek a feladatnak a megoldásakor el szoktak követni, az az, hogy összekeverik az állítás feltételrendszerét magával a bizonyítandó állítással, és azt próbálják bebizonyítani, hogy valamelyik feladatnak minden program megoldása. Természetesen általában ez nem igaz, de nem is ez a feladat! Abból kell tehát kiindulnunk, hogy pontosan ugyanazok a programok oldják meg mindkét feladatot, és meg kell vizsgálnunk, hogy következik-e ebből az, hogy a két feladat megegyezik. Induljunk ki abból, hogy minden program, ami megoldása -nek, az megoldása -nek, és válasszunk egy olyan programot, amelynek programfüggvénye megegyezik az relációval. Ekkor a választott program triviálisan megoldja az feladatot, tehát meg kell oldania -t is, azaz: Ž$ ]9 Z$ ]N ~~ (1)+,$ ] - t U46)R7SV 946)R7 Most felhasználva, hogy minden program, ami megoldása V -nek, az megoldása t - nek is, és egy olyan program választásával, amelynek programfüggvénye megegyezik -vel, az előzőekkel analóg módon adódnak a fordított irányú állítások: ~~H~ $^] $^] ~ m(*)+'$^] - 4D)R7 4D)R7_ Az ~ és ~~~ állításokból következik, hogy a két feladat értelmezési tartománya megegyezik, míg az ~~ és ~ állítások garantálják, hogy ezen közös értelmezési tartomány egyes pontjaihoz mindkét feladat ugyanazokat a pontokat rendeli, azaz E?G. 5. példa: E V. Az program megoldja V -t. Igaz-e, hogy megoldja t -et is? Megoldás: Próbáljuk meg bebizonyítani az állítást. Ehhez a megoldás definíciója két pontját kell belátnunk. ~ $ ]N $K L %NM, ~~ I(*)P+;$ƒ] -_FG4HI7_46)R7J 46)R7. Az ~ pont teljesülése könnyen látható, ugyanis megoldása V -nek, tehát $ ]8 Z$ ] $K/L %9M Az ~H~ pont bizonyításánál azonban gond van, hiszen az alábbi két állítás áll rendelkezésünkre: (*)+,$^] - FV46I74D)R7J 46)R7u (*)+,$ ]N -qt 46)875V 946)87_ és ezekből a kívánt állítás nem bizonyítható. Elakadtunk a bizonyításban, lehet, hogy nem igaz az állítás? Készítsünk ellenpéldát felhasználva azt, hogy hol akadtunk el a bizonyításban!
2.7. FELADATOK 25 Legyen!ONa b T, t `O84sa ab7 T, V!O84sa ab7_ 4sa9 b97 T és FG4HI7 egyezzen meg az V feladattal. Ekkor triviálisan megoldja V -t, de nem megoldása t -nek, ui. Tehát az állítás nem igaz. aƒ+;$ ]N ˆ FG4HI7_4iaB7IG N4sa/7I`O9a9 b T ko9a T?E 4sa/7u 2.7. Feladatok 1. Legyen O/ u # u f T 2J "#". 2O 46 wh G 5xf7u 46 wh ƒ Gxf7u 46 wh ƒ #xi7_ wh S 5xf7u wh ƒ xf7u wh ƒ ƒ ƒ ƒ ƒ sxi7_ wh S V xi7_ wh ƒ V 5xi7_ wh S E ƒ Sxi7_ I w6 V 5 xf7u I w6 V xf7u I w6 V 5 5xf7 T!ON4 57*4 # 7*4 57*4 # S7*4 # 7 T. a) Adjuk meg FV46I7 -t! b) Megoldja-e a feladatot? 2. Legyen program, olyan feladat, hogy megoldása -nek. Igaz-e, hogy a) ha nem determinisztikus, akkor sem az? b) ha determinisztikus, akkor is az? c) ha nem determinisztikus, akkor FG4HI7 sem az? d) ha FG4HI7 determinisztikus, akkor is az? e) ha determinisztikus, akkor FG4HI7 is az? f) ha nem determinisztikus, akkor FG4HI7 sem az? 3. Igaz-e, hogy FG46 7 értelmezési tartománya éppen " ősképe -re nézve? 4. Mondhatjuk-e, hogy az program megoldja az feladatot, ha igaz a következő állítás: š +'$ ]Z 54 š 7J " ˆ FG46 7_4 š 75J4 š 7u 5. Legyenek és \ programok, pedig egy feladat egy tetszőleges közös állapottéren. Teggyük fel továbbá, hogy * és * megoldja az feladatot. Igaz-e, hogy megoldja -et? T ˆ T 6. Legyen œk,œ, t U fv ƒ. E!ON4f4 V 7u 4Dž fÿr7f7sq=ÿ*q,!on4f4 V 7u 4Dž fÿr7f7sqž;? Ÿ\Q. Ugyanaz-e a két feladat? (Van-e valamilyen összefüggés közöttük?)
26 2. A PROGRAMOZÁS ALAPFOGALMAI 7. J `,., * programok -n. Az és az * is megoldja az feladatot. Igaz-e, hogy az Œ 46 * B7 program is megoldja az feladatot? 8. Tekintsük a következő szövegesen megadott feladatot: Adott egy sakktábla, és két rajta lévő bástya helyzete. Helyezzünk el a táblán egy harmadik bástyát úgy, hogy az mindkettőnek az ütésében álljon! Készítsük el a modellt: írjuk fel az állapotteret és az relációt! 9. Tudjuk, hogy megoldja -et (az állapottéren). Igaz-e, hogy 4D)P+ ˆ 464D)R7 J " FG4HI7_46)R7 J46)87f7i7 ) +;$ ] 10. Legyen! egy feladat és!; "#" egy program. Jelöljük ƒ -vel azt a relációt, amely és FV46I7 metszeteként áll elő. Igaz-e, hogy a) ha $ ] $ ], akkor megoldja -et? b) ha megoldja -et, akkor $ ]\ J$ ]?