1.5.5. СМЫСЛ ПРАВЫХ ЧАСТЕЙ

Правые части, имеющие вид = Q , где Q - некоторая тропа, являются еще более мощным средством ограничения перебора, чем заборы и отсечения.

Чтобы объяснить смысл правых частей, нам придется предварительно ввести некоторые понятия.

Пусть какая-то конструкция входит в качестве составной части в некоторую другую конструкцию. Мы будем говорить, что эта внутренняя конструкция является вассалом, если результат ее работы, согласно семантике языка, считается результатом работы объемлющей конструкции. Например, в тропе

S :: He R

хвост R является вассалом, ибо результат вычисления R считается результатом вычисления всей конструкции. Если некоторая конструкция не является  вассалом объемлющей конструкции, мы будем говорить, что она является сувереном. Например, в тропе S :: He R источник S является сувереном, ибо его результат не считается результатом всей конструкции (хотя и может использоваться в R). А именно, если определение функции имеет вид Fname Palt , то образцовое распутье Palt является сувереном.

Если тропа имеет один из следующих видов: S R , S :: He R , S : P R или # S R , то источник S является сувереном.

Если источник имеет вид S : Palt , то источник S является сувереном.

Рассмотрим теперь некоторую конструкцию вместе со всеми объемлющими ее суверенами. Среди этих суверенов всегда существует наименьший, и мы будем называть его покровителем рассматриваемой конструкции. В частности, всякий суверен является своим собственным покровителем.

Теперь мы можем описать семантику правых частей. Пусть покровителем правой части = Q является некоторая объемлющая конструкция ... = Q ... . Тогда первым делом вычисляется тропа Q. Если это вычисление завершилось с некоторым результатом X, то X считается результатом всего покровителя

... = Q ... . В частности, если X - неуспех, то и значением покровителя

... = Q ... будет неуспех, даже если внутри него расставлены ловушки, предназначенные для перехвата неуспехов. Например, результатом вычисления тропы

\{ A B C : $l e sX e, sX : B, sX} :: sY, sY

будет символ B, ибо sX принимает значение A, сопоставление которого с символом B терпит неуспех, в результате чего sX принимает новое значение B, и вычисление успешно завершается. Но если мы заменим запятую на равенство, мы получим тропу

\{ A B C : $l e sX e = sX : B, sX} :: sY, sY

вычисление которой терпит неудачу. На использование заборов, отсечений, и правых частей накладываются некоторые ограничения.

И отсечение \! Q , и соответствующий ему забор \? ... \! Q ... , должны иметь общего покровителя.

На пути от \! к соответствующему ему \? не должно быть ни одного = .