Важная особенность логических программ – это возможность
выполнения одной и той же процедуры при различном распределении ролей
входов и выходов между параметрами процедуры. Например, стандартный
предикат PDC Prolog'а char_int(char,integer), устанавливающий соответствие
между символом кода ASCII (char) и номером байта (integer), реализует
следующие варианты параметров: (i,i), (i,o), (o,i), где i означает, что предикат
воспринимает параметр как входной (input), а o означает, что предикат
воспринимает параметр как выходной (output).
Кроме того, логические программы характеризуются недетерминизмом
первого и второго рода. Недетерминизм первого рода связан с тем, что с
данным процедурным вызовом могут быть согласованы несколько вариантов
процедур и имеется свобода выбора порядка их выполнения. Недетерминизм
второго рода связан с тем, что в теле вызываемой процедуры есть более одной
подпроцедуры и, следовательно, также возникает свобода выбора.
Основной принцип, используемый Prolog-интерпретатором в отношении
процедур для разрешения недетерминизма первого и второго рода, заключается
в том, что порядок исполнения таких процедур совпадает с порядком их записи
в тексте Prolog-программы. Поскольку порядок записи зависит от составителя
программы, этот фактор следует учитывать при составлении логических
программ.
Что касается недетерминизма первого рода, то число просматриваемых
вариантов может быть ограничено с помощью так называемого "зеленого"
отсечения или "красного" отсечения. Разработчики Prolog-интерпретатора
предусмотрели встроенный предикат отсечения (!).
Пример 3.6. Программа
p(X):-c(X).
p(X):-a(X),!,b(X).
имеет декларативный смысл p(X)=a(X)&b(X) ∨ c(X).
Если убрать отсечение
p(X):-c(X).
p(X):-a(X),b(X). ,
то декларативный смысл программы не изменится. Следовательно, отсечение в
данном примере – “зеленое”.
Пример 3.7. В предыдущем примере поменяем местами предикаты:
p(X):-a(X),!,b(X).
p(X):-c(X).
Декларативный смысл изменился: p(X)=a(X)&b(X) ∨ ¬a(X)&c(X).
Следовательно, отсечение в данном примере – “красное ”.
При выборе порядка записи подпроцедур в теле процедуры следует
учитывать распределение входов и выходов процедур. Более эффективным,
133