次のルールがあります。
noRepetition([]).
noRepetition([Elem|Rest]):- not(member(Elem,Rest)), !, noRepetition(Rest).
このルールは、リストに繰り返し要素がないかどうかを決定するために作成され、メンバー ルールは、特定の要素がリストに属しているかどうかを決定します。私の質問は、このルールのカット演算子に関するものです。なぜなら、それが何をするかわからないからです。
私は次のトレースを作成しましたが?-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]).
この場合、not member が true を返すため、カットが true であることが証明されたので、私は立ち往生していますが、このカットがプログラムが noRepetition (3 番目の目標) に行くのを妨げているのか、それとも何か他のことをしているのかはわかりません。実際にプログラムが noRepetition に移行するのを防ぐ場合、このルールは true と評価されますが、リストに繰り返しがあるため、これは当てはまりません。