Унификация


Одним из наиболее важных аспектов программирования на Прологе являются понятия унификации (отождествления) и конкретизации переменных.
Пролог пытается отождествить термы при доказательстве, или согласовании, целевого утверждения. Например, в программе имеется факт собака(рекс). Для согласования запроса ?- собака(Х) целевое утверждение собака(X) будет отождествлено с фактом собака (рекс), в результате чего переменная Х станет конкретизированной: Х= рекc.
Переменные, входящие в утверждения, отождествляются особым образом — сопоставляются. Факт доказывается для всех значений переменной (переменных). Правило доказывается для всех значений переменных в головном целевом утверждении при условии, что хвостовые целевые утверждения доказаны. Предполагается, что переменные в фактах и головных целевых утверждениях связаны квантором всеобщности. Переменные принимают конкретные значения на время доказательства целевого утверждения.
В том случае, когда переменные содержатся только в хвостовых целевых утверждениях, правило считается доказанным, если хвостовое целевое утверждение истинно для одного или более значений переменных. Переменные, содержащиеся только в хвостовых целевых утверждениях, связаны квантором существования. Таким образом, они принимают конкретные значения на то время, когда целевое утверждение, в котором переменные были согласованы, остается доказанным.
Терм Х сопоставляется с термом Y по следующим правилам. Если Х и Y — константы, то они сопоставимы, только если они одинаковы. Если Х является константой или структурой, а Y — неконкретизированной переменной, то Х и Y сопоставимы и Y принимает значение Х (и наоборот). Если Х и Y — структуры, то они сопоставимы тогда и только тогда, когда у них одни и те же главный функтор и арность и каждая из их соответствующих компонент сопоставима. Если Х и Y — неконкретизированные (свободные) переменные, то они сопоставимы, в этом случае говорят, что они сцеплены. В приведены примеры отождествимых и неотождествимых термов.
Иллюстрация унификации.

Терм1 Терм2 Отождествимы ?
джек(Х)

джек (личность)

джек(Х,Х)

джек(Х.Х)

джек( . )

f(Y,Z)

Х

джек (человек)

джек (человек)

джек(23,23)

джек (12,23)

джек(12,23)

Х

Z

да: Х=человек

нет

да: Х=23

нет

да

да: X=f(Y,Z)

да: X=Z

Ход работы

Загрузите в свой компьютер программу Lab1_1.PRO и для ее запуска нажмите Alt-G.

/* Программа Lab1_1.PRO */

predicates
likes (symbol, symbol)
clauses

likes (ellen, tennis).
likes (john, football).
likes (tom, baseball).
likes (eric, swimming).
likes (mark, tennis).
likes (bill, Activity) if likes (tom, Activity).

Goal /* (Цель) запрос: */

likes (bill, baseball).

Система ответит: Yes (Да)
Для определения того, что likes (bill, baseball) система использовала комбинированное правило

likes (bill, Activity) if likes (tom, Activity).
и факт
likes (tom, baseball).

на основе чего она подтвердила истинность запроса.
Введите новый запрос: likes (bill, tennis).

Система ответит: No (Нет)
На последний запрос («Нравится Билу теннис? «) Турбо Пролог ответил нет из-за того, что:

а. Нет фактов, говорящих о любви Била к теннису.
б. Связь между Билом и теннисом не выводится из заданного правила и имеющихся фактов.

Использование анонимных переменных

Анонимная переменная может быть использована вместо любой другой переменной. Разница заключается в том, что анонимные переменные никогда не примут какого-либо значения.
Например, в следующем вопросе вам нужно узнать какие люди любят спорт, но вам не нужно узнавать, какой именно. Пролог понимает, что всякий раз, когда в запросе вы используете символ подчеркивания, вам не требуется знать значение, присваиваемое переменной на данном месте.

Goal: likes (Who, _).

Получив такой запрос, Пролог ответит:

Who=ellen
Who=john
Who=tom
Who=eric
Who=mark
5 Solutions

Кроме этого, анонимные переменные могут быть использованы в фактах. Следующие факты Пролога

owns (_, shoes).
eats (_).

могут быть использованы в следующих предложениях естественного языка: У каждого есть (owns) ботинки (shoess). Все едят (eats).

Анонимные переменные сопоставляются с чем угодно.

Задания:

Напишите предложения на естественном языке, соответствующие тому, что могут значить эти Прологовские факты. (для компьютера эти факты являются просто отдельными «кусками» информации, которые могут быть использованы для получения ответов на запросы.)

