PROGRAM MINIDFA(INPUT,OUTPUT); CONST MAXZ=20; (*MAX. ANZAHL ZUSTAENDE *) MAXE=10; (*MAX. ANZAHL EINGABESYMBOLE *) TYPE ZUSTANDSINDEX=1..MAXZ; KLASSENINDEX =1..MAXZ; EINGABEINDEX =1..MAXE; ZUSTANDSREF =^ZLISTE; (*LISTE ALLER ZUS- *) ZLISTE =RECORD (*STAENDE EINER KLASSE*) Z:ZUSTANDSINDEX; NEXT:ZUSTANDSREF END; VAR EINGABE:ARRAY [EINGABEINDEX] OF CHAR; ZUSTAND:ARRAY [ZUSTANDSINDEX] OF RECORD ERKANNT:BOOLEAN; KLASSE :KLASSENINDEX; (*ZEIGER AUF DEN*) END; (*KLASSENEINTRAG*) KLASSE :ARRAY[KLASSENINDEX] OF ZUSTANDSREF; D :ARRAY[ZUSTANDSINDEX,EINGABEINDEX] OF ZUSTANDSINDEX; (*UEBERGANGSFKT.*) T :ARRAY[ZUSTANDSINDEX,EINGABEINDEX] OF KLASSENINDEX; (*WIE D NUR FUER*) (*DIE KLASSEN *) ANZZUSTAENDE:ZUSTANDSINDEX; ANZKLASSEN :KLASSENINDEX; ANZEINGABEN :EINGABEINDEX; I :KLASSENINDEX; Z :ZUSTANDSINDEX; E :EINGABEINDEX; FERTIG :BOOLEAN; (*$"MINIDFA1.INC"*) PROCEDURE VERFEINERE(VAR KEINEAENDERUNG:BOOLEAN); (*BILDE VERFEINERUNG DER LFD. AEQUIVALENZKLASSEN *) (*KEINEAENDERUNG:=TRUE, FALLS KEINE NEUE KLASSE ANGELGT *) (*NEUE EINTRAEGE AM ENDE DER KLASSENTABELLE ANGEHAENGT *) VAR K,K1,BELEGTINDEX,NEUKINDEX:KLASSENINDEX; ALTEKLASSE:ZUSTANDSREF; (*LISTE DER ELEMENTE *) Q,LFD:ZUSTANDSINDEX; FOUND:BOOLEAN; BEGIN BELEGTINDEX:=ANZKLASSEN; FOR K:=1 TO ANZKLASSEN DO (*FUER ALLE KLASSEN*) BEGIN NEUKINDEX:=BELEGTINDEX+1; ALTEKLASSE:=KLASSE[K]^.NEXT; (*NUR 1. ELEMENT BLEIBT IN KLASSE K*) KLASSE[K]^.NEXT:=NIL;LFD:=KLASSE[K]^.Z; WHILE ALTEKLASSE<>NIL DO BEGIN Q:=ALTEKLASSE^.Z; (*PRUEFE, OB Q IN LFD. KLASSE:*) IF T[Q]=T[LFD] THEN ERWEITERE(K,Q) ELSE BEGIN (*EXISTIERT SOLCHE KLASSE ? *) K1:=NEUKINDEX;FOUND:=FALSE; WHILE(K1<=BELEGTINDEX)AND NOT FOUND DO IF T[Q]=T[KLASSE[K1]^.Z] THEN BEGIN FOUND:=TRUE;ERWEITERE(K1,Q) END ELSE K1:=K1+1; IF NOT FOUND THEN (*NEIN: NEUE KLASSE ANLEGEN *) BEGIN WRITELN("NEUE KLASSE":K1); BELEGTINDEX:=BELEGTINDEX+1; ERWEITERE(BELEGTINDEX,Q) END; END; ALTEKLASSE:=ALTEKLASSE^.NEXT END; END; KEINEAENDERUNG:=ANZKLASSEN=BELEGTINDEX; ANZKLASSEN:=BELEGTINDEX; END;(*VERFEINERE*) BEGIN (*LOESCHE ALLE TABELLEN*) FOR I:=1 TO MAXZ DO KLASSE[I]:=NIL; FOR Z:=1 TO MAXZ DO FOR E:=1 TO MAXE DO T[Z,E]:=0; DEFINIERE; WRITELN(ANZZUSTAENDE," ZUSTAENDE"); WRITELN(ANZEINGABEN ," EINGABSYMBOLE"); TILDE0; REPEAT FOR I:=1 TO ANZKLASSEN DO DRUCKEKLASSE(I); BILDETABELLE; VERFEINERE(FERTIG); UNTIL FERTIG; END.