Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пролог.doc
Скачиваний:
16
Добавлен:
10.11.2018
Размер:
1.44 Mб
Скачать

7.3. Структура программы

Типовая программа содержит 5 разделов:

A) domains <описание доменов>(заголовок области, описание различных классов объектов программы);

B) database < описание предикатов динамической базы данных>(содержит утверждения базы данных, которые являются предикатами динамической базы; если программа такой базы данных не требует, то этот раздел может быть опущен);

C) predicates <описание предикатов> – служит для описания предикатов);

D) goаl <целевое утверждение> – (описание внутренней цели и подцелей);

E) clauses <утверждения> – все правила и факты, известные априори.

С целью упрощения организации фактов и правил ПРОЛОГ поддерживает составные объекты-структуры, которые строятся из шести базовых предписанных классов (доменов).

Стандартные типы доменов приведены в таблице:

Тип данных

Ключевое слово

Диапазон значений

Примеры

Символ

Char

Все символы

‘a’,’#’,’\13’

Целые

Integer

-32768 +32767

-63,64

Действительные

Real

+1E-307 +1E308

1.25E23, 4.56

Строки

String

Последовательность символов длиной <250

“today”,”123”

Символьные имена

Symbol

1. Последовательность символов, первая буква

2. Последовательность любых символов в “”

“Stars and Stripes”

Файлы

File

Допустимое имя

Mail.txt, BIRDS.DBA

Пример программы:

domains (раздел описания),

lich (человек), uvl (увлечение) = symbol,

predicates (отношение, предикат),

lubit (lich, uvl) (любит человек увлечение),

clauses (факты, правила),

lubit (lena, ping_ pong),

lubit (ivan, futbol),

lubit (tolya, basketbol),

lubit (mark, plavat),

lubit (lena, plavat),

lubit (boria, X): – lubit (tolya, X). –Боря любит то же, что любит Толя,

Alt+C – компиляция, Alt+R – запуск на счет, Alt+F-?

Вопросы, беседа с программой:

lubit (lena, plavat) – вопрос (истинно),

lubit (boria, futbol) – (нет решения),

l

два решения

ubit (lena, X),

Х = ping_pong

Х = plavat.

lubit (Х, futbol) Х = ivan,

lubit (Х, Y) – напишет все решения.

Примечание. Здесь и далее курсивом выделены комментарии к программе, которые набирать не следует.

Выход из программы в интерактивном режиме завершается по клавише ESC.

Цель может быть составной:

lubit (Х, plavat), lubit (Х, ping_pong)? Х = lena

Дополнительное задание: написать программу «Телефонный справочник».

tel (lich, nomer) – предикат

Факты: Аня – 240-385

Правила: телефон у Вики такой же, как у Ани. Какой телефон у Вики? и т.д.

7.4. Поиск решений

Пример: 1) likes (mary, аpples) – факт,

2) likes (beth, X):– likes (mary, Х) – правило.

Введем цель:

likes (beth, аpples)? – любит ли Бет яблоки? X= аpples

совпали подцель

Цель сопоставляется с фактом 1 пословно: терм предиката цели likes совпадает с термом факта 1. Т.е. сопоставление начинается слева направо до тех пор, пока очередное сопоставление окажется неуспешным. beth не совпадает c mary и поэтому дальше уже не проверяется. Пролог ищет следующую точку входа и находит правило 2. Если факт совпадает с левой частью правила – головой, то он пытается выполнить часть правила справа (тело). likes и beth совпали у обоих, но apples и Х не сопоставимы. Однако Х – это переменная, следовательно, она может быть сопоставлена с любым значением. Т.е. Х присваивается значение apples. Это связывание используется до тех пор, пока либо не будет вычислена цель, либо нельзя будет выполнить никакого другого сопоставления с учетом этого связывания. Следовательно, предикат likes(beth, X) имеет значение likes(beth, apples). Теперь пытаемся выполнить условие if likes(mary, X) и проверяем факт likes(mary, apples) как подцель. Снова сначала просматривается база и находится факт likes(mary, apples). Так как тело совпало, то цель достигнута, и решение есть X=apples и является истиной. Как цели, так и правила могут быть связаны с помощью союзов и (,) и или(;).

Число аргументов в предикате называется арностью. Если в предикате нет аргументов, то арность равна нулю. Совпадение проверяется на имя аргумента (likes – пример), на число аргументов (арность), на тип аргументов, на совпадение значений (слева направо)

При сравнении аpples, Х происходит процесс связывания: Х=аpples, так как переменная может принимать любое значение. Из этого следует, что цель совпала с головой. При появлении подцели начинается проверка заново.

Ответ задачи: X=аpples.

В теле правила может быть несколько подцелей, подцели обрабатываются последовательно слева направо. Если одна из подцелей несопоставима, то и вся цель является неуспешной. Сопоставление и поиск решений выполняются внутренними унификационными процедурами. Они выполняют сопоставление целей и подцелей с фактами и головами правил, чтобы доказать эти цели или подцели, а также определяют, сгенерированы ли новые подцели правой части. При сопоставлении с правилами, где имеется переменные Х, переменные сначала не имеют значения, т.е. они не означены, не идентифицированы, свободные. Когда переменная сопоставляется с объектом (apples), она связывается. Внешние цели заставляют программу выдать все решения, удовлетворяющие цели, а внутренние цели заставляют программу остановиться после первого успешного сопоставления целей. Таким образом, переменная освобождается после неуспешного сопоставления или при успешном достижении цели, и ее значения не являются одновременными.

Для присваивания значения переменным используется оператор (=), который практикуется двояко: как присваивание или как сравнение в зависимости от того является ли значение объектов свободными или означенными.

Пример:

1) аpples=аpples – это сравнение. Равенство истинно, цель достигнута.

2) аpples=oranges – это тоже сравнение. Равенство ложно, цель недостигнута

3) X=аpples, если Х не означено, то это присвоение, в противном случае это сравнение.

Если оба значения известны, то трактуется как сравнение, даже если оба объекты являются переменными: х=у

Если известно одно значение, то оно присваивается второму, независимо от того где оно стоит: аpples=X.