我正在进行基于案例的推理学术咨询子系统能够获取新的学生档案(成绩单)并将其与中的studentprofiles数据库进行比较以便在不完全匹配的情况下找到最佳匹配。
我仍然不太熟悉这种语言我试图打开一个文件并提取一个特定的谓词,比如
student_profile/4 : student_profile(L1, name, L2, L3)
发现于CCD_ 1中。
从.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).
我一直在寻找如何提取一个术语并将其用于进一步处理的例子,但我运气不佳(或者可能我没有使用正确的术语)。
您的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)).