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

List ACL2如何保留列表的一部分?,list,recursion,lisp,acl2,List,Recursion,Lisp,Acl2,所以我对acl2和lisp还比较陌生,我不知道用lisp做这件事的方法。我怎样才能获得我的评论?(cons a…)我一直在考虑迭代器,但我被告知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-b

所以我对acl2和lisp还比较陌生,我不知道用lisp做这件事的方法。我怎样才能获得我的评论?(cons a…)我一直在考虑迭代器,但我被告知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
调用自身,每次都会对输入列表的第一个值进行cons'ing。一旦输入列表用尽或
n
为0,则函数会反转累加器并返回累加器

现在,需要做的就是使用空累加器启动helper函数

这是Scheme-in-Scheme中相当常见的模式,但是,您可以在所需的函数中定义helper函数。:)我不确定您使用的方言是否支持这种说法,因此我决定这样做以确保安全。:)