File PROLOG文件流操作;用于处理的术语提取

File PROLOG文件流操作;用于处理的术语提取,file,stream,io,prolog,term,File,Stream,Io,Prolog,Term,文件流操作PROLOG 我正在研究基于案例的推理 学术咨询子系统,即 能够获取新的学生档案(成绩单) 并将其与中的学生档案数据库进行比较 如果不是精确匹配,则查找最佳匹配 我还不太熟悉这门语言和语言 我正在尝试打开一个文件并解压缩 比如说,一个特定的谓词 student_profile/4 : student_profile(L1, name, L2, L3) 可在student.pl中找到 从.pl文件中提取谓词后,我希望 能够将其分配给变量并拆分 因此,我可以将第一个参数(在本例中为L1)

文件流操作PROLOG

我正在研究基于案例的推理 学术咨询子系统,即 能够获取新的学生档案(成绩单) 并将其与中的学生档案数据库进行比较 如果不是精确匹配,则查找最佳匹配

我还不太熟悉这门语言和语言 我正在尝试打开一个文件并解压缩 比如说,一个特定的谓词

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).
我已经寻找了一些关于如何提取一个术语并将其用于进一步处理的示例,但我已经找到了 没有运气(或者可能我没有使用正确的术语)


任何帮助都将不胜感激。

您的
加载
谓词应“返回”读取的列表,或使用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)).
但是有一种更简单的方法:
查阅文件并直接查询数据

load :- consult('h:/AAS/Novel_Profiles/vivian.pl').
这两种方法(读取或查阅)都要求文件的语法正确。您的序言将通知您该文件可能存在的任何问题

咨询成功后,每个事实(或规则)都可以使用

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

您的
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)).
但是有一种更简单的方法:
查阅文件并直接查询数据

load :- consult('h:/AAS/Novel_Profiles/vivian.pl').
这两种方法(读取或查阅)都要求文件的语法正确。您的序言将通知您该文件可能存在的任何问题

咨询成功后,每个事实(或规则)都可以使用

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

感谢您的快速回复,如果我想从程序中查询数据,是否会采用相同的程序?在关闭流成员_sp(StudentPred,StudentData)之前添加这样的内容,当然在底部定义这样的内容吗?是的,像Prolog这样的解释器使用REPL(Read,Eval,Print,Loop)作为程序开发的通用方法。感谢您的帮助,我想再问一件事。这可能看起来很简单,但我不太明白。一旦我读了文件;我需要的数据是复合词的形式:[学生谓词([2d向量]、vivian、[选修(课程),…]、[])|a]。是否有任何方法可以将术语的结构分解并分配给各个变量进行处理,如:V=[Vector],Name=vivian,Courses=[take(Courses),…],Recommendations=[]?我想在脚本中执行此操作。我一直在研究(unvi)=../2和functor/3univ,它是分解术语的更简单的方法,但很多时候这种“分解”是在子句级别完成的。模式匹配(即选择要应用的子句)是数据驱动的,并允许您控制如何使用数据。对不起,我不太明白你的最后一个问题。。。拆解学生档案后,您将执行什么操作?你将失去上下文…我的计划是,一旦我分解了student_配置文件,就使用第一个参数计算欧氏距离,并将其与student配置文件数据库(另一个包含47个类似谓词的文件)进行比较,以找到最接近的匹配项并检索类似的student配置文件。我遇到的问题是,一旦我阅读了该文件,我就不知道如何从该文件中提取特定谓词(student_profile/4)。除了vivian之外,我还会用其他几个个人资料重复这个过程,我正在制定这样做的程序。我很确定这是一件非常简单的事情。感谢您的快速响应,如果我想从程序中查询数据,是否会采用相同的过程?在关闭流成员_sp(StudentPred,StudentData)之前添加这样的内容,当然在底部定义这样的内容吗?是的,像Prolog这样的解释器使用REPL(Read,Eval,Print,Loop)作为程序开发的通用方法。感谢您的帮助,我想再问一件事。这可能看起来很简单,但我不太明白。一旦我读了文件;我需要的数据是复合词的形式:[学生谓词([2d向量]、vivian、[选修(课程),…]、[])|a]。是否有任何方法可以将术语的结构分解并分配给各个变量进行处理,如:V=[Vector],Name=vivian,Courses=[take(Courses),…],Recommendations=[]?我想在脚本中执行此操作。我一直在研究(unvi)=../2和functor/3univ,它是分解术语的更简单的方法,但很多时候这种“分解”是在子句级别完成的。模式匹配(即选择要应用的子句)是数据驱动的,并允许您控制如何使用数据。对不起,我不太明白你的最后一个问题。。。拆解学生档案后,您将执行什么操作?你将失去上下文…我的计划是,一旦我分解了student_配置文件,就使用第一个参数计算欧氏距离,并将其与student配置文件数据库(另一个包含47个类似谓词的文件)进行比较,以找到最接近的匹配项并检索类似的student配置文件。我遇到的问题是,一旦我阅读了该文件,我就不知道如何从该文件中提取特定谓词(student_profile/4)。除了vivian之外,我还会用其他几个个人资料重复这个过程,我正在制定这样做的程序。我敢肯定这件事很简单。。