什么是 ”!” 在序言中

Lau*_*raW 7 list prolog prolog-cut

有人可以解释我什么是“!” 在 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).
Run Code Online (Sandbox Code Playgroud)

munteMain 验证线性列表是否具有山峰。

das*_*ght 4

感叹号!表示Prolog 中的剪切,这是一个总是成功的特殊目标,并阻止对其上方可能有替代方案的所有分支进行回溯。

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

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

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).
Run Code Online (Sandbox Code Playgroud)