(* ----------------------------------------------------------------------------
 * $Id: MASUGB.md,v 1.2 1995/11/05 09:11:59 kredel Exp $
 * ----------------------------------------------------------------------------
 * This file is part of MAS.
 * ----------------------------------------------------------------------------
 * Copyright (c) 1989 - 1993 Universitaet Passau
 * ----------------------------------------------------------------------------
 * $Log: MASUGB.md,v $
 * Revision 1.2  1995/11/05 09:11:59  kredel
 * Improved error handling and cosmetic.
 *
 * Revision 1.1  1993/05/11  10:11:15  kredel
 * Initial Revision
 *
 * ----------------------------------------------------------------------------
 *)

DEFINITION MODULE MASUGB;

(* Universal Groebner Bases Definition Module. *)


(* Author: Belkahia, Uni Passau, 1992. *)


FROM MASSTOR IMPORT LIST; 


CONST rcsid = "$Id: MASUGB.md,v 1.2 1995/11/05 09:11:59 kredel Exp $";
CONST copyright = "Copyright (c) 1989 - 1993 Universitaet Passau";


PROCEDURE UGBBIN(); 
(*UGB input, execute and output. 
Diese hauptprozedur liest die eingabedatei ein (die
polynome, die variablen und ihre anzahl durch pread, den
parameter durch rdpar und die option durch execrd). Die
funktion exeugb wird anschliessend aufgerufen.
UGBBIN wird vom hauptprogramm main aufgerufen. *)


PROCEDURE EXEUGB(L,I,V,PAR,OPT: LIST); 
(*UGB execute. 
Diese prozedur ruft, abhaengig von der option opt  die 
prozeduren lf, plf, ugb und pugb. Diese prozeduren 
realisieren die verschiedenen optionen, die im abschnitt 
benutzerschnittstelle besprochen wurden.
Die prozedur wird von der hauptprozedur ugbbin aufgerufen. *)


PROCEDURE LF(L,I,V,PAR,OPT: LIST);  
(*UGB linear form. 
Die prozedur berechnet die linearformen nach der option
LF. Vergleiche benutzerschnittstelle und 5.1.6. 
Die prozedur wird von exeugb aufgerufen. *)


PROCEDURE PLF(L,I,V,PAR,OPT: LIST); 
(*UGB linear form with precomputed linear forms. 
Die prozedur berechnet die linearformen nach der option
plf. Vergleiche benutzerschnittstelle und 5.1.7.
Die prozedur wird von exeugb aufgerufen. *)


PROCEDURE UGB(L,I,V,PAR,OPT: LIST); 
(*Universal Groebner base. 
Die prozedur berechnet eine universelle groebner basis 
nach der option ugb. Vergleiche benutzerschnittstelle
und 5.2.4.
Die prozedur wird von exeugb aufgerufen. *)


PROCEDURE PUGB(L,I,V,PAR,OPT: LIST); 
(*Universal Groebner base with precomputed linear forms. 
Die prozedur berechnet eine universelle groebner basis 
nach der option pugb. Vergleiche benutzerschnittstelle 
und 5.2.5.
Die prozedur wird von exeugb aufgerufen. *)


PROCEDURE SUNIT1(I: LIST); 
(*UGB set input unit 1. 
Diese prozedur stellt bei der option plf die richtige
datei zum einlesen von linearformen bereit. I ist
die anzahl der variablen. Die vorberechneten lineraformen
sind je nach der anzahl der variablen in verschiedenen 
dateien gespeichert. Diese prozedur wird von der prozedur
plf aufgerufen. *)


PROCEDURE SUNIT2(I: LIST); 
(*UGB set input unit 2.
Diese prozedur stellt bei der option pugb die richtige 
datei zum einlesen von linearformen bereit. I ist
die anzahl der variablen. Die vorberechneten lineraformen
sind je nach der anzahl der variablen in verschiedenen 
dateien gespeichert. Diese prozedur wird von der prozedur
pugb aufgerufen. *)


PROCEDURE PREAD( VAR L,I,V: LIST);  
(*UGB polynomial read. 
Die polynome werden von der eingabedatei eingelesen.
Diese funktion wird von der hauptprozedur ugbbin
aufgerufen. *)


