Wie eine Schleife mit Rekursion in ACL2?
-
15-10-2019 - |
Frage
Ich brauche, um so etwas wie diese, aber in ACL2:
for (i=1; i<10; i++) {
print i;
}
Es benutzt COMMON LISP, aber ich habe keine Ahnung, wie diese Aufgabe...
Wir nicht verwenden standard Common Lisp Konstruktionen, wie zum Beispiel SCHLEIFE, DO.Nur Rekursion.
Ich habe einige links, aber ich finde es sehr schwer zu verstehen ist:
Lösung
Der Abschnitt "Besuch aller natürlichen zahlen von n bis 0" Eine Sanfte Einführung in ACL2-Programmierung erklärt, wie es zu tun.
In Ihrem Fall, die Sie besuchen möchten-zahlen in aufsteigender Reihenfolge, sodass Ihr code sollte wie folgt Aussehen:
(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.
.
.
.)))
Andere Tipps
Eine Lösung, die Rekursion verwendet:
> (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-loop (n) (Cond ((Zp n) "Done") (t (prog2 $ (cw "~ x0" n) (Foo-Loop (1- n)))))
(Foo-Loop 10)
Sie können den Beendigung Zustand und die Rekursion nach nachahmen von 1 bis 10 wiederholen.