home *** CD-ROM | disk | FTP | other *** search
Prolog Source | 1988-04-04 | 4.4 KB | 110 lines |
- /****************************************************************************/
- /* ANALYSE.PRO */
- /* "Intelligente" Datenanalyse mit Turbo Prolog */
- /* (C) 1988 M. Schlöter & PASCAL Int. */
-
- DOMAINS file = f
- t_Feld = STRING
- t_Record = t_Feld*
- t_Operator = STRING
- t_OperatorL = t_Operator*
- t_Vergleich = t_Feld*
- t_VergleichL = t_Vergleich*
- t_Bedingung = bedingung(t_OperatorL,t_VergleichL)
- t_BedingungL = t_Bedingung*
-
-
-
- DATABASE daten(t_Record)
- treffer(t_Record)
- strData(t_Feld)
-
- PREDICATES clear_Daten
- clear_Treffer
- request_File(STRING)
- read_Data(STRING)
- read_Records(INTEGER)
- read_One_Record(INTEGER,INTEGER)
- einlesen
- check_op(t_Feld,t_Operator,t_Vergleich)
- check_Field(t_Feld,t_OperatorL,t_VergleichL)
- check_Record(t_Record,t_BedingungL)
- search(t_BedingungL)
- strData_List(t_Record).
- welche_Bedingung(t_BedingungL)
- suchen
-
- CLAUSES
- clear_Daten :- daten(X), retract(daten(X)), fail. /* Löschen Daten */
- clear_Daten.
-
- clear_Treffer :- treffer(X), retract(treffer(X)), fail. /* Löschen Treffer*/
- clear_Treffer.
-
- request_File(FileName) :- dir(".","*.*",FileName). /* Dateiname erfragen */
-
- read_Data(FileName) :- openread(f,FileName), readdevice(f),
- readint(FeldProRec),
- read_Records(FeldProRec),
- readdevice(keyboard), closefile(f).
-
- read_Records(NrFeld) :- not(eof(f)), !,
- read_One_Record(1,NrFeld), read_Records(NrFeld).
- read_Records(_).
-
- read_One_Record(N,NrFeld) :- N > NrFeld,!,
- strData_List(X), assertz(daten(X)).
- read_One_Record(N,NrFeld) :- !, readln(Str), assertz(strData(Str)),
- N1 = N+1, read_One_Record(N1,NrFeld).
-
- /* Hier für neue Operatoren erweitern */
- check_op(_,"",_).
- check_op(Feld,"=",[Vergleich]) :- Feld = Vergleich.
- check_op(Feld,"<>",[Vergleich]) :- Feld = Vergleich.
- check_op(Feld,"<",[Vergleich]) :- Feld < Vergleich.
- check_op(Feld,">",[Vergleich]) :- Feld > Vergleich.
- check_op(Feld,"..",[Lower,Upper]) :- Feld >= Lower,
- Feld <= Upper.
-
- /* ODER-Verknüpfung zwischen zweiter und dritter Klausel ! */
- check_Field(Feld,[Op],[]) :- check_op(Feld,Op,[]), !.
- check_Field(Feld,[OpH|_],[VergleichH|_]):- check_op(Feld,OpH,VergleichH),!.
- check_Field(Feld,[_|OpT],[_|VergleichT]):- check_Field(Feld,OpT,VergleichT).
-
- /* UND-Verknüpfung der Felder im Record ! */
- check_Record([],[]):- !. /* Gesamter Record ERFOLGREICH abgearbeitet ! */
- check_Record([Feld|RestFelder],[bedingung(OpL,VergL)|RestBed]):-
- check_Field(Feld,OpL,VergL), !,
- check_Record(RestFelder,RestBed).
-
-
- search(BedingungL) :- daten(Rec), /* Neuer Datensatz */
- check_Record(Rec,BedingungL), assertz(treffer(Rec)),
- fail. /* Backtracking */
- search(_). /* Ende Daten */
-
- suchen :- welche_Bedingung(B), clear_Treffer, search(B).
-
- einlesen :- clear_Daten,
- makewindow(1,7,7,"Datei wählen !",5,20,15,40), clearwindow,
- request_File(Name), removewindow,
- read_data(Name).
-
- strData_List([]) :- not(strData(_)),!. /* Database -> Liste */
- strData_List([H|T]) :- strData(H),!,
- retract(strData(H)), strData_List(T).
-
- /* Bedingungs-Schablone: Feld 1 (Vorname) = egal
- UND
- Feld 2 (Nachname) < "Mueller"
- UND
- Feld 3 (Alter) < 27 ODER > 30
- */
- welche_Bedingung(X) :-
- X = [ bedingung([ "" ], [ ]),
- bedingung([ "<" ], [ ["Mueller"] ]),
- bedingung([ "<" , ">" ], [ ["27"] , ["30"] ])
- ] .
-
- GOAL einlesen,suchen,!,
- treffer(X),write(X),nl,fail. /* "treffer" mit backtracking ausgeben. */