Gondolatok
a típus-specifikációk
kompatibilitásának
vizsgálatáról

Eszmefuttatásom célja egy módszert vázolni, amely perspektivikus lehet annak vizsgálatában, hogy a típusok, típusosztályok algebrai, valamint a „hagyomá­nyosabb” külső felület szerinti specifikációjának[1] egymáshoz illeszkedése nem sérül-e. A módszer egyik sarkalatos pontja a Prolog nyelv felhasználása, amely –elképzeléseim szerint– képes támogatni eme vizsgálatot. Elvárásom, hogy egy alkalmasan felépített Prolog nyelvű programmal igazolható, a típus két leírá­sá­nak kompatibilitása: logikai egymáshoz illeszkedősége.

Egy ilyen módszer kidolgozásának elsősorban gyakorlati jelentősége van. Is­mert [KV2001] ugyanis, hogy algebrai specifikációból formálisan is előállít­hatók az érintett operációk elő- és utófeltételes specifikációi, tehát a típus­osztály P/P-specifikációja. A programfejlesztés során a programozó nem az említett tétel alkalmazásával (még ha tud is róla), hanem inkább „józanésszel” jut el a típusosztály-megvalósításhoz közelebb álló (azaz egyéb operációktól függetlenül megfogalmazott) másik specifikációjához. Ekkor nagyobb „űr” tá­tong a kétféle specifikáció között, ami fölveti a kompatibilitás meglétének kérdését.

Egy ilyen módszer más szempontból is hasznos lehet. Ha ugyanis valóban „me­chanikussá” sikerül tenni a kompatibilitás vizsgálatát, jó eséllyel akár prog­rammal is elvégezhetővé válik az ellenőrzés.

A harmadik részben további arra keressük a választ, mit ígérhet és mit nem a módszer, mit várhatunk el tőle, és miben ne reménykedjünk. Igyekszem össze­foglalni azokat a tudnivalókat, amelyek a gyakorlatból szűrhetők le, de fog­lalkozok az elméleti alapokkal.

III. rész
A módszer perspektívája


Vázlat:

0. A módszer matematikai modellje. 3

1. A megbízhatóság. 9

1.1. A megbízhatóság fogalma. 9

1.2. Rejtett hibák. 9

1.3. Hamis riasztás. 13

2. A teljesség. 14

3. Praktikus kérdések. 15

4. Ekvivalens formulák keresése. 16

Irodalom.. 18

Programhivatkozások. 19

Függelék. 20

 

 


0. A módszer matematikai modellje

Ebben a részben a módszer teljesítőképességét vesszük górcső alá. Megvizsgáljuk a műkö­dé­sének elméleti alapjait, és alkalmazásának gyakorlatát.

Az elméleti taglaláshoz néhány alapfogalomra lesz szükségünk. Nagyban építünk a [KV2001] irodalomra, így jónéhány fogalmat definiálás nélkül átveszünk. (Pl. típusosztályhoz kapcso­ló­dó szignatúra, specifikáció absztrakt fogalmait.)

 

Definíció    – P/P-specifikáció

Egy TIP tipusosztály P/P-specifikációja alatt a P/P-specTIP={S,EPP}, ahol S=(S,OP) szignatúra és EPP={(Efi ,Ufi) i=1..║OP║} (Efi ,Ufi) elő- és utófeltételek véges halmazát értjük, ║OP║ a TIP operációinak a számát jelenti.

Értelemszerűen az (Efi ,Ufi) elő- és utófeltétel-pár a TIP i. operációjához tartozik. (Arról azonban tudjunk, hogy minden operáció előfeltétele az implicit error-axiómával együtt ki kell, adja a bemeneti értékek összességét. Azaz valójában nincs az operáció használata korlátozva, de lényegi transzformációra csak a fenti előfeltételek teljesülése mellett számíthatunk. Tegyük ehhez hozzá azt, hogy ha az operátor NemDef értéket állít elő, akkor a bemeneti értékeket változatlan értékben meghagyja.)

Példul:

