2.10.15. РАСПУТЬЯ

Источник \{Q1; Q2; ... Qn;} означает, что следует вычислять тропы Q1, Q2, ..., Qn слева направо, пока не удастся найти тропу, вычисление которой завершится успешно.

А именно, рассмотрим результат вычисления очередной тропы Qj.

Если результат - объектное выражение Oe, то Oe считается результатом всего распутья. Если результат - $error(Oe), то $error(Oe) является результатом всего распутья. Если результат - $fail(k+1), то результатом вычисления всего распутья является $fail(k+1). И, наконец, если результат - $fail(0), то этот неуспех "перехватывается", т.е. делается попытка вычислить следующую тропу. Если же следующей тропы не существует (т.е. j=n), то результатом вычисления всей тропы является неуспех $fail(0).

Распутье вида {Q1; Q2; ... Qn;} эквивалентно распутью

\{Q1; Q2; ... Qn; $error(Fname "Unexpected fail");}.

Fname - имя функции, в которой находится конструкция.

{Q1; Q2; ... Qn;} =>=>

\{Q1; Q2; ... Qn;

$error(Fname "Unexpected fail");}

Fname - имя функции, в которой находится конструкция.

 

Env,m,St |- \{} => $fail(0),St

 

Env,m,St |- Q1 => Oe,St'

----------------------------------------

Env,m,St |- \{Q1; Q2; ... Qn;} => Oe,St'

 

Env,m,St |- Q1 => $fail(0),St'

Env,m,St'|- \{Q2; ... Qn;} => X,St"

---------------------------------------

Env,m,St |- \{Q1; Q2; ... Qn;} => X,St"

 

Env,m,St |- Q1 => $fail(k+1),St'

------------------------------------------------

Env,m,St |- \{Q1; Q2; ... Qn;} => $fail(k+1),St'

 

Env,m,St |- Q1 => $error(Oe),St'

------------------------------------------------

Env,m,St |- \{Q1; Q2; ... Qn;} => $error(Oe),St'