我觉得我正在用我认为应该很容易的东西把头撞到墙上。也许我的方法是不正确的。我绝对不觉得我理解 Prolog 中 I/O 背后的概念。(例如:流别名和 open/3 绑定的变量有什么区别?)但我跑题了:
如何在 GNU Prolog 中逐行读取文件?(因此无法访问 SWI 拥有的便捷功能。)我认为它与 get_char/1 和 peek_char/1 (检查终止换行符)有关,但我尝试实现可行的解决方案到目前为止都失败了。
据我所知,这是:
readl_as_list(ID, X):-
current_input(ID),
readl_as_list(X).
readl_as_list([X]):-
(peek_char(NextChar), ==(NextChar, '\n');
get_code(Char1),
append([X], [Char1], X),
readl_as_list(X)).
printl_list([]):-
!, nl.
printl_list([H|X]):-
put_code(H), printl_list(X).
将其加载到解释器中,我得到(为了便于阅读,删除了空行):
| ?- open('word_list.txt', read, ID).
ID = '$stream'(2)
yes
| ?- readl_as_list(ID, X).
ID = '$stream'(0)
X = [_] ?
% (interpreter pauses until I press return)
yes
| ?- printl_list(X).
X = []
yes
这些行不一定必须作为字符列表读入,但由于我的目标是在单词列表中搜索符合某些条件的单词(例如,没有重复字母),这似乎是最明智的做法它。