Ответ в теме: Красное и зеленое отсечение в Prolog

      Комментарии к записи Ответ в теме: Красное и зеленое отсечение в Prolog отключены
#2473

Здравствуйте. Разделение на красное и зеленое отсечение является чисто условным — интерпретатор Prolog никак их не различает. Однако, программисты условились называть зелеными отсечениями те, что не влияют на результаты работы программы, а красными — все остальные. Там, например, отсечение в реализации предиката max3 из статьи про семантику — красное, т.к. его удаление повлияет на результаты. Однако в другой реализации оно будет зеленым, т.к. оказывает влияние только на эффективность (устраняет лишние проверки условий при интерпретации):

max3(A, B, C, Max):-
  A >= B, A >= C, !, Max = A;
  B >= A, B >= C, !, Max = B;
  C >= A, C >= B, Max = C.

Может показаться, что зеленые отсечения возможны лишь в случае наличия в программах лишних проверок, однако это не так — они часто встречаются при обработке списков. Например посмотрите на предикат split — все отсечения в нем являются зелеными. Так при удалении отсечения из первого правила ничего не изменится, ведь оно сработает только если список не содержит ни одного элемента, но второе правило начнет выполняться только для списков из одного элемента, а третье — для списков из более чем двух элементов.