?- X is abc.
интерпретатор будет сигнализировать о возникновении ошибки при выполнении запроса:
ЗАДАНИЕ 1 (Исследование результатов выполнения предиката is)
Выполнить следующие запросы и объяснить результаты выполнения примеров:
а)?- X is 1+2. | б)?-Y=2, X is 1+Y. | в)?- 12 is 4*(1+2). |
г)?- X is 4, 12 is X*(1+2). | д)?-X is 2+Y. |
Замечания
1. Можно "сыграть" на том, что в выражениях операторы можно вставлять между операндами, и несколько упростить код вывода данных. Для этого нужно имитировать составной терм и применить знак оператора для разделения нескольких значений. Тогда, как один-единственный терм, эту конструкцию можно вывести одним предикатом write.
Например,
?- write('X'=1). % вместо write('X='),write('1')
?- write(1:2:3). % вместо write(1),write(' :'),write(2), write(' :'),write(2)
2. Термы с функторами-операторами при выводе с помощью write преобразуются в формат обычного выражения:
?- write(:(1,2)). % префиксная форма
1: 2 % инфиксная форма
3. В контекстах вычисляемых выражений функтор-оператор может использоваться прямо, без одиночных кавычек:?- X is +(1,2), write(X). Однако это допустимо не всегда. Например, в конструкции унификацией X=+(1,2) это уже недопустимо. Правильной будет запись X='+'(1,2).
4. Хотя is является одним из способов связывания переменных с числовыми значениями, то есть, исполняет роль, аналогичную операторам присваивания в процедурных языках, Пролог не допускает повторную конкретизацию переменных. Поэтому недопустимыми будут выражения типа
X is X+1.
ЗАДАНИЕ 2 (Подстановки и простейшие правила вывода)
1. В таблице приведены сведения о периодах пребывания на российском троне наиболее значимых особ из дома Романовых:
Михаил Федорович | 1613-1645 |
Алексей Михайлович | 1645-1676 |
Петр I | 1689-1725 |
Екатерина II | 1762-1796 |
Павел I | 1796-1801 |
Александр I | 1801-1825 |
Николай I | 1825-1855 |
Александр II | 1855-1881 |
Александр III | 1881-1894 |
Николай II | 1894-1917 |
Представить эту информацию в виде фактов программы на Прологе, используя предикат со следующей реляционной схемой:
'царствовал'(<Царь>,<Правил_от>,<Правил_до>).
2. Задать вопросы к составленной логической программе, соответствующие следующим формулировкам:
Когда царствовал Николай I?
Царствовал ли Павел I с 1796 по 1801 годы?
Кто царствовал, начиная с 1855 года?
Царствовал ли Петр I с 1696 по 1725 годы?
Выяснить, какие из простейших правил логического вывода (совпадение, конкретизация и обобщение) следует применить для получения ответов на каждый из них.
3. Используя протокол трассировки программы, выяснить, какие факты используются для доказательства цели в каждом случае, какие необходимы подстановки и к чему они должны быть применены (к вопросу или факту).
ЗАДАНИЕ 3 (Процедурный подход к проектированию отношения)
1. Факты, содержащие периоды царствования, можно использовать для определения нового отношения 'срок_правления', определяющего длительность срока царствования каждой монаршей особы:
'срок_правления'('Царь','Длительность').
Это отношение определяется правилом, для которого задается следующая процедурная трактовка:
Чтобы определить длительность правления некоторой царствовавшей особы, необходимо
а) найти, годы вступления на трон и конца правления, а затем,
б) вычитая из даты окончания правления дату вступления на трон, вычислить длительность царствования.
Очевидно, что правило, реализующее это процедурное поведение, будет конъюнктивным. Даты начала и конца царствования можно найти из фактов царствовал, а длительность пребывания на троне вычисляется с использованием арифметического предиката is.
2. Проверить работу процедуры, задав, например, вопрос: " Сколько лет правил Петр I?".
ЗАДАНИЕ 4 (Исследование декларативного смысла полученной процедуры)
Процедура 'срок_правления' была разработана, исходя из задачи получения ответа на один конкретный вопрос — найти длительность правления монаршей особы.
Логические программы отличаются от процедурных тем, что позволяют с помощью одной и той же программы решать разные задачи (отвечать на разные типы вопросов).
Необходимо выяснить, может ли построенная процедура 'срок_правления' быть использована для решения других задач:
а) " Какой царь правил заданное число лет (например, 36 лет)"?
б) Сколько лет правил каждый царь?
Дать декларативную трактовку получившегося правила.
ЗАДАНИЕ 5 (Исследование работы механизма вывода)
Анализируя протокол трассировки при ответе на вопрос а) из задания 4, сделать выводы о том:
а) в каком порядке согласуются цели в правиле 'срок_правления'?
б) в каком порядке просматриваются факты из базы данных при согласовании цели 'царствовал'?