12.2Állapottér transzformáció

Az alábbiakban egy olyan példát mutatunk be, amelyben az állapottér transzformáció nem egyszerű típustranszformáció. A feladatot úgy fogjuk megoldani, hogy eredeti állapottér helyett egy új (absztrakt) állapotteret választunk, azon megoldjuk a feladatot, majd a megoldásban szereplő műveleteket megvalósítjuk az eredeti téren.

Tegyük fel, hogy van egy karakterekből álló szekvenciális file-unk, ami egy szöveget tartalmaz. A feladat az, hogy számoljuk meg, hogy hány olyan szó van a szövegben, amelynek hossza nagyobb, mint a megadott érték! A szövegben a szavakat elválasztó jelek (egy vagy több) választják el egymástól. Az elválasztó jelek halmazát jelölje .

Így első ránézésre a feladat nem vezethető vissza egyetlen ismert programozási tételre sem. A feladatot ezért úgy általánosítjuk, hogy bevezetünk egy új állapotteret: tegyük fel, hogy a szövegfile helyett egy olyan file-unk van, amiben az eredeti file szavainak hossza szerepel. Legyen ez az absztrakt file , míg az eredeti szövegfile . A feladat specifikációja az új téren:

 

Ez a feladat visszavezethető a számlálás tételének szekvenciális file-ra felírt változatára:

Hátra van még az absztrakt és műveletek megvalósítása.

Az absztrakt file-nak pontosan akkor van még eleme, ha az eredeti file-ban van még szó. Ezért van szükség az műveletre, amely arra hivatott, hogy biztosítsa a művelet elején megkívánt invariáns tulajdonságot: vagy vagy a következő szó első karakterét tartalmazza. Ezen invariáns tulajdonság segítségével a műveletben könnyen el lehet dönteni, hogy lesz-e visszaadott érték, vagy már az absztrakt file is kiürült.

Az absztrakt file-ok kezelésének általában is ez a technikája: egy művelettel biztosítjuk a elején megkívánt invariáns tulajdonságot, és gondoskodunk róla, hogy a művelet ezt az invariáns tulajdonságot megtartsa. Általában is igaz az, hogy az invariánsból egyszerűen eldönthető, hogy lesz-e még visszaadott elem, ezért az absztrakt mindig elágazással kezdődik!

Nézzük tehát az absztrakt műveletek megvalósítását az eredeti állapottéren: ezek mint látható szintén programozási tételek egyszerű konstrukciói.