L. sor exportmodulját!

 

Definíció    – algebrai specifikáció

Egy TIP tipusosztály algebrai specifikációja alatt a Alg-specTIP={S,Eax}, ahol S=(S,OP) szignatúra és Eax={Axi i=1..N} Axi axiómák véges halmazát értjük.

Az axióma egy leképezés a típus bázishalmazáról (T0) a logikai értékek (L) halma­zára:

Ax: T0 ® L

Az axiómák tartalmazzák a TIP-hoz rendelt operációk közül számosat. Ezek kapcsolatait írják le. Vizsgálatunk tárgya, hogy az operációk működését leíró P/P-specifikációk jól illenek-e be­le az axiómák rendszerébe. Értelmes felvetés tehát egy axióma igazságtartalmára rákérdezni. Vagyis egy adott bázishalmazbeli értékből kiindulva az egyes axiómák igazak-e, amint „meg­szólaltatják” és kapcsolatba hozzák egymással a bennük foglalt műveleteket.

Példul:

L. sor algebrai specifikációját!

 

Definíció    – Operátor P/P-kiértékelése

Adott egy TIP tipusosztály P/P-specTIP={S,EPP} P/P-specifikációja. Az (Efi ,Ufi) ÎEpp elő- utófeltétellel adott operációjának tÎT0 melletti P/P-kiért(op,t) kiértéke­lése alatt azon értékek halmazát értjük (ÍRop), amelyet úgy kapunk, hogy bármely, az előfeltételt teljesítő paraméterezése és az adott t mellett az operátor kimeneti értékei az utófeltételt kielégítik. Azaz

ha  op:T0xTi1xxTij®T0xTikxxTim,
akkor P/P-kiért(op,t):=(tt, tt1,…,ttm)ÎRop  (=T0xTikxxTim ) :
   "(t1,…,tj)ÎTi1xxTij: Efop(t, t1,…,tj) Þ Ufop((tt, tt1,…,ttm), (t, t1,…,tj))

A  {(t1,…,tj)ÎTi1xxTij: Efop(t, t1,…,tj)}  halmazt nevezzük az operátor t melletti tartójának. S jelöljük így: Tartó(op,t),

(tt, tt1,…,ttm)=op(t, t1,…,tj), azaz (tt, tt1,…,ttm) jelöli az operátor által transzformált értéket a (t, t1,…,tj) helyen; továbbá a Ti1xxTij halmaz a paramétereinek a halmaza. A tartó tehát azon halmaz, amelybe tartozó paraméterek estén elvárható az operátor utófeltétel szerinti mű­ködése.

Például:

A sor bázishalmazát jelöljük S-sel, ami Elem-iterált – amint ez az exportmodul nyitó részé­ből derül ki. A Sorból és az Üres? operációk szignatúrája az algebrai specifikációban szereplőtől némileg eltér. Pontosítottuk az exportmodulban olvashatók szerint: hozzávettük a definiáltság-állapotát jelző {Def, NemDef} komponenst „hiba” néven. Ezt mint latens para­métert tekintjük; azaz a sor belső komponenseként használjuk, az operátorok paraméterei kö­zött explicite nem, csak a sor részeként fog megjelenni. Emiatt az axiómákat újrafogal­mazni kényszerülünk.

   Sorból: Sor x hiba ® Sor x hiba x Elem [2]
   Üres?: Sor x hiba ® Sor x hiba x L

ahol
   hiba={Def,NemDef}
   L={Igaz,Hamis}

Exportmodulbeli P/P-specifikációik:

  Eljárás Sorból(Változó s:Sor, e:ElemTip)
                                         [a sor első elemének kivétele]
     Ef:  $sÎSor Ù Øs.hiba
     Uf:  s.sorozat=(s1,...,sn) Þ s’=((s2,...,sn),Hamis) Ù e=s1
          s=() Þ s’.hiba=Igaz

  Függvény Üres?(Konstans s:Sor): Logikai
                                                         [üres-e a Sor]
     Ef:  $sÎSor Ù Øs.hiba
     Uf:  Üres?(s)=(s.sorozat=())

