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