Во, только хотел сказать, что задачку хорошо рассмотреть автоматно, как уже опередили

Вообще, в таких случаях, когда одно из условий окончания становится определено после одного из действий тела, так и просится изменить цикл так, чтобы на каждом витке выполнялось только одно из действий (т.е. одному обороту исходного цикла соответствует неск. оборотов преобразованного). Возникает состояние автомата.

Пример, как это записывается с циклом Дейкстры:

## Код:
```
GetCommand(cmd); (* ASSERT(cmd # empty) *)
WHILE (cmd # empty) & (cmd # stop) DO
  Execute(cmd, error); cmd := empty
ELSIF (cmd = empty) & (error = no_error) DO
  GetCommand(cmd)
END
```


Цикл находится либо в состоянии, когда команда выбрана, но не выполнена (cmd # empty); либо в состоянии, когда команда выполнена, и нужно выбирать следующую (cmd = empty). В первом случае условие продолжения - cmd # stop, во втором - error = no_error.

(Заметим, что тут оказалась не нужна противоестественная инициализация переменной error до цикла; как и полагается по её смыслу - до первого Execute она имеет право быть неопределённой).