Lássunk néhány P/P-kiértékelést:

1. mintastruktúra a Sorból operációhoz: ( ) – üres sorozat

a) Tartó(Sorból, ( )):={Def}

ui.:        EfSorból(( ), Def)=Igaz, EfSorból(( ), NemDef)=Hamis  Þ  Tartó(Sorból, ( )):={Def}

            (azaz csak a Def paraméterre teljesül az előfeltétel, 1-elemű a tartó az üres sorozatra)

b) P/P-kiért(Sorból, ( )):={(( ),NemDef,e) : "eÎElem }

ui.:        "hÎTartó(Sorból, ( )),  a)Þ $!h=Def

            (szavakkal: az üres sorozat mellett, elegendő csak a Def-re meghatározni azt a kimeneti halmazt, amelyre az utófeltétel igaz)

            UfSorból((ss,hh,ee), (( ),Def))=Igaz  Û  ss=( ) Ù hh=NemDef Ù ee=e "eÎElem

            (szavakkal: az utófeltétel igaz lesz NemDef állapot és üres sorozat mellett tetszőleges elemre).

2. mintastruktúra a Sorból operációhoz: (e) – egy elemű sorozat

a) Tartó(Sorból, (e)):={Def}

ui.:        EfSorból(((e), Def))=Igaz, EfSorból((e), NemDef)=Hamis  Þ  Tartó(Sorból, (e)):={Def}

b) P/P-kiért(Sorból, (e)):={(( ),Def,e)}

ui.:        "hÎTartó(Sorból, (e)),  a)Þ $!h=Def

            UfSorból((ss,hh,ee), ((e),Def))=Igaz  Û  ss=( ) Ù hh=Def Ù ee=e;

3. mintastruktúra az Üres? operációhoz: ( ) – üres sorozat

a) Tartó(Üres?, ( )):={Def}

ui.:        EfÜres?((( ), Def))=Igaz, EfÜres?((( ), NemDef))=Hamis  Þ  Tartó(Üres?, ( )):={Def}

b) P/P-kiért(Üres?, ( )):={(( ),Def,Igaz)}

ui.:        "hÎTartó(Üres?,( )),  a)Þ $!h=Def

            UfÜres?((ss,hh,ll), (( ),Def))=Igaz  Û  ss=( ) Ù hh=Def Ù ll=Igaz;

4. mintastruktúra az Üres? operációhoz: (e) – egy elemű sorozat

a) Tartó(Üres?, (e)):={Def}

ui.:        EfÜres?(((e),Def))=Igaz, EfÜres?(((e), NemDef))=Hamis  Þ  Tartó(Üres?, (e)):={Def}

b) P/P-kiért(Üres?, (e)):={((e),Def,Hamis)}

ui.:        "hÎTartó(Üres?, (e)),  a)Þ $!h=Def

            UfÜres?((ss,hh,ll), ((e),Def))=Igaz  Û  ss=(e) Ù hh=Def Ù ll=Hamis;

5. … egy nem ennyire triviális példa

 

Definíció    – Axióma kiértékelése

Adott egy TIP tipusosztály Alg-specTIP={S,Eax} algebrai specifikációja és P/P-specTIP={S,EPP} P/P-specifikációja. Az AxÎEax axiómájának tÎT0 melletti Ax-kiért(Ax,t) kiértékelése alatt azon logikai érték(ek)et értjük, amelyet úgy kapunk, hogy

a.)    a logikai műveletek kiértékelési sorrendjének megfelelően sorbavesszük az operátorokat, abból a célból, hogy

b.)    külön-külön kiértékeljük; természetesen az elsőt az adott t-re, a továbbiakat olyan paraméterekre, amelyeket az addigi kiértékelések meghatároznak;

c.)    majd figyelembe vesszük az előírt logikai műveleteket, megkapjuk a vég­eredményt.

Például:

Az eredeti 4’o axióma:

4’o  Sorból – hiba-axióma

         Üres?(s) Þ  Sorból(s)=NemDef

