列表列表已修改为单个列表

时间:2018-04-28 18:42:27

标签: prolog

这些是从输入文件中读取的谓词

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。这有什么问题?

1 个答案:

答案 0 :(得分:0)

问题在于此代码:

( (char_code(C,Code), Code == 32)
    -> C = '-'
    ; C = C),

如果空格字符被读入变量Cchar_codeCode绑定到32,条件为真。然后Prolog尝试将C'-'统一起来,但C已绑定到' '!这会失败,因此您的read_line调用失败并在标准输入流上留下一些未使用的输入。下次Prolog尝试读取您的输入时,它实际上会读取剩余的输入。

问题的根本原因是你似乎正试图重新分配"变量C。这在Prolog中是不可能的;一旦变量被绑定,它就只能在回溯时变为未绑定。

使用 new 变量,如下所示:

( (char_code(C,Code), Code == 32)
    -> NewC = '-'
    ; NewC = C),

在适当情况下使用NewC