- •Модуль 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.2 Числовые функции
Числовые функции выполняют основные математические операции над целыми и дробными числами. К элементарным числовым функциям относятся: сложение, вычитание, умножение и деление. В языке программирования ЛИСП они являются n-арными, т.е. количество их аргументов неограниченно. Они имеют следующий синтаксис
1. (+ <num1> <num2> ... <num>). 3. (* <num1> <num2> ... <num>)
2. ( - <num1> <num2> ... <num>) 4. (/ <num1> <num2> ... <num>)
и действуют следующим образом
(+ x1 x2 ... xn) x1 + x2 + x3 + ... + xn.
(– x1 x2 ... xn) x1 – x2 – x3 – ... – xn.
(* y1 y2 ... yn) y1 * y2 * y3 * ... * yn.
(/ x1 x2 ... xn) x1/x2/... /xn.
Функции увеличения и уменьшения на единицу имеют вид (ADD1 <n>), (SUB1 <n>) и возвращают значение, которое на единицу больше (меньше) чем аргумент.
К числовым функциям относятся MIN и MAX, которые определяют соответственно минимальное и максимальное значения числовой последовательности, а также функции сравнения, округление остатка от деления, и т.п. и набор стандартных математических функций.
Функции предикатного типа, которые принимают только значение истина или ложь и определяют тип аргумента, называются функциями распознавания. К ним относятся
(numberp n) – число; (integerp n) – целое; (zerop n) = 0;
(plusp n) > 0; (minusp n) < 0;
(oddp n) – четное; (evenp n) – нечетное.
и прочие. Они обычно применяются для построения условных функций.
2.2.3 Базовые функции лисПа
В ЛИСПе для обработки списков, т.е. для обработки, анализа и построения списков существуют базовые функции. Они образуют систему аксиом языка, к которым сводятся символьные вычисления. В этом смысле их можно сравнить с основными арифметическими операциями. Простота базовых функций и их малое количество – одно из достоинств ЛИСПа. Lisp имеет пять базовых функций. Их вызов имеет следующий формат:
(name arg1 arg2 ...), где name – имя функции, arg1,arg2,... – ее аргументы.
1. (CAR <list>) – голова списка.
2. (CDR <list>) – хвост списка.
3. (CONS <object> <list>) – присоединение объекта к списку.
4. (EQL <atom1> <atom2>) – сравнение двух атомов.
5. (ATOM <object>) – проверка, является ли <object> атомом.
CAR и CDR называются селекторными функциями, поскольку они дают возможность выбирать или уничтожать часть объекта. Результатом функции (CAR list) всегда есть первый элемент списка list, если он не пустой и NIL, в противном случае. Результатом функции (CDR list) есть список list без первого элемента, если list содержит больше одного элемента и NIL в противном случае.
(CAR ‘(a b c d)) a (CAR ‘((1 2) (2 3))) ’(1 2)
(CAR ‘()) NIL
(CDR ‘(f q h l t)) ‘( q h l t) (CDR ‘((f q h) l t)) ’( l t))
(CDR ‘(s w)) NIL (CDR ‘(( ) ( ) ( ))) (( ) ( ))
С помощью функций CAR, CDR можно находить по данному списку любой его подсписок или атом. Довольно удобны при обработке списков функции, которые являются комбинациями CAR и CDR. Имена таких функций начинаются на C и заканчиваются R, а между ними находится последовательность букв A (применение CAR) и D (применение CDR), которая указывает путь вычислений.
(CAR (CDR (CDR ‘(1 2 3 4 5 6)))) (CADDR ‘(1 2 3 4 5 6)) 3
(CAR (CAR ‘((1 2)))) (CAAR ‘((1 2))) 1
Вызовы происходят из середины наружу.
Функция конструктора CONS применяется для присоединения объекта к заданному списку. Объект, который добавляется, становится головой списка. Если второй аргумент не задан, то он считается равным NIL.
(CONS ‘a ‘(b c d)) (a b c d)
(CONS ‘(a b) ‘(c d)) ((a b) c d)
В последнем случае мы получили список с подсписками.
Для объединения двух списков в линейный список существует функция (APPEND <list> <list>), результат действия которой для этого примера был бы
(APPEND ‘(a b) ‘(c d)) (a b c d)
Функцией сравнения является EQL. Она сравнивает значение первого и второго аргумента, которые обязательно должны быть атомами, и возвращает значение истина (Т) или ложь (NIL).
(EQL ‘df ‘df) T (EQL (CAR ‘(q w)) q) T
(EQL (CAR ‘(a h)) NIL) F
При программировании на Лиспе часто возникает вопрос: является ли данный объект атомом. Этот вопрос можно решить с помощью предиката ATOM, который возвращает Т, если объект является атомом и NIL в обратном случае. Пустой список NIL считается атомом.
(ATOM one) T (ATOM ‘(s d h))F
Образовать список, который состоит из одного элемента можно с помощью функции конструктора, а именно
(CONS a ( )) (a).
В общем случае для этой цели существует функция LIST, которая имеет следующий формат записи
(LIST <s-выражение 1> <s-выражение 2>...<s-выражение N>),
а в результате вызова имеем
(LIST a b c) ’(a b c)
Разветвление вычислений в Лиспе реализуется с помощью условных функций. В частности, наиболее употребительная форма IF имеет общий формат
(IF (условие) (Then form) (Else form)).
В том случае, когда условие (предикат) не равно NIL, функция возвращает значение Then form, а в противном случае значения Else form.
(IF (minusp a) 0 1)
Поскольку случаи, когда можно ограничиться только формой Then на практике встречаются очень часто и форма Else становится не нужной, в Лиспе существует сокращенная форма условной функции, в которой слово IF опускается
((minusp a) 0).