考虑以下 Prolog 代码。它在其输入中编辑特定类型的行并打印出剩余的行而不进行任何更改。它使用了一个名为 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).
DCG 匹配的 if & else 部分phrase(rule(Part1, Part2), Codes)
已交换。这显然是一个新手错误,但失败的事实go, halt
并不是很有帮助。我该怎么做才能使错误消息表明失败是因为Part1
&Part2
没有绑定format('~s - ~s\n', [ Part1, Part2 ])
在行中?由于代码很小,我能够追踪到这个错误,但如果代码很大,我可能无法做到这一点。