summaryrefslogtreecommitdiff
path: root/app/baisy/2.2.1-schulis/src/isp.systembaumbearbeitung
blob: 8b2f18977ebeae55a953fe144fba194fa2a73337 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
PACKET systembaumbearbeitungneuDEFINES loescheteilbaeume,
teilbaeumeaussystembaum,uebersetze:LET dp=":",refinementende=".";LET grenze=6
;LET fehldat="Übersetzungsfehler:";FILE VAR quelle;KNOTENMENGE VAR ang,nach;
TEXT VAR newsymbol:="";INT VAR newkind;TEXT VAR aktzeile:="";INT VAR 
zeilenindex;ROW grenzeTEXT VAR at;FILE VAR f;INT CONST maxat:=6,tepos:=1,mpos
:=2,vpos:=3,npos:=4,tpos:=5,ppos:=6;LET normkz="0",refkz="1";LET scanende=7,
scanbold=2,scantext=4,scandel=6,scannumber=3,scanid=1;TEXT PROC attribute(
KNOTEN CONST k):TEXT VAR attr;read(k,attr);attrEND PROC attribute;BOOL PROC 
isrefinement(KNOTEN CONST k):(subtext(attribute(k),1,1)=refkz)END PROC 
isrefinement;BOOL PROC isnormal(KNOTEN CONST k):(subtext(attribute(k),1,1)=
normkz)END PROC isnormal;BOOL PROC isopen(KNOTEN CONST k):NOT (isrefinement(k
)COR isnormal(k))END PROC isopen;PROC mengedernachfolger(KNOTEN CONST k,
KNOTENMENGE VAR m):read(k,m)END PROC mengedernachfolger;PROC 
neuenachfolgermenge(KNOTEN CONST k,KNOTENMENGE CONST m):write(k,m)END PROC 
neuenachfolgermenge;PROC loescheteilbaeume(TEXT CONST datnam,BOOL VAR 
gefunden):bearbeiteteilbaeume(datnam,PROC (TEXT CONST ,BOOL VAR )loesche,
gefunden)END PROC loescheteilbaeume;PROC teilbaeumeaussystembaum(TEXT CONST 
datnam,BOOL VAR gefunden):bearbeiteteilbaeume(datnam,PROC (TEXT CONST ,BOOL 
VAR )retranslate,gefunden)END PROC teilbaeumeaussystembaum;PROC 
bearbeiteteilbaeume(TEXT CONST datnam,PROC (TEXT CONST ,BOOL VAR )behandle,
BOOL VAR gefunden):ersterteilbaum;WHILE weitereteilbaeumeREP behandleteilbaum
;naechsterteilbaumPER .behandleteilbaum:behandle(teilbaumname,gefunden);IF 
NOT gefundenTHEN line(f,2);putline(f,"(* Teilbaum "+teilbaumname+
" existiert nicht *)");FI ;nextsymbol(newsymbol,typ).ersterteilbaum:f:=
sequentialfile(input,datnam);TEXT VAR liste;getline(f,liste);forget(datnam,
quiet);f:=sequentialfile(output,datnam);scan(liste);naechsterteilbaum.
naechsterteilbaum:TEXT VAR teilbaumname;INT VAR typ;nextsymbol(teilbaumname,
typ).weitereteilbaeume:typ<>scanende.END PROC bearbeiteteilbaeume;PROC 
loesche(TEXT CONST teilbaumname,BOOL VAR gefunden):sucheteilbaum;IF gefunden
THEN loeschediesenFI .sucheteilbaum:KNOTEN VAR teilbaumref;gefunden:=
existiert(exporte,teilbaumref,teilbaumname).loeschediesen:#loescheunterbaum(
teilbaumref);KNOTENMENGE VAR g;mengedernachfolger(teilbaumref,g);KNOTEN VAR r
:=erster(g);IF gueltig(r)THEN knotenloeschen(g,r)FI ;knotenloeschen(exporte,
teilbaumref)#KNOTENMENGE VAR g;mengedernachfolger(teilbaumref,g);KNOTEN VAR r
:=erster(g);loescheunterbaum(teilbaumref);IF gueltig(r)THEN knotenloeschen(g,
r)FI ;knotenloeschen(exporte,teilbaumref).END PROC loesche;PROC retranslate(
TEXT CONST teilbaumname,BOOL VAR gefunden):sucheteilbaum;IF gefundenTHEN 
schreibeteilbaumname;durchlaufeteilbaum;schreibeteilbaumendeFI .sucheteilbaum
:KNOTEN VAR teilbaumref;gefunden:=existiert(exporte,teilbaumref,teilbaumname)
.schreibeteilbaumname:putline(f,attribute(teilbaumref)+dp).
schreibeteilbaumende:putline(f,refinementende).durchlaufeteilbaum:
KNOTENMENGE VAR g;mengedernachfolger(teilbaumref,g);ausbaum(erster(g),1).END 
PROC retranslate;PROC ausbaum(KNOTEN CONST k,INT CONST stufe):stufennummer;
IF istnochnichtdefiniertTHEN refinementnameschreiben;
nochnichtdefiniertschreibenELIF istrefinementTHEN 
refinementsuchenundschreibenELSE notierediesen;durchlaufeallesoehneFI .
istrefinement:(isrefinement(k))CAND (stufe>1).istnochnichtdefiniert:isopen(k)
.notierediesen:elemente(k,vorschub,zeile).stufennummer:TEXT VAR vorschub:=
stufe*" ";TEXT VAR zeile:=vorschub+text(stufe);vorschub:=vorschub+"  ".
refinementnameschreiben:KNOTEN VAR knoten:=k;refinementname.refinementname:
put(f,zeile+" "+attribute(knoten));line(f).nochnichtdefiniertschreiben:put(f,
vorschub+"  (* ist noch nicht definiert *)");line(f).
refinementsuchenundschreiben:read(k,knoten);refinementname.
durchlaufeallesoehne:KNOTENMENGE VAR soehne;mengedernachfolger(k,soehne);
KNOTEN VAR sohn:=erster(soehne);WHILE gueltig(sohn)REP ausbaum(sohn,stufe+1);
naechster(sohn,soehne)PER .END PROC ausbaum;PROC elemente(KNOTEN CONST k,
TEXT CONST vorschub,TEXT CONST zeil):TEXT VAR at,zeile:=zeil;tex;mask;vorproz
;nachproz;tast;prozess;absatz.tex:zeile:=zeile+" TEXT """+text(k)+"""";put(f,
zeile).mask:at:=maske(k);IF at<>""THEN put(f,";");line(f);zeile:=vorschub+
"MASKE """+at+"""";put(f,zeile)FI .prozess:at:=task(k);IF at<>""THEN put(f,
";");line(f);zeile:=vorschub+"TASK """+at+"""";put(f,zeile)FI .vorproz:at:=
vorprozedur(k);IF at<>""THEN put(f,";");line(f);zeile:=vorschub+"> "+at;put(f
,zeile)FI .nachproz:at:=nachprozedur(k);IF at<>""THEN put(f,";");line(f);
zeile:=vorschub+"< "+at;put(f,zeile)FI .tast:at:=taste(k);IF at<>""THEN put(f
,";");line(f);zeile:=vorschub+"TASTE """+at+"""";put(f,zeile)FI .absatz:line(
f).END PROC elemente;TEXT PROC maske(KNOTEN CONST k):attribut(k,mpos)END 
PROC maske;TEXT PROC task(KNOTEN CONST k):attribut(k,ppos)END PROC task;TEXT 
PROC vorprozedur(KNOTEN CONST k):attribut(k,vpos)END PROC vorprozedur;TEXT 
PROC nachprozedur(KNOTEN CONST k):attribut(k,npos)END PROC nachprozedur;TEXT 
PROC taste(KNOTEN CONST k):attribut(k,tpos)END PROC taste;TEXT PROC attribut(
KNOTEN CONST k,INT CONST i):TEXT VAR attext;attext:=attribute(k);TEXT VAR 
amuster:="��",emuster:="��";replace(amuster,1,i);replace(emuster,1,i+1);INT 
VAR ende,anfang;anfang:=pos(attext,amuster)+2;IF i<maxatTHEN ende:=pos(attext
,emuster,anfang)-1;subtext(attext,anfang,ende)ELSE subtext(attext,anfang)FI 
END PROC attribut;TEXT PROC text(KNOTEN CONST k):attribut(k,tepos)END PROC 
text;OP HAT (KNOTEN CONST k,TEXT CONST t):write(k,t)END OP HAT ;OP NACH (
KNOTEN CONST sohn,vater):KNOTENMENGE VAR m;mengedernachfolger(vater,m);
inknotenmenge(m,sohn);write(vater,m);END OP NACH ;OP BEZUG (KNOTEN CONST sohn
,KNOTEN CONST vater):write(sohn,vater);END OP BEZUG ;BOOL PROC schluss:
dateiendeCOR is(refinementende)END PROC schluss;BOOL PROC dateiende:(newkind=
scanende)CAND eof(quelle)END PROC dateiende;BOOL PROC isrand:(schlussCOR 
isnumber)END PROC isrand;BOOL PROC is(TEXT CONST t):(t=newsymbol)END PROC is;
BOOL PROC isbold:(newkind=scanbold)END PROC isbold;BOOL PROC iskeybold:(is(
"TEXT")OR is(">")OR is("<")OR is("MASKE")OR is("TASTE")OR is("TASK"))END 
PROC iskeybold;BOOL PROC istext:(newkind=scantext)END PROC istext;BOOL PROC 
isdelimiter:(newkind=scandel)END PROC isdelimiter;BOOL PROC isprocedure(TEXT 
VAR t):IF NOT isidTHEN FALSE ELSE t:=newsymbol;next;IF is("(")THEN INT VAR 
klammernzaehler:=0;REP IF is("(")THEN klammernzaehlerINCR 1ELIF is(")")THEN 
klammernzaehlerDECR 1FI ;IF istextTHEN t:=t+""""+newsymbol+""""ELSE t:=t+
newsymbolFI ;nextUNTIL (klammernzaehler=0)PER FI ;is(";")COR israndFI END 
PROC isprocedure;BOOL PROC isnumber:(newkind=scannumber)END PROC isnumber;
BOOL PROC isid:(newkind=scanid)END PROC isid;PROC next:nextsymbol(newsymbol,
newkind);WHILE (newkind=scanende)CAND (NOT eof(quelle))REP getline(quelle,
aktzeile);continuescan(aktzeile);aktuellezeile;nextsymbol(newsymbol,newkind);
PER ;END PROC next;PROC lies(TEXT CONST t):IF NOT (t=newsymbol)THEN fehler(t)
ELSE nextFI END PROC lies;PROC fehler(TEXT CONST f):FILE VAR fd:=
sequentialfile(output,fehldat);TEXT VAR t:="Fehler bei : """;t:=t+newsymbol+
""" in Zeile "+text(zeilenindex)+" , ";line(fd,5);putline(fd,t);t:=
"denn erwartet wurde: """;t:=t+f;t:=t+"""   ";putline(fd,t);close(fd);stop
END PROC fehler;PROC initparser:initscanner;END PROC initparser;PROC 
initscanner:getline(quelle,aktzeile);scan(aktzeile);page;cursor(1,3);put(
"Bearbeitet wird zur Zeit Zeile: ");zeilenindex:=1;aktuellezeile;END PROC 
initscanner;PROC aktuellezeile:cursor(33,3);put(zeilenindex);zeilenindexINCR 
1;END PROC aktuellezeile;PROC systembaum:enablestop;initparser;
initialisieretemporaeregruppen;next;REP benannterteilbaum;nextUNTIL dateiende
PER ;meldesyntaxkorrekt;uebernehmeindenbestand.initialisieretemporaeregruppen
:ang:=leereknotenmenge;nach:=leereknotenmenge.meldesyntaxkorrekt:line(5);put(
"   *  *  *   E i n g a b e   i s t   k o r r e k t   *  *  * ");line(5);put(
" *  *  *   Ü b e r n a h m e   i n   M e n ü b a u m  *  *  * ").END PROC 
systembaum;PROC benannterteilbaum:IF NOT isidTHEN fehler("Teilbaumname")FI ;
erzeugeangebotsundsystemknotenaunds;next;baum(s);sistnachfolgervona;
aistbezugsknotenvons.erzeugeangebotsundsystemknotenaunds:KNOTEN VAR a:=
neuerknoten(ang);aHAT newsymbol;KNOTEN VAR s:=neuerknoten(system).
sistnachfolgervona:sNACH a.aistbezugsknotenvons:sBEZUG a.END PROC 
benannterteilbaum;PROC baum(KNOTEN VAR node):INT VAR i0;lies(":");IF NOT 
isnumberTHEN fehler("Stufennummer")FI ;i0:=int(newsymbol);next;
knotenattribute(node);zeigerefinementan;unterbaum(i0,node).zeigerefinementan:
TEXT VAR t:=attribute(node);replace(t,1,"1");nodeHAT t.END PROC baum;PROC 
unterbaum(INT CONST j,KNOTEN VAR node):INT CONST k:=int(newsymbol);IF NOT 
isnumberTHEN IF NOT schlussTHEN fehler("Stufennummer oder Ende")ELSE LEAVE 
unterbaumFI FI ;IF j>=kTHEN LEAVE unterbaumFI ;next;erzeugeneuensohns;
dieseristinsystemnachfolgervonnode;sohn(k,s,node);soehne(k,node).
erzeugeneuensohns:KNOTEN VAR s:=neuerknoten(system).
dieseristinsystemnachfolgervonnode:sNACH node.END PROC unterbaum;PROC soehne(
INT CONST j,KNOTEN VAR node):INT CONST k:=int(newsymbol);IF NOT isnumberTHEN 
IF NOT schlussTHEN fehler("Stufennummer oder Ende")ELSE LEAVE soehneFI FI ;
IF j>kTHEN LEAVE soehneFI ;IF NOT (j=k)THEN fehler("gleiche Stufennummer")FI 
;next;erzeugeneuensohns;dieseristinsystemnachfolgervonnode;sohn(j,s,node);
soehne(j,node).erzeugeneuensohns:KNOTEN VAR s:=neuerknoten(system).
dieseristinsystemnachfolgervonnode:sNACH node.END PROC soehne;PROC sohn(INT 
CONST k,KNOTEN VAR node,vater):IF iskeyboldTHEN knotenattribute(node);
unterbaum(k,node)ELSE IF NOT isidTHEN fehler(
"ein Teilbaumname oder Schlüsselwort")ELSE erzeugeneuenachfrageninnach;
setzevateralsnachfolgervonn;next;FI FI .erzeugeneuenachfrageninnach:KNOTEN 
VAR n:=neuerknoten(nach,newsymbol).setzevateralsnachfolgervonn:IF sohnvon(n,
vater)THEN fehler(newsymbol+" nur einmal als Sohn auf Level "+text(k))FI ;
vaterNACH n;nodeHAT newsymbol.END PROC sohn;PROC knotenattribute(KNOTEN VAR 
node):initialisierehilfsvariablen;TEXT VAR t;attribut;WHILE iskeyboldREP 
attributPER ;IF ((NOT isnumber)CAND (NOT schluss))THEN fehler(
"Attribut oder Stufennummer")ELSE abschliessendebehandlungFI .
initialisierehilfsvariablen:INT VAR i:=0;t:="0";FOR iFROM 1UPTO maxatREP at(i
):=""PER .abschliessendebehandlung:merke(t);nodeHAT t.END PROC 
knotenattribute;PROC attribut:TEXT VAR procname;IF is("TEXT")THEN next;IF 
NOT istextTHEN fehler("ein Menuetext")FI ;setze(newsymbol,tepos);next;IF NOT 
israndTHEN lies(";")FI ELSE IF is(">")THEN next;IF NOT isprocedure(procname)
THEN fehler("ein Vor-Prozedur-Aufruf")FI ;setze(procname,vpos);IF NOT isrand
THEN nextFI ELSE IF is("<")THEN next;IF NOT isprocedure(procname)THEN fehler(
"ein Nach-Prozedur-Aufruf")FI ;setze(procname,npos);IF NOT israndTHEN nextFI 
ELSE IF is("MASKE")THEN next;IF NOT istextTHEN fehler("ein Maskenname")FI ;
setze(newsymbol,mpos);next;IF NOT israndTHEN lies(";")FI ELSE IF is("TASTE")
THEN next;IF NOT istextTHEN fehler("ein Funktionstastenname")FI ;setze(
newsymbol,tpos);next;IF NOT israndTHEN lies(";")FI ELSE IF is("TASK")THEN 
next;IF NOT istextTHEN fehler("ein Taskname")FI ;setze(newsymbol,ppos);next;
IF NOT israndTHEN lies(";")FI ELSE fehler("ein Schlüsselwort")FI FI FI FI FI 
FI END PROC attribut;PROC setze(TEXT CONST t,INT CONST i):at(i):=tEND PROC 
setze;PROC merke(TEXT VAR t):INT VAR i;TEXT VAR muster:="��";FOR iFROM 1UPTO 
maxatREP replace(muster,1,i);tCAT muster;tCAT at(i)PER END PROC merke;PROC 
uebersetze(TEXT CONST t,BOOL VAR fehler):quelle:=sequentialfile(input,t);INT 
CONST azahl:=zahlderelemente(exporte),szahl:=zahlderelemente(system),nzahl:=
zahlderelemente(importe);clearerror;disablestop;kopieresystembaum;systembaum;
IF iserrorTHEN fehler:=TRUE ;setzesystembaumzurueck;LEAVE uebersetzeFI ;
fehler:=FALSE ;line(3);put(
" *  *  *   Ü b e r n a h m e   i s t   b e e n d e t  *  *  * ");line(2);
statistik(azahl,szahl,nzahl);line(2);put(
" *  *  *   D a t e n b a n k b e r e i n i g u n g   *  *  *  ");loesche;
ueberschreibesystembaumEND PROC uebersetze;PROC statistik(INT CONST az,sz,nz)
:INT CONST agesz:=zahlderelemente(exporte),sgesz:=zahlderelemente(system),
ngesz:=zahlderelemente(importe);put("Zahl der Systembaumknoten insgesamt: ");
put(sgesz);INT CONST sdif:=sgesz-sz,ndif:=ngesz-nz;line;IF sdif<0THEN put(
"Entfernte Systemknoten: "+text(-sdif));ELSE put(
"Neu erzeugte Systemknoten: "+text(sdif));FI ;line;put(
"Neu definierte Teilbäume: "+text(agesz-az));line;IF ndif<0THEN put(
"Abgedeckte Teilbaumreferenzen: "+text(-ndif))ELSE put(
"Zusätzliche offene Teilbaumreferenzen: "+text(ndif))FI END PROC statistik;
PROC loesche:knotenmengeloeschen(ang);knotenmengeloeschen(nach)END PROC 
loesche;OP VEREINIGT (KNOTENMENGE VAR a,KNOTENMENGE CONST b):KNOTEN VAR k:=
erster(b);WHILE gueltig(k)REP a+k;naechster(k,b)PER ;END OP VEREINIGT ;OP +(
KNOTENMENGE VAR a,KNOTEN CONST b):inknotenmenge(a,b);END OP +;PROC 
uebernehmeindenbestand:startepruefungmitneu;WHILE gueltig(neu)REP 
pruefenderexporte;IF schondaTHEN aenderungELSE neuanlegenFI PER ;
abgleichenvonexportenundimporten.startepruefungmitneu:KNOTEN VAR neu:=erster(
ang);KNOTEN VAR alt;BOOL VAR gleich.pruefenderexporte:gleich:=existiert(
exporte,alt,attribute(neu)).schonda:gleich.aenderung:
loeschealleknotendesaltenrefinements;neuanlegenbisaufdenursprung.
loeschealleknotendesaltenrefinements:rettebisherigenursprung;
gehevomursprungausundloescheallesausserrefinements.rettebisherigenursprung:
KNOTENMENGE VAR u;mengedernachfolger(alt,u);KNOTEN VAR ursprung:=erster(u).
gehevomursprungausundloescheallesausserrefinements:loescheunterbaum(ursprung)
.neuanlegenbisaufdenursprung:raufnachfolgervonneusetzen;
derursprungwirdueberschrieben.raufnachfolgervonneusetzen:KNOTENMENGE VAR root
;KNOTEN VAR r;mengedernachfolger(neu,root);r:=erster(root).
derursprungwirdueberschrieben:move(r,ursprung);knotenloeschen(root,r);
knotenloeschen(ang,neu).neuanlegen:inknotenmenge(exporte,neu,alt);
ausknotenmenge(ang,neu).abgleichenvonexportenundimporten:KNOTENMENGE VAR 
abzudeckendenachfragen;KNOTENMENGE VAR nachfragesoehne;BOOL VAR gibtes;TEXT 
VAR importname;KNOTEN VAR importeinordner,importbezug;festimport:=erster(
importe);WHILE gueltig(festimport)REP importname:=attribute(festimport);
abgleichmitimporten;abgleichabschlussPER ;KNOTEN VAR aktimport:=erster(nach);
WHILE gueltig(aktimport)REP importname:=attribute(aktimport);
versucheabgleichmitexporten;IF gelungenTHEN importbezug:=aktimport;
fuehreabgleichmitexportendurch;knotenloeschen(nach,aktimport)ELSE gibtes:=
existiert(importe,importeinordner,importname);inknotenmenge(importe,aktimport
,importeinordner);ausknotenmenge(nach,aktimport)FI ;PER .abgleichabschluss:
versucheabgleichmitexporten;IF gelungenTHEN importbezug:=festimport;
fuehreabgleichmitexportendurch;knotenloeschen(importe,festimport)ELSE 
naechster(festimport,importe)FI .versucheabgleichmitexporten:KNOTEN VAR 
aktexport;BOOL VAR gelungen;gelungen:=existiert(exporte,aktexport,importname)
.abgleichmitimporten:KNOTEN VAR festimport;gelungen:=existiert(nach,aktimport
,importname);IF gelungenTHEN verschmelzung;knotenloeschen(nach,aktimport)FI .
verschmelzung:KNOTENMENGE VAR nfa;mengedernachfolger(aktimport,nfa);
KNOTENMENGE VAR nfn;mengedernachfolger(festimport,nfn);nfnVEREINIGT nfa.
fuehreabgleichmitexportendurch:finderefinementwurzel;
markiererefinementalsbenutzt;sammlenachfragen;WHILE nochimbereichREP 
deckenachfrageabPER .finderefinementwurzel:KNOTEN VAR refinementwurzel;
KNOTENMENGE VAR exportiertesrefinement;mengedernachfolger(aktexport,
exportiertesrefinement);refinementwurzel:=erster(exportiertesrefinement).
markiererefinementalsbenutzt:write(aktexport,markierungsknoten).
sammlenachfragen:mengedernachfolger(importbezug,abzudeckendenachfragen);
KNOTEN VAR behandelterimport:=erster(abzudeckendenachfragen).nochimbereich:
gueltig(behandelterimport).naechsterimport:naechster(behandelterimport,
abzudeckendenachfragen).deckenachfrageab:findeungesaettigtensohn;IF gueltig(
zuersetzendersohn)THEN ersetzediesendurchrefinement;naechsterimportELSE 
ausknotenmenge(abzudeckendenachfragen,behandelterimport)FI .
findeungesaettigtensohn:KNOTEN VAR zuersetzendersohn;mengedernachfolger(
behandelterimport,nachfragesoehne);zuersetzendersohn:=erster(nachfragesoehne)
;WHILE gueltig(zuersetzendersohn)CAND nochnichtgefundenREP naechster(
zuersetzendersohn,nachfragesoehne)PER .nochnichtgefunden:(NOT isopen(
zuersetzendersohn))COR (NOT (attribute(zuersetzendersohn)=attribute(
importbezug))).ersetzediesendurchrefinement:knotenloeschen(nachfragesoehne,
zuersetzendersohn);inknotenmenge(nachfragesoehne,refinementwurzel,
zuersetzendersohn).END PROC uebernehmeindenbestand;PROC loescheunterbaum(
KNOTEN CONST node):KNOTENMENGE VAR m;mengedernachfolger(node,m);KNOTEN VAR k
:=erster(m);WHILE gueltig(k)REP IF NOT isrefinement(k)THEN loescheunterbaum(k
);knotenloeschen(m,k)ELSE ausknotenmenge(m,k);FI PER END PROC 
loescheunterbaum;END PACKET systembaumbearbeitungneu;