ПРОГРАММИРОВАНИЕ РОДСТВЕННЫХ ОТНОШЕНИЙ С ИСПОЛЬЗОВАНИЕМ ЯЗЫКА VISUAL PROLOG
Амосова Л.Н.
УДК 004Амосова Л.Н.
ПРОГРАММИРОВАНИЕ РОДСТВЕННЫХ ОТНОШЕНИЙ С ИСПОЛЬЗОВАНИЕМ ЯЗЫКА VISUAL PROLOG
ФГБОУ ВО «Амурский гуманитарно-педагогический
государственный университет»
г. Комсомольск-на-Амуре, Россия, amosln@mail.ru
Пролог – это язык программирования, предназначенный для обработки символьной нечисловой информации. Особенно хорошо он приспособлен для решения задач, в которых фигурируют объекты и отношения между ними.
Познакомимся со структурой языка Visual Prolog и напишем простейшую программу родственных отношений.
Программа на языке Пролог имеет следующую структуру:
DOMAINS /* определение данных */
PREDICATES /* определение предикатов */
CLAUSES /* определение фактов и правил */
GOAL /* определение цели */
На языке Visual Prolog цели задаются в разделе программы GOAL. Для тестирования целей используется команда TestGoal из меню Project. Результат выводится в окне сообщений.
Рассмотрим программу «Дерево родственных отношений» на примере родословной семьи, представленной на рисунке 1.
Раздел CLAUSES. Это основной раздел программы [1]. В этом разделе определяются факты и правила. Факт представляется именем предиката, за которым следуют аргументы, заключенные в круглые скобки. Заканчивается запись факта точкой. Все имена предикатов и константы должны начинаться со строчной буквы. Для рассматриваемого примера введем предикаты: мужчина, женщина, родитель. В результате получим следующие факты:
Рисунок 1 – Дерево родственных отношений
CLAUSES
женщина (таня).
женщина (люда).
женщина (лена).
женщина (ира).
мужчина (сережа).
мужчина (вова).
родитель (таня, люда).
родитель (таня, вова).
родитель (люда, лена).
родитель (люда, сережа).
родитель (вова, ира).
Правило состоит из заголовка правила и тела правила. Заголовок представляет собой предикат, тело состоит из термов, которые могут быть связаны между собой операциями or (;) или and (,). Между телом и заголовком стоит знак «:-». Каждое правило должно заканчиваться точкой. Имена переменных должны начинаться с прописной буквы [2].
Добавим теперь в нашу программу-пример еще несколько родственных отношений. Определение отношения мать может быть основано на следующем логическом утверждении:
Для всех X и Y
X является матерью Y, если
X является родителем Y, и
X - женщина.
На Прологе это переводится в виде такого правила:
мать (X, Y):- родитель (X, Y), женщина (X).
Запятая между двумя условиями указывает на конъюнкцию условий [3]. Это означает, что они должны быть выполнены оба одновременно.
Аналогично запишется правило для предиката отец:
отец (X, Y):- родитель (X, Y), мужчина (X).
На рисунке 2 показано отношение (предикат) сестра:
Для любых X и Y
X является сестрой Y, если
у X и Y есть общий родитель, и
X - женщина.
Рисунок 2 – Определение отношения сестра
Граф на рисунке 2 можно перевести на Пролог так:
сестра (X, Y):-
родитель (Z, X),
родитель (Z, Y),
женщина (X), not (X=Y).
Аналогично запишется правило для предиката брат:
брат (X, Y):-
родитель (Z, X),
родитель (Z, Y),
мужчина (X), not (X=Y).
Определение отношений дядя (тетя) на языке Пролог будет выглядеть следующим образом:
дядя (X, Y):-
родитель (Z, Y), брат (X, Z).
тетя (X, Y):-
родитель (Z, Y), сестра (X, Z).
Определим предикат бабушка и запишем его на Прологе:
бабушка (X, Z):-
родитель (X, Y), родитель (Y, Z), женщина (X).
Сравним использование термов, связанных логическими операциями or (;) или and (,), определяя предикат дочь:
дочь (X, Y):- родитель (Y, X), женщина (X).
или
дочь (X, Y):- мать (Y, X), женщина (X);
отец (Y, X), женщина (X).
Рассмотрим раздел цели GOAL.
На вопрос «Кто является отцом Иры?»
отец (X, ира).
Получим ответ:
X=вова
Вопрос «Кто дети Тани» можно передать пролог-системе в такой форме:
родитель (таня, X).
В этом случае возможно несколько ответов. В окне сообщений система ответит:
X=люда
X=вова
На вопрос «Кто является бабушкой Лены?»
бабушка (X, лена)
получим ответ:
X=таня
Ниже приведен полный код программы на языке Visual Prolog:
DOMAINS
s=symbol
PREDICATES
multi женщина (s)
multi мужчина (s)
multi родитель (s, s)
multi мать (s, s)
multi отец (s, s)
multi сестра (s, s)
multi брат (s, s)
multi тетя (s, s)
multi дядя (s, s)
multi бабушка (s, s)
multi дочь (s, s)
CLAUSES
женщина (таня).
женщина (люда).
женщина (лена).
женщина (ира).
мужчина (сережа).
мужчина (вова).
родитель (таня, люда).
родитель (таня, вова).
родитель (люда, лена).
родитель (люда, сережа).
родитель (вова, ира).
мать (X, Y):- родитель (X, Y), женщина (X).
отец (X, Y):- родитель (X, Y), мужчина (X).
сестра (X, Y):- родитель (Z, X), родитель (Z, Y), женщина (X),
not (X=Y).
брат (X, Y):- родитель (Z, X), родитель (Z, Y), мужчина (X),
not (X=Y).
тетя (X, Y):- родитель (Z, Y), сестра (X, Z).
дядя (X, Y):- родитель (Z, Y), брат (X, Z).
бабушка (X, Z):- родитель (X, Y), родитель (Y, Z), женщина (X).
дочь (X, Y):- родитель (Y, X), женщина (X).
GOAL
сестра (сережа, X).
Получим ответ:
X=лена
Таким образом, мы познакомились с унарными предикатами: женщина, мужчина, которые зависят от одного аргумента, и бинарными предикатами: родитель, мать, отец, сестра, брат, тетя, дядя, бабушка, дочь, которые зависят от двух аргументов.
Список литературы
1. Практикум по дисциплине Логическое и функциональное программирование [Электронный ресурс]. - Электрон. текстовые данные. - М.: Московский технический университет связи и информатики, 2016. – 16 c. - 2227-8397. - Режим доступа: http://www.iprbookshop.ru/61489.html
2. Шрайнер П.А. Основы программирования на языке Пролог [Электронный ресурс] / П.А. Шрайнер. - Электрон. текстовые данные. - М.: Интернет-Университет Информационных Технологий (ИНТУИТ), 2016. – 213 c. - 5-9556-0034-5. - Режим доступа: http://www.iprbookshop.ru/52194.html
3. Амосов О.С., Методическое пособие для выполнения практических работ по языку Пролог: Учебное пособие / О.С. Амосов, Л.Н. Амосова, О.П. Постевой. – Комсомольск-на-Амуре: КГПУ, 2000. - 108 с.