1

文件流操作PROLOG

我正在开发一个基于案例的学术建议推理子系统,该子系统能够获取新的学生档案(成绩单)并将其与 student_profiles 数据库进行比较,以便在不完全匹配的情况下找到最佳匹配。

我仍然不太熟悉这种语言,我试图打开一个文件并提取一个特定的谓词让我们说

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

位于student.pl.

一旦我从 .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).

我已经寻找有关如何提取术语并将其用于进一步处理的示例,但我没有运气(或者我可能没有使用正确的术语)。

任何帮助将不胜感激。

4

1 回答 1

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

然后你可以使用 member/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)).
于 2012-04-02T19:28:51.450 回答