Функциональный предикат - Lisp (229435)

Узнай цену своей работы

Формулировка задачи:

Определите функциональный предикат each1(p l), который истинен в том и только том случае, когда, являющийся функциональным аргументом предикат p истинен для всех элементов списка l. Примеры:
>(each1 'atom '(a b c))
<T 
>(each1 'numberp '(1 2 a 3))
<NIL
Вопрос: не очень понятно,что нужно сделать. Как я понимаю, нужно описать функцию, которая будет проверять, является ли каждый элемент из списка атомом. Но,допустим, функция описана, а что дальше делать? Заранее благодарю за ответ!

Решение задачи: «Функциональный предикат»

textual
Листинг программы
;; Рекурсия :
 
(defun each1 (p l)
  (cond ((null l) t)
        ((funcall p (car l)) (each1 p (cdr l)))
        (t nil)))
 
==> each1
 
(each1 'atom '(a b c))
 
==> T
 
(each1 'numberp '(1 2 a 3))
 
==> NIL
 
;; свертка
 
(defun each1 (p l)
   (reduce (lambda (a x) (and a (funcall p x))) l :initial-value t))
 
==> each1
 
(each1 'numberp '(1 2 a 3))
 
==> NIL
 
(each1 'atom '(a b c))
 
==> T
 
;; итерация
 
(defun each1 (p l)
  (iter (for a in l) (unless (funcall p a) (return nil)) t))
 
==> each1
 
(each1 'atom '(a b c))
 
==> T
 
(each1 'numberp '(1 2 a 3))
 
==> NIL

Объяснение кода листинга программы

В коде представлены три реализации обобщённой рекурсивной функции each1, выполняющей последовательную обработку элементов списка l с помощью предиката p.

  1. В первой реализации используется условие (cond), которое проверяет, является ли список пустым. Если это так, то возвращается значение t. В противном случае функция вызывает саму себя с аргументами (car l) и (cdr l), передавая в качестве начального значения t.
  2. Во второй реализации используется функция reduce, которая применяет функцию (lambda (a x) (and a (funcall p x))) к элементам списка l, начиная с t в качестве начального значения.
  3. В третьей реализации используется итерация с помощью функции iter и генератора (for a in l). Если элемент списка с предикатом p не проходит, то возвращается nil. В противном случае возвращается значение t.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.222 из 5
Похожие ответы