… és az újrafogalmazott változata:

4’o  Sorból – hiba-axióma

         Üres?(s).L Þ  Sorból(s).hiba=NemDef

1. mintastruktúra a 4’o axiómához: ( ) – üres sorozat

Ax-kiért(4’ o, ( )) º

a) A kiértékelés sorrendje és a művelet paramétere:

  1. Üres? – ( )
  2. Sorból – P/P-kiért(Üres?, ( )) meghatározta Sor-komponens

b) A korábbi példákat alapul véve:

  P/P-kiért(Üres?, ( )):={(( ),Def,Igaz)},

  Ennek Sor-komponense: ( ), ezért

  P/P-kiért(Sorból, ( )):={(( ),NemDef,e) : "eÎElem }.

  Így

  Ax-kiért(4’ o, ( )) º
            º Üres?((( ),Def)).L Þ Sorból((( ),Def)).hiba=NemDef º
            º Igaz Þ NemDef=NemDef º
            º Igaz

2. mintastruktúra a 4’o axiómához: (e) – egy elemű sorozat

Ax-kiért(4’ o,((e),Def)) º

a) A kiértékelés sorrendje és a művelet paramétere:

  1. Üres? – (e)
  2. Sorból – P/P-kiért(Üres?, (e)) meghatározta Sor-komponens

b) A korábbi példákat alapul véve:

  P/P-kiért(Üres?, (e)):={((e),Def,Hamis)},

  Ennek Sor-komponense: (e), ezért

  P/P-kiért(Sorból, (e)):={(( ),Def,e)}.

  Így

  Ax-kiért(4’ o,((e),Def)) º
            º Üres?(((e),Def)).L Þ Sorból(((e),Def)).hiba=NemDef º
            º Hamis Þ ((),Def)=NemDef º
            º Igaz

 

Definíció    – mintastruktúrák halmazának Ax-szerinti partícionálása

Adott egy TIP tipusosztály P/P-specTIP={S, EPP} P/P-specifikációja és az Alg-specTIP={S, Eax} algebrai specifikációja. A t1,t2ÎT0 ugyanabba T0–partícióba tartozik egy adott AxÎEax szerint, ha az Ax-kiért(Ax,t1)ºAx-kiért(Ax,t2).

Jelöljük egy tÎT0-t tartalmazó partíciót: Partíció(P/P-specTIP,Ax-specTIP,Ax,t);
és a reprezentánsok halmazát:
Reprezentáns(P/P-specTIP,Ax-specTIP,Ax), amelyre igaz, hogy "t1,t2ÎT0: t1¹t2 Ù
        Partíció(P/P-specTIP,Ax-specTIP,Ax,t1)¹Partíció(P/P-specTIP,Ax-specTIP,Ax,t2).

Így elegendő mindig csak a partíció valamely reprezentánsát vizsgálni. Értelmes általánosítása ezeknek, a minden axiómát figyelembe vevő partícionálás és reprezentánsok halmaza.

Például:

t1=(( ),Def), t2=((e),Def), t1,t2ÎT0: t1¹t2 
            (előző példák) Þ
            Ax-kiért(4’o,t1)=Ax-kiért(4’o,(( ),Def))=Igaz Ù
            Ax-kiért(4’o,t2)=Ax-kiért(4’o,((e),Def))=Igaz
 
Þ
            Partíció(P/P-specTIP,Ax-specTIP,Ax,t1)=Partíció(P/P-specTIP,Ax-specTIP,Ax,t2).

 

 

 

 

 

 

 

 

Definíció    – P/P-specifikáció kompatibilitása az Ax axiómával

Egy TIP tipusosztály P/P-specTIP={S,EPP} P/P-specifikációja kompatíbilis az Alg-specTIP={S, Eax} algebrai specifikáció egy AxÎEax axiómájával, ha "tÎReprezentáns(P/P-specTIP,Ax-specTIP,Ax) mintastruktúra esetén Ax kiértékelése igaz értékre vezet.

 

