0

使用 acl2,我试图创建一个函数“ins”,它递归地将第一个参数(一个列表)附加到第二个参数(另一个列表)中每个元素的前面,其中

(ins (something) ( (a b c) (d e f) ...))

返回

( (something a b c) (something d e f) ...)

所以调用函数本身

(ins '((one thing)) '( ((this is)) ((something else)) ))

会给我们

'( ((one thing) (this is)) ((one thing) (something else)) ))

我提出了仅适用于包含单个元素的 arg2 列表的非递归函数,检查是否为空。

(defun ins(arg1 arg2)

  (if (equal arg2 nil) '() (list(append  arg1 (first arg2))))

)

当我尝试提出一些递归的方法时,它将第一个参数附加到第二个参数列表中的所有元素上,我能做的最好的就是

(defun ins (arg1 arg2)

  (cond

   ((equal arg2 nil) '())

   ((not(equal arg2 nil)) (ins (list(append  arg1 (first arg2))) (first(rest arg2)))

   )))

但无论如何我总是得到零,我似乎无法弄清楚为什么。因此,我什至不知道我的递归调用是否正确。我只是很难跟踪非平凡的递归。

4

1 回答 1

2

像这样的东西?

(defun ins (arg1 arg2)
  (if arg2
      (cons (append arg1 (car arg2)) 
            (ins arg1 (cdr arg2)))
      '()))
于 2015-12-01T21:38:10.560 回答