Предисловие 13
О содержании 14
Благодарности 15
О языке 16
О приоритетах 17
Поддержка 17
ЧАСТЬ I. ОСНОВНЫЕ ЭЛЕМЕНТЫ ЯЗЫКА VISUAL PROLOG
19
Глава 1. Лексика языка Visual Prolog
21
1.1. Алфавит 21
1.2. Комментарии 21
1.3. Символы разметки текста 22
1.4. Лексемы 22
1.4.1. Ключевые слова 22
1.4.2. Знаки пунктуации 22
1.4.3. Операции 23
1.4.4. Идентификаторы 23
1.4.5. Литералы 23
Целые числа 24
Вещественные числа 24
Символы 25
Строки 25
Двоичные данные 26
Списки 27
Составной терм 27
Глава 2. Термы
28
2.1. Понятие термов 28
2.2. Переменные 29
2.3. Списки 30
2.4. Операция сопоставления с образцом 31
2.4.1. Сопоставление термов 32
2.4.2. Сопоставление списков 33
2.5. Операция унификации 34
2.6. Операция «должно унифицироваться» 36
2.7. Неразрушающее присваивание в Visual Prolog 37
Глава 3. Операции языка
38
3.1. Арифметические операции и операции сравнения и сопоставления 38
3.2. Целочисленное деление 39
Глава 4. Типы, домены, подтипы
40
4.1. Типы данных 40
4.2. Встроенные домены 41
4.3. Домены-синонимы 45
4.4. Подтипы и категориальный полиморфизм 45
4.5. Домены, определяемые пользователем 46
4.5.1. Целочисленные подтипы 46
4.5.2. Вещественные подтипы 47
4.5.3. Списочные домены 48
4.5.4. Составные домены 48
Глава 5. Константы
50
5.1. Объявление пользовательских констант 50
5.2. Встроенные константы 51
ЧАСТЬ II. ЯЗЫК VISUAL PROLOG
53
Глава 6. Предикаты
55
6.1. Понятие предиката 55
6.2. Логические операции над предикатами 56
6.3. Логические формулы 58
6.4. Правила вывода предикатов 59
6.4.1. Вывод предиката из другого предиката 59
6.4.2. Формулы вычисления предикатов 61
6.5. Факты 64
6.6. Машина логического вывода 65
6.7. Работа механизма поиска с возвратом 66
6.8. Чистый Пролог 74
Глава 7. Предикаты в Visual Prolog
75
7.1. Объявление и определение предикатов 75
7.1.1. Режимы детерминизма 75
7.1.2. Шаблон потоков 77
7.1.3. Определение предикатов.. 78
7.2. Объявление и определение функций. 80
7.3. Объявление и определение фактов 82
7.3.1. Режимы детерминизма факта 82
7.3.2. Определение фактов 83
7.3.3. Факты-переменные 83
7.4. Операции над разделами базы фактов 87
7.5. Операции над фактами 88
7.6. Встроенные предикаты Visual Prolog 89
7.6.1. Предикаты для работы с фактами базы данных. 89
7.6.2. Предикаты контроля потока параметров 90
7.6.3. Предикаты локализации места выполнения программы в исходном тексте 91
7.6.4. Предикаты контроля компиляции исходного текста 91
7.6.5. Предикат сравнения термов 92
7.6.6. Предикаты преобразования типов.. 92
7.6.7. Предикаты обработки эллипсиса 96
7.6.8. Предикаты получения размера домена 97
7.6.9. Предикат получения размера терма 98
7.6.10. Предикаты объявления/проверки домена переменной 98
7.6.11. Предикат обработки ошибки 99
7.6.12. Предикаты управления выполнением программы 99
Глава 8. Модули
101
8.1. Область видимости 102
8.2. Структура модуля 102
8.3. Использование модулей в проекте 104
8.3.1. Библиотека констант и доменов 104
8.3.2. Библиотеки предикатов 105
8.3.3. Глобальные переменные проекта 105
Глава 9. Отсечение и отрицание
108
9.1. Принцип работы отсечения 108
9.1.1. Область видимости отсечения 109
9.1.2. Использование отсечений 109
9.2. Зеленые и красные отсечения 111
9.3. Динамическое отсечение 112
9.4. Отрицание 113
Глава 10. Циклы с откатом
115
10.1. Структура цикла с откатом 115
10.2. Реализация циклов с откатом 117
10.3. Использование изменяемых переменных в циклах с откатом 122
10.4. Циклы с откатом на основе отрицания 125
Глава 11. Рекурсия
127
11.1. Структура рекурсии 127
11.2. Реализация рекурсии 130
11.3. Мемоизация 138
Глава 12. Ввод/вывод
140
12.1. Ввод/вывод в консольном приложении 140
12.1.1. Основные функции ввода с клавиатуры 140
12.1.2. Основные предикаты вывода на экран 141
12.1.3. Использование предиката hasDomain 142
12.2. Файловый ввод/вывод 143
12.3. Потоковый ввод/вывод 144
12.3.1. Потоковый ввод/вывод в цикле с откатом 146
12.3.2. Потоковый ввод/вывод в рекурсивном цикле 147
12.4. Строковые потоки 148
2.4.1. Поток ввода строк 149
12.4.2. Поток вывода строк 151
Глава 13. Списки
153
13.1. Представление списков в памяти компьютера 153
13.2. Встроенные операции над списками 154
13.2.1. Объявление списочных доменов 157
13.3. Реализация очереди и дека 157
13.4. Принципы рекурсивной обработки списков 158
13.4.1. Построение списков из элементов 158
13.4.2. Построение реверсивных списков из элементов 159
13.4.3. Сканирование списка 160
13.4.4. Модификация списка 161
13.4.5. Синхронная обработка списков 161
13.5. Примеры рекурсивной обработки списков 162
13.5.1. Определение длины списка 162
13.5.2. Построение списка 164
13.5.3. Соединение списков 165
13.5.4. Реверс списка 167
13.6. Ввод/вывод списков целиком 167
13.6.1. Терминальный ввод/вывод списков 167
13.6.2. Файловый ввод/вывод списков 168
13.6.3. Потоковый ввод/вывод списков 168
13.7. Поэлементный ввод/вывод списков 169
13.7.1. Поэлементный ввод/вывод списков в цикле с откатом 169
13.7.2. Поэлементный ввод/вывод списков в рекурсивном цикле 170
13.8. Предикат выборки элементов списка.. 171
13.9. Коллектор списков.. 172
13.10. Представление базы фактов списками фактов 174
13.10.1. Когерентность базы фактов и списка фактов 174
13.10.2. Домен фактов внутренней базы данных 175
13.10.3. Создание списка фактов внутренней базы данных 175
13.10.4. Восстановление внутренней базы данных из списка фактов 175
и обратно 176
Глава 14. Параметрический полиморфизм
178
14.1. Полиморфизм параметров предикатов 178
14.2. Полиморфизм параметров доменов 179
14.2.1. Полиморфный списочный домен класса core 182
Глава 15. Эллипсис
183
Глава 16. Предикаты второго порядка и анонимные предикаты
185
16.1. Предикатные и функциональные домены 185
16.2. Анонимные предикаты и функции 189
16.2.1. Определения анонимных предикатов 190
16.2.2. Использование анонимных предикатов и функций 190
16.2.3. Замыкание 195
16.2.4. Каррирование 195
16.3. Высокоуровневые предикаты и функции класса list 197
Глава 17. Императивные конструкции
205
17.1. Разрушающее присваивание 205
17.2. Ветвление 206
17.3. Условные выражения 207
17.4. Цикл foreach 207
17.5. Циклы с заданным числом повторений 210
Глава 18. Обработка исключительных ситуаций
211
18.1. Явный вызов исключений 211
18.2. Обработка исключений 213
Глава 19. Классы
218
19.1. Структура класса 218
19.1.1. Параметры состояния класса и объекта 221
19.2. Объекты 221
19.2.1. Создание объектов 221
19.2.2. Объектные предикаты 222
19.2.3. Объектные свойства 223
19.2.4. Удаление объектов 225
19.3. Классы 226
19.3.1. Конструкторы 226
19.3.2. Состояние класса 227
19.4. Наследование кода и поддержка интерфейсов.. 228
19.5. Сохранение объектов 230
19.6. Операции над всеми живущими объектами 231
19.7. Примеры использования классов 232
Глава 20. Обобщенное программирование
239
20.1. Обобщенные интерфейсы 239
20.2. Обобщенные классы 240
20.3. Обобщенные реализации 241
20.4. Пример обобщенной очереди 242
ЧАСТЬ III. СРЕДСТВА ПРОФЕССИОНАЛЬНОГО ПРОГРАММИРОВАНИЯ
245
Глава 21. Многопоточность
247
21.1. Основные операции с потоками 247
21.1.1. Создание потоков 247
21.1.2. Завершение потоков 248
21.1.3. Приостановка и возобновление потоков 248
21.1.4. Примеры создания потока 249
21.2. Мониторы 251
21.3. Защита 253
Глава 22. Доступ к API-функциям Windows
256
22.1. Описание типов данных API-функций доменами Visual Prolog 256
22.2. Объявления предикатов для вызова API-функций.. 258
22.3. Использование пакета windowsAPI 260
22.4. Использование API-функций из библиотеки Windows 262
Глава 23. Разработка и использование DLL
265
23.1. Создание DLL-проекта 266
23.2. Описание экспортируемых предикатов и функций DLL-проекта 267
23.3. Использование DLL-проекта 268
Глава 24. Отладка приложений
271
24.1. Отладчик Visual Prolog 271
24.2. Просмотр значений переменных средствами языка 274
24.3. Контроль стека и кучи 275
ЧАСТЬ IV. ПРЕДСТАВЛЕНИЕ И ОБРАБОТКА ДАННЫХ В VISUAL PROLOG
277
Глава 25. Графы
279
25.1. Представление ориентированных графов. 279
25.2. Представление неориентированных графов 282
25.3. Поиск «сначала вглубь» 283
25.4. Поиск «сначала вширь» 285
Глава 26. Деревья
288
26.1. Представление деревьев в Visual Prolog 288
26.2. Операции над деревьями 290
26.2.1. Добавление вершины 290
26.2.2. Поиск вершины 291
26.2.3. Удаление вершины 291
26.3. Красно-черные деревья 294
Глава 27. Массивы
299
27.1. Класс binary 299
27.1.1. Создание массивов binary 299
27.1.2. Основные операции над массивами binary 300
27.2. Класс arrayM 301
27.2.1. Создание одномерных массивов 301
27.2.2. Основные операции над одномерными массивами 301
27.3. Класс array2M 303
27.3.1. Создание двумерных массивов 303
27.3.2. Основные операции над двумерными массивами 303
27.4. Класс arrayM_boolean 304
27.4.1. Создание одномерных булевых массивов 304
27.4.2. Основные операции над одномерными булевыми массивами 304
27.5. Способы обработки массивов 305
Глава 28. Символьные преобразования
307
28.1. Этапы анализа текстов 307
28.2. Основы анализа текстов на Visual Prolog 308
28.2.1. Простой лексический анализ 308
28.2.2. Простой синтаксический анализ 308
28.3. Анализ математических выражений 309
28.4. Парсер математических выражений с произвольной грамматикой 315
28.5. Символьное дифференцирование выражений 322
28.6. Калькулятор 329
Способ 1 329
Способ 2 330
Способ 3 331
28.7. Задания для самостоятельного решения 333
Глава 29. Интерпретатор программ
335
29.1. Лексический анализ 335
29.2. Синтаксический анализ 341
29.3. Интерпретатор программ 346
29.4. Задания для самостоятельного решения 353
Глава 30. Практические рекомендации
355
30.1. Выбор способа представления и обработки данных 355
30.2. Управление памятью в Visual Prolog 7 356
30.2.1. Стек вызовов 356
Управляемый детерминизм 357
Задание произвольного размера стека вызовов 361
30.2.2. Динамическая память 363
Отказ от глобального стека в Visual Prolog 7 364
Многопоточность 365
30.2.3. Системная память 365
ЧАСТЬ V. ПРАКТИКУМ ПО ПРОГРАММИРОВАНИЮ
367
Глава 31. Введение в Visual Prolog
369
31.1. Создание консольного проекта 369
31.2. Запуск программы 373
31.3. Расширение области видимости 376
31.4. Управление выводом в консоли 376
31.5. Использование классов PFC 377
Глава 32. Поиск с откатом на фактах
382
32.1. Цвета автомобилей 382
32.2. Точки на плоскости 385
32.3. Двенадцать месяцев 390
32.4. Зеленые и красные отсечения 390
Глава 33. Поиск с откатом на правилах
392
33.1. Родственные отношения 392
33.2. Моделирование комбинационных схем 397
33.3. Фигуры на плоскости 400
33.4. Ребус 405
Глава 34. Рекурсивные правила
408
34.1. Арифметика 408
34.2. Ряды 413
34.3. Длинная арифметика 415
34.4. Перевод чисел из одной системы счисления в другую 416
34.5. Обработка строк 423
Глава 35. Рекурсивные правила на списках
429
35.1. Списки 429
35.2. Математика 434
35.3. Треугольник Паскаля 435
35.4. Длинная арифметика 437
35.5. Преобразователь чисел из одной системы счисления в другую 439
35.6. Монеты 439
35.7. Домино 441
35.8. Ребус 442
35.9. Ребус с произвольными словами 444
35.10. Ребус с произвольными словами произвольной длины 446
35.11. Расстановка N ферзей на доске NxN 448
35.12. Кувшины 452
35.13. Строки. Баланс скобок 454
35.14. Строки. Транслитерация 455
35.15. Списки. Поиск в ширину подсписка в списке 456
Глава 36. Внутренняя база данных
459
36.1. Лексика русского языка 459
36.2. Искусственная жизнь 462
36.3. Представление базы данных списком фактов 466
Глава 37. Задачи на графах
468
Глава 38. Задачи на деревьях
473
Глава 39. Задачи на массивах
478
39.1. Решето Эратосфена 478
39.2. Сравнение частотных букварей текстов 481

ПРИЛОЖЕНИЯ 485
Приложение 1. Описание свойств и предикатов класса console 487
Свойства 487
Предикаты 487
Приложение 2. Описание предикатов класса file 491
Приложение 3. Описание конструкторов класса inputStream_file 495
Приложение 4. Описание конструкторов класса outputStream_file 497
Приложение 5. Пакет stream 500
Описание предикатов класса inputStream 500
Описание предикатов класса outputStream 501
Описание предикатов класса stream. 501
Приложение 6. Меню Visual Prolog 503
Приложение 7. Быстрые клавиши меню Visual Prolog. 509
Приложение 8. Панель инструментов Visual Prolog 512
Приложение 9. Описание предикатов класса std 514
Приложение 10. Описание класса string 517
Константа 517
Домены 517
Предикаты 517
Приложение 11. Описание электронного архива, сопровождающего книгу 534
Предметный указатель 535