Például:

 

 

 

 

 

 

 

 

 

 

Definíció    – P/P-specifikáció kompatibilitása az algebrai specifikációval

Egy TIP tipusosztály P/P-specTIP={S,EPP} P/P-specifikációja kompatíbilis az Alg-specTIP={S, Eax} algebrai specifikációjával, ha "tÎReprezentáns(P/P-specTIP,Ax-specTIP) mintastruktúra esetén minden axióma kiértékelése igaz értékre vezet.

 

Például:

 

 

 

 

 

1. A megbízhatóság

1.1. A megbízhatóság fogalma

A megbízhatóságon két dolgot értünk: egyrészt, ha a program elfogad egy axiómát jónak, ak­kor mennyire hihetünk eben; másrészt ha hibásnak jelez egy axiómát, akkor az valóban in­kompatibilitást jelez-e?

Az első részéhez keserű tapasztalatok fűződnek. Vannak „szerencsétlen interferencia” okozta kimutatlanul maradt hibák. Lássunk ezek közül néhányat!

1.2. Rejtett hibák

A verem példánál maradva, könnyű olyan hibás P/P-szabályt találni az Üres és az ÜresE operátorhoz, amelyek menthetetlenül elfedik egymás hibáját. [Verst3H1]

a hibás operációk szabályai[3]

axióma

Prolog „lényegi” szabály[4]

ures(verem([],nemDef)).

uresE(verem(_,nemDef),_).
uresE(verem([],def),hamis).
uresE(verem([_],def),hamis).
uresE(verem([_|_],def),hamis).

1º Üres – axióma

     V=Üres Û      Üres?(V)

axioma1(V,igaz) if
  ures(V) and uresE(V,igaz).
axioma1(V,igaz) if
  not(ures(V)) and
 
not(uresE(V,igaz)).
axioma1(verem(_,nemDef),igaz).
axioma1(_,hamis).

A verem([],def) paraméterrel hívva az axioma1 szabályt, az ures(V) il­leszthetetlen volta miatt rögvest fail-lel visszalép, és a 2. alternatívára tér át. Itt a not(ures(V)) true lesz, de nem várt ok miatt: nem az ürességet, hanem a definiáltságot kifogásolja a Prolog. Továbblépve a not(uresE(V,igaz)) a hibás uresE axióma miatt lesz true. A végeredmény: az axioma1 teljesül!

A verem([],nemDef) paraméterrel aktivizálva az axioma1-et azon csúszik el a hibaér­zékelés, hogy a hibás Üres szabályon áthalad a vezérlés az ÜresE helyesen megfogalmazott implicit-error axióma miatt tényleges vizsgálódás nélkül jut túl.

Egy másik példában a Tető és a Verembe operációk interferálnak rosszul. [VerSt3H2]

a hibás operációk szabályai

axióma

Prolog „lényegi” szabály

teto(verem(V,nemDef),_,
     verem(V,nemDef)).
teto(verem([E|V],def),E,
     verem([E|V],def)).
teto(verem([],def),_,
     verem([],def)).

verembe(verem(V,nemDef),_,
        verem(V,def)).
Verembe(verem(V,def),E,
        verem([E|V],def)).

3º Tető-Verembe – axióma

        Tető(Verembe
                 (v,e))=e

 

axioma3(V,igaz)if
  verembe(V,E,W) and ! and
  teto(W,E,W).
axioma3(verem(_,nemDef),igaz).
axioma3(_,hamis).

A verem([],def) paraméterrel hívva az axioma3 szabályt, minden joggal rendben fut le. A verem([],nemDef)-re viszont a válasz hibásan lesz igenlő. Ui.: a verem­be(V,E,W) úgy tud illesztődni a hibás az implicit-error axiómához, hogy közben a Tető hasonlóan hibás axiómája együttesen is elfogadhatóvá teszi az axiómát.

 

Az „abszolút” megbízhatóság elvileg sem biztosítható. Ezt mondja ki az alábbi állítás.

 

Állítás:

