
- •Лабораторная работа 1. Решение логических задач
- •Константы, переменные, домены
- •Предикаты, факты, структура логической программы
- •Унификация, доказательство простых целей
- •Доказательство составных целей, правила
- •Пример выполнения лабораторной работы
- •Варианты заданий
- •Лабораторная работа 2. Обработка списков
- •Рекурсивные предикаты
- •Пример выполнения лабораторной работы
- •Варианты заданий
- •Лабораторная работа 3. Недетерминированное программирование
- •Понятие недетерминированного программирования
- •Пример выполнения лабораторной работы
- •Варианты заданий
- •17) Задача об устойчивых браках (Стерлинг л., Шапиро э. Искусство программирования на языке Пролог./Пер. С англ. — м.: Мир, 1990. — 335 с., стр. 173):
- •Лабораторная работа 4. Динамическая база данных
- •Динамическая база данных
- •Составные домены
- •Пример выполнения лабораторной работы
- •Варианты заданий
- •Библиографический список
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Государственное образовательное учреждение
высшего профессионального образования
Санкт-Петербургский государственный университет
аэрокосмического приборостроения
ЛОГИЧЕСКОЕ ПРОГРАММИРОВАНИЕ
Методические указания к выполнению лабораторных работ 1 — 4
Санкт-Петербург
2010
Составитель: А. В. Бржезовский
Рецензент: В.А.Галанина
В методические указания включены описания базовых конструкций языка PROLOG, структуры логической программы и механизма ее выполнения. В методических указаниях приведены примеры программ, решающих логические задачи, производящих рекурсивную обработку списков, работающих с динамической базой данных, осуществляющих поиск решений посредством перебора в пространстве возможных состояний (недетерминированное программирование).
Методические указания предназначены для студентов специальностей 230105 (220400)— «Программное обеспечение вычислительной техники и автоматизированных систем» и 010503 (351500) — «Математическое обеспечение и администрирование информационных систем», изучающих дисциплины «Логическое программирование», «Рекурсивно-логическое программирование».
Методические указания подготовлены кафедрой компьютерной математики и программирования и рекомендованы к изданию редакционно-издательским советом Санкт-Петербургского государственного университета аэрокосмического приборостроения.
Лабораторная работа 1. Решение логических задач
Константы, переменные, домены
В языке PROLOG, так же как в любом языке программирования, используются понятия константы, переменной, типа данных. Вместе с тем, так как теоретической основой языка является логика предикатов первого порядка (PROLOG от PROgramming in LOGic), в языке используется терминология, заимствованная из данной теории. Первоначальные реализации языка и некоторые из существующих в настоящее время не требуют типизации аргументов предикатов, другие (например, такие системы программирования как Turbo Prolog или Visual Prolog — далее по тексту VIP) вводят типизацию для повышения эффективности выполнения логических программ. В таблице 1.1 приведены типы констант и перечислены соответствующие им домены (типы данных).
Таблица 1.1.
Константы и домены
Константа |
Форма записи |
Домен |
Примеры |
Символьная константа |
Один символ, заключенный в знаки апострофа |
char |
‘A’, ‘a’, ‘1’ |
Целочисленная константа |
Последовательность цифр, возможно предваряемая знаками + или – |
integer |
123, –5 |
Вещественная константа |
Последовательность цифр, возможно предваряемая знаками + или –, целая часть от дробной отделяется точкой, а степень числа – символом e |
real |
–1.5, 0.123, 3.5e–7 |
Символическая константа |
Последовательность букв или цифр, начинающаяся со строчной буквы и не содержащая специальных символов, за исключением знака подчеркивания |
symbol |
one, v_Prolog |
Строковая константа |
Произвольная последовательность символов заключенная в кавычки |
string |
“One”, “V. Prolog” |
Домены, приведенные в табл. 1.1 являются стандартными (предопределенными), на их основе могут создаваться домены пользователя, определение доменов приводится в разделе логической программы, следующим за ключевым словом DOMAINS в соответствии со следующим синтаксисом:
domains
<имя домена 1>, …, <имя домена N> = <имя домена>
Здесь <имя домена> — это стандартный домен или домен, определенный ранее. В приведенном ниже примере определяются пользовательские домены на базе стандартного домена string:
domains
name = string
first_name, last_name = name
Разделителем в разделе объявления доменов является перевод строки, новый домен должен записываться с новой строки.
Переменные в языке PROLOG наряду с константами используются в качестве аргументов предикатов, имя переменной записывается по правилам записи символических констант, но начинается с заглавной буквы. В языке PROLOG нет явного объявления переменных, первая заглавная буква является признаком, позволяющим транслятору отличить переменную от символической константы (например: var – символическая константа, Var – переменная).
Предикаты, факты, структура логической программы
Предикат — это логическая функция, возвращающая значение истина (И) или ложь (Л) в зависимости от значений своих аргументов. Все предикаты, используемые в логической программе (за исключением встроенных), должны быть объявлены в разделе, следующем за ключевым словом PREDICATES. К числу встроенных относятся предикаты, реализующие арифметические операции (+, -, *, /, div, mod), арифметические и тригонометрические функции, операции сравнения (<, <=, = , >, >=, <> или ><) и ряд других. Заметим, что в отличие от других операций, операция = является не операцией сравнения, а операцией унификации (см. ниже). Синтаксис объявления предиката выглядит следующим образом:
predicates
<имя предиката 1>(<имя домена 1,1>, < имя домена 1,2>, …)
<имя предиката 2>(<имя домена 2,1>, < имя домена 2,2>, …)
…
<имя предиката N>(<имя домена N,1>, < имя домена N,2>, …)
Здесь <имя домена I,J> указывает на тип данных, к которому относится J-й аргумент I-го предиката. В приведенном ниже примере объявляются предикаты студент и оценка:
domains
name, discipline = string
group, mark = integer
predicates
nondeterm student(name, group)
nondeterm mark(name, discipline, mark)
Несмотря на то, что для домена и предиката (MARK) использовано одно и то же имя, ошибки не происходит, так как с точки зрения транслятора языка они являются различными понятиями. Так же как и в разделе DOMAINS, разделителем в разделе PREDICATES является перевод строки. Директива NONDETERM является особенностью варианта языка, реализованного в VIP, она указывает транслятору, что данный предикат может иметь более одного решения. В других системах программирования, например Turbo Prolog, указание данной директивы не требуется, а ее появление приводит к ошибке.
Для подтверждения истинности предикатов в логической программе используются факты и правила, которые обозначаются обобщенным понятием «клозы». Факты записываются в разделе, следующем за ключевым словом CLAUSES в соответствии с приведенным ниже синтаксисом:
clauses
<имя предиката 1>(<аргумент 1,1,1>, < аргумент 1,1,2>, …).
<имя предиката 1>(< аргумент 1,2,1>, < аргумент 1,2,2>, …).
…
<имя предиката N>(< аргумент N,1,1>, < аргумент N,1,2>, …).
<имя предиката N>(< аргумент N,2,1>, < аргумент N,2,2>, …).
…
Как следует из приведенного синтаксиса, для одного предиката может быть задано произвольное количество фактов. В качестве аргументов в фактах могут использоваться константы и переменные, область действия имени переменной ограничивается фактом, в котором оно использовано. Разделителем в разделе CLAUSES служит точка, являющаяся признаком окончания текущего факта. Ниже приведены примеры фактов для рассмотренных выше предикатов STUDENT и MARK:
clauses
student(“Gruzdev”, 4000).
student(“Lisichkin”, 4000).
student(“Volnushkin”, 4001).
student(“Syroezhkin”, 4001).
mark(“Gruzdev”, “F&LP”, 4).
mark(“Gruzdev”, “DB”, 5).
mark(“Lisichkin”, “F&LP”, 3).
mark(“Lisichkin”, “DB”, 3).
mark(“Volnushkin”, “F&LP”, 5).
mark(“Volnushkin”, “DB”, 4).
mark(“Syroezhkin”, “F&LP”, 4).
mark(“Syroezhkin”, “DB”, 4).
Выполнение логической программы состоит в доказательстве истинности цели (логического утверждения), заданной в разделе, следующим за ключевым словом GOAL. Простая цель (содержащая один предикат) записывается по тем же правилам, что и факт. Таким образом, типовая логическая программа состоит из четырех разделов:
domains
<объявления доменов>
predicates
<объявления предикатов>
clauses
<факты и правила>
goal
<цель>