在SWI-prolog中调试 - 未绑定的变量

时间:2011-06-02 16:55:51

标签: debugging prolog dcg

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

1 个答案:

答案 0 :(得分:4)

在Prolog中,以下内容并不相同:

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

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

通常,目标\+ Cond永远不会实例化其变量。那么你 必须坚持原来的配方。

如果您有兴趣处理整个 使用DCG的文件,请考虑SWI的library(pio)