Ha a típus axiómái között található alábbi (*) szerkezetű, akkor a benne szereplő operációknak van olyan átértelmezése –szemantikus módosítása–, amelyre az axió­ma változatlanul igaz marad.

(*) opk, opsÎOP,  ops:T0®TiÈ{NemDef},  opk:®T0È{NemDef},  AÎTi,
AxÎL – az axióma „maradék” része, amely nem függ az ops-től és az opk-tól
ops(opk) = A Ù Ax

Bizonyítás:

 Könnyen definiálható olyan

     ops’: T0®TiÈ{NemDef},  opk’:®T0È{NemDef},

 amelyre
ops¹ops,  opk¹opk, de  ops’(opk’) = A .

 Konstrukció:

   Az operációkat P/P-specifikációval adjuk meg. Tehát:
P/P-spec(ops):
       "tÎT0: Efops(t) Þ Ufops(ops(t),t)           ha az Efops igaz, akkor az Ufops is az
       "tÎT0: ØEfops(t) Þ ops=NemDef        ha az Efops hamis, akkor NemDef

     P/P-spec(opk):
       Ufops(ops)

   Legyenek a módosított operátorok az alábbi módon definiálva:
t’ÎT0: Efops(t’)
P/P-spec(ops’):
       ops’(t’)=A                                           átdefiniálva egy t’-re
       "tÎT0: t¹t’ Ù Efops(t) Þ Ufops’(ops’(t),t)=Ufops(ops(t),t)
       "tÎT0:ØEfops(t) Þ ops’=NemDef

     P/P-spec(opk’):
       opk’=t’                                                ez maga a módosított Ufopk’

Megjegyzem: a bizonyítás nyilvánvalóságot formalizál. Nem állítom, hogy a hibák képződé­sének „gyakorlatias” módját mintázza. Cél csak annyi volt, hogy beláttassa: rejtve maradó hi­bák létezhetnek.

 

Az állítás után mire számíthatunk a módszer használhatóságát illetően?

Szerencsére ritka az olyan abszolút szerencsétlen interferencia, amely teljesen rejtve tud ma­radni. Ezt példázza a [Verst3H1] program is, amelyben ugyan az 1o axiómában szereplő két hibás operáció el tudott rejtőzni, de a 4o axiómában egy hiba mégis felszínre került. Ez alapján már gyanú ébredhet az ÜresE operációval szemben. Azt javítva, már az 1o axióma is jelzi a „maradék” problémát. L. az 1.1. és 1.2. ábrát!

Hasonlóan tárulkozik fel az elfedődött hiba [VerSt3H2] program példájában. Kezdetben a három hiba 2 axiómában jelződik, de a 3o és a 3’o axiómában rejtve maradnak a hibás ope­rátorok. L. az 1.3. és 1.4. ábrát! A hibajelzés után a gyanús ÜresE operációról bebizonyoso­dott a helytelen specifikáció, amit javítunk. A javítás után újabb hibajelzés, újabb javítás… A dolog érdekessége az, hogy a hibák javítása közben soha sem jutottunk olyan időleges állapotba, amely során az elemzett 3o axióma hibásnak mutatkozott volna. Ez nem is probléma, hisz a lényeg, hogy amíg hiba volt, addig volt hibásnak talált axióma is.

1.1. ábra – futási eredmény
a verem-specifikációk kompatibilitás ellenőrzése strukturális indukcióval –
az Üres és az ÜresE operációk kimutatatlan hibával

 

1.2. ábra – futási eredmény
a verem-specifikációk kompatibilitás ellenőrzése strukturális indukcióval –
az Üres hibájának megszüntetése után

 

1.3. ábra – futási eredmény
a verem-specifikációk kompatibilitás ellenőrzése strukturális indukcióval –
az ÜresE, a Tető és a Verembe operációk kimutatatlan hibával

 

1.4. ábra – futási eredmény
a verem-specifikációk kompatibilitás ellenőrzése strukturális indukcióval –
az ÜresE javítása után

