这些是从输入文件中读取的谓词
read_line(L,C) :-
get_char(C),
(isEOFEOL(C), L = [], !;
read_line(LL,_),% atom_codes(C,[Cd]),
[C|LL] = L).
%Tests if character is EOF or LF.
isEOFEOL(C) :-
C == end_of_file;
(char_code(C,Code), Code==10).
read_lines(Ls) :-
read_line(L,C),
( C == end_of_file, Ls = [] ;
read_lines(LLs), Ls = [L|LLs]
).
输入文件:
A B
C D
E F
G H
read_lines(L)
返回L = [[A, ,B],[C, ,D],[E, ,F],[G, ,H]]
。我的目标是替换所有空格并将列表列表合并到单个列表中。所以预期的输出应该是:L = [A-B,C-D,E-F,G-H]
。
我到目前为止修改了read_line
函数:
read_line(L,C) :-
get_char(C),
( (char_code(C,Code), Code == 32)
-> C = '-'
; C = C),
(isEOFEOL(C), L = [], !;
read_line(LL,_),% atom_codes(C,[Cd]),
[C|LL] = L).
当我使用它时,Prolog说Syntax error: Unexpected end of file
。这有什么问题?
答案 0 :(得分:0)
问题在于此代码:
( (char_code(C,Code), Code == 32)
-> C = '-'
; C = C),
如果空格字符被读入变量C
,char_code
将Code
绑定到32,条件为真。然后Prolog尝试将C
与'-'
统一起来,但C
已绑定到' '
!这会失败,因此您的read_line
调用失败并在标准输入流上留下一些未使用的输入。下次Prolog尝试读取您的输入时,它实际上会读取剩余的输入。
问题的根本原因是你似乎正试图重新分配"变量C
。这在Prolog中是不可能的;一旦变量被绑定,它就只能在回溯时变为未绑定。
使用 new 变量,如下所示:
( (char_code(C,Code), Code == 32)
-> NewC = '-'
; NewC = C),
在适当情况下使用NewC
。