【问题标题】:Why does my replace/2 program always return false?为什么我的 replace/2 程序总是返回 false?
【发布时间】:2014-10-20 06:54:55
【问题描述】:

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

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

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

【问题讨论】:

    标签: prolog prolog-toplevel


    【解决方案1】:

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

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

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

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

    这实质上是告诉prolog,如果这个子句成功了,剩下的可能匹配就不再考虑了。因此,没有选择点处于打开状态,一旦获得第一个结果,执行完成并返回 true。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      相关资源
      最近更新 更多