2012-04-02 74 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