- •Предложения в языке Пролог.
- •Термы Пролога.
- •Процедурная семантика и декларативный смысл.
- •Списки. Базовые операции над списками.
- •Операция сопоставления.
- •Перебор в Прологе. Механизм прямой трассировки и механизм возврата.
- •Отсечение в прологе, виды отсечений.
- •Арифметические действия в прологе.
- •Операторная запись.
- •Типовые предикаты Пролога.
- •Работа с базами данных.
- •Пролог и искусственный интелект.
- •Экспертные системы.
- •Двоичные деревья, двоичные справочники.
- •Решение логических задач, головоломок.
- •Представления графов в Прологе.
- •Как Пролог-система отвечает на вопросы пользователя.
- •Понятие строго функционального языка.
- •Определение функции. Безымянная лямбда функция.
- •Списки, операции над списками.
- •Внутреннее представление списков.
- •Символ, значение символа, свойства символа.
- •Рекурсия в Прологе, рекурсия по значению и аргументу.
- •Виды рекурсий в Лиспе.
- •Функции более высокого порядка. Применяющие и отображающие функционалы.
- •Замыкания.
- •Лисп в искусственном интеллекте.
А
Символ, значение символа, свойства символа.
Логические значения true, false и nil являются константами. Символы true, false и nil имеют в Лиспе специальное назначение: true обозначает логическое значение истина, false - ложь, nil - ничего. Символом nil обозначается также и пустой список. Эти символы имеют всегда одно и то же фиксированное встроенное значение. Их нельзя использовать в качестве имён других лисповских объектов.
Различают два типа атомов: символьные и числовые. Символьный атом состоит обычно из букв, но может содержать и другие символы (числа, символ подчеркивания), но обязательно должен содержать хотя бы один символ, отличающий его от числа. Символьный атом нельзя расчленять на составляющие символы. Единственная операция, допустимая над символами – операция сравнения. Числовой атом является последовательностью цифр, возможно следующих за знаком.
Символ - это имя, состоящее из букв, цифр, специальных знаков и обозначающее какой-либо предмет, объект, вещь, действие из реального мира.
В Lisp любой символьный атом может быть связан со списком свойств атома. Список свойств может быть пуст или содержать произвольное количество свойств. Свойство представляется парой имя_свойства - значение_свойства.
Пример:
Свойства символа ТОК: (система_измерения Ампер)
Рассмотрим функции чтения, изменения и удаления свойств, определяемых пользователем:
Чтение свойства
Значение свойства можно выяснить с помощью функции
GET(символ свойство)
Присваивание свойства.
Задать новое свойство или изменить его значение можно осуществить с помощью функции (PUTPROP символ значение свойство)
Однако в Common Lisp такой функции не существует, для присваивания свойства атому в этой версии Lisp применяется обобщенная функция присваивания SETF и функции GET
По сути GET возвращает ячейку памяти для данного свойства, а SETF присваивает значение свойство ячейке, то есть SETF изменяет физическую структуру списка.
self(get символ свойство) значение)
Удаление свойства
Удаление свойства и его значения производятся функцией
(REMPROP символ свойство) , в Common Lisp в случае успешного удаления возвращается значение T:
В случае если удаляемого свойства не существует, возвращается значение NIL:
Рекурсия в Прологе, рекурсия по значению и аргументу.
Любое определение, которое описывается в терминах самого себя, называется рекурсивным.
Следует отметить тот факт, что в рекурсивном определении, рекурсия присутствует только один раз. Программы такого вида называют минимально рекурсивными. Кроме того, рекурсивная цель в правиле присутствует в конце предложения (операция вывода на экран не в счет), это хвостовая рекурсия
Виды рекурсий в Лиспе.
В Лиспе рекурсия может быть по значению или по аргументам. Если рекурсивный вызов является выражением, формирующим результат функции, то имеет место рекурсия по значению. Если же рекурсивный вызов является аргументом некоторой другой функции, формирующей окончательный результат, то имеет место рекурсия по аргументам.
Различают следующие формы рекурсии:
– простая рекурсия, если рекурсивный вызов встречается в некоторой ветви не более одного раза;
– параллельная рекурсия, если рекурсия встречается одновременно в нескольких аргументах функции;
– взаимная рекурсия, если при определении одной функции, вызывается другая, которая в свою очередь вызывает первую;
– рекурсия более высокого порядка, если в качестве аргумента рекурсивного вызова выступает рекурсивный вызов.