PROCEDURE OPREAD( VAR PAR,OPT: LIST);  
(*UGB options and parameter read. 
Diese prozedur liest von der eingabedatei den parameter
par (zustaendig fuer zwischenausgaben) durch die prozedur
rdpar und die option opt (steht fuer lf, plf, ugb, pugb) 
durch die prozedur execrd.
Diese prozedur wird von der hauptprozedur ugbbin
aufgerufen. *)


PROCEDURE EXPTU(L: LIST): LIST; 
(*UGB extract exponent vector list from polynomial list. 
Aus den polynomen wird die liste der terme berechnet.
Da jeder term mit dem tupel seiner exponenten 
identifizert werden kann, wird die liste der
exponententupel ausgegeben. 
Diese funktion wird von den prozeduren mklist, newdif, 
isneu, ug, pug, lf, plf, ugb und pugb. *)


PROCEDURE MAKERN(Q: LIST): LIST;  
(*UGB rational exponent vector list from integer ev list. 
Makern transformiert die ganzzahlige struktur der 
exponententupel in eine rationalzahlige struktur
diese funktion wird von den funktionen mklist, neulf
und newdif aufgerufen. *)


PROCEDURE SCMULT(I,U: LIST): LIST; 
(*UGB rational exponent vector rational number product. 
Hilfsfunktion zur berechnung vom skalarprodukt zwischen 
rationalzahligen vektoren. 
Diese funktion wird von der funktion mkset aufgerufen. *)


PROCEDURE PDIF(R,S,DIFALT: LIST): LIST; 
(*UGB rational exponent vector list difference list, incremental. 
Berechnet (r-s) vereinigt mit (s-s).Diese prozedur ist
im hinblick auf die berechnung von universellen groebner
basen geschrieben. S entspricht der menge der neuen terme, 
die nach der reduktion entstehen. R enspricht der alten 
menge von termen. Da r-r in einem vorherigen schritt
schon berechnet wurde, berechnet die prozedur nur r-r 
vereinigt mit s-s.
Diese funktion wird von den funktionen projec, proj und 
newdif aufgerufen. *)


PROCEDURE MKSET(R: LIST;  VAR P2,P3,RR: LIST); 
(*UGB rational exponent vector list difference list. 
Berechnet die mengen p1, p2, p3 und die reduzierte menge
von p - p wie sie im theoretischen teil der diplomarbeit
beschrieben ist. Die eingabe ist r. P1 und p2 sind die
projektionen. P3 ist die vereinigung von p1 und p2.
Rr entspricht der reduzierten menge von p - p. 
Nur p2, p3 und rr werden zurueckgegeben. 
Diese funktion wird von den funktionen projec und proj
aufgerufen. *)


PROCEDURE PROJEC(R,S,DIFALT,OLDL,I,PAR: LIST): LIST; 
(*UGB projection to dimension 1. 
Berechnet die projektionen der eingabemenge r bis zur
dimension 1. Die ausgabe ist ein stapel der tupel der
form (p2,p) verschiedener dimensionen enthaelt.
P2 wird in jeder dimension zur berechnung der schnitte 
und p zum vergleich von ordnungen benutzt.
Diese prozedur ruft die prozeduren pdif und mkset auf. 
Die prozedur degre bestimmt fuer jede projektion den 
maximalen totalgrad der terme. 
Diese funktion wird von den funktionen lf, plf, ugb und
newdif aufgerufen. *)


PROCEDURE PROJ(R,S,DIFALT,OLDL,I: LIST;  VAR D,B,DEG: LIST); 
(*UGB projection, one dimension. 
Berechnet die projektion der eingabemenge r auf eine 
niedrigere dimension. Die ausgabe besteht aus b
(entspricht p2 in definition 2.2.1), d (entspricht der 
reduzierten differenz r - r), sowie deg.
Diese prozedur ruft die prozeduren pdif und mkset auf. 
Die prozedur degre bestimmt den maximalen totalgrad deg
der terme der projektion. 
Diese funktion wird von der funktion plf aufgerufen. *)


PROCEDURE DIFF(R: LIST): LIST; 
(*UGB difference set for rational exponent vector list. 
Diese prozedur berechnet fuer die eingabemenge von
tupel r die reduzierte menge r - r. das ergebnis wird 
in r zurueckgegeben.
diese funktion wird von den funktionen mklist und pdif
aufgerufen. *)


