Список списков в один измененный список - PullRequest
0 голосов
/ 28 апреля 2018

Это предикаты, которые читаются из входного файла

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).

Когда я использую его, Пролог говорит Syntax error: Unexpected end of file. Что с этим не так?

1 Ответ

0 голосов
/ 29 апреля 2018

Проблема в этом коде:

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

Если пробел был прочитан в переменную C, char_code связывает Code с 32, и условие истинно. Затем Пролог пытается объединить C с '-', но C уже связан с ' '! Это терпит неудачу, поэтому ваш вызов read_line завершается неудачно и оставляет некоторый неиспользованный ввод в стандартном потоке ввода. В следующий раз, когда Пролог попытается прочитать ввод от вас, он фактически прочитает этот оставшийся ввод.

Основной причиной проблемы является то, что вы, похоже, пытаетесь «переназначить» переменную C. Это невозможно в Прологе; как только переменная связана, она может стать свободной только при возврате.

Используйте переменную new , что-то вроде этого:

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

с соответствующим использованием NewC, где это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...