我正在尝试使用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].
我做错了什么?
答案 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术语。