- •Модуль 1. Приемы программирования на пролоГе.
- •Тема 1. Основные понятия и определения логического программирования.
- •Лекция 1
- •1. Язык логического программирования пролог.
- •1.1 Основные понятия и определения
- •Лекция 2
- •1.2 Создание консольного приложения. Структура файла main.Pro.
- •1.3 Примеры построения правил
- •Лекция 3
- •1.5 Согласование целевых утверждений. Поиск с возвратом
- •1.5 Рекурсия в пролоГе.
- •Лекция 4
- •1.6 Средства управления пролог-программой. Отладка пролог-программ.
- •1.7 Стандартные предикаты обработки строк
- •1.8 Средства ввода и вывода. Работа с файлами.
- •Лекция 4
- •1.9 Изображение и обработка списков
- •Лекция 5
- •1.10 Динамические базы данных
- •2. Язык функционального программирования лисп Введение
- •2.1 Объекты данных Лиспа
- •2.2 Основные функции лисПа
- •2.2.1 Функции назначения
- •2.2.2 Числовые функции
- •2.2.3 Базовые функции лисПа
- •2.3 Основы работы в среде mulisp-85
- •2.4 Трассировка функций в muLisp.
- •2.4 Определение функций в лисПе
- •2.6 Рекурсивные определения и вычисления
- •Задания для лабораторных работ
2.2 Основные функции лисПа
Из определение S-выражения также вытекает, что в ЛИСПе принята префиксная форма записи функции, имя которой расположено после открывающейся скобки. Например, выражение 2*x+3 запишется как (+ (* 2 x)), при этом действия выполняются из середины наружу. Структура программы не отличается от структуры данных и появляется возможность записывать функции в виде списков, т.е. данные (списки) и программа (списки) представляются единым образом.
При обращении к функции указывается ее имя и аргументы (фактические параметры – ACTUAL ARGUMENTS). Аргументами функции в общем случае могут быть S-выражения. Связь с формальными параметрами (FORMAL ARGUMENTS) осуществляется по значению.
В некоторых случаях не требуются вычисления значений выражений, а нужны сами выражения. Если нас не интересует значение функционального выражения, например (+ 2 3), значение которого равно 5, а нужно обработать форму как список, то это выражение записывают особым способом. А именно, для предупреждения вычислений перед ним ставят апостроф " ' ". Апостроф перед выражением – это сокращение лисповской формы QUOTE, которая записывается в единой для Лиспа префиксной нотации
‘ выражение ≡ (QUOTE выражение).
QUOTE – специальная функция с одним аргументом, которая возвращает в качестве значения этот аргумент. Апостроф автоматически переопределятся в QUOTE.
(QUOTE ' y ) (QUOTE y).
Перед константами не надо ставить апостроф, так как число и его значение совпадают.
Существует функция, которая разрешает снять блокирование QUOTE на вычисление. Она называется EVAL и обеспечивает дополнительный вызов интерпретатора Лиспа. Функции QUOTE и EVAL действуют во взаимно противоположных направлениях и аннулируют эффект друг друга
(QUOTE (+ 1 2)) (+ 1 2),
(EVAL (QUOTE (+ 1 2))) 3.
EVAL – это универсальная функция Лиспа, которая может вычислить любое правильно составленное s-выражение.
2.2.1 Функции назначения
Значение символу можно назначить или связать с некоторым значениемс помощью функции SET. Функция SET связывает символ со значением, предварительно вычисляя значение аргументов и возвращает в качестве результата значение второго аргумента
(SET ‘a (+ 2 3)) 5, (2)
(SET ‘a ‘(+ 2 3)) (+ 2 3).
В следующем примере происходит вычисление и первого аргумента
(set 'name '(a b c) ), (set (car name) 'town ),
в результате которого символ a будет связан со значением town.
Если перед первым аргументом нет апострофа, то значение будет присвоено значению этого аргумента. В этом случае необходимо быть довольно аккуратным, поскольку возможны ситуации, которые приводят к ошибкам. Так, если был вызов (2), то следующий вызов (SET a c) приводит к ошибке, поскольку константе 5 значение назначить невозможно.
Функция SETQ отличается от SET тем, что она вычисляет только свой второй аргумент. Она автоматически блокирует вычисление первого аргумента (буква от QUOTE в имени функции). При этом отпадает необходимость апострофа перед первым аргументом
(SETQ a (+ 2 3)) 5,
(SETQ a ‘(+ 2 3)) (+ 2 3).