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 中,您可以在需要它的函数中定义辅助函数。:) 我不确定您使用的方言是否支持它与,所以我决定像这样安全行事。 :)
所以我对 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 中,您可以在需要它的函数中定义辅助函数。:) 我不确定您使用的方言是否支持它与,所以我决定像这样安全行事。 :)