12. fejezet - Programtranszformációk

Tartalom

12.1Koordináta transzformációk
12.1.1Típustranszformációk
12.2Állapottér transzformáció
12.3Egyszerű programtranszformációk
Nem megengedett feltétel kitranszformálása elágazásból
Nem megengedett ciklusfeltétel kitranszformálása
Szimultán értékadás helyettesítése egyszerű értékadásokkal
Szekvencia sorrendjének felcserélése
Ciklusmag-beli szekvencia sorrendjének felcserélése
Függvény helyettesítése változóval
Rekurzívan definiált függvény helyettesítése

A továbbiakban olyan esetekkel fogunk foglalkozni, amelyekben a feladat állapotterét kell megváltoztatnunk. Vegyük észre: eddig is csináltunk már ilyet: bevezethetünk új változókat, vagy akár el is hagyhatunk komponenseket.

Az összetettebb esetekben az eredeti állapottér bizonyos komponenseit újakkal helyettesítjük.

12.1Koordináta transzformációk

Gyakran előfordul, hogy az állapottér egy komponensének típusát egy kapcsolódó másik típusra kell cserélnünk. Az ilyen transzformációk úgy általánosíthatók, hogy egy leképezést definiálunk a két állapottér egymásnak megfelelő komponensei között.

12.1.1Típustranszformációk

Típustranszformációról akkor beszélhetünk, ha az állapottér bizonyos komponenseit valami kapcsolódó típusra cseréljük.

A programozási tételek – és általában véve a (feladat, megoldó program) párok – az alábbiakban bemutatásra kerülő transzformációkon keresztül általánosíthatók, ha az állapotterek közötti transzformáció tulajdonképpen típustranszformáció. Ekkor az ábrán látható valamely típuson megoldott program egyszerű szabályok segítségével átvihető egy kapcsolódó típusra.

A programozási tételek átírása más típusra

Az alábbi sémák a programozási tételek típusok közötti transzformációjakor elvégzendő helyettesítéseket definiálják. A transzformáció úgy történik, hogy az első típus adott műveletét a második típus megfelelő (azonos sorban levő) műveletére cseréljük.

  • Halmazról ( ) sorozatra ( ) (egy input halmaz/sorozat esetén)

    A két típus közötti megfeleltetés: az és sorozatok tagjai felsorolják az és halmazok elemeit. ________________________________ _

    A fenti megfeleltetésben szereplő művelet a művelet olyan kiterjesztése, amely megengedi, hogy egy legfeljebb egy elemű halmazzal terjesszük ki a sorozatot. Ha a halmaz egy elemű, akkor azzal az elemmel terjeszti ki a sorozatot, míg ha üres, akkor a sorozatot helyben hagyja. Ennek megfelelően az elemenként feldolgozható függvényről is feltesszük, hogy egy egy elemű halmazhoz legfeljebb egy elemű halmazt rendel hozzá. Az művelet helyett az változónak feleltettük meg az értéket, mert a függvény mindig a sorozat első elemét adja vissza ellentétben az eredeti értékkiválasztással.

    Példa (egyváltozós egyértékű elemenkénti feldolgozás): ________________________________________________ ______________ ______ _______________________________

  • Sorozatról ( ) szekvenciális input file-ra (lopop,ext) ( ) vagy (read) ( ): (előreolvasási technika)

    A két típus közötti megfeleltetés: ha az sorozat nem üres, akkor megegyezik a és sorozatokkal, míg üres sorozat esetén az és sorozatokkal. ____________________________ ___________________ ___________________

    A transzformált program egy plusz (vagy ) művelettel kezdődik.

    Példa (egyváltozós egyértékű elemenkénti feldolgozás): ________________________________________________ _______________________________ _____ ___________________________

  • Halmazról ( ) vektorra ( )

    Feleltessük meg az (és ) halmaznak a (ill. ) párt oly módon, hogy az (ill. ) halmaz elemei a vektor (ill. a vektor ) indexű elemeivel egyeznek meg. ________________________________________________ _____

    Példa (egyváltozós egyértékű elemenkénti feldolgozás): ________________________________________________ ______________ _________ ________________________________________

  • Sorozatról ( ) vektorra ( )

    Sorozatok esetén a sorozat és vektor típusokra megengedett műveletek korlátozzák a két típus közötti megfeleltetés szabad választását: nem használható ugyanaz a leképezés, mint halmazoknál. Válasszunk hát a típusműveletekhez illeszkedő megfeleltetést!

    Feleltessük meg az sorozatnak a párt oly módon, hogy az sorozat tagjai rendre a vektor indexű elemeivel egyeznek meg. A sorozatnak viszont a párt úgy feleltessük meg, hogy a sorozat elemei rendre a vektor indexű elemeivel egyeznek meg. ________________________________________________ _____

    Példa (egyváltozós egyértékű elemenkénti feldolgozás): ________________________________________________ _______________________________ _________ ________________________________________

  • Intervallum felett definiált függvényről ( és a függvény argumentuma ) sorozatra ( )

    Első ránézésre úgy tűnhet, hogy kihagytunk egy lépést, a függvénytípust. De vegyük észre, hogy a függvény típusra való áttérés nem igényel transzformációt!

    Itt tulajdonképpen a sorozatot az intervallumnak feleltetjük meg az alábbi módon: tekintsük az sorozatot egy az intervallumon értelmezett függvénynek, ahol a függvényértékek a sorozat megfelelő elemei. Ekkor a tételben szereplő függvénynek tulajdonképpen az függvényt tekinthetjük. ________________________________________________ _____

    Példa (számlálás tétele): ____________________________________________________ _____________________________ / ________ __________________________________ /

  • Halmazokról ( ) szigorúan monoton növő sorozatokra ( ) a kétváltozós elemenkénti feldolgozás esetén. A kétváltozós elemenkénti feldolgozásnál az okozhat gondot, hogy el kell tudnunk dönteni, hogy egy adott elem melyik sorozatban van benne. Ezért tettük fel, hogy a sorozatok növekvően rendezettek, mert így mindkét sorozat legelső eleme a legkisebb, és ha ezek közül a kisebbiket választjuk, akkor a tartalmazás egyszerűen eldönthető. Egyébként a transzformáció többi része megegyezik az egyváltozós esetnél leírtakkal (itt is szükséges, hogy a függvényérték legfeljebb egyelemű legyen). Természetesen az elem kiválasztása itt is elhagyható, hiszen a művelet a sorozatnak mindig ugyanazt az elemét adja vissza.