home *** CD-ROM | disk | FTP | other *** search
Prolog Source | 1989-10-25 | 2.9 KB | 76 lines |
- 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)
- predicates
- clear(dbasedom); request_File(string)
- read_Data(string); read_Records(integer);
- read_One_Record(integer,integer,t_Record)
- 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)
- welche_Bedingung(t_BedingungL); suchen
- clauses
- clear(X):- retract(X),fail. /* Löschen */
- clear(_).
-
- request_File(Filename):- dir(".","*.tst",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,X),
- assertz(daten(X)),read_Records(NrFeld).
- read_Records(_).
-
- read_One_Record(N,NrFeld,[]):- N>NrFeld.
- read_One_Record(N,NrFeld,[Str|T]):- !,readln(Str),N1=N+1,
- read_One_Record(N1,NrFeld,T).
-
- /* 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.
- search(_). /* Ende der 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).
-
- welche_Bedingung(X):- X=[bedingung([".."],[["G","Süü"]]),
- bedingung([""],[]),
- bedingung(["<"],[["50"]])].
-
- goal
- einlesen,suchen,!,treffer(X),write(X),nl,fail.
-