}
}
};
Подставим определения предикатов взятьЧисло и перваяЦифра на место вызовов. Проведем очевидные упрощения.
Сумма(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)