PROCEDURE DIFF1(R,S: LIST): LIST; 
(*UGB difference set for two rational exponent vector list. 
Berechnet fuer die eingabemengen r und s von exponeneten
tupel die reduzierte menge r - s. das ergebnis wird in
erg zurueckgegeben. 
diese funktion wird von der funktion pdif aufgerufen. *)


PROCEDURE RNVDIF(A,B: LIST): LIST; 
(*UGB rational exponent vector difference. 
Berechnet die komponentenweise differenz von zwei
rationalzahligen vektoren. die differenz von zwei
rationalzahlen wird durch die prozedur rndif berechnet.
diese funktion wird von den funktionen diff und diff1
aufgerufen. *)


PROCEDURE SCPROD(A,B: LIST): LIST; 
(*UGB rational exponent vector scalar product. 
Berechnet das skalarprodukt von zwei rationalzahligen
vektoren. die prozedur rnprod berechnet das produkt
zweier rationalzahlen. die prozedur rnsum berechnet die
summe von zwei rationalzahlen. das ergebnis wird in c
zurueckgegeben.
diese funktion wird von den funktionen cq2, cp2, pkegel
und cspur aufgerufen. *)


PROCEDURE SKPRO2(A,B: LIST): LIST; 
(*UGB rational exponent vector scalar product with integer ev. 
Diese funktion ist eine spezielle skalarprodukt-funktion.
da die ausgerechneten linearformen rationahlzahlig sind
und die exponententupel ganzzahlig sind, werden diese
zunaechst als rationahlzahlen dargestellt und dann das 
skalarprodukt gebildet. 
diese funktion wird von evlfcp aufgerufen. *) 


PROCEDURE LRNBMS(L: LIST): LIST;
(*List of rational numbers bubble-merge sort.  L is an arbitrary list of
rational numbers, possibly with repetitions.  M is the result of sorting
L into non-decreasing order.  A combination of bubble-sort and merge-
sort is used.  The list L is modified to produce M.*)


PROCEDURE LRNBS(L: LIST);
(*List of rational numbers bubble sort.  L is an arbitrary list of
rational numbers, with possible repetitions.  L is sorted into
non-decreasing order by the bubble-sort method.  The list L, though not
its location, is modified.*)


PROCEDURE LRNM(L1,L2: LIST): LIST;
(*List of rational numbers merge.  L1 and L2 are arbitrary lists of
rational numbers in non-decreasing order.  L is the merge of L1 and L2.
L1 and L2 are modified to produce L.*)


PROCEDURE COMPLF(C,D,KLIST,NP,JP,M: LIST; VAR LFORM,KLISTP,J: LIST); 
(*UGB compute linear form from difference set. 
Diese prozedur berechnet fuer die linearform c und die
menge der schnitte d die neuen linearformen. klist
enthaelt die spuren der schon berechneten linearformen
np entspricht der reduzierten menge  p - p und wird
dazu verwendet um die neuen spuren zu berechnen.
lform enthaelt als ausgabe alle bisher berechneten
linearformen. klistp die dazugehoerigen spuren. alle
spuren sind verschieden.
die funktion wird von der funktion mklf1 aufgerufen. *)


PROCEDURE CQ2(C,Q2,M: LIST): LIST; 
(*UGB linear form product with rational exponent vector list. 
Diese prozedur berechnet fuer eine linearform c und eine 
liste q2, beide der gleichen dimension, das produkt c * q2. 
die elemente von c * q2 bestehen aus dem skalarprodukt von
c mit den einzelnen elementen von q2. da diese menge dazu
verwendet wird, um die schnitte zu bilden, werden nur die
negativen elemente gespeichert.
die funktion wird von der funktion mklf1 aufgerufen. *)


PROCEDURE RNVABS(A: LIST): LIST;  
(*Rational number list absolute values. 
Diese prozedur berechnet fuer die liste a von rational- 
zahlen den absolutbetrag ihrer komponenten. die prozedur
rnabs berechnet den absolutbetrag einer rationalzahl. 
das ergebnis wird in der liste b zurueckgegeben.
die funktion wird von den funktionen mklf1, mklf2 und 
mklf3 aufgerufen. *)


PROCEDURE CUT(TR: LIST): LIST; 
(*UGB set of cuts. 
Berechnet fuer die eingabemenge tr die menge der 
schnitte d. fuer die inneren punkte wird das
algebraische mittel gebildet. fuer die aeusseren punkte
wird 1 addiert beziehungsweise die zahl halbiert.
die funktion wird von den funktionen mklf1, mklf2 und
mklf3 aufgerufen. *)


