Как мне кажется, сопрограммы так же опасны, как и goto. Почему я так считаю?
Для однопоточной программы:
## Код:
```
PROCEDURE (VAR c: SomeRecord);
  VAR x: INTEGER;
BEGIN
c.found := FALSE;
x := 0;
WHILE ~c.found DO
  x := x + 1;
  c.found := f(x) = 0;
END;
END Do;
```

Данный код корректен.
Но, если мы используем сопрограммы, то следующий код становится уже некорректным:
> -- Цитата:
> PROCEDURE (c: Cor1) Do  VAR x: INTEGER;BEGINc.found := FALSE;x := 0;WHILE ~c.found DO  x := x + 1;  c.found := f(x) = 0;  Co.Yield();END;END Do;иPROCEDURE (c: Cor2) Do  VAR x: INTEGER;BEGINc.found := FALSE;y := 1;WHILE ~c.found DO  y := y - 1;  c.found := f(y) = 0;   Co.Yield();END;END Do;
Так как может быть ситуация, что сколько-то итераций работала первая сопрограмма и только она нашла корень функции и устанавливает c.found в TRUE:
> -- Цитата:
> c.found := f(x) = 0;Co.Yield();,
как она прерывается и запускается вторая сопрограмма, которая сбрасывает c.found в FALSE, и если у функции больше нет корней, то программа никогда не завершится.

Для того, чтобы программа с сопрограммами стала корректной необходимо исправить несколько недочетов в программе:
1) не сбрасывать c.found := FALSE; внутри сопрограммы;
2) не использовать c.found := f(x) = 0; так как после установки c.found в TRUE и запуска другой сопрограммы, c.found снова может сбросится в FALSE. Необходимо использовать:
> -- Цитата:
> IF f(x) = 0 THEN   c.found := TRUEEND

Основной вывод: нельзя взять обычную однопоточную программу, добавить туда Co.Yield(); и ожидать, что программа останется корректной.

Для верификации данных сопрограмм, с одним Co.Yield() необходимо рассмотреть по три ситуации для каждой сопрограммы: сопрограмма может быть еще не запущена или остановлена в точке Co.Yield() или уже завершилась. Таким образом, получается 9 вариантов, которые нужно рассмотреть, чтобы проверить правильная ли программа.

В случае увеличения, количества Co.Yield() и количества сопрограмм, количество вариантов, которое нужно будет рассмотреть будет равно (Number_of_yields + 2) в степени Number_of_coprograms.