Debugging SWI 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

考虑下面的Prolog代码。它在其输入中编辑特定类型的行,并在不做任何更改的情况下打印出其余行。它使用了一个名为
规则
的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 ), ...