
- •1.1 Пример программы: родственные отношения.
- •1.2 Факты.
- •1.3 Вопросы.
- •1.4 Переменные.
- •1.5 Конъюнкция целей.
- •1.6 Правила.
- •1.7 Конъюнкция в правилах.
- •1.8 Переменные в теле правила.
- •1.9 Cтруктура пролог-программы.
- •2.1 Синтаксис пролога.
- •2.1.1 Константы.
- •2.1.2 Переменные.
- •2.1.3 Структуры.
- •2.1.4 Операторы - тоже функторы.
- •2.2 Арифметика.
- •2.3 Операции сравнения.
- •2.4 Сопоставление.
- •2.6 Примеры сопоставления структур.
- •3.1 Декларативная семантика Пролог-программ
- •3.2 Дизъюнкция целей
- •3.3 Процедурная семантика
- •3.3.1 Пример вычисления
- •3.3.2 Формальное описание процедуры вычисления целей.
- •3.4 Соотношение между процедурным и декларативным смыслом
- •4.1 Списки
- •4.1.1 Представление списка диаграммой.
- •4.1.2 Выделение головы и хвоста списка
- •4.1.3 Шаблоны списков.
- •4.1.4 Определения отношений через cons форму списка
- •4.1.4 Определения отношений через cons форму списка
- •4.2 Процедуры обработки списков
- •4.2.3 Применение append
- •4.2.5 Длина списка
- •4.3 Встроенные предикаты
- •4.3.1 Простые встроенные предикаты ввода-вывода.
- •4.3.2 Процедурный смысл встроенных предикатов ввода-вывода.
- •4.4 Ввод-вывод списков.
- •4.4.1 Ввод-вывод списка как терма.
- •4.4.2 Поэлементный ввод-вывод списка.
- •5.1 Отсечение.
- •5.1.1 Графическая иллюстрация действия cut.
- •5.1.2 Пример действия cut.
- •5.1.3 Применение cut при выборе альтернатив.
- •5.1.4 Формальное описание действия отсечения.
- •5.2 Применение отсечения.
- •5.2.2 Добавление элемента без дублирования.
- •5.2.3 Классификация.
- •5.2.4 Отсечение в численной рекурсии.
- •5.2.5 Замечания при использовании отсечения.
- •5.3 Сортировка списков.
- •5.3.1 Метод наивной сортировки.
- •5.3.2 Метод пузырька.
- •5.3.3 Mетод вставки.
- •5.3.4 Быстрая сортировка quick.
- •6.1 Отрицание как неудача. (not as failure)
- •6.2 Алгоритм поиска на Прологе. ( Логический подход к задаче о фермере, волке, козе и капусте.)
- •6.3 Чтение и запись информации с файлов.
- •6.3.1 Обработка входных потоков.
- •6.3.2 Обработка выходных потоков.
- •6.4 Обработка символов.
- •7.1 Встроенные предикаты
- •7.1.2 Проверка типа терма
- •7.2 Метапредикаты.(Встроенные предикаты обработки термов.)
- •7.2.1 Создание и декомпозиция термов.
- •7.2.2 Предикаты работы с базой данных
- •7.3 Поиск в лабиринте
- •7.4 Сравнительная характеристика языков программирования.
- •8.1. Операции (Операторы).
- •8.1.1 Приоритет оператора.
- •8.1.2. Тип оператора.
- •8.1.3 Объявление операций.
- •8.2. Поиск.
- •8.2. Поиск.
- •8.2.1 Поиск в Прологе.
- •8.2.2 Поиск в глубину.
- •8.2.3 Поиск в ширину.
- •8.2.4 Резюме Поиска.
- •9.1. Введение
- •9.2 Поиск с предпрочтением.
- •10.1. Постановка задачи
- •10.2. Пример грамматики
- •10.3. Пример разбора вручную.
- •10.4. Реализация грамматического разбора на Прологе.
- •Как должны выглядеть утверждения Пролога ?
- •Запоминание состояния в Прологе.
- •Аналогично для dcg проводится
- •11.1. Постановка задачи
- •Две емкости
- •11.2. Решение задачи
- •12.1. Постановка задачи
- •12.2. Решение
- •13.1. Введение
- •Метод "образовать и проверить"
- •13.2. Раскрашивание плоской карты
2.3 Операции сравнения.
При сравнении числовых величин также используются арифметические операции Ниже перечислены операторы сравнения:
X > Y |
X больше Y |
X < Y |
X меньше Y |
X >= Y |
X больше или равен Y |
X =< Y |
X меньше или равен Y |
X =:=Y |
величины X и Y совпадают (равны) |
X =\= Y |
величины X и Y не равны |
Точно также как оператор is , операторы сравнения вызывают выполнение вычислений.
Обратите внимание на разницу между операторами сравнения = и =:=, например в таких целях как X = Y и X =:= Y. Первая цель вызовет сопоставление объектов X и Y, и, если X и Y сопоставимы, возможно приведет к конкретизации каких-либо переменных в этих объектах. Никаких вычислений при этом производитя не будет. С другой стороны, X =:= Y вызовет арифметическое вычисление и не может привести к конкретизации переменных. Это различие можно проиллюстрировать следующими примерами:
|
?- 1 + 2 =:= 2 + 1. yes ?- 1 + 2 = 2 + 1. no ?- 1 + A = B + 2. A = 2 B = 1 |
|
|
|
|
Примеры использования операторов сравнения:
|
?- 100 > 4. yes |
|
|
|
|
age(mary, 20). age(ann , 23). age(bob , 25).
|
?- age(X , Y), Y>21. X=ann; X=bob; ?- age(X , Y), Y>21, Y<=23. X=ann ; |
|
|
|
|
Определим отношение "выше" higher/2
higher(point(X1, Y1), point(X2, Y2):-Y1>Y2.
|
?- higher(point( 1, 1), point( 2, 2). no |
Если наоборот - то будет yes.
2.4 Сопоставление.
Главной операцией в процессе выполнения пролог -программы, является сопоставление (согласование, унификация) термов.
Например,
рarent(pam, bob).
|
?- parent(pam, bob). Yes |
|
|
|
|
Цель согласуется.
|
?-parent(pam, X). X=bob |
|
|
|
|
Tоже согласуются, но X конкретизируется и принимает значение bob
Но если взять два составных терма -структуры.
a(b, C, d(e, F, g(h, i, J))) a(B, c, d(E, f, g(H, I, j)))
cогласуются ли они? Что будет с переменными после согласования? Как они будут конкретизированны?
Сопоставление -это процесс, на вход которого подаются два терма, а он проверяет, соответствуют ли эти термы друг другу.
Если термы не сопоставимы, значит сопоставление терпит неудачу. Если термы сопоставимы, тогда пpоцесс сопоставления находит конкретизацию переменных, делающих эти термы тождественными, и завершается удачей.
Какие же правила определяют сопоставимость двух термов S и Т ?
Если S и Т константы , то S и Т cопоставимы, только, если они являются одним и тем же объектом. т.е.: 2 сопоставляется с 2 bob сопоставляется с bob
Если S переменная, а Т -произвольный объект, то ни сопоставимы и S приписывается значение T. Наоборот, если Т -переменная, а S -произвольный объект, то T приписывается значение S. Говорят,что T конкретизируется значением S. То есть:
data(M, D, 1992). data(may, 3, Y).
Сопоставимы, переменные конкретизируются: М=may D=3 Y=1992 в обоих термах.
Если S и Т - структуры, то они сопоставимы, если (а) S и Т имеют одинаковый главный функтор и (b) все их соответствующие компоненты сопоставимы. Результирующая конкретизация определяется сопоставлением компонент.
Если сопоставить структуры
a(b, C, d(e, F, g(h, i, J))) a(B, c, d(E, f, g(H, I, j)))
то получим
B=b C=c E=e F=f H=h I=i J=j
Рассмотрим более сложный пример:
triangle(point(2, 5), A, point(B, 8))
triangle(X, point(2, 8), point(5, 8))
После конкретизации
X=point(2, 5) A=point(2, 8) B=5
Еще один пример:
конкретизированная переменная Х=2
!
triangle(point(X, 5), point(X, 8), point(5, Z))
неконкретизированная переменная Y=2
!
triangle(point(2, 5), point(Y, 8), point(5, A))
Если Y представляет собой неконкретизированную переменную, а переменная X конкретизированную, то X и Y согласуются и принимает значение Х.То есть
X=2 Y=2
Переменные Z и A обе не конкретизированы. Они согласуются и становятся сцепленными.
Если две переменные сцеплены, то при конкретизации одной из них, второй переменной автоматически будет присвоено тоже самое конкретное значение, что и первой. Как это было с X и Y.
2.5 Второе значение операции = в Прологе.
В Прологе операция = , кроме сравнения, выполняет сопоставление двух термов с конкретизацией переменных.
Если термы согласуются, то результат истина.
|
?-a(B,c(x,D))=a(d,c(X,3)). Yes B=d X=x D=3 |
|
|
|
|
Аналогично, /= дает истину, если термы не согласуются.
|
?-a(x)/=a(d). Yes |