Prolog:通过read / 1添加元素到列表

时间:2014-12-07 11:09:51

标签: list input prolog

我正在尝试使用add_read_list / 2将用户输入添加到列表中,直到单词" end。"遇到了。这是输出的外观:

add_read_list(Resultlist, [a,b]).
|: c.
|: d.
|: e.
|: f.
|: end.
Resultlist = [f,e,d,c,a,b].

这是我走了多远:

 add_read_list(Resultlist,Entrylist) :- 
            read(end), append([], Entrylist, Resultlist).
add_read_list(Resultlist, Entrylist) :-
            read(Input), append([Input], Entrylist, X),
            add_read_list(Resultlist, X). 

但是这样就可以跳过每秒输入:

add_read_list(Resultlist, [a,b]).
|: c.
|: d.
|: e.
|: f.
|: end.
Resultlist = [f,d,a,b].

我做错了什么?

2 个答案:

答案 0 :(得分:3)

删除第一个子句,并使用简单的'if / then / else'结构:

add_read_list(Resultlist, Entrylist) :-
  read(Input),
  (  Input = end
  -> reverse(Resultlist, Entrylist)
  ;  add_read_list(Resultlist, [Input|Entrylist])
  ).

而不是附加每个项目读取,“减少”它,并在完成后反转完整列表(好吧,只需统一以获得LIFO中的列表,如需要的那样。即代替reverse(Resultlist, Entrylist),{{1 }})

答案 1 :(得分:3)

实际错误为read(end)。如果读入的字词为end,则此操作只会成功。否则就失败了。

但我确实有很多保留意见告诉你这个,因为没有人会这样做是Prolog。以下是需要改进的实际内容。

第一种方法是使用end_of_file代替end,因为这是在文件末尾自动生成的,而且你也可以自己编写。

第二个是如何处理这个问题。您需要阅读并处理读入的术语:

... read(X),  ( X == end_of_file -> ... ; /* whatever */ ... ), ....

但是,请重新考虑您的整个任务。有一个原因可能需要这样做:当您处理Prolog文件时。但是,通过说[file],你可以降低成本,减少错误。

因此,请更好地设计数据以符合Prolog术语。