1.6.2. ВЕТВЛЕНИЯ

Пусть у нас имеется условие, заданное источником S и две тропы Q' и Q". Рассмотрим тропу

\? {S \! Q'; \! Q";}

Тогда, если результат вычисления S - пустое выражение, то вычисляется тропа Q', и то, что получится, является результатом всей конструкции. Если же результат вычисления источника S - неуспех, то вычисляется тропа Q", и то, что получится, является результатом всей конструкции.

Следует обратить внимание на использование отсечений \! . Они существенны в том случае, если вычисление Q' или Q" заканчивается неуспехом. Предположим, что они убраны, в результате чего тропа приобретает следующий вид:

{ S, Q'; Q";}

Тогда, если условие S выполнено, производится вычисление тропы Q'. Предположим, однако, что вычисление тропы Q' заканчивается неуспехом. Тогда этот неуспех не будет выдан в качестве результата всей конструкции, а будет перехвачен, что приведет к вычислению тропы Q". В данном случае это совсем не то, что нам было нужно. Таким образом, первое отсечение необходимо, чтобы предотвратить "перескок" на следующую тропу в распутье.

Теперь рассмотрим случай, когда условие S не выполнено, т.е. результатом вычисления S является неуспех. В этом случае неуспех перехватывается и начинается вычисление тропы Q". Предположим, что вычисление тропы Q" завершается неуспехом. В этом случае неуспех перехватывается и делается попытка вычислить следующую тропу в распутье. Но, поскольку следующей тропы нет, возникает ситуация ошибки, а это опять таки не то, что мы хотели!

Если ветвление имеет вид

\? {S \! = Q'; \! = Q";}

его можно записать более кратко следующим образом:

{ S = Q'; = Q";}

(что мы и будем часто делать в дальнейшем).

Рассмотрим следующий пример. Определим функцию Min-Oe, которая сравнивает два объектных выражения Oe1 и Oe2 и выдает Oe1, если Oe1 предшествует Oe2. Если же Oe1 равно Oe2 или Ое2 предшествует Oe1, то Min-Oe выдает Oe2.

$func Min-Oe (eX)(eY) = e.Min-X-Y;

Min-Oe (eX)(eY) =

{

<"<" (eX)(eY)>

= eX;

= eY;

};

Теперь рассмотрим случай, когда условие задано тропой Q и нужно вычислить тропу Q', если условие выполнено, либо тропу Q", если условие не выполнено. Этого можно достичь, заключив Q в фигурные скобки и превратив его в источник \{ Q; }. После этого ветвление может быть записано следующим образом.

\? { \{Q;} \! Q'; \! Q";}