2012-04-02 69 views
1

文件流操作PROLOGPROLOG文件流操作;處理

我工作的學術建議,一個基於案例推理 子系統項提取 能夠採取新的學生檔案(副本) 並將其與student_profiles數據庫在 爲了找到最佳匹配,如果不是完全匹配。

我仍然不是很熟悉的語言和 我試圖打開一個文件,並提取 一個明確的始發假設

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

這是在student.pl找到。

一旦我從特等文件中提取的謂語,我希望能夠 將其分配給一個變量,並把它分解 這樣我就可以提取的第一個參數(在這種情況下L1)以 做一些計算。

這是我到目前爲止有:
我已經打開了文件,我能看到學生的個人資料或成績單發現謂詞 的完整列表。

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). 

我已經看過了如何提取一個術語,用它作進一步處理的例子,但我有 沒有運氣(或者也許我沒有使用正確的術語)。

任何幫助將不勝感激。

回答

1

load謂語應該「迴歸」列表中讀取,或assertz它緩存,以備後用...

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

然後就可以使用會員/ 2,以匹配加載列表中的一些記錄..

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

但是有一個更簡單的方法:consult該文件並直接查詢數據。

load :- consult('h:/AAS/Novel_Profiles/vivian.pl'). 

這兩種方法(閱讀或諮詢)都要求您的文件在語法上是正確的。您的Prolog會通知您該文件可能存在的任何問題。

後成功協商,每個事實(或規則)就可以使用了...

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

感謝您的快速反應,會是這樣的情況,如果我想查詢相同的程序將適用程序內的數據?就像在關閉流member_sp(StudentPred,StudentData)之前添加類似的東西,當然在底部定義這樣的東西? – user1308665 2012-04-02 22:59:25

+0

是的,像Prolog這樣的解釋器使用REPL(Read,Eval,Print,Loop)作爲程序開發的一般方法。 – CapelliC 2012-04-03 05:45:25

+0

謝謝你的幫助,我還想問一件事。這看起來很簡單,但我不太明白。一旦我讀完文件;我需要的數據有一個複合項的形式:[student_predicate([2d vector],vivian,[taken(courses),...],[])| _A]。有沒有什麼方法可以將術語的結構放下來,並分配給各個變量進行處理,如:V = [Vector],Name = vivian,Courses = [taken(courses),...],Recommendations = [] ?我想從一個腳本中完成。我一直在尋找(unvi)= ../2和functor/3 – user1308665 2012-04-04 06:02:17