所以我对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
每次在输入列表的第一个值上调用自己一旦输入列表耗尽或n
为0,函数将反转累加器并返回它。现在,
keep-at-most-n-bits
需要做的就是用空累加器触发helper函数。这是Scheme-in-Scheme中相当常见的模式,但是,您可以在所需函数中定义helper函数)我不确定你用的方言是否支持这种说法,所以我决定像这样稳妥行事:)
关于list - ACL2如何保留列表的一部分?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52879049/