【问题标题】:List of lists into modified single list列表列表为修改后的单个列表
【发布时间】:2018-10-09 07:58:18
【问题描述】:

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

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

【问题讨论】:

    标签: prolog


    【解决方案1】:

    问题出在这段代码中:

    ( (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

    【讨论】:

      猜你喜欢
      • 2022-09-29
      • 2021-08-12
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-17
      • 2011-09-07
      • 2016-10-26
      相关资源
      最近更新 更多