PROCEDURE ALLELN(STAKK,L,KALT,I,PAR: LIST;  VAR LF,NURLF: LIST); 
(*UGB all linear forms from stack of projections. 
Diese funktion berechnet aus dem stapel der projektionen
stakk alle linearformen nurlf. die prozedur mklf1 wird 
aufgerufen.
diese funktion wird von der prozedur lf aufgerufen. *)


PROCEDURE MKLF1(LFP,Q2,NP,M: LIST): LIST;  
(*UGB make new linear forms 1. 
Diese prozedur berechnet fuer eine liste von linearformen
lfp die neuen linearformen newlf. die menge q2 wird dazu 
verwendet, die schnitte zu berechnen. die menge np 
dient dazu, die ueberfluessigen linearformen zu eliminieren.
diese funktion wird von der prozedur plf und alleln
aufgerufen. *)


PROCEDURE NULRNV(A: LIST): LIST;  
(*Rational number vector null test.  
Diese prozedur ueberprueft ob ein vektor a der nullvektor
ist. i ist 1 falls a der nullvektor ist ansonsten 0.
diese funktion wird von der funktion mkset aufgerufen. *)


PROCEDURE PKEGEL(C,N,KALT: LIST): LIST; 
(*UGB trace for linear form. 
Diese funktion berechnet die spur k bezueglich der linear-
form c und der menge n in kodierter form. die spur wird
nach der methode der wortkodierung (abschnitt 5.1.4)
gebildet. 
diese funktion wird von der funktion complf aufgerufen. *)


PROCEDURE COMPA1(K,KLIST: LIST): LIST;  
(*UGB trace member in trace list. 
Diese funktion stellt fest ob eine spur k in einer liste von
spuren vorhanden ist. j ist gleich 1 falls k in klist liegt,
ansonsten 0.
diese funktion wird von den funktionen complf, clf2, clf3
aufgerufen. *)


PROCEDURE COMPA2(K,A: LIST): LIST; 
(*UGB trace compare. 
Diese funktion ueberprueft zwei spuren k und a auf 
gleichheit. u ist gleich 1 falls a und k gleich sind,
ansonsten 0.
diese funktion wird von den funktionen compa1, dfp, dipmc2, 
zulfo und isneu aufgerufen. *)


PROCEDURE LASTEL(Y: LIST): LIST;  
(*Last element. 
X ist das letzte element der liste y. *)


PROCEDURE EVLRNBSO(A: LIST); 
(*Rational exponent vector list bubble sort. a is a list of
rational exponent vectors, a is sorted 
with respect to the termordering defined in EVORD 
by the bubble-sort method, two exponent vectors with equal
exponents will lead to an error. the
list a but not its location, is modified.*) 


PROCEDURE EVRNGL(U,V: LIST): LIST; 
(*Rational exponent vector inverse graded lexicographical compare.
u=(ul1, ..., ulrl), v=(vl1, ..., vlrl) are rational exponent vectors.
tl=0 if u eq v. tl=1 if u gt v. tl=-1 if u lt v. eq, gt, lt
with respect to the inverse graded lexicographical ordering
of the exponent vectors. rl is the length of u and v.*)


PROCEDURE EVRNC(U,V: LIST): LIST; 
(*Rational exponent vector compare. u=(ul1, ...,ulrl), v=(vl1, ...,vlrl)
are exponent vectors. rl is the length of u and v.
tl=0 if u eq v. tl=1 if u gt v. tl=-1 if u lt v. eq, gt, lt
with respect to the ordering of the exponent vectors specified
in the global variable EVORD. lexicographical, inverse
lexicographical, graded lexicograhpical, inverse graded
lexicographical orderings are possible. *)


PROCEDURE DEGRE(Q: LIST): LIST; 
(*UGB total degree of a list of rational exponent vectors. 
Q ist eine liste von rationalzahligen tupeln. der maximale
totalgrad der in q vorkommt wird berechnet.
diese prozedur wird von den funktionen projec und proj 
aufgerufen. *)


