- •Функциональное и логическое программирование
- •Глава 1. Классификация языков и стилей программирования 3
- •Глава 2. Программирование на языКе лисп 16
- •Глава 3. Программирование на языке пролог 89
- •Глава 1. Классификация языков и стилей программирования
- •Основные парадигмы программирования
- •Процедурное (императивное, директивное) программирование.
- •Объектно-ориентированное программирование.
- •Декларативное программирование
- •Логическое программирование.
- •Функциональное программирование.
- •Классификация языков программирования
- •Функциональные языки
- •Логические языки
- •Глава 2. Программирование на языКе лисп
- •История создания языка Лисп
- •Диалекты языка Лисп
- •Лисп-машины
- •Область применения языка Лисп
- •Особенности языка Лисп Одинаковая форма данных и программ
- •Хранение данных, не зависящее от места
- •Автоматическое и динамическое управление памятью
- •Функциональная направленность
- •Динамическая проверка типов
- •Интерпретирующий и компилирующий режимы работы;
- •Пошаговое программирование
- •Единый системный и прикладной язык программирования
- •Основы языка Лисп
- •Понятие функции.
- •Quote блокирует вычисления
- •Базовые функции языка.
- •Функция car возвращает в качестве значения первый элемент списка.
- •Функция cdr - возвращает в качестве значения хвостовую часть списка, т. Е. Список, получаемый из исходного списка после удаления из него головного элемента:
- •Функция cons включает новый элемент в начало списка:
- •Предикат equal проверяет идентичность записей:
- •Предикат equalp проверяет наиболее общее логическое равенство:
- •Другие простейшие встроенные функции Лиспа. Функция null проверяет, является ли аргумент пустым списком:
- •Комбинации вызовов car и cdr позволяют получить любой элемент списка:
- •Наиболее общая функция, выделяющая n-й элемент списка (при этом индексация начинается с 0):
- •Функция last позволяет выделить последний элемент списка:
- •Функция list - создает список из элементов:
- •Функция setq – невычисляющее присваивание:
- •Функция setf - обобщенная функция присваивания:
- •Функции, обладающие побочным эффектом, называются псевдофункциями.
- •С символом можно связать именованные свойства:
- •Функция get - возвращает значение свойства, связанного с символом:
- •Псевдофункция remprop удаляет свойство и его значение:
- •Вызов интерпретатора eval вычисляет значение выражения.
- •Ввод и вывод.
- •Использование файлов.
- •Определение функций
- •Задание параметров в лямбда-списке.
- •Передача параметров и область их действия.
- •Вычисления в лисПе.
- •Предложение let создает локальную связь внутри формы:
- •Последовательные вычисления.
- •Разветвление вычислений.
- •Циклические вычисления.
- •Передача управления.
- •Другие циклические структуры.
- •Динамическое управление из другого контекста
- •Внутреннее представление списков
- •Функциональное программирование Рекурсия. Различные виды рекурсии.
- •Функции более высокого порядка.
- •Применяющие функционалы.
- •Отображающие функционалы.
- •Макросы
- •Типы данных
- •Основные типы данных:
- •Глава 3. Программирование на языке пролог
- •Общие сведения о языке Пролог. Язык Пролог как система, реализующая логический вывод в исчислении предикатов первого порядка.
- •Фразы Хорна как средство представления знаний.
- •Синтаксис языка Пролог.
- •Фразы, термы, факты, правила.
- •Константы:
- •Простейшая программа на Прологе
- •Выполнение запроса в Прологе.
- •Неудача запроса и возврат назад.
- •Декларативная и процедурная семантика Пролога.
- •Рекурсивные процедуры.
- •Списки.
- •Операторы.
- •Средства управления ходом выполнения программы. Предикат сократить (отсечение).
- •Отрицание как неудача запроса.
- •Встроенные предикаты.
- •Типы отношений.
- •Ограничения, обеспечивающие целостность отношений.
- •Свойства отношений.
- •Подходы к программированию на языке Пролог.
Функция cons включает новый элемент в начало списка:
(CONS s-выражение список) => список.
Функция строит новый список из преданных ей в качестве аргументов головы и хвоста. Для того чтобы можно было включить первый элемент функции CONS в качестве первого элемента значения второго аргумента этой функции, второй аргумент должен быть списком. Значением функции CONS всегда будет список:
(CONS ‘a ‘(b c)) => (a b c)
(CONS ‘(a b) ‘(c d)) => ((a b) c d)
(CONS (+ 1 2) ‘(+ 3)) => (3 + 3)
(CONS ‘(a b c) NIL) => ((a b c))
(CONS NIL ‘(a b c)) => (NIL a b c)
Список, разбитый с помощью CAR и CDR на голову и хвост, можно восстановить с помощью CONS:
(CONS (CAR ‘(a b c d)) (CDR ‘(a b c d))) => (a b c d)
Предикат ATOM - проверяет, является ли аргумент атомом:
(ATOM s - выражение)
При работе с выражениями необходимо иметь возможность проверить, является ли выражение атомом или списком. Это может потребоваться, например, перед применением функций CAR и CDR.
Значением вызова ATOM будет T, если аргументом является атом, и NIL - в противном случае:
(ATOM ‘a) => T
(ATOM ‘(a b c)) => NIL
(ATOM NIL) => T
(ATOM ‘(NIL)) => NIL
Предикат EQ проверяет тождественность двух символов:
(EQ символ символ)
Предикат EQ сравнивает два символа и возвращает значение T, если они идентичны, в противном случае - NIL. С помощью EQ сравнивают только символы или константы T и NIL:
(EQ ‘a ‘b) => NIL
(EQ ‘a (CAR ‘(a b c))) => T
(EQ NIL ()) => T
Предикат EQL сравнивает числа одинаковых типов:
(EQL число число)
Предикат EQL используется во многих встроенных функциях, осуществляющих более сложные операции сравнения.
(EQL 2 2) => T
(EQL 2.0 2.0) => T
(EQL 2 2.0) => NIL (не годится для разных типов)
Предикат = сравнивает числа разных типов:
(= число число)
Для сравнения чисел различных типов используют предикат «=». Значением предиката «=» является T в случае равенства чисел независимо от их типов и внешнего вида записи:
(= 2 2.0) => T
Предикат equal проверяет идентичность записей:
(EQUAL список список)
Предикат EQUAL работает как EQL, но дополнительно проверяет одинаковость двух списков. Если внешняя структура двух Лисповских объектов одинакова, то результатом EQUAL будет T:
_(EQUAL ‘a ‘a) => T
_(EQUAL ‘(a b c) ‘(a b c)) => T
_(EQUAL ‘(a b c) ‘(CONS ‘a ‘(b c))) => T
_(EQUAL 1.0 1) => NIL
Предикат equalp проверяет наиболее общее логическое равенство:
(EQUALP s-выражение s-выражение)
Предикат EQUALP позволяет сравнивать произвольные Лисповские объекты: числа различных типов, выражения, списки; используется в тех случаях, когда нет уверенности в типе сравниваемых объектов.
Недостатком применения подобных универсальных предикатов и функций требует большего объема системных вычислений, чем применение специализированных предикатов и функций.
Другие простейшие встроенные функции Лиспа. Функция null проверяет, является ли аргумент пустым списком:
(NULL s-выражение)
Функция NULL работает как логическое отрицание, у которого в Лиспе есть своя функция NOT:
(NULL ‘()) => T
(NULL ‘(1 2 3)) => NIL
(NOT (NULL NIL)) => NIL
Функция NULL реализована через EQ:
(NULL x) ( EQ NIL x)
Комбинации вызовов car и cdr позволяют получить любой элемент списка:
(C….R список)
Вместо многоточия записывается любая комбинация из букв А (для функции CAR) и D (для функции CDR). В один вызов можно объединять не более четырех функций CAR и CDR. Комбинации вызовов CAR и CDR образуют уходящие в глубину списка обращения:
(CADAR x) (CAR (CDR (CAR x)))
(CDDAR ‘((a b c d) e)) => (c d)
(CDDR ‘(k l m)) => (m)
Через комбинацию вызовов CAR и CDR реализованы функции, позволяющие получить произвольный элемент списка с 1-го по 10-й:
(first список) (car список)
(second список) (cadr список)
(third список) (caddr список)
(fourth список) (cadddr список)
…
(third (cons a (cons b (cons c nil) ) ) ) => c
(fourth ‘(a b c) ) => NIL