Megállapíthatjuk, hogy a hibák rejtve maradása ellen úgy védekezhetünk, hogy minél inkább „redundánssá” tesszük az algebrai rendszert. Ennek egy kitűnő eszköze lehet a típusosztályt jellemző állítások kimondása, formalizálása, és a Prolog programba való beillesztése.

 

Amint már korábban hangsúlyoztuk, a hibák rejtve maradásának másik oka az lehet, ha nem megfelelően választjuk meg a típusosztályt tesztelő mintastruktúrákat. Itt vezérelvként jelen­tettük ki: egy sorozattípus esetén minden közvetlenül hivatkozott elemnek legalább egy minta­struktúrában fel kell bukkannia. Más szóval, ha van opi operátor, amely a sorozat i. elemével tesz valamit (módosítja, beszúr elé/mögé, törli, vagy egyszerűen az értékét teszteli), kell legalább egy legalább i db elemet tartalmazó mintasorozat.

1.3. Hamis riasztás

A módszer lényegéből fakadóan, feltéve a P/P- és az algebrai specifikáció precíz kódolását, csak olyan axiómák esetében jelez „fölöslegesen” inkompatibilitást, ha az axióma nem fedi le a „teljes esemény rendszert”. Vagyis hiányzik olyan alternatíva, amely nem képes „elfoga­dólag nyilatkozni” valamely mintastruktúrára, s ez okozhat téves hibajelzést

2. A teljesség

Teljesség: az „intuitíve” elvárt minden elem előállítható-e az axióma rendszer leírt műveletek által? E kérdés tehát nem a módszerre vonatkozik, hanem magára az axióma renszerre. Érde­kes meggodolni azért, hogy mi módon lehetne „algoritmikusan” ellenőrizni ezt a fajta teljes­séget.

 

3. Praktikus kérdések

Néhány olyan kérdést vetek föl az alábbiakban, amelyek a módszer kidolgozása közben vetődtek föl. Alighanem hasznosak lehetnek a mindennapi használat során. Kérdések:

1.             Hogyan készítsük el a típusosztály algebrai specifikációját?

2.             Hogyan készítsük el a típusosztály P/P-specifikációját?

3.             Többletállítások a típusosztályhoz, invariáns állítások

4.             Egy bizonyítás nyomon követése a Prolog adatbázis-kezelő szolgáltatására építve

 

4. Ekvivalens formulák keresése

Az eddigi gondolatmenet egyik lényegi tulajdonsága az volt, hogy a kétféle rendszerben felállított állítások valamifajta kompatibilitását tudtuk kimutatni, feltéve, hogy megvolt. Most többre vágyunk, és az ekvivalencia reményével igyekszünk az algebraiból a P/P-rendszerbe áttérni. A [KV2001] irodalomban szereplő állítás erre jogalapot teremt.

 

Állítás:

Az algebrai specifikáció elő- és utófeltételes formára hozható.

Bizonyítás:

            A bizonyítás konstruktív, amelyre építhetünk a példánk esetében..

Konstrukció:

            …… a bizonyítás lépései …






Az eddigi kifogásunk a fenti átírással szemben az volt, hogy a P/P-specifikációban olyan hi­vatkozásokat tartalmaz (más operációkra), amelyek nem kívánatosak ilyen rendszerben. Ezen úgy segíthetünk, hogy a sorozat-nyelv [SzPG2002, PSzZs1998, SzP1999] elemeit fölhasz­nál­juk, s mintegy a kapott formulák még nem kívánatos részleteinek megfeleltetjük a sorozat-nyelvbeli analogonját.

Figyeljük meg a verem esetén az áttérést! Időnként az axiómát kettébontjuk, s majd egyesítjük a specifikációdarabokat.

f0 = Üres. I(v)= 0£Hossz(v)[5]

Algebrai axióma

P/P-specifikáció1

P/P-specifikáció2

Üres:
Ef: –
Uf: 0£Hossz(v) Ù v=Üres


Ef: –

Uf: 0£Hossz(v) Ù v=()

Üres=v Û Üres?(v)

 

 

