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.