PROCEDURE RDPAR(): LIST; 
(*UGB read parameter. 
Diese funktion liest aus der eingabedatei den parameter
par. zulaessige werte sind y oder n. bei y werden zwischen
berechnungen ausgegeben, bei n nicht.
diese funktion wird von der prozedur opread aufgerufen. *)


PROCEDURE EXECRD(): LIST;  
(*UGB execution options read. 
Diese funktion liest aus der eingabedatei die 
auszufuehrende option. moegliche optionen sind lf  plf  ugb 
und pugb. vor der option muss das wort exec stehen. die
option ist mit einem punkt abzuschliessen.
beispiel  exec ugb.
diese funktion wurde mit geringfuegigen aenderungen aus
der aldes-bibliothek entnommen.
diese funktion wird von der hauptprozedur ugbbin aufgerufen. *)


PROCEDURE SEENR(AC: LIST;  VAR NR: LIST);  
(*UGB number of option. 
Diese funktion ermittelt fuer eine option ac eine
schluesselzahl nr. die funktion stammt bis auf einige
aenderungen aus der aldes-bibliothek.
diese funktion wird von der funktion execrd aufgerufen. *)


PROCEDURE LFGET(DEG,LF: LIST): LIST;  
(*UGB get linear form from list of linear forms. 
Diese funktion holt aus der liste lf der gespeicherten 
linearformen, abhaengig vom grad deg, die benoetigten
linearformen.
diese funktion wird von den funktionen plf, pugb und pug 
aufgerufen. *)


PROCEDURE MKLF2(LFP,Q2,NP,M,L: LIST;  VAR NEWLF,LISTLF: LIST); 
(*UGB make new linear forms 2. 
Diese funktion ist genau analog zu mklf1. die linear-
formen werden im gegensatz zu onenlf auch mit der zahl 1 
als letzte komponente der linearformen berechnet.
diese funktion wird von der funktion lfall aufgerufen. *)


PROCEDURE CLF2(C,D,KLIST,NP,JP,M,L: LIST; VAR LFORM,KLISTP,J,RECLF: LIST);  
(*UGB compute linear form from difference set 2.
Diese funktion funktionniert genauso wie complf, mit dem 
unterschied, dass das element 1 als letzte komponente
der linearform gespeichert wird. 
diese funktion wird von der funktion mklf2 aufgerufen. *)


PROCEDURE CP2(C,Q2: LIST): LIST;  
(*UGB linear form product with rational exponent vector list 2. 
Diese funktion funktionniert genauso wie cq2, mit dem
unterschied, dass das element 1 als letzte komponente
der linearform gespeichert wird. 
diese funktion wird von den funktionen mklf2 und mklf3 
aufgerufen. *)


PROCEDURE CSPUR(C,N,KALT: LIST): LIST;  
(*UGB trace for linear form 2. 
Diese funktion funktionniert genauso wie pkegel, mit dem 
unterschied, dass das element 1 als letzte komponente
der linearform gespeichert wird. 
diese funktion wird von den funktionen clf2, clf3 und zulfo 
aufgerufen. *)


PROCEDURE MKNEWP(P,POL,PRS: LIST): LIST; 
(*UGB make new critical pairs. 
Diese funktion aktualisiert die menge der paare prs der
polynomliste p um die paare der form (pol,f) wobei f aus 
p und pol ein polynom ist. das ergebnis ist ppairs.
das buchberger-kriterium ist implementiert.
diese funktion wird von der funktion gs2 aufgerufen. *)


PROCEDURE MKPAIR(PP: LIST;  VAR PAIRS: LIST);  
(*UGB make critical pairs for polynomial list. 
Diese funktion berechnet aus der liste pp von polynomen 
die menge der paare pairs. das buchberger-kriterium ist
implementiert. 
diese funktion wird von der funktion gs1 aufgerufen. *) 


PROCEDURE MKSP1(X,L,PAIRS,I,V: LIST;  VAR D,PAIRSP: LIST); 
(*UGB compute next non-zero reduced S-polynomial.  
Diese funktion bildet bezueglich der linearform x und der
polynommenge l aus der liste von paaren pairs solange
ein s-polynom (dirpsp) und fuehrt es zu normalform (dirrnf) 
bis das s-polynom d nicht null ist oder die liste der paare 
pairsp leer ist.
diese funktion wird von den funktionen ug und pug
aufgerufen. *)


