Рекурсивное добавление списков в начало элемента в списке
Используя 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)))
'()))