0

ファイルから文字を読み取り、これらの文字をリストに入れるこの単純な 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 ファイルの同じ内容が同じ順序で含まれているように思えます。

なんで?私は何が欠けていますか?私の推論のどこが間違っているのでしょうか?

4

1 に答える 1

1
readCharacter(Stream,[Char|Tail]):-
    get0(Stream,Char),
    readCharacter(Stream,Tail).

Streamがあるので、そこから文字を取得し、それをCharと統合します。Tailにまだ初期化されていないリストがあります。次に、 Stream (現在は 1 文字が削除されています) とTailを の再帰呼び出しに渡しreadCharacterます。ストリームがファイルの終わりになるまで、すすいで繰り返します。

要点は、これはCharが結果のリストの先頭にあること、つまり、リスト内の他のすべての前に[Char|Tail]あることを意味するということです。

これをトレースすると、 を呼び出すと、ファイル内の文字のコードとCharがファイル内の順序でどのように統合されるかがわかりますが、再帰的get0(Char)に呼び出すと消えます。readCharacter

次に、再帰を終了すると、から取得した文字コードがget0魔法のように の 2 番目の引数に再表示されreadCharacterます。それらが読み取られた呼び出しの終了時に、各CharがTailのすべての前に表示されます ( [Char|Tail].

基本的に、あなたの推論 (ここや他の質問) の間違っているところは、あなたが観察したものの論理を受け入れて認識しようとするのではなく、あなたが見たものに期待を押し付けようとすることです. プロローグは、他のすべての人工物と同様に、ほとんどの場合、特定のロジックに従います。

于 2013-04-23T15:20:33.433 に答える