我的目标是用给定列表中的逻辑变量替换'_'
。我的代码:
replace([], []).
replace(['_'|As], [_|Bs]) :-
replace(As, Bs).
replace([A|As], [B|Bs]) :-
A \= '_',
B = '#',
replace(As, Bs).
它将返回一个正确的列表,但总是以false
结束。有什么帮助吗?
答案 0 :(得分:0)
与replace(['_'|As], [_|Bs])
匹配的任何输入也与replace([A|As], [B|Bs])
匹配。这意味着在执行第一个子句时,会为后者保留一个选择点。
在prolog找到第一个结果后,它注意到仍有选择点打开,因此它会询问您是否需要更多结果。如果你说是,它将不会尝试执行另一个子句。这总是会失败,因为A \= '_'
永远不会成真。
请注意,此行为没有错。 “假”并不意味着程序失败,只是意味着在已经呈现的那些之后没有找到更多的结果。在这种情况下,您知道总会只有一个结果,因此您可以通过使用剪切运算符!
告诉prolog不要让任何选择点保持打开状态:
replace(['_'|As], [_|Bs]) :-
replace(As, Bs), !.
这基本上告诉prolog,如果此子句成功,则不应再考虑剩余的可能匹配。因此,没有选择点保持打开状态,一旦获得第一个结果,执行完成并返回true。