所以我对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)来完成的,它使用累加器变量。(accfirst-n每次在输入列表的第一个值上调用自己一旦输入列表耗尽或n为0,函数将反转累加器并返回它。
现在,keep-at-most-n-bits需要做的就是用空累加器触发helper函数。
这是Scheme-in-Scheme中相当常见的模式,但是,您可以在所需函数中定义helper函数)我不确定你用的方言是否支持这种说法,所以我决定像这样稳妥行事:)

关于list - ACL2如何保留列表的一部分?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52879049/

10-09 00:10