Рекурсивное добавление списков в начало элемента в списке

Используя 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)))

   )))

Но я всегда получаю ноль, несмотря ни на что, и я не могу понять, почему. Поэтому я даже не знаю, правильный ли мой рекурсивный вызов. Мне просто трудно отследить нетривиальную рекурсию.

1 ответ

Решение

Что-то вроде этого?

(defun ins (arg1 arg2)
  (if arg2
      (cons (append arg1 (car arg2)) 
            (ins arg1 (cdr arg2)))
      '()))
Другие вопросы по тегам