2012-03-15 8 views
0

ファイルを読み込んで、すべての行に単語をリストとして保存したいと考えています。これは私のコードです:Amzi Prolog Tokenize

main :- 
open('sample.txt', read, Str), 
read_file(Str,Lines), 
close(Str), 
write(Lines), nl. 

read_file(Stream,[]) :- 
at_end_of_stream(Stream). 

append1([H|T],Old_list,New_list):- 
New_List = [H|Old_list], 
write(New_List), 
append1(T,New_List,New_list). 

read_file(Stream,[X|L]) :- 
\+ at_end_of_stream(Stream), 
read(Stream,X), 
write(X), 
append1(X,[],New_List), 
read_file(Stream,L). 

ここではXは用語ですが、私は自分のプログラムを動作させることができません。

Input : 'Australia', 'Singapore','23','34','Mon/Tue'. 
Output : New_List=[Australia,Singapore,23,34,Mon/Tue]. 

私はAmzi prolog btwを使用しています。

ありがとうございました!

+0

あなたの例では、物事の入力側でかなりのフォーマットをしたいと考えています。あなたが表示しているように入力が「素敵」であれば、必要なリストを取得するには、指定された行を1つの文字列として入力し、終了期間を取り除き、その前後に角括弧をスラップします。結果の文字列は、Amziの述語** string_term **によって、必要な数の項目を持つリストとして解析されます。私の解答で概説されているアプローチは、より堅牢で汎用性のある方法です。 – hardmath

答えて

1

ISO述語read/2入力Prologの用語で、入力はピリオドで終了する必要があります。クエリプロンプトからこれを対話形式で試すことができます。

しかし、Prologの用語を読むのではなく、入力行全体を文字列として読み込み、それをリストの項目である「単語」にトークン化することが望ましいでしょう。

この目的のために、Amzi! Prologには、有用である可能性のある非ISOの述語がいくつかあります。 documentation here for read_string/2を参照し、documentation for string_split/3for string_tokens/3も参照してください。

これらの後者の2つの述語のどちらか一方が、あなたの "単語"リストの空白と句読点について何をしたいかによって、より便利になりがちです。