2012-11-19 22 views
1

我是序言的新手,直到现在我能够读取文件的所有单词,逐一显示它们,现在我想将它们存储在一个列表中(一个一个地,就在我展示他们时)。所有无处不在的追加逻辑,将两个列表的内容添加到空列表中。例如 append(new_word,word_list,word_List),我的word_list是空的,所以一切正常,但之后它说不,并停止在那一点。 需要帮助才能够将元素逐个存储在列表中。读取并存储序言中的所有文件的文字

回答

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中的有序列表。

编辑我仍然必须睡觉......这些代码不到风度建立一个反向列表...请考虑

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). 
+0

不,反向列表可以和我一起,非常感谢你的帮助。 – tosif24

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(UU,L-无论如何,这可以在这个丑陋方式(注意,我们需要一个服务变量)来完成[])获取单词列表。没有减速,但比CapelliC的代码(每字一个)需要更多的推论。

相关问题