如何在ACL2中使用递归循环?

时间:2011-01-20 22:58:42

标签: lisp common-lisp acl2

我需要在ACL2中制作类似的东西:

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

它使用COMMON LISP,但我不知道如何完成这项任务......

我们不能使用标准的Common Lisp结构,例如LOOP,DO。只是递归。

我有一些链接,但我发现很难理解:

3 个答案:

答案 0 :(得分:1)

使用递归的解决方案:

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

答案 1 :(得分:1)

A Gentle Introduction to ACL2 Programming中的“访问从n到0的所有自然数”部分说明了如何执行此操作。

在您的情况下,您希望按升序访问数字,因此您的代码应如下所示:

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

答案 2 :(得分:1)

(defun foo-loop(n)   (cond((zp n)&#34; done&#34;)          (t(prog2 $(cw&#34; ~x0&#34; n)                     (foo-loop(1- n)))))

(foo-loop 10)

您可以重做终止条件和递归以模仿从1到10。