如何使用Prolog中的read谓词读取.txt文件中的所有Prolog谓词?

如何使用Prolog中的read谓词读取.txt文件中的所有Prolog谓词?,prolog,Prolog,我正在使用SWI Prolog学习Prolog。考虑一下我有一个名为 MyField.txt的文件,其中包含以下内容: line1. line2. line3. 现在,我尝试创建一个谓词,使用read谓词必须读取此文件的内容,我创建了以下谓词: readFileSee(InputFile) :- seeing(OldStream), see(InputFile), read(Term),

我正在使用SWI Prolog学习Prolog。考虑一下我有一个名为<强> MyField.txt<强>的文件,其中包含以下内容:

line1.
line2.
line3.
现在,我尝试创建一个谓词,使用read谓词必须读取此文件的内容,我创建了以下谓词:

readFileSee(InputFile) :- seeing(OldStream),
                          see(InputFile),
                          read(Term),
                          write(Term),
                          seen,
                          see(OldStream).
问题是,当我执行这个程序时,我只得到第一行。例如,如果我启动此语句,我将获得:

?- readFileSee('/home/andrea/Documenti/prolog/lezione6/project/myFile.txt').
line1
true.
谓词读序言词,但为什么只读第一个词?我该怎么做才能让它读取文件中包含的所有条款?我可以用谓词吗?

你可以用repeat:

readFileSee(InputFile) :- seeing(OldStream),
                          see(InputFile),
                          repeat,
                          read(Term),
                          ( Term == end_of_file -> true ; 
                            write(Term), fail
                          ),
                          seen,
                          see(OldStream).

该手册声称,
read
读取下一个术语,而不是文件中的所有术语。我看不出你在循环中调用read或任何东西,你只调用它一次。为什么你会期望它读不止一个术语?!?嗯,我理解你的推理,但这似乎不起作用,因为当我通过文本文件执行它时,查询只对我作出正确的响应,但在序言外壳中写入任何术语查看跟踪似乎是因为术语被迫成为文件的结尾,但我不确定这一点OK,我很确定问题在于当你说:Term==end\u of_of_file->true;它将术语与\u文件的结尾统一在一起,强制使谓词的结果为真并防止回溯…因为如果我在执行我的行时删除这一行,我会在shell上说\u文件的无限结尾(当它读取字符串并在文件的结尾之后…),但如何避免这种情况?(==)/2故意不统一。重复/0必须以某种方式停止,我已经测试过,似乎有效…您是否使用SWI Prolog?我知道A==B是检查A是否等于B但不统一的运算符…现在我用这种方式解决了:(Term==end\u of_file)->true;(如果我在我的SWI Prolog UNIFED上输入int而不使用(),则将\u文件的Term==end放入()中!!!这很奇怪…您使用SWI Prolog或其他Prolog解释吗?