考虑以下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 ])
?我能够追踪这个错误,因为代码很小,但如果代码很大,我可能无法做到这一点。
答案 0 :(得分:4)
在Prolog中,以下内容并不相同:
..., ( Cond -> Then ; Else ), ...
和
..., ( \+ Cond -> Else ; Then ), ...
通常,目标\+ Cond
永远不会实例化其变量。那么你
必须坚持原来的配方。
如果您有兴趣处理整个
使用DCG的文件,请考虑SWI的library(pio)
。