在prolog中读取和存储文件的所有单词

时间:2012-11-19 08:30:53

标签: list file-io prolog

我是prolog的新手,到现在为止我能够阅读文件中的所有单词,逐一显示它们,现在我想将它们存储在一个列表中(一个接一个,就在我显示它们的时候)。所有随处附加的逻辑,在空列表中追加两个列表的内容。例如 追加(new_word,word_list,word_List),最初我的word_list是空的,所以一切都很好,但之后它说不,并在那一点停止。 需要帮助才能逐个存储元素。

2 个答案:

答案 0 :(得分:1)

您可以使用差异列表:

file_to_list(W, L) :-
   read_word(Word),
   append_dl(W, [Word|U]-U, Ws),
   !, file_to_list(Ws, L).

file_to_list_1(Ws, Ws).


append_dl(X-Y, Y-Z, X-Z).

您拨打 file_to_list(U-U,L - [])以获取字词列表。没有减速但是比CapelliC的代码(每个单词一个)有更多的推论。

答案 1 :(得分:0)

假设您有一个谓词read_word(W),它可以获取W并且在没有更新时会失败。 然后用这个定义

file_to_list_rev([W|Ws]) :-
   read_word(W),
   !, file_to_list_rev(Ws).
file_to_list_rev([]).

查询file_to_list_rev(R),reverse(R, L),将所有单词(按相反顺序)存储在R中,并在L中存储有序列表。

编辑我必须还在睡觉...那段代码 dos not 构建一个反向列表...请考虑

file_to_list([W|Ws]) :-
   read_word(W),
   !, file_to_list(Ws).
file_to_list([]).

并完全放弃反向/ 2结束。

编辑完成

请注意,将每个单词追加到列表末尾会导致减速,将“线性大小”问题转换为“二次”问题。无论如何,这可以用这种丑陋的方式完成(注意我们需要一个服务变量):

file_to_list(L) :-
    file_to_list([], L).

file_to_list(SoFar, L) :-
   read_word(W),
   append(SoFar, [W], Temp),
   !, file_to_list(Temp, L).
file_to_list(L, L).