Üres=v Þ Üres?(v)

Üres?(v):
Ef: Üres=v
Uf: Üres?(v)


Ef: v=()
Uf: Üres?(v)

Üres¹v Þ ØÜres?(v)

Üres?(v):
Ef: Üres¹v
Uf: ØÜres?(v)


Ef: v¹()
Uf: ØÜres?(v)

 

Üres?(v):
Ef: Üres¹v
Uf: Üres=v Þ Üres?(v)
       Üres¹v Þ ØÜres?(v)


Ef: –
Uf: ()=v Þ Üres?(v)
       ()¹v Þ ØÜres?(v)

Az axiómát két részre vágtuk, majd a egyesítettük az átírás eredményeit.

Ø Üres?(Verembe(v,e))

Verembe(v,e):
Ef: 0£Hossz(Verembe(v,e))
Uf: 0£Hossz(w) Ù
     w=Verembe(v,e)

Verembe(v,e):
Ef: 0£Hossz(v&(e))
Uf: 0£Hossz(w) Ù
     w=Verembe(v,e)

Látható nehézség: a Verembe konstrukciós művelet szempontjából nem veszi számításba az axióma tényleges mondanivalóját. Ha az Üres? szelekciós művelet szempontjából tekinte­nénk, akkor semmivel több információhoz nem jutnánk, mint amennyihez a korábbi axióma átírásával jutottunk.

Tető(Verembe(v,e))=e

Tető(v):
Ef: w=Verembe(v,e)
Uf: Tető(w)=e


Ef: –
Uf: Tető(v&(e))=e

A sorozatnyelvre áttérés valójában két lépésben történt. Az első:

Ef: w=v&(e)
Uf: Tető(w)=e

Majd a w kiküszöbölésével kapjuk a végső átírtat.

 

Irodalom

[KV2001]

Kozma L. – Varga L.: „Adattípusok osztálya.”, ELTE TTK Informatikai TanszékCsoport, 2001

[SzPG2002]

Szlávi P. – Pap Gné: „Adatszerkezet – Típusok”, Informatika a felsőoktatásban’99 konferen­cia, Debrecen, 2002

[PSzZs1998]

Pap Gné – Szlávi P. – Zsakó L.: „Módszeres programozás – Adattípusok”, ELTE TTK In­formatikai TanszékCsoport, 1998

[SzP1999]

Szlávi P.: „Programok, programspecifikációk.”, Informatika a felsőoktatásban’99 konferencia, Debrecen, 1999

 

Programhivatkozások

[VerSt3H1]

Szlávi P.: „A verem specifikációinak kompatibilitását ellenőrző Prolog program – strukturális indukció alapján; hibás Tető és Verembe operáció esetén.”,. http://izzo.inf.elte.hu/szlavi/Doktori/TipSpecKomp/VERST3H2.PRO

[VerSt3H2]

Szlávi P.: „A verem specifikációinak kompatibilitását ellenőrző Prolog program – strukturális indukció alapján; hibás Tető és Verembe operáció esetén.”,. http://izzo.inf.elte.hu/szlavi/Doktori/TipSpecKomp/VERST3H2.PRO

 

Függelék



[1] Szokás az irodalomban ezt P/P-specifikációnak is nevezni, mivel az pre- és postcondition, vagyis az elő- és az utófeltétel megadását jelenti.

[2] A definiáltságot valójában logikaiként kezeljük, ugyanis értelmezés nélkül alkalmazzuk rá pl. a negáció műveletét. A könnyebb követhetőség miatt neveztük át konstansait Def-re , illetve NemDef-re Hamis, illetve Igaz értelemben.

[3] Kiemeltük a hibás paramétereket.

[4] Csak a „logikát” kódoltuk. Nem bonyolítottuk a vágással és a miatt szükséges al-szabályokra bontással; továb­bá a paramétergeneráláshoz szükséges sorozatok részformula beillesztésével.

[5] A felülről korlátosságot csak bizonyos (folytonos) ábrázolás esetén kell elvárni.