ファイルから文字を読み取り、これらの文字をリストに入れるこの単純な 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述語が呼び出されると、入力が渡されたファイルが読み取りモードで開かれ、そのファイルがストリームに関連付けられます。
次に、入力ファイル (読み取るファイル) に関連付けられた Stream と、ファイルの内容を格納するリストであるTextListを受け取る readCharacter/2述語を呼び出します。
readCharacter/2述語は、次の 2 つの場合に分けられます。
1)ストリームの最後の文字 (ファイルの最後の文字) が読み取られた後に成功するat_end_of_stream(Stream)述語を使用する終了条件。この場合、何もせず、readCharacter述語が終了します。
2) 2 番目のケースは、読み取り文字を追加してTextListに追加するこのルールです。
readCharacter(Stream,[Char|Tail]):- get0(Stream,Char),
readCharacter(Stream,Tail).
そして、ここで疑問があります。get0を使用してストリームから文字を読み取り、それをリストの先頭に(リストの最初の要素として)配置します...だから...なぜリストに逆が含まれないのですかファイルの内容?
すなわち
次のテキストを含むmyFile.txtというファイルがあります: abc
したがって、 readCharacter は最初に Stream から文字を読み取り、それをリストの先頭に配置するので、次のようになります。
TextList = [a]
次に、readCharacterはストリームからb文字を読み取り、それをリスト si の先頭に入れます。
TextList = [b,a]
次に、readCharacterはストリームからc文字を読み取り、それをリスト si の先頭に入れます。
TextList = [c,b,a]
その場合、TextList には myFile.txt ファイルの逆の内容が含まれているはずですが、TextList には myFile.txt ファイルの同じ内容が同じ順序で含まれているように思えます。
なんで?私は何が欠けていますか?私の推論のどこが間違っているのでしょうか?