Рассмотрим следующий код Пролога.Он редактирует строки определенного типа на своем входе и печатает оставшиеся строки без каких-либо изменений.Он использует 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 ])
?Мне удалось отследить эту ошибку, потому что код маленький, но я не смог бы сделать это, если бы код был большим.