Az axiómákban, ill. a unitban szereplő fogalmak (azonosítók) némileg különböznek, ezért megadom az egymáshoz rendelésüket:
Axiómában | Unitban |
---|---|
Üres | UresLista |
Üres? | UresE |
ElemÉrték | Elem |
ElemMódosít | ElemModosit |
Elsőre | Elejere |
Utolsóra | Vegere |
Következőre | Kovre |
Előzőre | Elozore |
Első? | ElsoE |
Utolsó? | UtolsoE |
BeszúrMögé | Beilleszt |
BeszúrElejére | – |
Kihagy | Listabol |
BeszúrElé | BeillesztEle |
ElemSzám | Hossz |
NemDef? | HibasE |
A tesztelő program „filozófiája”:
Function Axioma_x:Boolean;//az x. axióma //... az axióma rövid, formális leírása ... Var l:TLista;//a szükséges lista(k) e:TElem;//a szükséges elem(ek) h:Integer;//a szükséges hossz(ak) Begin ... a tesztelés ... Axioma_x:=... a tesztelés eredménye ...; End;
Az 1. axióma (l=Üres → Üres?(l)) tesztelésére az alábbi függvény alkalmas lehet:
Function Axioma_1:Boolean;//implikáció
//l=Üres -> Üres?(l)
Var
l:TLista;
Begin
l:=UresLista;//garantáljuk az implikáció bal oldalának a teljesülését:
//létrehozunk l-ben egy üres listát
Axioma_1:=UresE(l) and (l.hiba=False);//előállítjuk a jobb oldal logikai értékét
//(és ez lesz a függvény értéke, hiszen
//IMPLIKÁCIÓról van szó!)
End;
Procedure Ellenorzes(Const ax:Integer {az axióma azonosításához kell}; Const l:Boolean {az axióma teljesülésének logikai értéke}); Const //hogy magyarul jelenjen meg a logikai érték: Igaz_Hamis:Array [Boolean] of String=('Hamis','Igaz'); Begin Writeln('A(z) ',ax,'. axióma teljesül? = ',Igaz_Hamis[l]); End;Az első paramétere az axióma sorszáma, a második az axióma teljesülésének igazságtartalma.
Begin UjLap(cim); Ellenorzes(1,Axioma_1); Ellenorzes(2,Axioma_2); Ellenorzes(3,Axioma_3); Ellenorzes(5,Axioma_5); //... BillreVar; End.
A 2. axióma (Üres?(l) ↔ Hossz(l)=0) esetében az ekvivalencia miatt két dolog teljesülését ellenőrizük:
A) Üres?(l) → (Hossz(l)=0) és
B) ¬Üres?(l) → (Hossz(l)≠0)
Az A) a korábbi fenti példához hasonlóan megoldható.
A B)-hez viszont elő kell állítani a lista egy nem 0 elemű állapotát.
Ezt az állapotot a listába elemet betevő műveletekkel érjük el. (Mégpedig mindkét „filozófiájával”. Vitatható?!?)
Function Axioma_2:Boolean;//Ekvivalencia //Üres?(l) <-> ElemSzám(l)=0 Var l:TLista; bA,bB:Boolean;//a fenti A) és B) eset logikai értéke Begin //bA := ( üres-lista -> 0 eleme van ): l:=UresLista; bA:=UresE(l) and (Hossz(l)=0) and not HibasE(l); //bB := ( nem üres-lista -> 0< eleme van ): ///a nem üres listát a Beilleszt-tel létrehozva: l:=UresLista; Beilleszt(l,'1'); bB:=not UresE(l) and (Hossz(l)>0) and not HibasE(l); ///a nem üres listát a BeillesztEle-vel létrehozva: l:=UresLista; BeillesztEle(l,'1'); bB:=bB and not UresE(l) and (Hossz(l)>0); Axioma_2:=bA and bB; End;
A 2. axióma (Üres?(l) ↔ Hossz(l)=0) esetében az ekvivalencia miatt két dolog teljesülését kell ellenőrizni:
A) Üres?(l) = (Hossz(l)=0) és
B) ¬Üres?(l) = (Hossz(l)≠0)
Az A) a korábbi fenti példához hasonlóan megoldható.
A B)-hez viszont elő kell állítani a lista egy nem 0 elemű állapotát.
Ezt az állapotot azonban nem lehet a listába elemet betevő műveletekkel elérni, mert azok esetleg hibásak,
és így az axióma igazságtartalma nem a benne előfordulók miatt lesz hamis.
Ekkor a kívánt nem „üres” állapotot „direkt” módon érjük el,
pl. ahogy feljebb a fals elem bevezetésével tettük.
Fontos, hogy a „direkt” módon kapott kód egyszerű, garantáltan hibamantes legyen!
Hiszen csak hibátlan tesztelő programmal mutathatunk ki valódi hibákat.
Function Axioma_2:Boolean;//Ekvivalencia
//Üres?(l) <-> ElemSzám(l)=0
Var
l1,l2:TLista;
Begin
//az A)-hoz:
l1:=UresLista;
//a B)-hez:
l2.fej:=... valami nem Nil érték ...; //pl. falsElem
l2.akt:=l2.fej;
l2.db:=1;
l2.hiba:=False;
Axioma_2:=UresE(l1)=(Hossz(l1)=0) and (l1.hiba=False) {A)-hoz} and
(not UresE(l2))=(Hossz(l2)<>0) and (l2.hiba=False) {B)-hez};
End;
Persze világos, hogy így is jó (és egyszerűbb):
... Axioma_2:=... and UresE(l2)=(Hossz(l2)=0) {B)-hez};//miért nem kell az //'and (l2.hiba=False)'?
Kiindulópontként ajánlom: Lista_Teszt_Unitok.zip. Tartalma:
Fájl | Megjegyzés |
---|---|
Lista_Str_u.pas | a jó unit |
Lista_Str_u_H1.pas | az 1. axióma elrontva |
Lista_Str_u_H3.pas | a 3. axióma elrontva |
Lista_Str_u_H5.pas | az 5. axióma elrontva |
A unitok első sorában található sorszámok megadják, hogy mely sorok lettek elrontva.
Világos, hogy a fenti „módszer” nem nyújt abszolút biztonságot a hibák kimutatása terén.
Annyit jelenthetünk csak ki –hibátlan tesztelő program esetén–, hogy amelyik axióma hibásnak mutatkozik,
az abban szereplő műveletek legalább egyike hibás.
Gondolkodjon el azon, hogy preparálható-e olyan hibás kódú Lista unit, amelyben egyes hibák az Ön által elkészített tesztelő program számára kimutatlanok maradnak? Mutasson ilyeneket, ha van!
Készítsen a fenti elveken alapuló tesztelő programot egy saját, típus-konstrukciót megvalósító Pascal unithoz!
Akár választhatja a vermet vagy a sort is. Nem ragaszkodom a láncolt ábrázoláshoz sem.
Az axiómáit megtalálja itt:
verem,
sor.