home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1988 / 06_07 / analyse.pro next >
Encoding:
Prolog Source  |  1988-04-04  |  4.4 KB  |  110 lines

  1. /****************************************************************************/
  2. /*                               ANALYSE.PRO                                */
  3. /*                "Intelligente" Datenanalyse mit Turbo Prolog              */
  4. /*                    (C) 1988 M. Schlöter & PASCAL Int.                    */
  5.  
  6. DOMAINS file = f
  7.         t_Feld = STRING
  8.         t_Record = t_Feld*
  9.         t_Operator = STRING
  10.         t_OperatorL = t_Operator*
  11.         t_Vergleich = t_Feld*
  12.         t_VergleichL = t_Vergleich*
  13.         t_Bedingung = bedingung(t_OperatorL,t_VergleichL)
  14.         t_BedingungL = t_Bedingung*
  15.         
  16.                
  17.         
  18. DATABASE daten(t_Record)
  19.          treffer(t_Record)
  20.          strData(t_Feld)
  21.   
  22. PREDICATES clear_Daten
  23.            clear_Treffer
  24.            request_File(STRING)
  25.            read_Data(STRING)
  26.          read_Records(INTEGER)
  27.          read_One_Record(INTEGER,INTEGER)
  28.            einlesen
  29.          check_op(t_Feld,t_Operator,t_Vergleich)
  30.        check_Field(t_Feld,t_OperatorL,t_VergleichL)
  31.        check_Record(t_Record,t_BedingungL)
  32.        search(t_BedingungL)
  33.        strData_List(t_Record).
  34.        welche_Bedingung(t_BedingungL)
  35.         suchen
  36.   
  37. CLAUSES
  38.   clear_Daten :- daten(X), retract(daten(X)), fail.        /* Löschen Daten */
  39.   clear_Daten.
  40.   
  41.   clear_Treffer :- treffer(X), retract(treffer(X)), fail. /* Löschen Treffer*/ 
  42.   clear_Treffer.
  43.  
  44.   request_File(FileName) :- dir(".","*.*",FileName).   /* Dateiname erfragen */
  45.                               
  46.   read_Data(FileName) :- openread(f,FileName), readdevice(f),
  47.                          readint(FeldProRec),
  48.                          read_Records(FeldProRec),  
  49.                          readdevice(keyboard), closefile(f).
  50.                          
  51.   read_Records(NrFeld) :- not(eof(f)), !,                       
  52.                           read_One_Record(1,NrFeld), read_Records(NrFeld).
  53.   read_Records(_).
  54.                            
  55.   read_One_Record(N,NrFeld) :- N > NrFeld,!,
  56.                    strData_List(X), assertz(daten(X)).
  57.   read_One_Record(N,NrFeld) :- !, readln(Str), assertz(strData(Str)),
  58.                        N1 = N+1, read_One_Record(N1,NrFeld).
  59.                          
  60.   /* Hier für neue Operatoren erweitern */
  61.   check_op(_,"",_).                                 
  62.   check_op(Feld,"=",[Vergleich]) :- Feld = Vergleich.
  63.   check_op(Feld,"<>",[Vergleich]) :- Feld = Vergleich.
  64.   check_op(Feld,"<",[Vergleich]) :- Feld < Vergleich.
  65.   check_op(Feld,">",[Vergleich]) :- Feld > Vergleich.
  66.   check_op(Feld,"..",[Lower,Upper]) :- Feld >= Lower,
  67.                          Feld <= Upper.
  68.   
  69.   /* ODER-Verknüpfung zwischen zweiter und dritter Klausel ! */
  70.   check_Field(Feld,[Op],[]) :- check_op(Feld,Op,[]), !.
  71.   check_Field(Feld,[OpH|_],[VergleichH|_]):- check_op(Feld,OpH,VergleichH),!.
  72.   check_Field(Feld,[_|OpT],[_|VergleichT]):- check_Field(Feld,OpT,VergleichT).
  73.     
  74.   /* UND-Verknüpfung der Felder im Record ! */
  75.   check_Record([],[]):- !. /* Gesamter  Record ERFOLGREICH abgearbeitet ! */ 
  76.   check_Record([Feld|RestFelder],[bedingung(OpL,VergL)|RestBed]):-
  77.                                              check_Field(Feld,OpL,VergL), !, 
  78.                                              check_Record(RestFelder,RestBed).
  79.   
  80.   
  81.   search(BedingungL) :- daten(Rec), /* Neuer Datensatz */
  82.                         check_Record(Rec,BedingungL), assertz(treffer(Rec)),
  83.                         fail. /* Backtracking */
  84.   search(_). /* Ende Daten */
  85.   
  86.   suchen :-  welche_Bedingung(B), clear_Treffer, search(B).
  87.     
  88.   einlesen :- clear_Daten,
  89.               makewindow(1,7,7,"Datei wählen !",5,20,15,40), clearwindow,
  90.               request_File(Name), removewindow,
  91.               read_data(Name).
  92.       
  93.   strData_List([]) :- not(strData(_)),!. /* Database -> Liste */
  94.   strData_List([H|T]) :- strData(H),!,
  95.                          retract(strData(H)), strData_List(T).
  96.     
  97.   /* Bedingungs-Schablone: Feld 1 (Vorname)  = egal
  98.                            UND
  99.                            Feld 2 (Nachname) < "Mueller"
  100.                            UND
  101.                            Feld 3 (Alter)    < 27 ODER > 30
  102.   */
  103.   welche_Bedingung(X) :-
  104.     X = [ bedingung([ ""        ],  [                   ]),
  105.           bedingung([ "<"       ],  [ ["Mueller"]       ]),
  106.           bedingung([ "<" , ">" ],  [ ["27"] , ["30"]   ])
  107.         ] .
  108.          
  109. GOAL einlesen,suchen,!,
  110.      treffer(X),write(X),nl,fail. /* "treffer" mit backtracking ausgeben. */