3

考虑以下 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 ])在行中?由于代码很小,我能够追踪到这个错误,但如果代码很大,我可能无法做到这一点。

4

1 回答 1

4

在 Prolog 中,以下是不一样的:

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

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

一般来说,目标\+ Cond永远不会实例化它的变量。所以你必须坚持原来的配方。

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

于 2011-06-02T17:49:58.627 回答