Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Логическое программирование. Turbo Prolog 2.0.doc
Скачиваний:
72
Добавлен:
04.06.2015
Размер:
1.59 Mб
Скачать

1 Введение в логическое программирование

Логическая программа– это множество аксиом (утверждений, не требующих доказательств) и правил, задающих отношения между объектами. Вычислением логической программы является вывод следствий из программы. Основные конструкции логического программирования–термыиутверждения. Имеется три основных вида утверждений:факты,правилаивопросы.

Для обозначения факта используется запись вида «Q.»–предикат, вслед за которым ставится точка. Предикаты бывают 0-местные (без аргументов) илиn- местные (сnаргументами). Предикат без аргументов обозначается одним именем. Предикат с аргументами обозначается именем, вслед за которым в скобках через запятые записываются все его аргументы. Аргумент предиката– синтаксическая конструкция, называемаятермом. Определение предиката в обозначениях Бэкуса-Наура:

Терм–это либоконстанта, либопеременная, либоструктура.

Структура– более сложное, чем константа и переменная, образование, характеризуется именем (функтором) и компонентами– составными частями структуры. Каждый компонент структуры в свою очередь является термом.

Например, библейское утверждение «Авраам родил Исаака» (иначе: объект Авраам связан с объектомИсаак отношениемfather1) в терминах языка Пролог может быть записано как факт с использованием двуместного предиката2:

father("Авраам", "Исаак").

По аналогии: факты, представленные в Пролог-программе одноместными предикатами:

man("Адам").

woman("Ева").

можно интерпретировать как утверждения: «Адам является мужчиной» (объект Адамобладает свойствомman), «Ева является женщиной» (объектЕваобладает свойствомwoman), соответственно. Эти же утверждения могут быть реализованы несколько иначе:

homo_sapiens(man("Адам")).

homo_sapiens(woman("Ева")).

При этом одноместный предикат homo_sapiensподчеркивает, что объектыАдамиЕва, несмотря на очевидные различия, все-таки относятся к одному и томе же биологическому виду. В приведенном примере предикаты man иwomanвыступают в качестве аргумента для предикатаhomo_sapiens.

Конечное множество фактов образуют простейший вид Пролог-программы. Такой подход лежит в основе программирования баз данных и, в принципе, уже сейчас, используя только один вид утверждений– факты, можно написать небольшую, но достаточно эффективную программу на Прологе, описывающую фрагмент генеалогического дерева одного весьма известного российского семейства (см. рис. 1). Кроме уже рассмотренных предикатовman иwomanв программу для описания родственных отношений введены предикатыchild1иpair2.

man("Алексей Михайлович").

man("Иван V").

man("Карл-Фридрих").

man("Петр I").

man("Алексей Петрович").

man("Петр II").

man("Петр III").

man("Павел I").

man("Александр I").

man("Константин Павлович").

woman("Мария Милославская").

woman("Наталья Нарышкина").

woman("Софья").

woman("Прасковья Салтыкова").

woman("Евдокия Лопухина").

woman("Екатерина I").

woman("Анна Иоановна").

woman("Елизавета Петровна").

woman("Анна Петровна").

woman("Софья-Шарлотта").

woman("Екатерина II").

woman("Наталья Алексеевна").

woman("Мария Федоровна").

woman("Елизавета Алексеевна").

pair("Алексей Михайлович", "Мария Милославская").

pair("Алексей Михайлович", "Наталья Нарышкина").

pair("Иван V", "Прасковья Салтыкова").

pair("Петр I", "Евдокия Лопухина").

pair("Петр I", "Екатерина I").

pair("Карл-Фридрих", "Анна Петровна").

pair("Алексей Петрович", "Софья-Шарлотта").

pair("Екатерина II", "Петр III")

pair("Павел I", "Наталья Алексеевна").

pair("Павел I", "Мария Федоровна").

pair("Александр I", "Елизавета Алексеевна").

child("Софья Алексеевна", "Мария Милославская").

child("Иван V", "Мария Милославская").

child("Софья Алексеевна", "Алексей Михайлович").

child("Иван V", "Алексей Михайлович").

child("Петр I", "Алексей Михайлович").

child("Петр I", "Наталья Нарышкина").

child("Наталья Алексеевна", "Алексей Михайлович").

child("Наталья Алексеевна", "Наталья Нарышкина").

child("Анна Иоановна", "Иван V").

child("Анна Иоановна", "Прасковья Салтыкова").

child("Алексей Петрович", "Петр I").

child("Алексей Петрович", "Евдокия Лопухина").

child("Анна Петровна", "Петр I").

child("Анна Петровна", "Екатерина I").

child("Елизавета Петровна", "Петр I").

child("Елизавета Петровна", "Екатерина I").

child("Петр II", "Алексей Петрович").

child("Петр II", "Софья-Шарлотта").

child("Петр III ", "Карл-Фридрих")

child("Петр III ", "Анна Петровна")

child("Павел I", "Екатерина II").

child("Павел I", "Петр III").

child("Константин Павлович", "Павел I").

child("Константин Павлович", "Мария Федоровна").

child("Александр I", "Павел I").

child("Александр I", "Мария Федоровна").

Контрольные вопросы

  1. В чем отличие языка Пролог от традиционных алгоритмических языков программирования?

  2. Назовите основные конструкции логического программирования.

  3. Что такое факт в логическом программировании?

  4. Что такое правило в логическом программировании?