Cómo bucle que utiliza la recursividad en ACL2?
-
15-10-2019 - |
Pregunta
Necesito hacer algo como esto pero en ACL2:
for (i=1; i<10; i++) {
print i;
}
Se utiliza Common Lisp, pero no tienen idea de cómo realizar esta tarea ...
No se puede utilizar construcciones estándar Common Lisp como LOOP, DO. Sólo recursividad.
Tengo algunos enlaces, pero me resulta muy difícil de entender:
Solución
La sección "visitar todos los números naturales de N a 0" en Una Introducción a la Programación ACL2 explica cómo hacerlo.
En el caso de que quiera visite números en orden ascendente, por lo que el código debe ser algo como esto:
(defun visit (n max ...)
(cond ((> n max) ...) ; N exceeds MAX: nothing to do.
(t . ; N less than or equal to MAX:
. n ; do something with N, and
.
(visit (+ n 1) max ...) ; visit the numbers above it.
.
.
.)))
Otros consejos
solución A que los usos recursión:
> (defun for-loop (from to fn)
(if (<= from to)
(progn
(funcall fn from)
(for-loop (+ from 1) to fn))))
;; Test
> (for-loop 1 10 #'(lambda (i) (format t "~a~%" i)))
1
2
3
4
5
6
7
8
9
10
NIL
(defun foo-bucle (n) (Cond ((zp n) "hecho") (T (prog2 $ (cw "~ x 0" n) (Foo-bucle (1- n)))))
(foo-loop 10)
Puede volver a realizar la condición de terminación y la recursividad para imitar va de 1 a 10.