Else break

}

}

};

Подставим определения предикатов взятьЧисло и перваяЦифра на место вызовов. Проведем очевидные упрощения.

Сумма(string s, nat n : nat n)

{ for (; ;) {

for (; ;) {

if (s = nil) #M1

{ char e = s.car || s = s.cdr };

if (цифра(e)) #2

}

case 2: {числоВстроке(e, s: nat v, string s); n= n + v}

}

M1:

}

числоВстроке(char e, string s: nat v, string s)

{ v = val(e);

for (; ;) {

if (s = nil) break

{char b = s.car || s = s.cdr};

if (цифра(b)) v = v * 10 + val(b)