home *** CD-ROM | disk | FTP | other *** search
- code = 3500 /* Wir brauchen etwas Platz */
- /***************************************************************************/
- /* Globale Daten und Domains */
- /***************************************************************************/
-
- domains
- INTEGERLIST = INTEGER*
- REALLIST = REAL*
-
- database
- setup_Daten( STRING, INTEGER, STRING, STRING, CHAR, STRING, STRING, CHAR)
- /* Kennwort,Dim.,Variablenname X, Einheit X, X-Fehler bekannt ?,
- Variablenname Y, Einheit Y, Y-Fehler bekannt ? */
- daten( STRING, REALLIST, REALLIST, REALLIST, REALLIST)
- /* Kennwort, X-Liste, Y-Liste, X-Fehlerliste, Y-Fehlerliste */
- eingabe_Daten( STRING, STRING) /* Kennwort,Eingabedaten */
-
- /****************************************************************/
- /* Listen Handling */
- /****************************************************************/
-
- domains
- LIST = SYMBOL*
- STRINGLIST = STRING*
-
- PREDICATES
- member(SYMBOL,LIST) /* Symbol in Liste enthalten ? */
- maxlen(LIST,INTEGER,INTEGER) /* Find the length of the longest string */
- listlen(LIST,INTEGER) /* Find the length of a list */
- reallist_len(REALLIST,INTEGER) /* Ermittelt Laenge einer Liste von REALs */
- writelist(INTEGER,INTEGER,LIST) /* Used by the menu predicate */
- convert_to_Nrs(STRINGLIST,REALLIST) /* Tokenliste in REALliste umsetzen */
- write_list(INTEGER,STRINGLIST) /* Write the list separated by spaces */
-
- CLAUSES
- member(X,[X|_]).
- member(X,[_|L]) :- member(X,L).
-
- maxlen([H|T],MAX,MAX1):-
- str_len(H,LEN) AND LEN>MAX AND ! AND maxlen(T,LEN,MAX1).
- maxlen([_|T],MAX,MAX1) :- maxlen(T,MAX,MAX1).
- maxlen([],LEN,LEN).
-
- listlen([],0).
- listlen([_|T],N) :- listlen(T,X), N=X+1.
-
- reallist_len([],0).
- reallist_len([_|R],N) :- reallist_len(R,X), N=X+1.
-
- writelist(_,_,[]).
- writelist(LI,ANTKOL,[H|T]) :-
- field_str(LI,0,ANTKOL,H), LI1=LI+1, writelist(LI1,ANTKOL,T).
-
- convert_to_Nrs([],[]).
- convert_to_Nrs([H1|T1],[H2|T2]) :-
- str_real(H1,Nr), H2 = Nr, convert_to_Nrs(T1,T2).
-
- write_list(_,[]).
- write_list(_,[X]) :- ! AND write(X).
- write_list(4,[H|T]) :- ! AND write(H), nl, write_list(0,T).
- write_list(3,[H|T]) :-
- str_len(H,LEN) AND LEN>13 AND ! AND write(H), nl, write_list(0,T).
- write_list(N,[H|T]) :-
- str_len(H,LEN) AND LEN>13 AND ! AND N1=N+2,writef("%-27 ",H),
- write_list(N1,T).
- write_list(N,[H|T]) :- N1=N+1, writef("%-13 ",H), write_list(N1,T).
-
- /******************************************************************/
- /* mathematischer Teil */
- /******************************************************************/
-
- predicates
- listsum(REALLIST,REAL)
- listsum_of_squares(REALLIST,REAL)
- listsum_x_mal_y(REALLIST,REALLIST,REAL)
- mittelwert(REALLIST,REAL)
- standardabweichung(REALLIST,REAL)
- lineare_Regression(REALLIST,REALLIST,REALLIST)
- /* X-Liste, Y-Liste, [Konstante,Steigung] */
- horner(REALLIST,REAL,REAL) /* Koeffizienten,X-Wert,Ergebniss */
- regress_StandardAbweichung(REALLIST,REALLIST,REALLIST,REAL)
- /* Standardabw. fuer Interpolationspolynome (Koefflist,XListe,YListe,Res) */
- sum_Y_minus_YNeu_Square(REALLIST,REALLIST,REAL)
- /* Hilfsrechnung fuer Regress_StandardAbweichung */
- make_polynomwerte(REALLIST,REALLIST,REALLIST)
- /* Koeffliste, X-Liste, --> Y-Liste */
-
- clauses
- listsum([],0).
- listsum([H|T],Res) :-
- listsum(T,NRes), Res = NRes + H.
-
- listsum_of_squares([],0).
- listsum_of_squares([H|T],Res) :-
- listsum_of_squares(T,NRes), Res = NRes + H*H.
-
- listsum_x_mal_y([],[],0).
- listsum_x_mal_y([HX|TX],[HY|TY],Res) :-
- listsum_x_mal_y(TX,TY,NRes), Res = NRes + HX*HY.
-
- mittelwert([],0).
- mittelwert(Liste,Res) :-
- listsum(Liste,SumRes), reallist_len(Liste,Anzahl), Res = SumRes/Anzahl.
-
- standardabweichung(Liste,Res) :-
- listsum_of_squares(Liste,SqrSum), listsum(Liste,Sum),
- mittelwert(Liste,MW), SumProd = MW*Sum, Diff = SqrSum - SumProd,
- reallist_len(Liste,Anzahl), Res = sqrt(Diff / (Anzahl - 1)).
-
- lineare_Regression(XListe,YListe,[Offset,Steigung]) :-
- mittelwert(XListe,XQuer), mittelwert(YListe,YQuer),
- listsum_x_mal_y(XListe,YListe,XY), listsum(XListe,XSum),
- listsum_of_squares(XListe,XSquare),
- Steigung = (XY - YQuer*XSum)/(XSquare - XQuer*XSum),
- Offset = YQuer - Steigung*XQuer.
-
- horner([],_,0).
- horner([H|T],X,Res) :- horner(T,X,NRes), Res = NRes*X + H.
-
- regress_StandardAbweichung(KoeffListe,XListe,YListe,Sigma) :-
- make_polynomwerte(KoeffListe,XListe,NeuYListe),
- Sum_Y_minus_YNeu_Square(YListe,NeuYListe,Res),
- reallist_len(XListe,Anzahl), reallist_len(KoeffListe,Grad_plus_1),
- Sigma = sqrt(Res/(Anzahl - Grad_plus_1)).
-
- sum_Y_minus_YNeu_Square([],[],0).
- sum_Y_minus_YNeu_Square([HY|TY],[HYNeu|TYNeu],Res) :-
- Sum_Y_minus_YNeu_Square(TY,TYNeu,NRes),
- Diff = (HY - HYNeu), Res = Diff*Diff + NRes.
-
- make_polynomwerte(_,[],[]).
- make_polynomwerte(KoeffListe,[XH|XT],[YH|YT]) :-
- make_polynomwerte(KoeffListe,XT,YT), horner(KoeffListe,XH,YH).
-
-
- /******************************************************************/
- /* READING THE KEYBORD */
- /******************************************************************/
-
- DOMAINS
- ROW,COL,LEN = INTEGER
-
- KEY = cr ; esc ; break ; tab ; btab ; del ; bdel ; ins ;
- end ; home ; ftast(INTEGER) ; up ; down ; left ; right ;
- ctrlleft; ctrlright; ctrlend; ctrlhome; pgup; pgdn;
- chr(CHAR) ; otherspec
-
- PREDICATES
- readkey(KEY)
- readkey1(KEY,CHAR,INTEGER)
- readkey2(KEY,INTEGER)
-
- CLAUSES
- readkey(KEY):-readchar(T),char_int(T,VAL),readkey1(KEY,T,VAL).
-
- readkey1(KEY,_,0):-!,readchar(T),char_int(T,VAL),readkey2(KEY,VAL).
- readkey1(cr,_,13):-!.
- readkey1(esc,_,27):-!.
- readkey1(chr(T),T,_) .
-
- readkey2(up,72):-!.
- readkey2(down,80):-!.
- readkey2(ftast(N),VAL):-VAL>58,VAL<70,N=VAL-58,!.
- readkey2(otherspec,_).
-
-
- /****************************************************************/
- /* menu */
- /* Implements a popup-menu */
- /* menu(FensterNr,FussZeile_Nr,KopfZeile_Nr,Line,Collum, */
- /* ListOfChoices,ChoiceNr) */
- /* The following keys can be used: */
- /* arrows up and down: select choice */
- /* cr and F10: activate choice */
- /* Esc: abort */
- /* ACHTUNG : FensterNr. 127 wird fuer interne Zwecke benutzt. */
- /****************************************************************/
-
- domains Nr_des_MenueFensters, Nr_des_FussZeile_Fensters,
- Nr_des_KopfZeile_Fensters = INTEGER
-
- PREDICATES
- menu(Nr_des_MenueFensters, Nr_des_FussZeile_Fensters,
- Nr_des_KopfZeile_Fensters,ROW,COL,STRING,LIST,INTEGER)
- menu1(ROW,LIST,ROW,INTEGER,INTEGER)
- menu2(ROW,LIST,ROW,INTEGER,INTEGER,KEY)
-
- CLAUSES
- menu(MenueWindowNr, FussZeile,KopfZeile,LI,KOL,TXT,LIST,CHOICE):-
- shiftwindow(MenueWindowNr), maxlen(LIST,0,ANTKOL), listlen(LIST,LEN),
- ANTLI=LEN, LEN>0, HH1=ANTLI+2, HH2=ANTKOL+2,
- makewindow(127,7,7,TXT,LI,KOL,HH1,HH2), HH3=ANTKOL, writelist(0,HH3,LIST),
- cursor(0,0), menu1(0,LIST,ANTLI,ANTKOL,CH),
- CHOICE=1+CH, removewindow, shiftwindow(FussZeile), shiftwindow(KopfZeile).
-
- menu1(LI,LIST,MAXLI,ANTKOL,CHOICE):-
- field_attr(LI,0,ANTKOL,112), cursor(LI,0), readkey(KEY),
- menu2(LI,LIST,MAXLI,ANTKOL,CHOICE,KEY).
-
- menu2(_,_,_,_,-1,esc):-!.
- menu2(LI,_,_,_,CH,ftast(10)):-!,CH=LI.
- menu2(LI,_,_,_,CH,cr):-!,CH=LI.
- menu2(LI,LIST,MAXLI,ANTKOL,CHOICE,up):-
- LI>0, !, field_attr(LI,0,ANTKOL,7), LI1=LI-1,
- menu1(LI1,LIST,MAXLI,ANTKOL,CHOICE).
-
- menu2(LI,LIST,MAXLI,ANTKOL,CHOICE,down):-
- LI<MAXLI-1, !, field_attr(LI,0,ANTKOL,7), LI1=LI+1,
- menu1(LI1,LIST,MAXLI,ANTKOL,CHOICE).
-
- menu2(LI,LIST,MAXLI,ANTKOL,CHOICE,_):- menu1(LI,LIST,MAXLI,ANTKOL,CHOICE).
-
-
- /***************************************************************************/
- /* Graphikteil */
- /***************************************************************************/
-
-
- predicates
- transform_Koord(REALLIST,REAL,REAL,INTEGERLIST)
- /* transformiert Benutzerkoordianten in absolute Bildschirmkoordinaten */
- transform_Koord_rel(REALLIST,REAL,REAL,INTEGERLIST)
- /* transformiert Benutzerkoordianten in relative Bildschirmkoordinaten */
- cut_Koord(REAL,REAL) /* faengt Bereichsueberschreitungen ab */
- cut_Koord(INTEGER,INTEGER) /* dito */
- achsen(INTEGER,INTEGER,INTEGER,INTEGER) /* Zeichnet die Achsen */
- /* X0,Y0,Schrittweite X-Teilung,Schrittweite Y-Teilung */
- xachse(INTEGER,INTEGER,INTEGER) /* dito */
- yachse(INTEGER,INTEGER,INTEGER) /* dito */
- xachse1(INTEGER,INTEGER,INTEGER) /* dito */
- yachse1(INTEGER,INTEGER,INTEGER) /* dito */
- setz_Punkt(INTEGERLIST,INTEGERLIST,INTEGERLIST,INTEGERLIST)
- /* Setzt die Punkte. X-Liste, Y-Liste, X-Fehlerliste, Y-Fehlerliste */
- kreuz(INTEGER,INTEGER) /* Macht ein Kreuzchen bei (X,Y) */
- mach_FehlerBalk_X(INTEGER,INTEGER,INTEGERLIST,INTEGERLIST)/* Zeichnet */
- mach_FehlerBalk_Y(INTEGER,INTEGER,INTEGERLIST,INTEGERLIST)/* Fehlerbalken */
- zeichne_Kurve(INTEGERLIST,INTEGERLIST) /* X-Liste, Y-Liste */
-
- clauses
- transform_Koord([],_,_,[]).
- transform_Koord([HR|TR],Min,Max,[HI|TI]) :-
- Wert = 31999 - 31999 * (HR - Min) / (Max - Min),
- cut_Koord(Wert,NWert), HI = round(NWert),
- transform_Koord(TR,Min,Max,TI).
- transform_Koord_rel([],_,_,[]).
- transform_Koord_rel([HR|TR],Min,Max,[HI|TI]) :-
- Wert = 31999 * HR / (Max - Min),
- cut_Koord(Wert,NWert), HI = round(NWert),
- transform_Koord_rel(TR,Min,Max,TI).
- cut_Koord(Ein,Aus) IF Ein < 0 AND Aus = 0 AND !.
- cut_Koord(Ein,Aus) IF Ein > 31999 AND Aus = 31999 AND !.
- cut_Koord(Ein,Ein).
-
- achsen(X0,Y0,DX,DY) :-
- cut_Koord(X0,NX0), cut_Koord(Y0,NY0), cut_Koord(DX,NDX),
- cut_Koord(DY,NDY), xachse(NX0,NY0,NDX), yachse(NX0,NY0,NDY).
- xachse(X0,Y0,DX) :-
- line(0,Y0,31999,Y0,3),
- Parts = X0 div DX, XSTART = X0 - DX * PARTS,
- xachse1(Y0,DX,XSTART).
- xachse1(_,_,LaufInd) IF LaufInd > 31999 AND !. /*Schon ueber Ende hinaus?*/
- xachse1(_,_,LaufInd) IF LaufInd < 0 AND !. /*Schon ueber Ende hinaus?*/
- /* Hinweis: Bereichsueberschreitungen bei Integers
- fuehrt zu negativen Zahlen */
- xachse1(Y,DX,LaufInd) :- /* Sonst Strich machen und weiterzaehlen */
- YPlus = Y + 600, cut_Koord(YPlus,NYPlus),
- YMinus = Y - 600, cut_Koord(YMinus,NYMinus),
- line(LaufInd,NYPlus,LaufInd,NYMinus,3),
- LaufInd1 = LaufInd + DX, xachse1(Y,DX,LaufInd1).
- yachse(X0,Y0,DY) :- /* Siehe X-Achse */
- line(X0,0,X0,31999,3),
- Parts = Y0 div DY, YSTART = Y0 - DY * PARTS, yachse1(X0,DY,YSTART).
- yachse1(_,_,LaufInd) IF LaufInd > 31999 AND !.
- yachse1(_,_,LaufInd) IF LaufInd < 0 AND !.
- yachse1(X,DY,LaufInd) :-
- XPlus = X + 600, cut_Koord(XPlus,NXPlus),
- XMinus = X - 600, cut_Koord(XMinus,NXMinus),
- line(NXPlus,LaufInd,NXMinus,LaufInd,3),
- LaufInd1 = LaufInd + DY, yachse1(X,DY,LaufInd1).
-
- setz_Punkt([],[],[],[]).
- setz_Punkt([HX|TX],[HY|TY],FXL,FYL) :-
- kreuz(HX,HY), mach_FehlerBalk_X(HX,HY,FXL,NFXL),
- mach_FehlerBalk_Y(HX,HY,FYL,NFYL),
- setz_Punkt(TX,TY,NFXL,NFYL).
- kreuz(X,Y) :-
- XPlus = X + 600, cut_Koord(XPlus,NXPlus), XMinus = X - 600,
- cut_Koord(XMinus,NXMinus), YPlus = Y + 600, cut_Koord(YPlus,NYPlus),
- YMinus = Y - 600, cut_Koord(YMinus,NYMinus),
- line(NXMinus,NYMinus,NXPlus,NYPlus,3),
- line(NXMinus,NYPlus,NXPlus,NYMinus,3).
-
- mach_FehlerBalk_X(_,_,[],[]).
- mach_FehlerBalk_X(X,Y,[HF|TF],TF) :-
- MaxX = X + HF, MinX = X - HF, cut_Koord(MaxX,NMaxX),
- cut_Koord(MinX,NMinX), line(NMinX,Y,NMaxX,Y,3), Yplus = Y + 400,
- YMinus = Y - 400, cut_Koord(YPlus,NYPlus), cut_Koord(YMinus,NYMinus),
- line(NMaxX,NYPlus,NMaxX,NYMinus,3), line(NMinX,NYPlus,NMinX,NYMinus,3).
- mach_FehlerBalk_Y(_,_,[],[]).
- mach_FehlerBalk_Y(X,Y,[HF|TF],TF) :-
- MaxY = Y + HF, MinY = Y - HF, cut_Koord(MaxY,NMaxY),
- cut_Koord(MinY,NMinY), line(X,NMinY,X,NMaxY,3), Xplus = X + 400,
- XMinus = X - 400, cut_Koord(XPlus,NXPlus), cut_Koord(XMinus,NXMinus),
- line(NXPlus,NMaxY,NXMinus,NMaxY,3), line(NXPlus,NMinY,NXMinus,NMinY,3).
- zeichne_Kurve([X1,X2],[Y1,Y2]) :- line(X1,Y1,X2,Y2,3) AND !.
- zeichne_Kurve([X1,X2|TX],[Y1,Y2|TY]) :-
- line(X1,Y1,X2,Y2,3), zeichne_Kurve([X2|TX],[Y2|TY]).
-
-
- /***************************************************************************/
- /* Daten - Editor & Mini-Parser */
- /***************************************************************************/
- domains
- Var_Name, Einheit = STRING
- predicates
- scanner(string,STRINGLIST) /* Zerpflueckt String zur String-Liste */
- make_Header(STRING,STRING) /* Kopfzeile vom Dateneditor */
- get_Part_2( INTEGER, STRING, STRING, STRING) /* Fuer Header */
- get_Part_3( CHAR, STRING, STRING, CHAR, STRING, STRING, STRING) /* dito */ /* des Header */
- fill_to(STRING,INTEGER,STRING) /* Fuellt String bis zu N Stellen auf */
- string_dollar(CHAR,INTEGER,STRING) /* Macht String aus N mal */
- /* einem Zeichen */
- edit_Daten(STRING) /* Daten zu einem Stichwort bearbeiten */
- hole_Eingabe_Daten(STRING,STRING) /* Holt Eingabedaten aus DATABASE */
- einfuegen_Eingabe_Daten(STRING,STRING) /* Einfuegen Eingabedaten in
- DATABASE */
- retract_first_Line(STRING,STRING)
- retract_empty_Lines(STRING,STRING) /* Leere Zeilen aus Eingabe
- rausschmeissen */
- retract_not_allowed(STRING,STRING) /* Nicht erlaubte Symbole raus */
- make_Bruch(STRING,STRING,STRING) /* Bruch aus Variable und Einheit */
- make_Part(STRING,STRING,STRING,INTEGER,STRING) /* Teil vom Header */
-
- clauses
- scanner("",[]) :- !.
- scanner(Str,Res) :- /* Fuer nur Leerstellen im String */
- NOT(fronttoken(Str,_,_)) AND ! AND scanner("",NRes), Res = NRes.
- scanner(Str,[Tok|Rest]):-
- fronttoken(Str,Sym,Str1), Tok = Sym, scanner(Str1,Rest).
-
- make_Header(StichW,Header) :-
- setup_Daten(StichW,Dim,NameX,EinhX,XFehl,NameY,EinhY,YFehl),
- make_Part("",NameX,EinhX,15,Part1),
- get_Part_2( Dim, NameY, EinhY, Part2),
- get_Part_3( XFehl, NameX, EinhX, YFehl,NameY, EinhY, Part3),
- concat(Part1,Part2,PartA), concat(PartA,Part3,Res),
- fill_to(Res,78,Line), concat(Line,"\n",Line_with_CR),
- Header = Line_with_CR.
-
- make_Bruch(Zaehler,Nenner,Bruch) :-
- concat(Zaehler,"/",Res1), concat(Res1,Nenner,Res2), Bruch = Res2.
-
- make_Part(FrontStr,Zaehler,Nenner,Stellen,Part) :-
- make_Bruch(Zaehler,Nenner,Bruch), concat(FrontStr,Bruch,Zeile),
- N_minus_2 = Stellen - 2, fill_to(Zeile,N_minus_2,NeuBruch),
- concat(NeuBruch,"| ",Res), Part = Res.
-
- get_Part_2(1,_,_,"").
- get_Part_2(2,Name,Einh,Res) :- make_Part("",Name,Einh,15,NRes), Res = NRes.
-
- get_Part_3( 'n',_,_,'n',_,_,"").
- get_Part_3( 'j',NameX,EinhX, 'n',_,_,Res) :-
- make_Part("Abs. Fehl. ",NameX,EinhX,23,Part), Res = Part.
- get_Part_3('n',_,_,'j',NameY,EinhY,Res) :-
- make_Part("Abs. Fehl. ",NameY,EinhY,23,Part), Res = Part.
- get_Part_3( 'j',NameX,EinhX, 'j',NameY,EinhY,Res) :-
- make_Part("Abs. Fehl. ",NameX,EinhX,23,Res1),
- make_Part("Abs. Fehl. ",NameY,EinhY,23,Res2), concat(Res1,Res2,NRes),
- Res = NRes.
-
- fill_to(RohString,Stellen,Res) :-
- str_len(RohString,Laenge) AND Laenge <= Stellen AND ! AND
- Blanks = Stellen - Laenge, string_dollar(' ',Blanks,BlankStr),
- concat(RohString,BlankStr,NRes), Res = NRes.
- fill_to(RohString,Stellen,Res) :-
- ! AND frontstr(Stellen,RohString,NRes,_), Res = NRes.
-
- string_dollar(_,0,"") :- !.
- string_dollar(_,Nr,_) :- /* Fuer "negative" Stringlaengen */
- Nr < 0 AND ! AND FAIL.
- string_dollar(Zeichen,Nr,Res) :-
- ! AND N1 = Nr - 1, string_dollar(Zeichen,N1,NRes),
- str_char(ZeichenStr,Zeichen), concat(ZeichenStr,NRes,NRes2),
- Res = NRes2.
-
- edit_Daten(StichW) :-
- hole_Eingabe_Daten(Stichw,StrRes),
- makewindow(126,7,7," Daten-Editor ",0,0,24,80),
- make_Header(StichW,Header), concat(Header,StrRes,EdZeile),
- editmsg(EdZeile,Res,"***** Bearbeitung der Daten *****","",
- ">>> Bitte vermeiden Sie es, die Kopfzeile zu zerstoeren <<<",
- 100,"MYED.HLP",_), retract_first_Line(Res,Aus),
- retract_empty_Lines(Aus,NRes), retract_not_allowed(NRes,NRes2),
- einfuegen_Eingabe_Daten(StichW,NRes2), removewindow.
-
- hole_Eingabe_Daten(StichW,Res) :-
- eingabe_daten(Stichw,Str) AND ! AND Res = Str.
- hole_Eingabe_Daten(_,"").
-
- einfuegen_Eingabe_Daten(StichW,Str) :-
- retract(eingabe_Daten(StichW,_)) AND ! AND /* schon vorhanden ? */
- assertz(eingabe_Daten(StichW,Str)).
- einfuegen_Eingabe_Daten(StichW,Str) :- assertz(eingabe_Daten(StichW,Str)).
- retract_first_Line(Ein,Aus) :-
- frontstr(1,Ein,Zeichen,Rest) AND Zeichen = "\n" AND ! AND Aus = Rest.
- retract_first_Line(Ein,Aus) :-
- frontstr(1,Ein,_,Rest) AND retract_first_Line(Rest,Res), Aus = Res.
- retract_empty_Lines(Ein,Aus) :-
- fronttoken(Ein,Tok,Rest) AND str_real(Tok,_) AND ! AND
- fronttoken(NRes,Tok,Rest), Aus = NRes.
- retract_empty_Lines(Ein,Aus) :-
- fronttoken(Ein,_,Rest), retract_empty_Lines(Rest,NRes), Aus = NRes.
- retract_not_allowed("","") :-!.
- retract_not_allowed(Ein,Aus) :-
- frontstr(1,Ein,Zeichen,Rest) AND Zeichen = "\n" AND ! AND
- retract_not_allowed(Rest,NRes), concat(Zeichen,NRes,NRes2),
- Aus = NRes2.
- retract_not_allowed(Ein,Aus) :-
- frontstr(1,Ein,Zeichen,Rest) AND Zeichen = " " AND ! AND
- retract_not_allowed(Rest,NRes), concat(Zeichen,NRes,NRes2),
- Aus = NRes2.
-
- retract_not_allowed(Ein,Aus) :-
- fronttoken(Ein,Tok,Rest),
- Tok <> "w" AND TOK <> "W" AND not(str_real(Tok,_)) AND ! AND
- retract_not_allowed(Rest,Nres), Aus = NRes.
- retract_not_allowed(Ein,Aus) :-
- fronttoken(Ein,Tok,Rest), retract_not_allowed(Rest,Nres),
- concat(Tok," ",NRes2), concat(NRes2,NRes,NRes3), Aus = NRes3.
-
- /***************************************************************************/
- /* Hauptprogramm */
- /***************************************************************************/
-
- predicates
- start
- hauptmenue
- option(INTEGER) /* Optionen des Hauptmenues */
- dV_Option(INTEGER) /* Optionen des Datenverwaltungsmenue */
- ja_nein(STRING,CHAR)
- fehler_Meldung(STRING)
- input_SetUp_Daten(STRING, INTEGER, STRING, STRING, CHAR,
- STRING, STRING, CHAR)
- frag_Stichwort(STRING)
- frag_Verteilung(INTEGER)
- frag_Variablen( INTEGER, STRING, STRING, CHAR, STRING, STRING, CHAR)
- frag_Var( STRING, STRING, STRING, CHAR)
- frag_Koord(REAL,REAL,REAL,REAL,REAL,REAL,REAL,REAL)
- frag_Ecken(REAL,REAL,REAL,REAL)
- frag_Aufteilung(REAL,REAL,REAL,REAL)
- make_Nr_Listen(STRING)
- constellation( INTEGER, CHAR, CHAR, STRINGLIST, STRINGLIST,
- STRINGLIST, STRINGLIST, STRINGLIST)
- einfuegen_Daten(STRING, REALLIST, REALLIST, REALLIST, REALLIST)
- replace_Ws(STRINGLIST,STRINGLIST)
- zeige_alle_Stichworte /* Zeigt in einem Fenster alle schon benutzten
- Stichworte */
- berechnung(STRING) /* Statistische Berechnung und Anzeige der zu einem
- Stichwort gehoerenden Groessen */
- graphik(STRING) /* graphische Darstellung von 2 dim. Verteilungen */
- schreibe_Berech(INTEGER,STRING,STRING,CHAR,REALLIST,REALLIST,
- STRING,STRING,CHAR,REALLIST,REALLIST)
- schreibe_Fehlermittel(CHAR,STRING,STRING,REALLIST)
- /* Aufteilung der Eingabe in Spalten */
- mache_2_Spalten(STRINGLIST,STRINGLIST,STRINGLIST)
- mache_3_Spalten(STRINGLIST,STRINGLIST,STRINGLIST,STRINGLIST)
- mache_4_Spalten(STRINGLIST,STRINGLIST,STRINGLIST,STRINGLIST,STRINGLIST)
-
- GOAL START.
-
- clauses
- start :-
- makewindow(1,112,0,"",24,0,1,80),
- FussZeileA = "ESC: Verlassen dieses Menue ",
- FussZeileB = "-- Pfeiltasten fuer Auswahl, ",
- FussZeileC = "RETURN zum Aktivieren.",
- concat( FussZeileA, FussZeileB, FussZeileD),
- concat( FussZeileD, FussZeileC, FussZeileGesamt),
- write(FussZeileGesamt),
- makewindow( 2, 112, 0, "", 24, 0, 1, 80),
- write("ESC: Ausgang Ctrl S: Unterbrechung der Ausgabe"),
- makewindow( 3, 7, 7,
- " STATISTIKHELFER: Dialogorientiertes Statistikprogramm ",
- 0 , 0, 24, 80),
- hauptmenue.
-
- hauptmenue :-
- menu( 1, 2, 3, 5, 30, " Hauptmenue ", ["Daten-Verwaltung",
- "Berechnung",
- "2 dim. Graphik "], Wahl),
- Option(Wahl) AND Wahl = 0 AND ! AND removewindow, removewindow.
- /***** Optionen des Hauptmenues *****/
- option(0) :- /* Ausgang */
- Message = "\nSie wollen das Programm verlassen. Sicher ? (j/n) : ",
- ja_nein(Message,Wahl), str_char(WahlStr,Wahl)
- AND member(WahlStr,["j","J"]) AND ! AND EXIT.
- option(1) :- /* Datenverwaltungsmenue */
- menu( 1, 2, 3, 5, 30, " Datenverwaltung",["Daten-Setup",
- "Bearbeiten Daten",
- "Speichern Sitzung",
- "Laden Sitzung"], Wahl),
- dV_Option(Wahl) AND Wahl = 0 AND ! AND FAIL.
- option(2) :- /* Berechnung */ frag_Stichwort(SW) AND berechnung(SW).
- option(3) :- /* graphische Darstellung */
- frag_Stichwort(SW) AND setup_Daten(SW,2,_,_,_,_,_,_) AND
- graphik(SW).
- option(_) :- ! AND hauptmenue. /* nix trifft zu */
-
- /***** Datenverwaltungsoptionen *****/
- dV_Option(0) :- ! AND hauptmenue.
- dV_Option(1) :- /* Daten-Setup */
- input_SetUp_Daten( STRING, Anzahl, NameX, EinhX, XFehlbek,
- NameY, EinhY, YFehlbek)
- AND ! AND
- assertz(setup_Daten( STRING, Anzahl,NameX, EinhX, XFehlbek,
- NameY, EinhY, YFehlbek)),
- option(1).
- dV_Option(1) :- /* Falls Fehler bei Setup */ ! AND option(1).
- dV_Option(2) :- /* Daten editieren */
- frag_Stichwort(SW) AND ! AND edit_Daten(SW),
- make_Nr_Listen(SW), option(1).
- dV_Option(2) :- /* Falls Fehler bei editieren */ ! AND option(1).
- dV_Option(3) :- /* Daten speichern */
- makewindow( 124, 120, 112, " Daten speichern ", 10, 9, 5, 62),
- nl, write("Unter welchem Namen sollen die Daten gespeichert werden ? "),
- nl, write("(Max. 8 Zeichen ! Abbruch Eingabe mit <ESC>) : "),
- readln(Wahl) AND ! AND removewindow,
- concat(Wahl,".DAT",Name), save(Name), option(1).
- dV_Option(3) :- /* Falls Fehler */ ! AND removewindow, option(1).
- dV_Option(4) :- /* Daten laden */
- makewindow( 124, 120, 112, " Daten laden ", 10, 9, 6, 62), nl,
- write(" IN DER FOLGENDEN AUSWAHL"), nl,
- write(" Datei mit Cursortasten und <RETURN> auswaehlen ."), nl,
- write(" Abbrechen mit ESC "), nl,
- write(" >>> Taste druecken <<<"), readchar(_),
- dir("","*.DAT",Wahl) AND ! AND removewindow, consult(Wahl),
- option(1).
- dV_Option(4) :- /* Falls Laden abgebrochen wurde */
- ! AND removewindow AND option(1).
- dV_Option(_) :- ! AND option(1).
-
- berechnung(SW) :- daten(SW,XL,YL,XFL,YFL),
- setup_Daten(SW,Dim,NameX,EinhX,XFehl,
- NameY,EinhY,YFehl)
- AND ! AND
- clearwindow,
- schreibe_Berech(Dim,NameX,EinhX,XFehl,XL,XFL,
- NameY,EinhY,YFehl,YL,YFL),
- nl,nl,nl, write(">>> Taste druecken <<<"),
- readchar(_).
- schreibe_Berech(1,NameX,EinhX,XFehl,XL,XFL,_,_,_,_,_) :- ! AND
- mittelwert(XL,XM),
- nl, nl, write("Mittelwert von ",NameX," : ",XM," ",EinhX),
- schreibe_Fehlermittel(XFehl,NameX,EinhX,XFL),
- standardabweichung(XL,XSTD),
- nl, nl,write("Standardabweichung von ",NameX," : "),
- write("σ = ",XSTD," ",EinhX).
- schreibe_Berech(2,NameX,EinhX,XFehl,XL,XFL,NameY,EinhY,YFehl,Yl,YFL) :- ! AND
- schreibe_Berech(1,NameX,EinhX,XFehl,XL,XFL,NameY,EinhY,YFehl,Yl,YFL),
- schreibe_Berech(1,NameY,EinhY,YFehl,YL,YFL,NameY,EinhY,YFehl,Yl,YFL),
- lineare_Regression(XL,YL,[Offset,Steigung]),
- nl, nl, write("Regressionsgleichung : "),
- write(NameY," = ",Steigung,EinhY,"/",EinhX,"*",NameX," + ",
- Offset,EinhY),
- regress_StandardAbweichung([Offset,Steigung],XL,YL,Sigma),
- nl, nl, write("Standardabweichung der Regressionsgrade : "),
- write("σ = ",Sigma,EinhY).
-
- schreibe_Fehlermittel('j',Name,Einh,FL) :-
- mittelwert(FL,F),
- nl, nl, write("Fehlermittel von ",Name," : ",F," ",Einh).
- schreibe_Fehlermittel('n',_,_,_). /* Fehlermittel nicht bekannt */
-
- graphik(SW) :-
- makewindow( 4, 120, 112, " Graphik-SetUp ", 10, 9, 5, 62),
- frag_Koord(Links,Rechts,Unten,Oben,X0,Y0,DX,DY),
- removewindow,
- daten(SW,XL,YL,XFL,YFL), transform_Koord(XL,Links,Rechts,IXL),
- transform_Koord(YL,Unten,Oben,IYL),
- transform_Koord_rel(XFL,Links,Rechts,IXFL),
- transform_Koord_rel(YFL,Unten,Oben,IYFL),
- lineare_Regression(XL,YL,KoeffL),
- horner(KoeffL,Links,LY), horner(KoeffL,Rechts,RY),
- transform_Koord([Links,Rechts],Links,Rechts,IRegXL),
- transform_Koord([LY,RY],Unten,Oben,IRegYL),
- transform_Koord([X0],Links,Rechts,[IX0]),
- transform_Koord_rel([DX],Links,Rechts,[IDX]),
- transform_Koord([Y0],Unten,Oben,[IY0]),
- transform_Koord_rel([DY],Links,Rechts,[IDY]),
- graphics(1,1,0),
- achsen(IX0,IY0,IDX,IDY), setz_Punkt(IXL,IYL,IXFL,IYFL),
- zeichne_Kurve(IRegXL,IRegYL), write(">>> Taste druecken <<<"),
- readchar(_), text.
-
- frag_Koord(Links,Rechts,Unten,Oben,X0,Y0,DX,DY) :-
- frag_Ecken(Links,Rechts,Unten,Oben),
- frag_Aufteilung(X0,Y0,DX,DY).
- frag_Ecken(Links,Rechts,Unten,Oben) :-
- clearwindow, nl , write("EINGABE DER KOORDINATENGRENZEN"),
- nl, write("Linke Grenze : "), readreal(L), Links = L,
- nl, write("Rechte Grenze : "), readreal(R), Rechts = R,
- nl, write("Untere Grenze : "), readreal(U), Unten = U,
- nl, write("Obere Grenze : "), readreal(O), Oben = O AND !.
- frag_Ecken(L,R,U,O) :- ! AND
- clearwindow, nl,
- write("***** Fehler bei Zahleingabe"), nl,
- write(">>> Taste druecken <<<"), clearwindow,
- frag_Ecken(NL,NR,NU,NO), L = NL, R = NR, U = NU, O = NO.
- frag_Aufteilung(X0,Y0,DX,DY) :-
- clearwindow, nl , write("EINTEILUNG KOORDINATENSYSTEM"), nl,
- write("X-Wert Schnittpunkt Koord.-Achsen : "), readreal(X), X0 = X, nl,
- write("Y-Wert Schnittpunkt Koord.-Achsen : "), readreal(Y), Y0 = Y,
- nl, write("Achsenteilung X : "), readreal(NDX), DX = NDX,
- nl, write("Achsenteilung Y : "), readreal(NDY), DY = NDY AND !.
- frag_Aufteilung(X,Y,DX,DY) :- ! AND
- clearwindow, nl,
- write("***** Fehler bei Zahleingabe"), nl,
- write(">>> Taste druecken <<<"), clearwindow,
- frag_Aufteilung(NX,NY,NDX,NDY), X = NX, Y = NY, DX = NDX, DY = NDY.
-
- ja_nein(Message,Wahl) :-
- write(Message), readchar(Zeichen), str_char(ZeichenStr,Zeichen),
- upper_lower(ZeichenStr,Low_Zeichen) AND member(Low_Zeichen,["j","n"])
- AND ! AND str_char(Low_Zeichen,Res), Wahl = Res.
- ja_nein(M,W) :- ! AND ja_nein(M,W). /* Solange wiederholen bis */
- /* richtiges Zeichen */
- fehler_Meldung(Message) :-
- makewindow( 5, 18, 135, "Fehlermeldung ",10, 10, 6, 60),
- cursor(3,18), write(">>> Taste druecken <<<"),
- cursor(0,1), write(Message),
- readchar(_) , removewindow AND !.
-
- input_SetUp_Daten( SW, Dimension, NameX, EinheitX, XFehl,
- NameY, EinheitY, YFehl) :-
- makewindow( 4, 120, 112, " Daten-SetUp ", 10, 9, 5, 62),
- frag_Stichwort(Wort) AND ! AND SW = Wort,
- frag_Verteilung(Dim), Dimension = Dim,
- frag_Variablen(Dimension, XName, XEinh, XFehlBek,
- YName, YEinh, YFehlBek),
- NameX = XName, EinheitX = XEinh, XFehl = XFehlbek,
- NameY = YName, EinheitY = YEinh, YFehl = YFehlbek,
- removewindow.
- input_SetUp_Daten(_,_,_,_,_,_,_,_) :- /* Fehler bei Setupdaten-Eingabe */
- ! AND removewindow and FAIL.
-
- frag_Stichwort(SW) :-
- zeige_alle_Stichworte,
- makewindow( 125, 120, 112, " Stichwort ", 10, 9, 5, 62),
- nl, write("Welches Stichwort bei der Datenverwaltung ? "),
- nl, write("(Abbruch Eingabe mit <ESC>) : "), readln(Wahl)
- AND ! AND removewindow, removewindow, SW = Wahl.
- frag_Stichwort("") :- /* Fehler bei Stichwortfrage */
- ! AND removewindow, removewindow AND FAIL.
-
- frag_Verteilung(Dimension) :-
- nl, write(" 1 oder 2 dim. Verteilung ? (1/2) : "), readchar(NrZeichen),
- str_char(NrZeichenStr,NrZeichen) AND member(NrZeichenStr,["1","2"])
- AND ! AND str_int(NrZeichenStr,Nr), Dimension = Nr, clearwindow.
- frag_Verteilung(Dim) :- /* Bei Fehler meckern und nochmal fragen */
- FehlertextA = " Fehler bei Eingabe der Dimension !",
- FehlertextB = "\n Nur 1 und 2 dim. Verteilungen moeglich !",
- concat(FehlertextA,FehlertextB,Fehlertext), fehler_Meldung(Fehlertext),
- frag_Verteilung(Dim).
-
- frag_Variablen(1,NameX, EinhX, FehlerX, "", "", 'n') :-
- frag_Var("X",Name,Einh,Fehler),
- NameX = Name, EinhX = Einh, FehlerX = Fehler.
- frag_Variablen(2,NameX, EinhX, FehlerX, NameY, EinhY, FehlerY) :-
- frag_Var("X",Name,Einh,Fehler),
- NameX = Name, EinhX = Einh, FehlerX = Fehler,
- frag_Var("Y",Name2,Einh2,Fehler2),
- NameY = Name2, EinhY = Einh2, FehlerY = Fehler2.
-
- frag_Var( Bezeich, Name, Einheit, Fehler_bekannt) :-
- nl, write(" Variablenname fuer ",Bezeich," : "), readln(Name_Wahl),
- Name = Name_Wahl, clearwindow, nl,
- write(" Einheit von ",Name," : "), readln(Einheit_Wahl),
- Einheit = Einheit_Wahl, clearwindow, nl,
- Fehlerfrage = " Fehler von bekannt ? (j/n) : ",
- ja_nein(Fehlerfrage,Res), Fehler_bekannt = Res, clearwindow.
-
- make_Nr_Listen(Stichw) :-
- setup_Daten(Stichw,AnzVar,_,_,XFehlBek,_,_,YFehlBek),
- eingabe_Daten(Stichw,Str),
- scanner(Str,StrListe),
- constellation(AnzVar,XFehlBek,YFehlBek,StrListe,XL,YL,XFL,YFL),
- replace_Ws(XL,XL2), replace_Ws(YL,YL2), replace_Ws(XFL,XFL2),
- replace_Ws(YFL,YFL2), convert_to_Nrs(XL2,XLNr),
- convert_to_Nrs(YL2,YLNr), convert_to_Nrs(XFL2,XFLNr),
- convert_to_Nrs(YFL2,YFLNr), einfuegen_Daten(StichW,XLNr,YLNr,XFLNr,YFLNr).
-
- /* Welche Konstellation beim SetUp */
- constellation(1,'n','n',StrL,StrL,[],[],[]).
- constellation(2,'n','n',StrL,XL,YL,[],[]) :-
- mache_2_Spalten(StrL,NeuXL,NeuYL), XL = NeuXL, YL = NeuYL.
- constellation(1,'j','n',StrL,XL,[],XFL,[]) :-
- constellation(2,'n','n',StrL,NeuXL,NeuXFL,_,_),
- XL = NeuXL, XFL = NeuXFL.
- constellation(2,'j','n',StrL,XL,YL,XFL,[]) :-
- mache_3_Spalten(StrL,NeuXL,NeuYL,NeuXFL),
- XL = NeuXL, YL = NeuYL, XFL = NeuXFL.
- constellation(2,'n','j',StrL,XL,YL,[],YFL) :-
- constellation(2,'j','n',StrL,NeuXL,NeuYL,NeuYFL,_),
- XL = NeuXL, YL = NeuYL, YFL = NeuYFL.
- constellation(2,'j','j',StrL,XL,YL,XFL,YFL) :-
- mache_4_Spalten(StrL,NeuXL,NeuYL,NeuXFL,NeuYFL),
- XL = NeuXL, YL = NeuYL, XFL = NeuXFL, YFL = NeuYFL.
-
- /* Aufteilung in Spalten */
- mache_2_Spalten([],[],[]).
- mache_2_Spalten([A,B|T],[A|TA],[B|TB]) :- mache_2_Spalten(T,TA,TB).
-
- mache_3_Spalten([],[],[],[]).
- mache_3_Spalten([A,B,C|T],[A|TA],[B|TB],[C|TC]) :-
- mache_3_Spalten(T,TA,TB,TC).
-
- mache_4_Spalten([],[],[],[],[]).
- mache_4_Spalten([A,B,C,D|T],[A|TA],[B|TB],[C|TC],[D|TD]) :-
- mache_4_Spalten(T,TA,TB,TC,TD).
-
- einfuegen_Daten(StichW,XL,YL,XFL,YFL) :-
- retract(daten(StichW,_,_,_,_)) AND ! AND
- assertz(daten(StichW,XL,YL,XFL,YFL)).
- einfuegen_Daten(StichW,XL,YL,XFL,YFL) :-
- assertz(daten(StichW,XL,YL,XFL,YFL)).
-
- /* Ersetzen der "W's" */
- replace_Ws([],[]) :- !.
- replace_Ws([F,"w"|T],[HRes|TRes]) :-
- ! AND replace_Ws([F|T],NRes), HRes = F, TRes = NRes.
- replace_Ws([F,"W"|T],[HRes|TRes]) :-
- ! AND replace_Ws([F|T],NRes), HRes = F, TRes = NRes.
- replace_Ws([H|T],[HRes|TRes]) :-
- ! AND replace_Ws(T,NRes), HRes = H, TRes = NRes.
-
- zeige_alle_Stichworte :-
- findall(SW,setup_Daten(SW,_,_,_,_,_,_,_),Res),
- makewindow( 120, 7, 7, " Vorhandene Stichworte ", 16, 9, 5, 62),
- write_list(5,Res).
-
-
-