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:

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top