con Isabelle/Isar - Dpto. Ciencias de la Computación e Inteligencia ...
con Isabelle/Isar - Dpto. Ciencias de la Computación e Inteligencia ...
con Isabelle/Isar - Dpto. Ciencias de la Computación e Inteligencia ...
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
5.2. Recursión general. La función <strong>de</strong> Ackermann 43<br />
usados son<br />
append_assoc (xs @ ys) @ zs = xs @ (ys @ zs)<br />
append.append_Cons (x#xs)@ys = x#(xs@ys)<br />
append.append_Nil []@ys = ys<br />
Los dos últimos son <strong>la</strong>s ecuaciones <strong>de</strong> <strong>la</strong> <strong>de</strong>finición <strong>de</strong> append.<br />
En <strong>la</strong> siguiente <strong>de</strong>mostración se <strong>de</strong>tal<strong>la</strong>n los lemas utilizados.<br />
lemma (inversa xs)@(a#ys) = (inversa (a#xs))@ys<br />
proof −<br />
have (inversa xs)@(a#ys) = (inversa xs)@(a#([]@ys))<br />
by (simp only:append.append-Nil)<br />
also have . . . = (inversa xs)@([a]@ys) by (simp only:append.append-Cons)<br />
also have . . . = ((inversa xs)@[a])@ys by (simp only:append-assoc)<br />
also have . . . = (inversa (a#xs))@ys by (simp only:inversa.simps(2))<br />
finally show ?thesis .<br />
qed<br />
5.2 Recursión general. La función <strong>de</strong> Ackermann<br />
El objetivo <strong>de</strong> esta sección es mostrar el uso <strong>de</strong> <strong>la</strong>s <strong>de</strong>finiciones recursivas generales y<br />
sus esquemas <strong>de</strong> inducción. Como ejemplo se usa <strong>la</strong> función <strong>de</strong> Ackermann (se pue<strong>de</strong><br />
<strong>con</strong>sultar información sobre dicha función en Wipipedia).<br />
Definición 5.2.1. La función <strong>de</strong> Ackermann se <strong>de</strong>fine por<br />
⎧<br />
⎪⎨ n + 1, si m = 0,<br />
A(m, n) = A(m − 1, 1) si m > 0 y n = 0,<br />
⎪⎩<br />
A(m − 1, A(m, n − 1)), si m > 0 y n > 0<br />
para todo los números naturales. La función <strong>de</strong> Ackermann es recursiva, pero no es primitiva<br />
recursiva.<br />
fun ack :: nat ⇒ nat ⇒ nat where<br />
ack 0 n = n+1<br />
| ack (Suc m) 0 = ack m 1<br />
| ack (Suc m) (Suc n) = ack m (ack (Suc m) n)<br />
Nota 5.2.2 (Definiciones recursivas generales).<br />
• Las <strong>de</strong>finiciones recursivas generales se i<strong>de</strong>ntifican mediante fun.