PROCEDURE GS1(LF,V,PAR: LIST): LIST;  
(*UGB generate stack of sorted polynomials and critical pairs 1. 
Lf ist ein tupel der form (a,l,k,n). dabei ist a eine linear-
form, l eine liste von polynomen, k die dazugehoerige
spur und n die reduzierte differenz p - p der 
entsprechenden menge von exponententupel. 
diese prozedur ordnet die polynome nach den linearformen 
und berechnet die menge der dazugehoerigen paare b.
die ausgabe stak besteht aus tupeln der form (a,l,k,n,b).
diese funktion wird von den funktionen ug und pug
aufgerufen. *) 


PROCEDURE MERGE(STALT,STNEU: LIST): LIST;  
(*UGB merge stacks. 
Diese funktion mischt die zwei stapel stalt und stneu zu 
einem stapel stak wie in 5.2.3 beschrieben ist. 
diese funktion wird von der funktion neulf aufgerufen. *)


PROCEDURE WRUGF(X,V,PAR: LIST): LIST; 
(*Write universal Groebner family. 
Diese funktion gibt eine berechnete universelle 
groebnerfamilie  auf dem ausgabegeraet aus. es wird
jeweils eine linearform und die dazugehoerige polynommenge
ausgegeben. 
diese funktion wird von den prozeduren ugb und pugb
aufgerufen. *)


PROCEDURE WRUGB(UL,V: LIST);  
(*Write universal Groebner base. 
Diese funktion gibt eine berechnete universelle 
groebnerbasis ul auf dem ausgabegeraet aus.
diese prozedur wird von den prozeduren ugb und pugb
aufgerufen. *)


PROCEDURE POLCOP(L: LIST): LIST;  
(*Two level list copy. 
Diese funktion macht eine kopie p der polynomliste l.
diese funktion wird von den funktionen gs1, gs2 und wrugf
aufgerufen. *)


PROCEDURE DFP(A,B: LIST): LIST; 
(*UGB distributive rational polynomial difference. 
Diese funktion bildet aus den beiden polynomen a und b 
die distributive differenz a - b. das ergebnis ist cp. 
diese funktion unterscheidet sich von der in der aldes 
bibliothek vorhandenen funktion. sie berechnet die 
differenz bezueglich der in der globalen variablen 
EVORD gesetzten ordnung.
diese funktion wird von den funktionen dirrnf und dirpsp 
aufgerufen. *)


PROCEDURE SFP(A,B: LIST): LIST; 
(*UGB distributive rational polynomial sum. 
Diese funktion bildet aus den beiden polynomen a und b 
die distributive summe a + b. das ergebnis ist cp. 
diese funktion unterscheidet sich von der in der aldes 
bibliothek vorhandenen funktion. sie berechnet die 
differenz bezueglich der in der globalen variablen 
EVORD gesetzten ordnung.
diese funktion wird von den funktionen dirrnf aufgerufen. *)


PROCEDURE EVLFCP(L,U,V: LIST): LIST;  
(*UGB exponent vector linear form compare. 
Diese funktion vergleicht die exponententupel u und v
zweier terme bezueglich der linearform l. das ergebnis 
t ist gleich 1 falls u groesser als v ist, 0 falls sie 
gleich sind  und -1 ansonsten.
diese funktion wird von der funktion evcomp aufgerufen. *)


PROCEDURE PCOMP(X,Y: LIST): LIST; 
(*UGB distributive polynomial composition. 
Diese funktion bildet aus den beiden polynomen x und y 
ein polynom z, sodass das polynom x der ersten teil, und 
y der zweite teil ist.
diese funktion wird von den funktionen dfp und dipmc2
aufgerufen. *)


PROCEDURE EVCOMP(U,V: LIST): LIST; 
(*UGB exponent vector compare. 
Diese funktion vergleicht die exponententupel u und v
zweier terme bezueglich der termordnung, die in der
globalen variable EVORD gespeichert ist. das ergebnis
tl ist gleich 1 falls u groesser als v ist, 0 falls sie
gleich sind  und -1 ansonsten. *)


PROCEDURE DIPMC2(A,C,P: LIST): LIST;  
(*UGB distributive polynomial composition 2. 
Diese funktion bildet aus dem koeffizient a, dem term c
und dem polynom p ein neues polynom dp.
diese funktion wird von der funktione dirrnf aufgerufen. *)


