Debugging SWI prolog中的调试-未绑定变量
考虑下面的Prolog代码。它在其输入中编辑特定类型的行,并在不做任何更改的情况下打印出其余行。它使用了一个名为Debugging SWI prolog中的调试-未绑定变量,debugging,prolog,dcg,Debugging,Prolog,Dcg,考虑下面的Prolog代码。它在其输入中编辑特定类型的行,并在不做任何更改的情况下打印出其余行。它使用了一个名为规则的DCG,该规则未包含在下面,因为它对问题不重要 go:- prompt(_, ''), processInput. processInput:- read_line_to_codes(current_input, Codes), processInput(Codes). processInput(Codes):- (Codes \= e
规则的DCG,该规则未包含在下面,因为它对问题不重要
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
更改为以下内容,它只是说警告:/home/asfernan/tmp/tmp.pl:28:Goal(directive)failed:user:(go,halt)
短语(规则(第1部分,第2部分),代码)
DCG匹配的if&else部分已交换。这显然是一个新手的错误,但是go,halt
失败的事实并没有多大帮助。如何使错误消息表明失败是因为Part1
和Part2
未以格式(“~s-~s\n',[Part1,Part2])
行绑定?我之所以能够跟踪此错误,是因为代码很小,但如果代码很大,我可能无法跟踪此错误。在Prolog中,以下内容不同:
..., ( Cond -> Then ; Else ), ...
及
通常,目标\+Cond
永远不会实例化其变量。那么你呢
必须坚持原来的配方
如果您有兴趣处理整个
使用DCGs的文件,考虑SWI的代码>库(PIO)< /代码> ./P>
..., ( Cond -> Then ; Else ), ...
..., ( \+ Cond -> Else ; Then ), ...