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

时间:2018-10-18 16:59:32

标签: 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-bits '(1 0 1 1) 2)  '(1 0))
(check-expect (keep-at-most-n-bits '(1 0 1 1) 8)  '(1 0 1 1))

1 个答案:

答案 0 :(得分:2)

这看起来像您想要的:

(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)来实现,该函数需要一个累加器变量。 (accfirst-n每次都会根据输入列表的第一个值进行调用。输入列表用尽或n为0后,该函数将反转累加器并将其返回。

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

这是Scheme中的一种相当常见的模式-但是,在Scheme中,您可以在需要它的函数中定义助手功能。:)我不确定您使用的方言是否支持该功能,所以我决定像这样安全地玩。 :)