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

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

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

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

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

textual
Листинг программы
  1. ;; Рекурсия :
  2.  
  3. (defun each1 (p l)
  4.   (cond ((null l) t)
  5.         ((funcall p (car l)) (each1 p (cdr l)))
  6.         (t nil)))
  7.  
  8. ==> each1
  9.  
  10. (each1 'atom '(a b c))
  11.  
  12. ==> T
  13.  
  14. (each1 'numberp '(1 2 a 3))
  15.  
  16. ==> NIL
  17.  
  18. ;; свертка
  19.  
  20. (defun each1 (p l)
  21.    (reduce (lambda (a x) (and a (funcall p x))) l :initial-value t))
  22.  
  23. ==> each1
  24.  
  25. (each1 'numberp '(1 2 a 3))
  26.  
  27. ==> NIL
  28.  
  29. (each1 'atom '(a b c))
  30.  
  31. ==> T
  32.  
  33. ;; итерация
  34.  
  35. (defun each1 (p l)
  36.   (iter (for a in l) (unless (funcall p a) (return nil)) t))
  37.  
  38. ==> each1
  39.  
  40. (each1 'atom '(a b c))
  41.  
  42. ==> T
  43.  
  44. (each1 'numberp '(1 2 a 3))
  45.  
  46. ==> 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы