- •8. Языки и технологии программирования для искусственного интеллекта
- •8.1. Обзор языка prolog
- •8.2. Типы данных prolog
- •8.3. Структура программы на prolog
- •8.3.1. Раздел целей
- •8.3.2. Организация запросов на prolog
- •8.4. Ввод-вывод данных на prolog
- •8.5. Разветвления на prolog
- •8.6. Правила логического вывода
- •8.6.1. Понятие об унификации и конкретизации
- •8.6.2. Правило логического вывода на prolog
- •8.6.3. Задачи на упорядочение объектов
- •8.7. Рекурсия на prolog
- •8.7.1. Понятие рекурсии на prolog
- •8.7.2. Числовая рекурсия
- •8.7.3. Рекурсия в графике
- •8.8. Списки prolog. Рекурсивная обработка списков
- •8.8.1. Определение и структура списка
- •8.8.2. Рекурсивная обработка списков
- •8.9. Решение логических задач на prolog
- •8.9.1. Понятие о методе резолюций
- •8.10. Задачи, использующие структуру графа
8.2. Типы данных prolog
Предложим классификацию данных PROLOG как на рис. 8.1.
Переменные это данные PROLOG, имеющие имя, представляющее собой набор букв и цифр, начинающийся с заглавной (прописной) буквы. Переменная может быть конкретизирована каким-либо значением или не конкретизирована. Следует отметить, что конкретизация не является полным аналогом оператора присваивания.
Рис. 8.1. Классификация данных PROLOG
Переменная получает свое значение только в результате сопоставления с константами в фактах и правилах программы. Получив значение, переменная владеет им лишь до получения ответа на запрос. После этого переменная вновь становится свободной и участвует в поиске альтернативных решений. Поэтому следует помнить:
переменная не является хранилищем информации на все время работы программы, а служит частью процесса сопоставления (унификации), о котором речь пойдет далее;
областью действия переменной является не вся программа, а лишь одно предложение, то есть одно правило или один вопрос.
Во многих случаях переменная встречается в правиле только один раз и ее значение не влияет на результат логического вывода. Такую переменную называют анонимной и замещают знаком подчеркивания.
Атомом называют любой набор символов алфавита, заключенный в кавычки, или набор строчных букв и цифр, начинающийся с буквы, например:
"alpha","Alpha","4beta",anna,x5
Не являются атомами наборы:
1b,#d,a-b
Атомом также является любой символ алфавита. Например:
( , ; , < , >
Числовые константы определяются в PROLOG так же, как и в других языках.
Принято также использовать рекурсивное определение списка:
пустой список [] – это список;
[A¦B] – список, если B – список.
И наконец, структурой называют единый объект PROLOG, состоящий из совокупности других объектов, например:
Отец(Х,иван)
8.3. Структура программы на prolog
Программа на языке PROLOG состоит из:
раздела объявления типов переменных (domains);
раздела объявления предикатов (predicates);
раздела целей (clauses).
Раздел объявления типов переменных имеет вид:
Domains
<список имен типов>=<описание типа>.
Например:
Domains
X=integer.
Z=real.
U=symbol*.
В этом разделе объявлены целый тип с именем X, вещественный тип с именем Z, и тип U обозначает список слов.
Раздел объявления предикатов имеет вид:
Predicates
<имя предиката>(<список типов аргументов>).
Например:
Predicates
vvod(X).
dlina(U,X).
Здесь объявлен предикат vvod с одним целым аргументом, и предикат dlina с двумя аргументами, первый из которых – список, второй – целое число.
В конце любого предложения ставится точка.
8.3.1. Раздел целей
Фактом называют предложение PROLOG следующего вида:
<имя факта>(<список констант через запятую>), –
которое считается всегда истинным.
Например:
Хобби(анна,марки).
Хобби(петя,фантики).
Данное([1,2,3,4]).
Предикатом называют предложение PROLOG вида:
<имя предиката>(<список имен переменных и констант через запятую>),
которое может принимать значение истина или ложь в зависимости от значений переменных.
Правилом называют следующее предложение PROLOG:
<предикат> if <предикат1>, <предикат2>, ...,<предикатN>.
Раздел целей PROLOG имеет вид:
Clauses
<факты>.
<правила>.
Например:
Clauses
Отец(Иван,Петр). /*Иван–отец Петра*/
Отец(Иван,Игорь). /*Иван – отец Игоря*/
Отец(Игорь,Семен).
Отец(Игорь,Анна).
Дед(X,Y) if отец(Z,Y),отец(X,Z).
/*X–дед Y,если отцом Y является Z, а отцом
Z является Х*/