Question

Je dois faire quelque chose comme ça, mais en ACL2:

for (i=1; i<10; i++) {
    print i;
}

Il utilise Common Lisp, mais je ne la moindre idée comment faire cette tâche ...

Nous ne pouvons pas utiliser des constructions standards tels que Common Lisp LOOP, DO. Juste récursivité.

J'ai quelques liens, mais je trouve qu'il est très difficile à comprendre:

Était-ce utile?

La solution

La section "Visiter tous les nombres naturels de n à 0" dans A Gentle introduction à la programmation ACL2 explique comment le faire.

Dans votre cas, vous voulez nombre de visites dans l'ordre croissant, de sorte que votre code devrait ressembler à ceci:

(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.
             .
            .
           .)))

Autres conseils

une solution qui utilise la récursion:

> (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-boucle foo (n)   (Cond ((ZP n) "fait")          (T (prog2 $ (cw "~ x0" n)                     (Foo-boucle (1- n)))))

(foo-boucle 10)

Vous pouvez refaire la condition de terminaison et la récursivité mimétique allant de 1 à 10.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top