2012-04-02 5 views
1

Datei-Stream-Manipulation PROLOGPROLOG File Stream Manipulation; Termextraktion für die Verarbeitung

ich auf einem fallbasierten Subsystem gerade arbeitete für akademische, dass die Beratung ist die Lage, ein neues Schüler-Profil zu nehmen (Transkript) und vergleichen Sie es mit Datenbank von student_profiles in um die beste Übereinstimmung zu finden, wenn nicht die genaue Übereinstimmung.

Ich bin immer noch nicht sehr vertraut mit der Sprache und ich eine Datei zu öffnen versucht und extrahieren eine spezifische Prädikat des

student_profile/4 : student_profile(L1, name, L2, L3) 

sagen lassen, die in student.pl gefunden wird.

Sobald ich das Prädikat aus der .pl-Datei extrahiert haben, möchte ich der Lage sein, es zu einer Variablen zuzuweisen und spaltete es so kann ich das erste Argument extrahieren (in diesem Fall L1) zu einige Berechnungen . Diese

ist, was ich habe, so weit:
Ich habe die Datei geöffnet, und ich bin in der Lage, die gesamte Liste von Prädikaten sehen in dem Schüler-Profil oder Transkript gefunden.

load :- open('h:/AAS/Novel_Profiles/vivian.pl', read, Stream), 
     read(Stream, X), 
     read_data(Stream, X, StudentP), 
     write(StudentP), 
     close(Stream). 

read_data(_Stream, end_of_file, []) :- !. 

read_data(Stream, X, [X|StudentP]) :- 
    read(Stream, Y), 
    read_data(Stream, Y, StudentP). 

Ich habe Beispiele zusehen, wie ein Begriff zu extrahieren und für die weitere Verarbeitung verwendet werden, aber ich habe kein Glück hatte (oder vielleicht ist ich mit der richtigen Terminologie nicht).

Jede Hilfe würde sehr geschätzt werden.

Antwort

1

Ihr load Prädikat sollte ‚Rückkehr‘ der Liste zu lesen, oder Cache mit assertz, für die spätere Verwendung ...

load(StudentData) :- open('h:/AAS/Novel_Profiles/vivian.pl', read, Stream), 
     read(Stream, X), 
     read_data(Stream, X, StudentData), 
     write(StudentP), 
     close(Stream). 

dann können Sie verwenden, Mitglied/2 eine Aufzeichnung in loaded Liste übereinstimmen .. .

?- load(L), 
    member(student_profile(Student, vivian, L2, L3), L), 
    writeln(vivian(Student, L2, L3)). 

Aber es gibt einen einfacheren Weg: consult die Datei und die Daten direkt abfragen.

Beide Methoden (lesen oder konsultieren), erfordern Ihre Datei syntaktisch korrekt. Ihr Prolog wird Sie über jedes Problem informieren, das die Datei haben könnte.

Nach einem erfolgreichen konsultieren, jede Tatsache (oder Regel) einsatzbereit ist ...

?- student_profile(Student, vivian, L2, L3), 
    writeln(vivian(Student, L2, L3)). 
+0

Vielen Dank für Ihre schnelle Antwort, wäre es der Fall sein, dass das gleiche Verfahren gilt, wenn ich abfragen mag die Daten aus dem Programm? So etwas vor dem Schließen des Streams member_sp (StudentPred, StudentData) hinzufügen und natürlich unten definieren? – user1308665

+0

Ja, Interpreter wie Prolog verwenden REPL (Read, Eval, Print, Loop) als eine allgemeine Methode für die Programmentwicklung. – CapelliC

+0

Danke für deine Hilfe, nur noch eine Sache, die ich gerne stellen würde. Es mag sehr einfach erscheinen, aber ich verstehe es nicht ganz. Sobald ich die Datei gelesen habe; Die Daten, die ich brauche, haben die Form eines zusammengesetzten Begriffs: [Student_Predicate ([2d Vektor], Vivian, [genommen (Kurse), ...], []) | _A].Gibt es eine Möglichkeit, dass die Struktur des Begriffs heruntergebrochen und einzelnen Variablen zur Verarbeitung zugewiesen werden kann, wie: V = [Vektor], Name = vivian, Kurse = [genommen (Kurse), ...], Empfehlungen = [] ? Ich möchte dies innerhalb eines Skripts tun. Ich habe mir die (unvi) = ../2 und funktor/3 – user1308665