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 3

1 ответ:

Программа, связанная в вашем вопросе, использует оператор cut !, чтобы предотвратить объединение кода в ответе с другими предложениями. Без этих сокращений flatten2/2 из ответа объединил бы пустой список в первом аргументе с предложениями один и три, т. е.

flatten2([], []) :- !.
flatten2(L, [L]).

Аналогичным образом, без сокращения во втором предложении flatten2/2 объединит непустой список в пунктах два и три, что приведет к неправильному поведению.

Ваш код, с другой стороны, имеет явные проверки, чтобы гарантировать, что каждый пункт flatten/2 касается одной конкретной ситуации:

  • первое предложение рекурсивно сглаживает непустые списки
  • второе предложение создает список из одного элемента из констант, отличных от пустых списков
  • Третье предложение "выравнивает" пустые списки.

Поскольку каждое предложение применяется исключительно к одному типу элемента слева, вырезание не является необходимым. Вы могли бы переписать свой код с сокращением, переключив второе и третье предложение и добавив сокращение после сопоставление пустого списка, но я бы настоятельно рекомендовал не делать этого (demo).

Необходимо ли во втором предложении проверять, не является ли это списком?

Эта проверка необходима, поскольку пустой список [] считается константой, поэтому ваша программа будет иметь неправильное поведение, когда пустые списки присутствуют в сглаженном списке ( demo).