У меня есть следующее правило (!):проблем Понимания Cut Оператору пример (Пролог Language)
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]).
Теперь я застрял, как не член возвращает верно этот случай, таким образом, разрез доказан, однако я не уверен, что этот разрез не позволяет программе перейти на noRepetition (3-й гол) или если он делает что-то еще. Если это действительно препятствует переходу программы в noRepetition, это правило будет оцениваться как true, что не так, поскольку в списке есть повторение.
Где вы получили это определение 'noRepetition/1' от? –