我有以下规则:
noRepetition([]).
noRepetition([Elem|Rest]):- not(member(Elem,Rest)), !, noRepetition(Rest).
此规则用于确定列表中是否没有重复元素,并且成员规则确定特定元素是否属于列表。我的问题与此规则中的 cut 运算符有关,因为我不确定它的作用。
我已经为一个问题制定了以下跟踪?-noRepetition([a,b,b,c,d])
并遇到了一个问题(可能与我对剪切运算符缺乏了解有关):
?-noRepetition([a,b,b,c,d])
Unfies with the second noRepetion rule and instantiates variables to:
noRepetition([a|b,b,c,d] :- not(member(a,[b,b,c,d])), !, noRepetition([b,b,c,d]).
现在我被卡住了,因为在这种情况下不是成员返回 true,因此剪切被证明是正确的,但是我不确定这个剪切是否会阻止程序进入 noRepetition(第三个目标)或者它是否会执行其他操作。如果它确实阻止程序进入 noRepetition,那么该规则将被评估为 true,但情况并非如此,因为列表中有重复。