什么是 ”!”在序言中
What is "!" in Prolog
有人能解释一下“!”是什么意思吗?在 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
验证线性列表是否具有山脉方面。
感叹号!
在Prolog中表示Cut,一个总是成功的特殊目标,并阻止backtracking它上面的所有可能有备选方案的分支.
在您的情况下,这意味着一旦找到 munteMain/1
的解决方案,程序将永远不会回溯并寻找替代解决方案。具体来说,如果第二个子句中的 H
使 munteMain(H)
成功,那么 Prolog 永远不会考虑 nrSubliste/2
规则的第三个子句,即忽略列表头 _
.
请注意,使用 !
会使您的代码更难阅读和维护,因为第三个子句中的逻辑取决于第二个子句中的逻辑。您可以使用 不可证明 operator \+
:
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).
有人能解释一下“!”是什么意思吗?在 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
验证线性列表是否具有山脉方面。
感叹号!
在Prolog中表示Cut,一个总是成功的特殊目标,并阻止backtracking它上面的所有可能有备选方案的分支.
在您的情况下,这意味着一旦找到 munteMain/1
的解决方案,程序将永远不会回溯并寻找替代解决方案。具体来说,如果第二个子句中的 H
使 munteMain(H)
成功,那么 Prolog 永远不会考虑 nrSubliste/2
规则的第三个子句,即忽略列表头 _
.
请注意,使用 !
会使您的代码更难阅读和维护,因为第三个子句中的逻辑取决于第二个子句中的逻辑。您可以使用 不可证明 operator \+
:
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).