SWI-Prolog を使用することにコミットしている場合は、より単純なケースでテキストを操作するために文字列を使用できます。この場合、たとえば、を使用してストリームからファイルを読み取りIn
(質問にあるように) read_string/3
、 を使用してその中の部分文字列のすべての出現位置を見つけるだけで十分sub_string/5
です。
setup_call_cleanup(open(File, read, In),
read_string(In, _, File_contents),
close(In)),
sub_string(File_contents, Pos, _Length, _After, Substr)
それでおしまい。Pos
の 0 ベースの位置になりSubstr
ます。文字を検索するには、長さ 1 の文字列を使用するだけです。最も優れている点の 1 つは、sub_string/5
部分的に重複する部分文字列を正しく処理できることです。
?- sub_string("banana", Pos, _, _, "ana").
Pos = 1 ;
Pos = 3 ;
false.
のより標準的な対応物sub_string/5
はsub_atom/5
で、セマンティクスは と同じですsub_string/5
が、アトムを取ります。すべての Prolog 実装で利用できるはずです。
?- sub_atom(banana, Pos, _, _, ana).
Pos = 1 ;
Pos = 3 ;
false.
ファイル全体をコードに読み取った後、 と を使用するだけatom_codes/2
ですsub_atom/5
。ただし、これは少し無駄です。
ファイルの内容でより複雑なことをしなければならなくなったら、DCG などの使用に移ることができます。通常は不要なlibrary(pio)
読み取りプリミティブの使用に戻ります。get_char
ただし、上記でリンクした文字列に関するマニュアルのセクションを読むことを強くお勧めします。