1. любит (джеф, рисование).
2. мужчина (джон).
3. здание («Строительная империя», нью-йорк).
4. человек (Иванов, Вася, «111000 Москва», «ул.Разина», 4445566).

Запишите факты Турбо Пролога, соответствующие следующим предложениям естественного языка:

1. Эллен нравятся макароны.
2. Сан-Франциско находится в Калифорнии.
3. Номер телефона Ани — 476-02-99.
4. Отца Лены зовут Альфонсо Гренальди.

3. Напишите предложения естественного языка, интерпретирующие следующие правила Турбо Пролога:

а) ест (Кто, Что) if
пища (Что) and любит (Кто, Что).
б) заканчивает_курс (Кто) if
выполняет задания (Кто) and
нормально_посещает (Кто).
в) не_ест (тоби, Вещество) if
пища (Вещество) and
сальный (Вещество).
г) владелец (Кто, Что) if
купил (Кто, Что).

4. Напишите правила Турбо Пролога, соответствующие смыслу следующих предложений на естественном языке:

а) Человек голоден, если его желудок пуст.
б) Все любят работу, если она приятна и хорошо оплачивается.
в) Владеют машиной те, кто ее купил, заплатил за нее и содержит ее.

5. Напишите программу, которая бы, имея факты (предикаты)
мужчина(кто).
женщина(кто).
родитель(кто,чей).

Определяла бы:

1. кто чей отец и мать
2. кто кому приходится братом, сестрой
3. кто кому приходится двоюродным братом, двоюродной сестрой
4. кто кому приходится тетей, дядей
5. кто кому приходится племянником, племянницей
6. кто кому приходится дедушкой, бабушкой
7. кто кому приходится прадедушкой, прабабушкой.
8. кто кому приходится двоюродным дедушкой, бабушкой
9. кто кому приходится внучатым племянником, племянницей

6. Добавив к условию задания 5 предикат супруг(кто, чей), определить:

1. кто кому приходится мужем, женой
2. кто кому приходится тестем, тещей
3. кто кому приходится свекром, свекровью
4. кто кому приходится невесткой, зятем.
5. кто кому приходится ШУРИНОМ, ЗОЛОВКОЙ
6. кто кому приходится невесткой, ДЕВЕРЕМ

О родственных связях имеется следующая информация (стрелки задают отношение родитель(кто,чей)):

Таблица 1. Основные стандартные домены (типы).

Домен Описание
char Символ, заключенный между двумя одиночными кавычками (например: ‘a’).

integer Целое число от -32,768 до 32,767.

real Числа с необязательным знаком (+ или -), за которым следует несколько цифр DDDDDDD, затем — необязательная десятичная точка(.) и еще цифры DDDDDDD, за которыми необязательная экспоненциальная часть (e(+ или -)DDD):
<+|-> DDDDD <.> DDDDDDD <e<+|->DDD>
Примеры действительных (real) чисел:
42705 9999 86.72
9111.929437 521e238 79.83e+21
здесь 79.83e+21 означает 79.83*10^21 (аналогично Фортрану, Бейсику и Паскалю).
Допустимый диапазон действительных чисел: от 1*10^-307 до 1*10^308 от 1e-3 до 1e+3). При необходимости, целые автоматически преобразуются в действительные.

string Строка — любая последовательность символов, записанных между парой символов удвоенных кавычек. Например: «книга Марка».
Строки, которые вы пишете в программе, могут достигать длины в 255 символов, в то время как строки, которые система Турбо Пролога считывает из файла или строит внутри себя, — могут достигать 64 К.
symbol Для идентификаторов (symbol) допускается два формата:
1. Последовательность букв, цифр и символов подчеркивания, причем первый символ должен быть строчной буквой;
2. Последовательность символов, заключенных в двойные кавычки (это делается для случаев, когда идентификаторы включают пробелы или не начинаются со строчной буквы).
Примеры идентификаторов.
telephone_number «railway ticket» «Dorid Inc», «Петров Иван Иванович»

Идентификаторы и строки взаимозаменяемы в программе, однако Турбо Пролог хранит их раздельно.
Идентификаторы хранятся в таблице поиска, а для представления объектов используются лишь их адреса, а не сами идентификаторы. Это означает, что сопоставление идентификаторов выполняется очень быстро, а в случае, если они встречаются в программе несколько раз, то и хранение их выполняется очень компактно.
Строки же не хранятся в поисковой таблице, и при необходимости сопоставления Турбо Пролог проверяет их символ за символом. Вы сами должны определять какой домен лучше использовать в каждой конкретной программе

Загрузка...