PROCEDURE DIRRNF(P,S,X,V: LIST): LIST;  
(*UGB distributive polynomial normalform. 
Diese funktion berechnet die normalform r eines polynoms 
s mit rationalen koeffizienten bezueglich der liste von
polynomen p und der ordnung, die von der linearform x
induziert wird.
diese funktion wird von der funktione mksp1 aufgerufen. *) 


PROCEDURE DIRPSP(A,B,X: LIST): LIST;  
(*UGB distributive polynomial S-polynomial. 
Diese funktion berechnet das s-polynom c der polynome a
und b bezueglich der ordnung, die von der linearform x 
induziert wird.
diese funktion wird von der funktion mksp1 aufgerufen. *) 


PROCEDURE UG(LF,I,V,STAP,P,NURLF,PAR: LIST): LIST;  
(*Universal Groebner base. 
Diese funktion berechnet eine universelle groebner-
familie ugf. lf sind tupel der form (a,l,k,n), wobei l 
die eingabemenge von polynomen, a eine von allen
dazugehoerigen linearformen, k die spur und n die
reduzierte differenz der eingabemenge der exponententupel
ist. die berechnung realisiert die option ugb.
diese funktion wird von der funktion ugb aufgerufen. *)


PROCEDURE PUG(LF,I,V,P,DEGP,NURLF,PAR,LFQ: LIST): LIST; 
(*Universal Groebner base using precomputation.
Diese funktion berechnet eine universelle groebner-
familie ugf. lf sind tupel der form (a,l,k,n), wobei l 
die eingabemenge von polynomen, a eine von allen
dazugehoerigen linearformen, k die spur und n die
reduzierte differenz der eingabemenge der exponententupel
ist.
die berechnung realisiert die option pugb.
diese funktion wird von der funktion pugb aufgerufen. *)


PROCEDURE NEWL(LFTEMP,LFNEU,LFEND: LIST): LIST;  
(*UGB update linear forms from new terms. 
Lfneu ist die menge der linearformen auf der neuen menge 
von termen. die funktion stellt fest welche von diesen 
linearformen die alten fortsetzen und aktualisiert 
das zwischenergebnis lftemp durch lfp. 
die funktion wird auch nur aufgerufen wenn neue 
linearformen enstanden sind.
diese funktion wird von den funktionen ug und pug
aufgerufen. *)


PROCEDURE ZULFO(LFNEU,X,LL,LFEND: LIST;  VAR LFP,LF: LIST);  
(*UGB find admissible extensions of linear forms. 
Diese funktion stellt fest, welche linearformen aus lfneu
die linearform von x fortsetzen. diese linearformen mit
den aktualisierten daten (spur, paare) ersetzen dann x 
in ll. das ergebnis ist lfp.
diese funktion wird von der funktion newl aufgerufen. *)


PROCEDURE NONEWL(LFTEMP: LIST): LIST; 
(*UGB update linear forms without new terms. 
Diese funktion wird aufgerufen wenn keine linearformen 
entstanden sind. sie aktualisiert lftemp durch lfp.
diese funktion wird von den funktionen ug und pug
aufgerufen. *)


PROCEDURE ISNEUL(LFALT,LFNEU,PAR: LIST): LIST; 
(*UGB new linear form test.
Lfalt ist die alte liste von linearformen, lfneu die
neue. diese funktion stellt fest ob neue linearformen
entstanden sind (u gleich 1) oder nicht (u gleich 0).
diese funktion wird von den funktionen ug und pug
aufgerufen. *)


PROCEDURE NEULF(STAP,DSUM,LSUM,I,V,PAR: LIST; VAR LFNEU,NEUST: LIST); 
(*UGB compute new linear forms from new terms. 
Diese funktion berechnet, nachdem neue terme entstanden
sind, die neuen linearformen. die berechnung basiert
auf die bereits beschriebenen funktionen und prozeduren
zur berechnung von linearformen. 
dsum ist die liste der neuen s-polynome, lsum die liste
der alten polynome, stap der alte stapel der projektionen.
das ergebnis ist die liste der neuen linearformen lfneu
und der neue stapel von projektionen neust.
diese funktion wird von der funktion ug aufgerufen. *)


