为什么我的replace / 2程序总是返回false?

时间:2014-10-20 06:54:56

标签: prolog prolog-toplevel

我的目标是用给定列表中的逻辑变量替换'_'。我的代码:

replace([], []).
replace(['_'|As], [_|Bs]) :- 
    replace(As, Bs).
replace([A|As], [B|Bs]) :-
    A \= '_',
    B = '#',
    replace(As, Bs).

它将返回一个正确的列表,但总是以false结束。有什么帮助吗?

1 个答案:

答案 0 :(得分:0)

replace(['_'|As], [_|Bs])匹配的任何输入也与replace([A|As], [B|Bs])匹配。这意味着在执行第一个子句时,会为后者保留一个选择点。

在prolog找到第一个结果后,它注意到仍有选择点打开,因此它会询问您是否需要更多结果。如果你说是,它将不会尝试执行另一个子句。这总是会失败,因为A \= '_'永远不会成真。

请注意,此行为没有错。 “假”并不意味着程序失败,只是意味着在已经呈现的那些之后没有找到更多的结果。在这种情况下,您知道总会只有一个结果,因此您可以通过使用剪切运算符!告诉prolog不要让任何选择点保持打开状态:

replace(['_'|As], [_|Bs]) :- 
    replace(As, Bs), !.

这基本上告诉prolog,如果此子句成功,则不应再考虑剩余的可能匹配。因此,没有选择点保持打开状态,一旦获得第一个结果,执行完成并返回true。