Пусть у нас имеется условие, заданное источником
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";}