ACL2如何保留一个列表的一部分?

ACL2 how to keep part of a list?

所以我对 acl2 和 lisp 还是比较陌生,我不知道在 lisp 中有什么方法可以做到这一点。我怎样才能实现我的评论?(缺点...)我一直在考虑迭代器,但我被告知 ACL2 仅使用递归

(defun keep-at-most-n-bits (l n)
   ;cons a (up to n) 

   )

;;;unit tests.
(check-expect (keep-at-most-n-bits '(1 0 1 1) 3)  '(1 0 1))
(check-expect (keep-at-most-n-bits '(1 0 1 1) 2)  '(1 0))
(check-expect (keep-at-most-n-bits '(1 0 1 1) 8)  '(1 0 1 1))

这看起来符合您的要求:

(defun first-n (lst n acc)
  (if (or (= n 0) (eq lst nil))
      (reverse acc)
    (first-n (cdr lst) (- n 1) (cons (car lst) acc))))

(defun keep-at-most-n-bits (l n)
  (first-n l n '()))

这通过创建一个带有累加器变量的辅助函数 (first-n) 来实现。 (acc) first-n 调用自身,每次都使用输入列表的第一个值。一旦输入列表耗尽或 n 为 0,则函数反转累加器并 returns 它。

现在,所有 keep-at-most-n-bits 需要做的就是使用空累加器启动辅助函数。

这是 Scheme 中相当常见的模式 — 然而,在 Scheme 中,您可以在需要它的函数中定义辅助函数。:) 我不确定您使用的方言是否支持它与,所以我决定像这样安全行事。 :)