Prolog-понимание использования cut
Я не могу ясно понять использование cut. Например, в этом случае: сплющить , это действительно нужно? Он работает для меня даже без обоих предикатов cut (я пытался удалить). Каковы случаи, которые могут вызвать отступление, идущее к разрезу? Удаление разрезов у вас есть такая же реализация книги" Искусство пролога " (Шапиро Э., Стерлинг Л.), что и:
flatten([X|Xs],Ys) :-
flatten(X,Ysl),
flatten(Xs,Ys2),
append(Ys1,Ys2,Ys).
flatten(X,[X]) :-
constant(X),
X=[].
flatten([],[]).
Что приводит меня к другому вопросу: нужно ли во втором предложении проверять, не является ли это списком? Если это единственный термин, который не объединится с первым предложением...разве не так?1 ответ:
Программа, связанная в вашем вопросе, использует оператор cut
!
, чтобы предотвратить объединение кода в ответе с другими предложениями. Без этих сокращенийflatten2/2
из ответа объединил бы пустой список в первом аргументе с предложениями один и три, т. е.flatten2([], []) :- !. flatten2(L, [L]).
Аналогичным образом, без сокращения во втором предложении
flatten2/2
объединит непустой список в пунктах два и три, что приведет к неправильному поведению.Ваш код, с другой стороны, имеет явные проверки, чтобы гарантировать, что каждый пункт
flatten/2
касается одной конкретной ситуации:
- первое предложение рекурсивно сглаживает непустые списки
- второе предложение создает список из одного элемента из констант, отличных от пустых списков
Третье предложение "выравнивает" пустые списки.Поскольку каждое предложение применяется исключительно к одному типу элемента слева, вырезание не является необходимым. Вы могли бы переписать свой код с сокращением, переключив второе и третье предложение и добавив сокращение после сопоставление пустого списка, но я бы настоятельно рекомендовал не делать этого (demo).
Необходимо ли во втором предложении проверять, не является ли это списком?
Эта проверка необходима, поскольку пустой список
[]
считается константой, поэтому ваша программа будет иметь неправильное поведение, когда пустые списки присутствуют в сглаженном списке ( demo).