[ИУ9] Основы информатики

Лекция 6а. Понятие свёртки

Свёртка — объединение нескольких значений одной операцией. Примеры: вычислить сумму нескольких чисел, произведение нескольких чисел и т.д.

a • b • c • … • k

Здесь знаком обозначена некоторая двуместная операция.

Свёртка может быть правой и левой.

Правая свёртка:

a • (b • (c • (… • k)…))

Левая свёртка:

((…(a • b) • c) … • k)

Иногда для свёртки может быть определён некоторый нейтральный элемент z:

((a • b) • c) = (((z • a) • b) • c)
(a • (b • c)) = (a • (b • (c • z)))

В Scheme некоторые операции обладают свойством свёртки, такие функции могут принимать произвольное количество параметров.

  1. Сложение: (+ 1 2 3 4)10
  2. Умножение: (* 1 2 3 4)24
  3. Вычитание: (- 10 5 3)2
  4. Деление: (/ 120 6 5)4
  5. Функции min и max: (min 3 8 2 5)2, (max 3 8 2 5)8.
  6. Конкатенация списков: (append '(a b) '(c d e) '(f g))(a b c d e f g).
  7. Конкатенация строк: (string-append "ab" "cde" "fg")"abcdefg".

Особые формы (and …) и (or …) тоже обладают обладают свойством свёртки, не смотря на то, что это не функции.

Для свёрток определена такая аксиома, что если op — свёрточная операция, то

(op x) ≡ x

кроме - и / — (- x) меняет знак числа, (/ x) — вычисляет обратное значение.

Для ряда свёрточных операций существует нейтральный элемент. Он возвращается при вызове операции без параметров:

(+)            → 0
(*)            → 1
(append)       → '()
(string-append) → ""
(and)          → #t
(or)           → #f

Для вызова свёрточных операций часто используется функция apply:

(define xs '(1 2 3 4))

(apply * xs)                       → 24
(apply + xs)                       → 10

Помимо свёрточных операций (+, * и т.д.) в Scheme произвольное число параметров принимают операции арифметических отношений:

(= 1 1 1)                          → #t
(= 1 2 1)                          → #f
(> 7 5 2)                          → #t
(> 7 5 5)                          → #f
(>= 7 5 5 2)                       → #t
...

Операции арифметических отношений не являются свёрточными, т.к. запись вида (a < b) < c бессмысленна, но здесь упоминаются для полноты картины. Их тоже можно вызывать при помощи apply.

Назначение функции apply:

  1. Вызов свёрточных операций.
  2. Вызов функции с неизвестным числом аргументов.

При помощи apply невозможно вызвать and и or, поскольку они не функции (попытка вызова будет ошибкой синтаксиса).