Отладка в SWI-прологе - несвязанные переменные - PullRequest
3 голосов
/ 02 июня 2011

Рассмотрим следующий код Пролога.Он редактирует строки определенного типа на своем входе и печатает оставшиеся строки без каких-либо изменений.Он использует DCG с именем rule, который не включен ниже, так как это не важно для вопроса.

go:-
    prompt(_, ''),
    processInput.

processInput:-
    read_line_to_codes(current_input, Codes),
    processInput(Codes).

processInput(Codes):-
    (Codes \= end_of_file
    ->
        (phrase(rule(Part1, Part2), Codes)
        ->
            format('~s - ~s\n', [ Part1, Part2 ])
        ;
            format('~s\n', [ Codes ])),
        processInput
    ;
        true).

:- go, halt.

Это прекрасно работает.Однако, предположим, что я изменил processInput/1 на следующее, он просто говорит, что Warning: /home/asfernan/tmp/tmp.pl:28: Goal (directive) failed: user: (go,halt).

processInput(Codes):-
    (Codes \= end_of_file
    ->
        (\+phrase(rule(Part1, Part2), Codes)
        ->
            format('~s\n', [ Codes ]))
        ;
            format('~s - ~s\n', [ Part1, Part2 ]),
        processInput
    ;
        true).

Были заменены части if & else phrase(rule(Part1, Part2), Codes) DCG.Это, очевидно, ошибка новичка, но тот факт, что go, halt не удалось, не очень помогает.Что можно сделать, чтобы сообщение об ошибке указывало на то, что ошибка произошла из-за того, что Part1 & Part2 не были связаны в строке format('~s - ~s\n', [ Part1, Part2 ])?Мне удалось отследить эту ошибку, потому что код маленький, но я не смог бы сделать это, если бы код был большим.

1 Ответ

4 голосов
/ 02 июня 2011

В Прологе не то же самое:

..., ( Cond -> Then ; Else ), ...

и

..., ( \+ Cond -> Else ; Then ), ...

Как правило, цель \+ Cond никогда не будет создавать экземпляры своих переменных. Так что вы должны придерживаться первоначальной формулировки.

В случае, если вы заинтересованы в обработке всего файлы с DCG, рассмотрим SWI library(pio).

...