PROCEDURE ISNEU(DSUM,LSUM,PAR: LIST;  VAR SEMA,DD: LIST); 
(*UGB new terms test. 
Diese funktion stellt fest, ob neue terme in dusm entstanden
sind. 
dsum ist die liste der neuen s-polynome in normalform, 
lsum die alte liste von polynomen. die ausgabe sema ist
gleich 1 falls neue terme entstanden sind. ansonsten 0.
dd ist die liste der neuen terme.
diese funktion wird von den funktionen ug und pug
aufgerufen. *)


PROCEDURE TCOMP(X,Y: LIST): LIST; 
(*UGB list constructive conc. ??CCONC??
X und y sind zwei listen. diese prozedur konkatiniert sie
zu einer liste z.
diese funktion wird von der funktion isneu aufgerufen. *)


PROCEDURE NEWDIF(L,D,DIFALT: LIST): LIST;  
(*UGB exponent vector list difference from polynomials. 
Diese funktion liest durch die funktion exptu die
exponententupel der terme von l und d und berechnet mit
hilfe der funktion pdif die differenz. fuer die 
berechnung der neuen differenz wird das schon berechnete 
ergebnis genutzt.
diese funktion wird von den funktionen zulfo und nonewl
aufgerufen. *) 


PROCEDURE GS2(LF,V,PAR: LIST): LIST;  
(*UGB generate stack of sorted polynomials and critical pairs 2.
Diese funktion funktioniert aehnlich zu gs1. sie ist wegen
der uebersichtlichkeit getrennt geschrieben. die funktion
aktualisiert die zwischenergebnisse lf (tupel der form 
(a,l,k,n,b) wie die ausgabe von gs1), d.h sie ordnet
die polynome neu und aktualisiert die mengen von paaren. 
diese funktion wird von den funktionen ug und pug
aufgerufen. *)


PROCEDURE ALLLF(STAKK,KALT,I: LIST): LIST; 
(*UGB all linear forms from stack of projections and print. 
Die funktion funktionniert genauso wie lfall. hier 
werden nur die linearformen berechnet und ausgegeben.
diese funktion wird von der funktion neulf aufgerufen. *)


PROCEDURE LFALL(STAKK,L,KALT,I: LIST; VAR LISTLF,NURLF: LIST); 
(*UGB all linear forms from stack of projections 1. 
Diese funktion funktionniert genauso wie alleln, mit dem 
unterschied, dass das element 1 als letzte komponente
der linearform gespeichert wird. 
diese funktion wird von der funktion ugb aufgerufen. *)


PROCEDURE MKLF3(LFP,Q2,NP,M: LIST): LIST;  
(*UGB make new linear forms 3.
Diese funktionniert genauso wie mklf2. hier werden nur 
die linearformen (newlf) berechnet und ausgegeben. 
diese funktion wird von der funktion alllf aufgerufen. *) 


PROCEDURE CLF3(C,D,KLIST,NP,JP,M: LIST;  VAR LFORM,KLISTP,J: LIST); 
(*UGB compute linear form from difference set 3.
Diese funktionniert genauso wie clf2. hier werden nur
die linearformen (lform) berechnet und ausgegeben. 
diese funktion wird von der funktion mklf3 aufgerufen. *) 


PROCEDURE DO1(LFP: LIST): LIST; 
(*UGB add last component to exponent vector. 
Um speicherplatz zu sparen wurden die linearformen ohne
das 1 element als letzte komponente gespeichert. diese 
funktion fuegt fuer die liste der linearformen lfp das 
element 1 ein. das ergebnis ist lf1. 
diese funktion wird von der funktion pugb aufgerufen. *)


PROCEDURE MKLIST(LF,L: LIST;  VAR LFLIST,NURLF: LIST);  
(*UGB make trace and cuts. 
Diese funktion wird aufgerufen bei der option pugb. die
liste der eingelesenen linearformen lf ist groesser als
noetig. diese funktion reduziert diese linearformen,
sodass bezueglich der menge p von polynomen verschiedene 
ordnungen ergeben. nurlf ist dann das ergebnis. listlf 
besteht aus tupel der form (a,l,k,n) wie das ergebnis von
lfall.
diese funktion wird von der funktion pugb aufgerufen. *)


PROCEDURE LDEG(L: LIST): LIST; 
(*Distributive polynomial list total degree. 
Diese funktion bestimmt fuer eine liste von polynomen l
den maximalen totalgrad, der darin auftaucht. 
diese funktion wird von den funktionen pug und pugb
aufgerufen. *)


END MASUGB.