关于使用流在Prolog中读取文件的一些疑问

关于使用流在Prolog中读取文件的一些疑问,prolog,Prolog,我怀疑这个简单的Prolog程序是如何工作的,它从文件中读取字符并将这些字符放入列表中 代码运行良好,如下所示: readFile(FileInput, TextList):- open(FileInput, read, Stream), readCharacter(Stream, TextList), close(Stream),

我怀疑这个简单的Prolog程序是如何工作的,它从文件中读取字符并将这些字符放入列表中

代码运行良好,如下所示:

readFile(FileInput, TextList):- open(FileInput, read, Stream),
                                readCharacter(Stream, TextList),
                                close(Stream),
                                !.


readCharacter(Stream,[]):- at_end_of_stream(Stream).    % Exit condition


readCharacter(Stream,[Char|Tail]):- get0(Stream,Char),
                                    readCharacter(Stream,Tail).
readFile/2谓词为时,调用发生:输入传递的文件在读取模式下打开,并且该文件与流相关联

然后调用readCharacter/2谓词,该谓词获取与我的输入文件(要读取的文件)关联的流,并调用TextList,该列表是放置文件内容的列表

readCharacter/2谓词它分为两种情况:

1) 在流(stream)的结尾处使用谓词的退出条件,在读取流的最后一个字符(即文件中的最后一个字符)后成功。在本例中,不执行任何操作,readCharacter谓词结束

2) 第二种情况是添加一个读取字符并将其添加到我的文本列表中的规则:

readCharacter(Stream,[Char|Tail]):- get0(Stream,Char),
                                    readCharacter(Stream,Tail).
这里我有一个疑问:它使用get0从流中读取一个字符,并将其放在列表的开头(作为列表的第一个元素)…那么…为什么列表不包含文件内容的相反部分呢

i、 e

我有一个名为myFile.txt的文件,其中包含以下文本:abc

所以readCharacter首先从流中读取a字符,并将其放在列表的开头,这样我就有了:

TextList=[a]

然后readCharacter从流中读取b字符,并将其放在我拥有的列表的开头:

TextList=[b,a]

然后readCharacter从流中读取c字符,并将其放在我拥有的列表的开头:

TextList=[c,b,a]

如果是这样,TextList应该包含myFile.txt文件的反向内容,但在我看来,TextList以相同的顺序包含myFile.txt文件的相同内容

为什么??我错过了什么?我的推理有什么错

readCharacter(Stream,[Char|Tail]):-
    get0(Stream,Char),
    readCharacter(Stream,Tail).
所以你有你的流,你从中得到一个字符,并用Char统一它。您的尾部有一个尚未初始化的列表。然后将流(现在一个字符消失)和尾部传递给递归调用
readCharacter
。冲洗并重复,直到流在文件末尾

关键是:
[Char | Tail]
意味着Char是结果列表的头,或者换句话说,在列表中的所有其他内容之前

如果您对此进行跟踪,您将看到在调用
get0(Char)
时,Char是如何与文件中的字符的代码按照它们在文件中的顺序统一起来的,但在递归调用
readCharacter
时会消失

然后,当您退出递归时,从
get0
获得的字符代码神奇地重新出现在
readCharacter
的第二个参数中,在读取它们的调用退出时,每个字符在尾部的所有字符之前(根据
[Char | Tail]
,应该是这样)


基本上,你的推理有什么问题(在这里和其他问题中)是因为你太努力地把你的期望强加在你所看到的东西上,而不是接受你所观察到的东西,并试图识别你所观察到的东西中的逻辑。序言和所有其他人造的东西一样,大部分时间都遵循一定的逻辑。

你是对的,这并不困难。不幸的是,我花了整个时间今天晚上我在办公室里,我很开心melted@false这是一个相当愚蠢的问题,然后是我不必要的愚蠢回答。原始问题使用
get0/1