List “什么是”啊&引用;在序言中

List “什么是”啊&引用;在序言中,list,prolog,prolog-cut,List,Prolog,Prolog Cut,有人能给我解释一下“!”在序言中的作用吗?我不明白。 这里我有一个代码,它计算一个异构列表中有多少子列表具有山的外观 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验证线性列表是否有山形。感叹号在Pr

有人能给我解释一下“!”在序言中的作用吗?我不明白。 这里我有一个代码,它计算一个异构列表中有多少子列表具有山的外观

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中表示一个始终成功的特殊目标,并阻止其上所有可能有备选方案的分支的回溯

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/1
的解决方案,程序将永远不会回溯并寻找替代解决方案。具体而言,Prolog永远不会考虑您的代码< NRStudie/2 < /C>规则中的第三个子句,即“忽略代码列表中的“代码< >代码> >,如果第二子句中的<代码> h <代码>是这样的:<代码> MuntMeMe(H)成功。

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


好的,我想我理解了,非常感谢您选择使用操作符\+。另外,请查看“何时使用<代码>”/序言中的0。