2012-03-15 19 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

你的例子表明你願意在事物的輸入方面進行相當多的格式化。可以想象,如果輸入與你所顯示的一樣「好」,那麼所有需要的(獲得期望的列表)是將給定的行作爲一個字符串輸入,去除終止週期,並打開和關閉它的方括號。得到的字符串將被Amzi的謂詞** string_term **解析爲具有所需數量項目的列表。我的答案中概述的方法旨在成爲一種更強大和更普遍的做事方式。 – hardmath 2012-03-15 14:17:33

回答

1

ISO謂詞read/2輸入序言條款並要求輸入以句點結尾。您可以從查詢提示中交互地嘗試。

但是,您可能想要的不是讀取Prolog術語,而是將整個輸入行讀取爲字符串,然後將其標記爲列表中的項目「單詞」。

爲此目的Amzi! Prolog有幾個可能有用的非ISO謂詞。請參閱documentation here for read_string/2,並參見documentation for string_split/3for string_tokens/3

這些後兩個謂詞中的一個或另一個可能更有用,具體取決於您希望對「單詞」列表中的空格和標點符號做些什麼。