11

有人可以解释一下“!”是什么意思吗?在 Prolog 中做什么?我不明白。在这里,我有一个代码可以计算异构列表中有多少子列表具有山区特征。

nrSubliste([], 0).
nrSubliste([H|T], R):-
    is_list(H),
    munteMain(H),!,
    nrSubliste(T, R1),
    R is R1 + 1.
nrSubliste([_|T], R):-
    nrSubliste(T, R).

munteMain验证线性列表是否具有山脉特征。

4

1 回答 1

3

感叹号!表示Prolog 中的Cut,一个始终成功的特殊目标,并阻止其上方可能有替代方案的所有分支的回溯。

在您的情况下,这意味着一旦munteMain/1找到解决方案,程序将永远不会回溯并寻找替代解决方案。具体来说,Prolog 永远不会考虑您的nrSubliste/2规则的第三个子句,即_如果H在第二个子句中munteMain(H)成功,则忽略列表头的那个。

请注意, using!使您的代码更难阅读和维护,因为第三个子句中的逻辑取决于第二个子句的逻辑。您可以使用不可证明的 运算符\+重写您的程序而无需删减:

nrSubliste([H|T], R):-
    is_list(H),
    munteMain(H),
    nrSubliste(T, R1),
    R is R1 + 1.

nrSubliste([H|T], R):-
    is_list(H),
    \+ munteMain(H),
    nrSubliste(T, R).
于 2016-01-09T12:54:44.807 回答