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

Глава 12. Игры и головоломки

Введение

В первых одиннадцати главах Турбо-Пролог использовался для

решения задач самых разных типов начиная с простой обработки

информации, находящейся в базе данных, и кончая экспертными

системами. В этой главе демонстрируется программирование на

Турбо-Прологе игр и головоломок. Вы, вероятно знаете насколько

сложны техника и методы, используемые для программирования игр

и головоломок. Игры и головоломки различной сложности являются

хорошей пробой сил для программиста. Несомненно, что программи-

рование игр и головоломок улучшает навыки программиста в облас-

ти обработки данных разных типов.

В этой главе вы познакомитесь с разработкой пяти программ

на Турбо-Прологе. Первая - программа для игры в отгадывание

числа, вторая и третья реализуют некоторую игру двух лиц. Чет-

вертая программа предназначена для решения классической задачи

ИИ, а пятая решает логическую задачу. Эта последняя программа

демонстрирует средства пользовательского интерфейса, необходи-

мого для выполнения программы в более интересной, ориентирован-

ной на пользователе форме.

В каждой из этих программ средства Турбо-Пролога использу-

ются для решения конкретных задач, для которых и предназначены

эти программы. Многообразие внутренних подпрограмм Турбо-Проло-

га, его графика и эффективность - все это используется совмест-

но с целью продемонстрироровать технику программирования, кото-

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

12.1.Решение задач в играх и головоломках

Ваша ежедневная деятельность состоит из многих повторяю-

щихся действий, таких как приготовление пищи, еда, сон и поезд-

ки на работу. Для нормального человека эта деятельность может

потребовать большой энергии, но очень небольшого напряжения ум-

ственных способностей.

Но игры и головоломки требуют размышлений. Это одна из

причин их популярности. Задачи, содержащиеся в играх и голово-

ломках, хорошо формализованы, поэтому значительная часть первых

работ в области искусственного интеллекта была ориентирована на

игры и головоломки.

Были написаны программы для игры с человеком. Программы

для игры в настольные игры, такие как шашки и шахматы, способны

обрабатывать логические взаимосвязи, возникающие в процессе иг-

ры. Программы, решающие такие известные головоломки как "Крес-

тики и нолики" и "Ханойская башня" являются классическими при-

мерами, часто встречающимися в литературе по искусственному ин-

теллекту.

Используя Турбо-Пролог можно разработать и реализовать за-

конченную программу для решения головоломки или какой-нибудь

игры. Внутренние унификационные подпрограммы Турбо-Пролога спо-

собны выполнять многоуровневый поиск и сопоставление с образ-

цом, что позволяет легко и эффективно реализовать методы реше-

ния задач.

Вы, по-видимому, уже знаете, что либо результатом, либо

целью вашей будущей работы будет решение некоторых задач. Для

многих таких задач метод их решения может потребовать выполне-

ния цепочки рассуждений, начинающейся с желаемого результата и

закачивающейся заданными условиями. В ИИ этот подход называется

обратным выводом. Турбо-Пролог имеет средства для обратного вы-

вода, которые являются его фундаментальным свойством.

В общем случае в Прологе, и в Турбо-Прологе в частности,

обычно голова правила (или цель) содержит параметры, значения

которых неизвестны. Подцели тела этого правила пытаются вычис-

лить параметры цели. Именно это является фундаментальным свойс-

твом Пролога, и таким образом обратный вывод является весьма

"естественным" для Пролога.

При решении задач другого типа могут потребоваться все не-

обходимые промежуточные шаги и соответствующие условия для то-

го, чтобы достичь любого из возможных решений или ответа. В

этом случае решение задачи начинается с известных фактов или

условий и выполняется как прямой поиск допустимого решения.

Этот подход называется прямым выводом.

12.2. Игры в отгадывание числа

Игры в отгадывание числа являются конкретным примером игр,

основанных на сопоставлении символов. В программах для игр в

отгадывание символов этими символами могут быть числа, литеры,

слова или предложения, графические объекты, которые хранятся в

памяти машины. Игры в отгадывание чисел особенно интересны тем,

что они могут быть организованы так, чтобы обеспечивать различ-

ные уровни сложности для играющего.

12.2.1. Анализ проекта

При разработке игры в отгадывание числа необходимо устано-

вить предел области, в которой могут быть эти числа. Например,

рассмотрим игру, цель которой отгадать число из диапазона от 1

до 100. Если вы будете отгадывать число "слепым" образом, то

для нахождения правильного ответа может потребоваться около 99

попыток. С другой стороны, если у вас есть продвижения к пра-

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

быть существенно уменьшено.

Если для генерации случайного числа и выдачи советов во

время игры используется компьютер, то он участвует в игре пас-

сивно. Только вы являетесь "реальным" игроком. Это пример игры

с одним игроком. Но можно написать программу, в которой компь-

ютер играет активную роль в качестве оппонента. В этом случае,

вы и компьютер являетесь полнорпавными игроками. Тогда это игра

двух игроков.

12.2.2. План игры

В качестве примера игры с одним участником рассмотрим игру,

в которой компьютер выбирает целое число из диапазона от 1 до

100. Вы пытаетесь угадать это число и сообщаете его компьютеру.

Затем компьютер дает вам знать правилен ли ваш выбор.

Если ваш выбор неправилен, то компьютер даст вам знать,

что выбранноле вами число больше или меньше, чем задуманное.

Продолжая таким образом, вы будете отвечать с возрастающей точ-

ностью при каждой попытке. В конце концов ваш ответ будет пра-

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

ся угадать правильное число за минимальное число попыток.

Эта игра является простой иллюстрацией эвристического под-

хода. По сравнению со "слепыми" методами, эвристический подход

позволяет вам двигаться к решению задачи, корректируя область

поиска по определенным правилам. При детальном анализе этой иг-

ры, вы можете надеяться найти эмпирическое правило (или эврис-

тику) для выбора соответствующих действий.

Например, пусть X (число которое должно быть отгадано)

равно 36. В табл. 12.1 показана логическая последователь-

ность попыток отгадать число.

Таблица 12.1. Логичекая последовательность нахождения числа

_______________________________________________________________

Попытка Ваш ход Подсказка копьютера

для выполнения следующей

попытки

1 50 Введите число поменьше

2 25 Введите число побольше

3 37 Введите число поменьше

4 31 Введите число побольше

5 34 Введите число побольше

6 35 Введите число побольше

7 36 Правильный ответ

_______________________________________________________________

Ответы были получены делением оставшейся части области оп-

ределения числа X (0 < X <= 100) пополам. Отгадывание любого

числа потребует не более 7 попыток. Заметьте, что после четырех

попыток оставшаяся область определения есть интервал от 32 до

36, т.е. имеется только пять кандидатов. Вы можете выбрать одно

из них случайным образом в качестве пятой попытки. У вас имеет-

ся в этот момент 20% -ая вероятность выбрать правильное число.

Программа для такой игры реализует следующие шаги: 1. Сге-

нерировать случайное число в диапазоне от 1 до 100

включительно.

2. Пригласить игрока ввести целое число в качестве попытки

угадать правильное.

a. Если ответ правильный, выдать соответствующее сооб-

щение и выйти из программы.

b. Если ответ меньше, чем правильный, то выдать соот-

ветствующее сообщение и ввести следующий ответ.

c. Если ответ больше, чем правильный, то выдать соот-

ветствующее сообщение и ввести следующий ответ.

Заметьте, что шаг 1 выполняется только один раз, в то вре-

мя как шаг 2 выполняется повторно до тех пор, пока не будет по-

лучен правильный ответ.

12.2.3. Программа для игры в отгадывание числа

Достаточно любопытно написать программу на Турбо-Прологе,

реализующую игру в отгадывание числа, но также не менее инте-

ресно играть в эту игру. Целое число в диапазоне от 1 до 100

вычисляется при помощи генератора случайных чисел Турбо-Проло-

га, а информацию, подсказывающую правильный ответ нетрудно вы-

вести на экран. Эту игру можно реализовать на Турбо-Прологе при

помощи следующих процедур.

Правило для генерации случайного числа следующее:

generate_rand(X) :-

random(R),

X = 1 + R * 100,

nl,write(" Я задумал число."),

nl,write(" Теперь Ваш ход!"),nl.

Это правило присваивает переменной X значение случайного

числа. Встроенный предикат Турбо-Пролога random(R) генерирует

случайное действительное число X, где 0 <= X < 1. Предикат ра-

венства

X = 1 + R * 100

преобразует случайное число в число с областью определения, за-

данной для X, т.е. в число в диапазоне от 1 до 100 и преобра-

ует действительное число в целое.

Для того чтобы запросить ввод пользователя (ответ) и быст-

ро его проверить нужно написать следующее правило:

play_it_sam(X) :-

nl, write(" Введите ваш ответ. "),

nl, readint(G),

test_and_tell(X,G),

play_it_sam(X).

Предикат readint(G) считывает ответ пользователя (G). Пра-

вило test_and_tell(X,G) проверяет верен ли ответ пользователя.

Как было объяснено выше, существуют три возможности для каждого

ответа: число слишком большое, число слишком маленькое и число

правильное. Каждый из этих отыетов вызывает определенное прави-

ло,подсказывающее пользователю в каком напрвлении двигаться при

следующей попытке. Правила на Турбо-Прологе для проверки отве-

та следующие:

test_and_tell(X,G) :-

X = G,

say_you_got_it_right(X).

test_and_tell(X,G) :-

X > G,

say_too_small.

test_and_tell(X,G) :-

X < G,

say_too_big.

say_too_big :-

nl,write(" Your guess is too big. "),

nl,write(" Try a smaller number. ").

say_too_small :-

nl,write(" Your guess is too small. "),

nl,write(" Try a bigger number. ").

say_you_got_it_right(X) :-

nl,write("You got it right."),

nl,write(" It is",X,"."),

nl,write(" Good bye !"),

nl,write(" Press the space bar."),

nl,readchar(_),

exit.

Теперь можно написать для программы цель play_the_game как

правило, которое включает предшествующие два в качестве подце-

лей:

play_the_game :-

give_info,

play_it.

Правило give_info сообщает пользователю как организована

игра. Правило play_it выполняет всю игру. Это правило вызывает

genеrate_rand(A) для запуска игры:

play_it :-

generate_rand(A),

play_it_sam(A).

Программа игры в отгадывание числа (листиг 12.1) реализует

этот проект.Заметьте, что G и X объявлены как целые цисла, а R

объявлено как действительное число. Помимо встроенного предика-

та генерации случайных чисел, программа также использует средс-

тва Турбо-Пролога для организации окон.

Листинг 12.1

На рис. 12.1 показан диалог с программой "Отгадай число".

Заметьте, что играющий воспользовался советом компьтера и ис-

пользует метод деления отрезка пополам в качестве эвристики.

* Упражнения

12.1. Запустите несколько раз программу игры в отгадывание чис-

ла. Используйте стратегию деления отрезка пополам для достиже-

ния лучших результатов.

12.2. Измените программу игры в отгадывание числа так, чтобы

случайное число лежало в диапазоне от1 до 10. Каково максималь-

ное число попыток отгадать число в этом случае?

12.3. Запустите модифицированную программу игры в отгадывание

числа несколько раз. Используйте стратегию деления отрезка по-

полам. Какое у вас наилушее число попыток отгадать число?

12.4. Модифицируйте эту программу так, чтобы она запоминала

число попыток пользователя отгадать число. Если это число мень-

ше, чем максимально допустимое, то выдайте на экран текст "WELL

DONE !" (Хорошо сработано !) в отдельном окне. (Подсказка: для

реализации счетчика см. гл. 3 о рекурсии).

Рисунок 12.1

12.3. Игра в 23 спички

Игра "23 спички" является одной из многих игр для двух

лиц. Эта игра весьма интересна, так как она может быть реализо-

вана либо как простая игра, либо как весьма сложная со многими

логе для обоих случаев.

Игра "23 спички" заключается в следующем. Игроки начинают

с 23 спичек (или палочек). Каждый игрок по очереди удаляет 1, 2

или 3 спички. Тот, кто возьмет последнюю - проигравший. Таким

образом, цель игры - это заставить другого игрока взять послед-

нюю спичку.

Первая программа на Турбо-Прологе для этой игры будет раз-

работана в следующем разделе.

12.3.1. Обсуждение проекта

Существуют два варианта игры в 23 спички:

Вариант с одной кучкой

Номер кучки Состояние кучки Число спичек

1 1,2,3,...22,23 23

Вариант с четырьмя кучками

Номер кучки Состояние кучки Число спичек

1 1 2 3 4 5 5

2 6 7 8 9 10 11 6

3 12 13 14 15 16 17 6

4 18 19 20 21 22 23 6

В том и другом варианте игры каждый игрок по очереди берет

1, 2 или 3 спички из каждой кучки. В обоих вармантах суммарное

число спичек, остающиеся после хода каждого игрока впоследствии

определяет проигравшего.

Для простоты начнем с варианта с одной кучкой. Для реали-

зации этой игры на Турбо-Прологе компьютер становится одним из

игроков, а пользователь - другим игроком.

Основная процедура включает несколько шагов:

1. Выбрать 23 спички в качестве начального числа спичек и

поместить их в единственную кучку.

2. Попросить пользователя удалить 1, 2 или 3 спички. Пос-

читать число оставшихся спичек в кучке.

a. Если осталась только одна спичка, то компьютер дол-

жен удалить эту последную спичку. В этом случае

компьютер проигрывает.

b. Если же осталось более одной спички, то перейти к

шагу 3.

3. Компьютер удаляет 1, 2 или 3 спички. Вычислить число

оставшихся спичек в кучке.

a. Если осталась только одна спичка, то пользователь

должен взять эту последнюю спичку. В этом случае

он проигрывает.

b. Если осталось больше одной спички, то повторить

шаг 2.

Сама по себе процедура очень простая. Тем не менее число

спичек, удаляемое игроком, определяет победителя, и следова-

тельно, стратегия является важной компонентой структуры игры.

12.3.2. Программа простой игры в "23 спички"

При реализации этой простой игры можно позволить пользова-

телю самостоятельно выбирать стратегию игры. Поэтому сейчас на-

до позаботиться только о компьютере, как игроке. Компьютер дол-

жен генерировать числа 1, 2 или 3 случайным образом и использо-

вать это число в игровом модуле.

Для написания программы игры "23 спички" необходимо реали-

зовать три шага, рассмотренные в предыдущем разделе. Первый шаг

- это установить начальное число спичек равным 23. Затем можно

передать это число из основного модуля в подмодуль в соответст-

вии со структурой программы (см. рис. 12.2).

Рисунок 12.2.

Основной модуль имеет вид:

play_the_game :-

do_windows,

play(23,0,0).

В этом модуле правило do_windows создает окна и выдает

вспомогательную информацию. Правило play(23,0,0) фактически вы-

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

им исходное число 23.

Правило play(M,H,C) построено из следующего за ним прави-

ла, которое выполняет игровую последовательность до тех пор,

пока не определится выигравший:

play(M,H,C) :-

play_it_again(M,H,C).

Переменные M, H и C используются соответственно для

matches (спички), human (человек) и computer (компьютер).

Правило play_it_again рекурсивное. Оно имеет три альтерна-

тивы, ревализующие три возможных окончания процесса игры: выиг-

рывает человек, выигрывает компьютер, игра продолжается.

Если выигрывает человек, то правило имеет вид:

play_it_again (M,H,C) :-

M <= 0,

nl, write(" Ты выиграл, человек!"),nl,

nl, write(" Нажмите клавишу пробела."),

readchar(_),

clearwindow, !.

Предикат равенства M<=0 определяет, что компьютер сделал

последний ход. Сделав это, он взял все спички (M=0), или же он

взял больше спичек, чем фактически имеется (M<0). В том и дру-

гом случае компьютер проигрывает, а человек выигрывает.

Если выигрывает компьютер, то соответствующее правило име-

ет вид:

play_it_again (M,H,C) :-

M = 1,

nl, write(" Я, компьютер, выиграл !"),nl,

readchar(_),

clerawindow, !.

В этом варианте правила предикат равенства M = 1 определя-

ет, что текущее число спичек равно 1, и что эта последняя спич-

ка должна быть удалена человеком во время следующего хода, т.е.

есть компьютер выигрывает. Как первый, так и второй варианты

правила play_it_again выполняют выход из программы, если они

успешны.

Третий вариант правила является сердцевиной игровой после-

довательности:

play_it_again(M,H,C) :-

nl,write(" Ваш ход."),

nl,write(" Сколько спичек вы хотите убрать?"),

readint(Hn),

M2 = M - Hn,

H2 = Hn,

write(" Теперь имеется",M2,"спичек"),

nl,nl,write(" Мой ход."),

nl,write(" Я думаю !"),

random(F),

Rea = 1 + 3 * F,

real_int(Rea,Rint),

M3 = M2 - Rint,

nl,write(" Я удалил ",Rint,"."),

nl,write(" Теперь имеется ",M3,"спичек"),nl,

M7 = M3,

H7 = H2,

C7 = Rint,

play_it_again(M7,H7,C7).

Этот вариант правила считывает ответ введенный пользовате-

лем, вычисляет число оставшихся спичек и выдает это число на

экран. Затем правило считывает ввод компьютера (случайное целое

число, равное 1, 2 или 3), модифицирует число спичек и выдает

измененное значение. Этот третий вариант правила является ре-

курсивным правилом, так как это необходимо для play_it_again.

Описанные правила используются в программе для простой иг-

ры в 23 спички (листинг 12.2). Эта программа использует средст-

ва оконного интерфейса Турбо-Пролога и выдает вспомогательные

сообщения и приглашения.

Листинг 12.1

На рис. 12.3 показан диалог между пользователем и програм-

мой. Это представление на экране диалога между компьютером и

пользователем сделано достаточно просто и ясно, так что пользо-

ватель может легко проанализировать ситуацию и решить какое

ввести число. Пользователь может использовать свою собствееную

выигрышную стратегию. Компьютер выбирает 1, 2 или 3 случайным

образом - он не использует никакой стратегии, кроме надежды на

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

компьютер.

Рисунок 12.3.

* Упражнения

12.5. Запустите программу для простой игры в 23 спички. Сколько

раз вам удалось выиграть?

12.6. Предположим, что вы хотите реализовать вариант игры с че-

тырьмя кучками. Напишите последовательность шагов для процедуры

игры. (Подсказка: необходимо начать с четырех кучек спичек, ге-

нерировать больше случайных чисел и модифицировать во время иг-

ры все кучки).

12.7. Модифицируйте программу, используя процедуру, разрабо-

танную в предыдущем упражнении. Запустите программу и проконт-

ролируйте поведение как компьютера, так и пользователя.

12.3.3. Интеллектуальная игра "23 спички"

В простой игре "23 спички" компьютер как игрок был запрог-

раммирован на выбор числа удаляемых спичек случайным образом.

Компьютер играл не имея выигрышной стратегии. Программа интел-

лектуальной игры "23 спички" показывает, как реализовать выиг-

рышную стратегию (или эвристику) для компьютера.

В игре "23 спички", как вы понимаете, каждый игрок стара-

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

Начальное число спичек 23, конечная цель - одна спичка, а каж-

дый игрок может удалить 1, 2 или 3 спички. Таким образом, можно

увидеть последовательности начальных, промежуточных и конечных

состояний кучки с точки зрения каждого игрока.

Для того чтобы продемонстрировать ситуации, возникающие в

процессе игры в табл. 12.2 показаны игровые последовательности.

Таблица 12.2. Игровые последовательности для игры в 23 спички

________________________________________________________________

Число спичек, Остающееся Число спичек, Остающееся Комментарии

удаляемое число удаляемое число

пользователем спичек компьютером спичек

Последова- 3 20 3 17

тельность 3 14 1 13

# 1 3 10 1 9

3 6 1 5

1 4 3 1 Компьютер

выигрывает

Последова- 1 22 1 21

тельность 2 19 2 17

# 2 3 14 1 13

2 11 2 9

1 8 3 5

2 3 2 1 Компьютер

выигрывает

________________________________________________________________

Для первой игры эти последовательности следующие:

S = [23,20,17,14,13,10,9,6,5,4,1]

S = [23,17,13,9,5,1] - оставлены пользователю

S = [20,14,10,6,4] - оставлены компьютеру

Для второй игры эти последовательности следующие:

S = [23,22,21,19,17,14,13,9,8,5,3,2,1]

S = [23,21,17,13,9,5,1] - оставлены пользователю

S = [22,19,14,11,8,3] - оставлены компьютеру

Анализ показывает, что некоторые числа в последовательнос-

ти нежелательны, если они оставляются вам. Эти числа:

2,3,4,6,7 и 8. С другой стороны, числа 1, 5 и 9 можно спокойно

оставить противнику.

Заметьте, что в последовательностях, показанных для этих

двух игр, обе последовательности пользователя содержат "опас-

ные" числа. Первая последовательность для компьютера содержит 6

и 4, и оба эти числа "безопасные".

Этот анализ также показывает, что каждый игрок пытается

оставить "опасные" числа противнику. Поэтому целесообразно най-

ти соотношение между удаляемым числом спичек и "опасным" чис-

лом, оставляемым противнику. Энтузиасты и теоретики изучили

этот аспект игры и предложили различные решения.

Упрощенная версия решения приводится ниже. Если M - число

остающихся спичек, то надо удалить C спичек. Величина C

вычисляется по формуле:

C = (R + 3) - 4 * integer((R + 3)/ 4),

где R = M - (4 * integer(M/4)).

Здесь integer подразумевает целую часть значения выраже-

ния в скобках. Например, если M = 8, то C = 3; если M = 6, то C

= 1.

Эти формулы могут быть записаны как правила Турбо-Пролога.

Последовательность их записи следующая:

A_r = M2/4 - 0.45,

real_int(A_r, A_int),

A1_int = M2 - (4 * A_int),

A2_r = (A1_int + 3)/4 - 0.45,

real_int(A2_r, A2_int),

A3_int = (A1_int + 3) - (4 * A2_int),

Эти правила присваивают A3_int целое значение числа спи-

чек, которые должны быть удалены. (Правило real_int необходимо

для преобразования действительного числа в целое.)

Предложенная выигрышная стратегия может быть использована

(в виде правил Турбо-Пролога) для замены простой случайной

стратегии на основе случайного числа, которая использовалась в

предыдущей программе игры в 23 спички. В результате получим

программу интеллектуальной игры в 23 спички.

Листинг 12.3.

Интеллектуальная программа игры в 23 спички выдает число

спичек в кучке. Затем она считывает ввод пользователя для опре-

деления числа удаляемых спичек, модифицирует число спичек в

кучке и выдает их новое число.

Во время хода компьтера программа использует формулу выйг-

рышной стратегии для вычисления числа удаляемых спичек. Затем

программа удаляет это число из кучки и выдает новое их число.

Игра повторяется до тех пор, пока один из игроков не выиг-

рает. Затем объявляется победитель и звучит музыкальный сигнал.

Заметьте, что программа имеет два дополнительных окна в

правой половине экрана. Верхнее окно показывает модифицирован-

ное число спичек после каждого хода. Нижнее окно демонстрирует

победителя.

На рис. 12.4 показан сеанс интеллектуальной игры в 23

спички. Заметьте, что компьютер выиграл.

Рисунок 12.4.

* Упражнения

12.8. Запустите интеллектуальную программу игры в 23 спички.

Выиграли ли вы хотя бы один раз? Использовали ли вы ту же стра-

тегию, что и компьютер, или какую-либо другую?

12.9. Модифицируйте выигрышную стратегию так, чтобы человек

имел вероятность выиграть 40%. (Подсказка: необходимо модифици-

ровать формулу или изобрести собственную стратегию.)

12.10. Запустите модифицированную программу и сыграйте несколь-

ко партий.

12.4. Задача "Обезьяна и бананы"

Задача "Обезьяна и бананы" - это классическая задача ИИ,

демонсрирующая хорошо известные методы вывода при программиро-

вании на Турбо-Прологе. Задача сформулируется следующим обра-

зом:

Обезьяна находится в запертой комнате. В комнате на

полу лежит коробка, а связка бананов свисает с потолка

так, что достать ее обезьяна не может. Решение задачи

- это последователь-

ность действий, которые позволят обезьяне взять бананы.

Последовательность действий обезьяны может быть организо-

вана следующим образом:

Обезьяна подходит к коробке, двигает коробку под бана-

ны.

Обезьяна залезает на коробку и хватает бананы.

12.4.1. Разработка программы.

Программа, решающая задачу "Обезьяна и бананы", должна со-

держать в базе данных некоторые конкретные факты. Ими являются

местоположение обезьяны в комнате, местоположение коробки в

комнате, позиция на полу комнаты, над которой висит связка ба-

нанов и информация о том, что сидит обезьяна на коробке или

нет. Для этой задачи местоположение бананов, коробки и обезьяны

изменяются и может быть представлено переменными Турбо-Проло-

га.. Причем место нахождения обезьяны и коробки может быть лю-

бым. Предварительный анализ приводит к следующим начальным ус-

ловиям:

- бананы над позицией 1 - 10;

- коробка в позиции 1 - 10;

- обезьяна в позиции от 1 - 10;

- обезьяна не на коробке;

- у обезьяны нет бананов.

Эти факты описывают начальное состояние для задачи. Если

обезьяна преуспеет в своей деятельности, то конечное состояние

для задачи будет описываться при помощи следующих фактов:

- бананы в первоначальной позиции;

- коробка в той же позиции, что и бананы;

- обезьяна в той же позиции, что и бананы;

- обезьяна на коробке;

- обезьяна схватила бананы.

Теперь необходимо построить правила трансформации исходно-

го состояния в конечное. Ниже приводятся возможные форматы для

этих правил:

move_to(box,position,position). /* передвинуть */

move_to(monkey,position,position). /* передвинуть */

go_to(position,position,position). /* перейти */

push_box(position,position,position). /* переместить */

/* коробку */

climb_box. /* взобраться на */

/* коробку */

grasp_bananas. /* схватить

/* бананы */

Первое правило move_to предназначено для передвижения ко-

робки в новое положение, а второе правило move_to предназначено

для перемещения обезьяны в новое положение. Правило go_to пред-

назначено для логического перемещения коробки или обезьяны из

одной позиции в другую. Правило push_box предназначено для пе-

ремещения обезьяной коробки из одного положения в другое. Пра-

вило climb_box предназначено для перемещения обезьяны на короб-

ку. Правило grasp_bananas предназначено для хватания бананов.

12.4.2. Программа "Обезьяна и бананы"

Используя базу данных и правила, рассмотренные в предыду-

щем разделе, можно написать программу на Турбо-Прологе, которая

решает задачу об обезьяне и бананах. Блок-схема этой программы

показана на рис.12.5.

Основной модуль на этой блок_схеме - это

solve_the_problem (решить задачу). Этот модуль вызывает подмо-

дули request_positions (запросить позиции) и go_and_get_bananas

(иди и возьми бананы). Первый из них приглашает пользователя

ввести местоположения обезьяны, коробки и бананов. Эти коорди-

наты присваиваются переменным M, Bo и B. Модуль monkey_works

(обезьяна работает) вызывает четыре модуля: move_to(box,B,Bo),

move_to(monkey,Bo,M), climb_box и grasp_bananas. Модуль

move_to(box,B,Bo) вызывает модуль push_box(C,B), который в свою

очередь вызывает модуль move_to(monkey,B,M). Последний модуль

вызывает модуль go_to(M,B) для выполнения премещения обезьяны

из одной позиции в другую. Модуль climb_box выполняет перемеще-

ние обезьяны, а модуль grasp_bananas выполняет "хватание" бана-

нов обезьяной.

Рисунок 12.5.

На листинге 12.4 приведена программа "Обезьяна и бананы",

являщаяся реализацией рассмотренного проекта.

Листинг 12.4.

База данных "Обезьяна и бананы" состоит из следующих ут-

верждений:

monkey_is_off_box.

is_at(bananas,1). is_at(bananas,2).

is_at(bananas,3). is_at(bananas,4).

is_at(bananas,5). is_at(bananas,6).

is_at(bananas,7). is_at(bananas,8).

is_at(bananas,9). is_at(bananas,10).

is_at(box,1). is_at(box,2).

is_at(box,3). is_at(box,4).

is_at(box,5). is_at(box,6).

is_at(box,7). is_at(box,8).

is_at(box,9). is_at(box,10).

is_at(monkey,1). is_at(monkey,2).

is_at(monkey,3). is_at(monkey,4).

is_at(monkey,5). is_at(monkey,6).

is_at(monkey,7). is_at(monkey,8).

is_at(monkey,9). is_at(monkey,10).

Первое утверждение - это простой факт: обезьяна не на ко-

робке. Остальные утверждения отражают допустимое местоположение

бананов, коробки и обезьяны.

Целевой модуль имеет вид:

solve_the_problem :-

make_window(1,7,7,"",0,0,25,80),

make_window(2,7,7," MONKEY AND BANANAS ",

1,10,23,50),

request_position(B,Bo,M),

nl,write(" Monkey is thinking. "),

nl,write(" 'I want those bananas"),

write(" hanging up there !'"), nl,

go_and_get_bananas(B,Bo,M),

write(" Monkey gets the bananas !"), nl,nl,

write(" THREE CHEERS !!!"), nl,nl,

write(" Press the SPACE BAR."),

readchar(_).

Этот модуль выдает информационный текст в окно на экране.

Затем он вызывает два модуля request_position и

go_and_get_bananas. Второй из них выполняет "захват бананов",

вызывая подмодуль monkey_works. Основной модуль выдает некото-

рый заключительный текст.

Правило monkey_works реализовано следующим образом.

monkey_works(B,Bo,M) :-

nl, write(" Monkey looks around and spies the box. "),

move_to(monkey,Bo,M),

nl, write(" Monkey goes from ",M," to ",Bo,"."),nl,

move_to(box,B,Bo),

nl, write(" Monkey pushes the box from ",Bo,

" to ",B,"."),nl,

climb_box,

grasp_bananas.

Основная задача этого модуля разбита на последовательность

более мелких подзадач. Правила move_to и go_to совместно пере-

водят обезьяну из одного положения в другое:

move_to(monkey,B,M) :-

is_at(monkey,B),

is_at(monkey,M),

go_to(M,B),

fail.

move_to(box,B,M),

is_at(box,B),

is_at(box,C),

push_box(C,B).

go_to(B,C) :-

monkey_is_off_box,

retract(is_at(monkey,B)),

assert(is_at(monkey,C)),

nl,write(" Monkey goes ",B," to ",C,".").

Правило move_to проверяет допустимость позиций B и С. Пра-

вило go_to фактически удаляет из базы данных старое положение

обезьяны и добавляет туда ее текущее положение.

Правила move_to и push_box совместно выполняют перемещение

коробки из одного положения в другое:

move_to(box,B,M) :-

is_at(box,B),

is_at(box,C),

push_box(C,B).

push_box(B,C) :-

monkey_is_off_box,

move_to(monkey,B,M),

retract(is_at(monkey,B)),

retract(is_at(box,B)),

assert(is_at(monkey,C)),

assert(is_at(box,C)).

Правило move_to проверяет, допустимость параметров B и C

и передает эти параметры правилу push_box. Правило push_box вы-

зывает правило move_to(monkey,B,M) для того, чтобы включить

обезьяну в процесс передвижения коробки в новое положение. Пра-

вило push_box удаляет из базы данных старые положения обезьяны

и коробки и добавляет туда их новые положения.

Если достигнуто конечное положение обезьяны и коробки, то

правила climb_box и grasp_bananas заставляют обезьяну залезть

на коробку и схватить бананы:

climb_box :-

monkey_is_off_box,

retract(monkey_is_off_box),

write(" Monkey climbs the box."),nl.

grasp_bananas :-

write(" Monkey grasp the bananas."),nl.

Тело правила climb_box удаляет утверждение

monkey_is_off_box, что соответствует тому, что обезьяна залеза-

ет на коробку. Правило grasp_bananas не имеет параметров и ими-

тирует хватание обезьяной бананов.

На рис. 12.6 показан сеанс выполнения программы об обезь-

яне и бананах. Содержимое экрана дает информацию о начальном

положении обезьяны и коробки, а также позицию, над которой ви-

сят бананы. Краткий текст сценария показывает действия обезьяны

и работу правил программы.

Задача "Обезьяна и бананы" решается при помощи специаль-

ной системы представления местоположений предметов в пространс-

тве, т.е. состояние системы (обезьяны, коробки и бананов) пред-

ставляется в терминах положения обезьяны, коробки и бананов.

Для этой задачи состояние определяется пятью параметрами:

состояние(B,Bo,M,C,G),

где B - положение бананов, Bo - положение коробки, M - положе-

ние обезьяны, C определяет находится ли обезьяна на коробке, а

G определяет схватила ли обезьяна бананы (0 - не схватила, 1 -

схватила). Начальное состояние следующее:

состояние(5,10,1,0,0),

а конечное состояние имеет вид:

состояние(5,5,5,1,1).

Рисунок 12.6.

Правила Турбо-Пролога в этой программе - это операторы,

которые действуют над пространством состояний, преобразуя их в

новые. Для данной задачи начальное состояние обрабатывается

этими правилами с тем, чтобы перевести всю систему в конечное

состояние. На рис. 12.7 показана диаграмма состояний для этой

задачи.

Метод, использованный в программе об обезьяне и бананах,

является примером обратного вывода. Программа начинается с цели

и движется назад при помощи подцелей, возникающих во время уни-

фикации. В Прологе левая часть правила (голова правила) являет-

ся целью. Правая часть правила (тело правила с подцелями) ис-

пользуется для сопоставления с данными в базе данных. Если про-

цессы сопоставления оказываются успешными, то левая часть пра-

вила также успешна. По этой причине системы с обратным выводом

называются системами, управляемыми целью. Экспертная система о

собаках, основанная на правилах, с которой вы познакомились в

главе 10, является примером экспертной системы с обратным выво-

дом.

* Упражнения

12.11. Модифицируйте программу "Обезьяна и бананы" так, чтобы

обезьяне потребовалась палка для того, чтобы достать бананы.

12.5. Задача "Воссоединение семьи Смита"

Последняя программа этой главы является одной из простых

дедуктивных задач, для которых игрок поначалу кажется, что от-

вет должен очевиден. Однако вск не иак просто, поскольку имею-

щиеся данные представляют собой множество связанных фактов, ко-

торые должны быть тщательно рассмотрены для получения решения.

Мощные внутренние унификационные подпрограммы Турбо-Пролога яв-

ляются основным средством, используемым в программе "Воссоеди-

нение семьи Смита".

12.5.1. Формулировка задачи

В качестве области применения логического решателя задач

вообразим себе гипотетическое воссоединение семьи. Семья Смитов

собралась впервые за несколько лет. Четыре сестры Смита вышли

замуж. После непростой дискуссии они пришли к выводу, что их

некоторые привычки и интересы могут позволить двум или более

парам неплохо провести отпуск вместе.

Классификация интересов и привычек пар следующая:

1. Диета.

2. Развлечения.

3. Место проведения отпуска.

4. Время подъема утром.

Факты, касающиеся интересов и привычек пар, а также имена

семейных пар хранятся в базе данных. Пользователь должен иден-

тифицировать две пары, которые имеют общие интересы, исходя из

заданной информации.

12.5.2. Разработка алгоритма программы

Для решения этой логической головоломки необходимо создать

базу данных и набор определенных правил. При разработке базы

данных, вы можно ввести блок, в котором перечислены все семей-

ные пары. Для этой цели подходит предикат базы данных, имеющий

вид:

married(string,string).

Объектами такого предиката являются имена четырех сестер

Смита и их мужей. Для описания склонностей каждой пары могут

быть использованы следующие предикаты базы данных:

diet(string, string).

entertainment(string, string).

location(string, string).

rise_time(string, string).

Объектами этих предикатов являются имена мужей и данные,

которые ввявлены во время предыдущего обсуждения. Случай, когда

пара оказывалась безразличной в отношении того или иного вопро-

са, выражается двумя предикатами.

Например, факт "Рон может есть любую пищу" приводит к следующим

двум предикатам:

diet("Ron","vegetarian").

diet("Ron", "non-vegetarian").

Эти предикаты используются при выполнении сопоставления.

Для того чтобы помочь пользователю (игроку), программа со-

держит меню, при помощи которого игрок он может просмотреть па-

ры, их интересы и привычки. Для того чтобы написать правила

просмотра пар и их интересов, необходимо некоторое число обра-

батывающих правил. Например, одно из таких правил может сопос-

тавить пары в соответствии с их вкусами, касающимися еды. Ос-

новная часть тела этого правила должна содержать следующие пре-

дикаты:

process(1) :-

clear_window,

nl, write(" Turbo Prolog has searched "),

nl, write(" the list of dietary preferences"),

nl, write(" and marriage matches."),

nl, write(" This search shows that "),nl,

married(X1,Y1),

diet(X1,Y1),

nl, write(" ",X1," or ",Y1," or both "),

nl, write(" like ",D1," food."),

nl, write(" --Press the SPACE bar to continue."),

nl, readchar(_),

fail.

В этом правиле X1 и Y1 - переменные обозначающие имена

пар, а D1 - это переменная, обозначающая предпочитаемые парой

блюда. Во время сопоставления X1 и Y1 получают значения имени

мужа и жены для каждого предиката married, а D1 получает значе-

ние, соответствующее блюду, которое по вкусу мужу. Предикат

write выдает на экран информацию для игрока. Аналогичные прави-

ла обработки имеются и для других склонностей из приведенного

списка.

Затем необходимо разработать серию правил для сопоставле-

ния пар в соответствии с их общими интересами и привычками. Ис-

пользуя второе меню игрок выбирает категорию, для которой будут

выданы все возможные сопоставления. Правила для сопоставления

пар и их интересов называются обрабатывающими (process) прави-

лами. Эти правила уже написаны. Основное тело такого правила

для двух любых пар и названий предпочитаемых ими блюд содержит

следующие предикаты:

process(1) :-

clearwindow,

nl, write(" Turbo Prolog has searched the list"),

nl, write(" of dietary preferences and found"),

nl, write(" a match. It has also searched the"),

nl, write(" list of married people and put "),

nl, write(" husbands and wifes together."), nl,

nl, write(" The results are: "),

married(X1, Y1),

diet(X1, D1),

married(X2, Y2),

X1 <> X2,

diet(X2,D2),

D1 = D2,

nl, write(" ",X1," and ",Y1,", and ",X2," and ",Y2),

nl, write(" are possible matching couples "),

nl, write(" eating ",D1, " food."),nl,

nl, write(" --Press the SPACE bar to continue."),

nl, readchar(_),

fail.

В этом правиле X1 и Y1 - переменные обозначающие имена

первой пары из базы данных, а X2 и Y2 - переменные обозначающие

имена второй пары из базы данных. Заметьте, что условие X1<>X2

необходимо для того, чтобы пара не была сопоставима сама с со-

бой. Для начала процесса сопоставления, который выполняется

здесь, переменным X1 и Y1 присвоены значения John и Mary, а D1

присвоено значение "vegetarian" (вегетарианец). Переменные X2 и

Y2 имеют значения Sam и Jane, а D2 имеет значение

"non-vegetarian" (невегетарианец). Так как "vegetarian" и

"non-vegetarian" не сопоставимы, то это правило неуспешно.

Турбо-Пролог выполняет возврат по базе данных и означивает

переменные X2 и Y2 значениями следующей пары Ron и Amy, а затем

присваивает D2 значение "vegetarian", соответствующее Ron в

предикате diet базы данных. Так как "vegetarian" сопоставимо с

"vegetarian", то правило успешно, и три строчки с предикатом

write выдают результат сопоставления на экран. Предикат

read_char считывает введенный пользователем символ, а само пра-

вило откатывает весь процесс до тех пор, пока все допустимые

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

имеются и для остальных интересов и привычек из спписка.

После того, как игрок просмотрел все исходные данные и со-

поставимые пары, он может потребовать демонстрацию решения, то

есть сопоставимые пары, чьи интересы совместимы в наибольшей

степени. В этом случае обработка включает множественный поиск

по образцу. Тело правила аналогично правилам рассмотренным вы-

ше, с той лишь разницей, что программа определяет действительно

ли две пары X1 и Y1, и X2 и Y2 такие, что все их интересы сов-

падают. Иными словами

D1 = D2, E1 = E2, L1 = L2 и R1 = R2,

где D обозначает предпочитаемые блюда, E - предпочитаемые развл

ечения, L - предпочитаемые места проведения отпуска, а R - при-

вычное время подъема утром.

Если программа находит сопоставление, то на экран выдаются

имена пар и остальные, характеризующие их данные. Последний

предикат передает управление в первое меню. Игрок выходит из

программы только через него.

12.5.3. Программа "Воссоединение семьи Смита"

Предшествующий анализ приводит к программе, имеющей

структуру, изображенную на рис.12.8.

Главный модуль do_the_job вызывает модуль show_menu_1, ко-

торой в свою очередьдля выдачи исходных данных вызывает модули

начиная process(1), process(2), proces(3) и process(4). Модуль

process(6) выполняет выход из программы. Модуль procees(5) вы-

зывает подмодуль show_menu_2, который в свою очередь вызывает

шесть обрабатывающих модулей для выполнения сопоставления. Ис-

пользуя схему на рис.12.8 можно написать Турбо-Пролог-програм-

му, которая очень хорошо обрабатывает логические соотношения

головоломки. Структура программы достаточно специфична, но ее

идея весьма гибка, и хорошо приспосабливается для широкого

класса логических задач. Полностью программа "Воссоединение

семьи Смита" показана на листинге 12.5.

Рисунок 12.8.

Листинг 12.5.

После запуска программы "Воссоединение семьи Смита" на эк-

ран выдается информационный текст, открывающий игру. Затем

пользователь получает приглашение нажать клавишу пробела, и на

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

основана на меню, так что игрок выбирает данные для просмотра и

сопоставления, которые нужно будет сделать. Вариант завершающей

стадии игры также выбирается при помощи меню, т.е. осуществля-

ется множественный поиск по образцу двух пар с совместимыми ин-

тересами и привычками. Затем игрока приглашают вернуться в пер-

вое меню, в котором уже можно выбрать опцию выхода из програм-

мы.

На примере программы "Воссоединения семьи Смита" хорошо

видны возможности Турбо-Пролога для интеграции графики в виде

совместного использования текста и окон, выбора при помощи меню

и множественного поиска по образцу. Типичный диалог во время

сеанса игры, приведенный на рис.12.9, демонстрирует это.

Рисунок 12.9.

Программа "Воосоединении семьи Смита" демонстрирует инте-

ресную технологию программирования, в результате которой рожда-

ется программа максимально доброжелательная к пользователю.

Программа иллюстрирует собой прямой вывод. Вначале игры сопос-

тавимые пары неизвестны. Однако все факты, впоследствии исполь-

зуемые для анализа и поиска решения вопроса, уже храняться в

базе данных. Левая часть правил, составляющих программу, или

голова, определяет интересующую пользователя комбинацию фактов,

которые должны быть сопоставлены с фактами базы данных. Процесс

сопоставления не должен влиять на них. Однако в результате ра-

боты правила могут возникнуть новые данные, которые могут быть

добавлены к уже существующим. В случае, когда сопоставление

проходит успешно, переменным, указанным в голове правила, прис-

ваиваются конкретные эначения. Эти данные могут образовывать

дополнительную информацию в базе данных. Поэтому системы с пря-

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

В следующем разделе рассматриваются вопросы пользователь-

ского интерфейса программы "Воссоединения семьи Смита" на более

глубоком уровне, так как это интересная часть проекта и процес-

са выполнения программы.

12.5.6. Пользовательский интерфейс

Задача пользовательского интерфейса - создать у пользова-

теля чувство непринужденности. В общем случае интерфейсу поль-

зователя присущи три функции. Первая из них, и наиболее очевид-

ная, - это вывод на экран некоторого текста, вводящего пользо-

вателя в курс дела. При этом у пользователя исчезнет чувство

неуверенности, и возникнет знакомое ему ощущение, появляющиеся

при чтении обячного рассказа. Текст на экране должен начинаться

со слов, подобных, например, "Однажды ...".

Окна создаются при помощи предиката makewindow, а много-

численные строки текста - предикатом write. Для наглядности

часть текста смещается вправо. Этого добиваются введением слева

желаемого числа пробелов в текст, заключенный в кавычки. Кавыч-

ки начинают и завершают строку текста. За текстом, описывающим

историю семтьи, выводится пояснительный текст (см. рис. 12.10).

Дополнительные сведения выдаются пользователю по мере вы-

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

текста как бы вложено в предыдущее. Однако, окна ограничивающие

несколько сопоставимых элементов, таких как привычки и им по-

добные, занимают в точности тоже место. Это показано на

рис.12.11.

На данном примере было продемонстрировано как использовать

средства Турбо-Пролога и объединять графику, текст и команды

программы в одном модуле.

Вторая функция, возлагаемая на интерфейс - это обеспечить

дружественный способ взаимодействия пользователя с базой дан-

ных, являющейся основой любого решения, получаемогос помощью

внутренних унификационных подпрограмм Турбо-Пролога. Разработ-

чик представляет себе, что происходит на самом деле. Но нельзя

считать, что каждый пользователь располагает той же степенью

знаний. Он знает только то, что почерпнул из текста на экране.

Таким образом, еще одна задача пользовательского интерфейса -

это представить информацию, имеющуюся в базе данных, в логичес-

ки очевидной и легко читаемой форме.

Рисунок 12.10.

Рисунок 12.11.

Рисунок 12.12.

Третья наиболее часто возлагаемая на пользовательский ин-

терфейс функция - это обеспечение дружественного способа управ-

ления программой. Это достигается при помощи приглашений, та-

ких, например, как

-- Press the SPACE BAR to continue.

(Нажмите пробел для продолжения)

Эти приглашения позволяют пользователю читать и обдумывать

информацию на экране столько времени, сколько это ему необходи-

мо. В больших программах с помощью приглашения очень удобно пе-

реходить от одного модуля к другому. В данном случае время не

должно быть критичным. Более важной характеристикой программы

здесь является удобство для пользователя. Без сомнения, фраза:

"Когда Вы будете готовы, то нажмите "пробел" и вы увидите

имена пар"

значительно более легко воспринимаема, чем непосредственные ко-

манды программы, такие как

"Сопоставимые пары?"

Выбор меню - это другой часто встречающийся дружественный

пользователю способ управления программой. Этот прием использо-

вался и ранее, но в программе о воссоединении семьи меню обес-

печивают основу интерфейса с пользователем. Эти меню позволяют

читателю не только работать с программой, но и видеть информа-

цию, которая является весьма важной. Два меню в программе "Вос-

соединение семьи Смита" обеспечивают обе названые функции -

просмотр данных (с помощью первого меню) и просмотр сопоставле-

ний ( с помощью второго меню). Оба меню показаны на рис.12.13.

Рисунок 12.13.

Имейте в виду, что вся информация, представленная здесь в

форме игры, может быть полезна в других случаях, где следует

дать возможность пользователю просмотреть данные до принятия

решения. Средства организации меню Турбо-Пролога делают эту

процедуру простой для программирования и эффективной во время

использования.

Модули пользовательского интерфейса хотя и удлинняют прог-

рамму, но зато экономят время время пользователя и оберегают

его от всяких непредвиденных ситуаций. Они придают программе

черты более профессиональной. Во многих програмах пользователь-

ский интерфейс становится критическим для успешной работы прог-

раммы.

* Упражнения

12.12. Модифицируйте программу "Воссоединения семьи Смита" так,

чтобы в процессе сопоставления участвовали новые элементы, нап-

ример, курение. Вам потребуется создать дополнительный набор

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

Незабудьте модифицировать также модуль process(6). (Возможно

при этом может потребоваться изменить модуль process(5)).Можно

упростить эту часть для удобства работы. Не забудьте, что со-

поставление изменится, если данные будут образовывать новые

комбинации.

12.13.Модифицируйте программу "Воссоединения семьи Смита",

увеличив число пар до пяти и можете также уменьшить число пара-

метров для сопоставления (например, исключить место отдыха). Но

вновь сопоставление даст результат, определяемый комбинацией

данных (успешные сопоставления могут не обнаружиться). При же-

лании можете упростить программу, удалив модуль process(5).

12.7.Обзор главы

Цель данной главы дать представление об основных концепци-

ях решения задач в ИИ. Вы узнали как использовать в сложных

программах многие из методов, описанные ранее.

Вы участвовали в разработке и реализации таких игр как

"Отгадай число" и "23 спички" (два варианта - простой и слож-

ный). Во время реализации стало очевидно, что процедурно-ориен-

тированное программирование естественно для них. Программы пот-

ребовали сопоставления символов и разработки стратегий, которые

и были с успехом реализованы на Турбо-Прологе.

Вы также получили представление об основных понятиях и

подходах к решению логических задач. Вы узнали, как были разра-

ботаны и созданы такие, ставшие классическими, программы, как,

например, "Обезьяна и бананы" и "Воссоединении семьи Смита". Вы

увидели при выполнении упражнений насколько гибкими могут быть

такие программы. Благодаря им стала очевидной вся мощь и гиб-

кость Турбо-Пролога.

- 35 -

Названия рисунков главы 12

N Название рисунка

12.1. Сеанс игры с программой об отгадывании числа.

12.2. Структура для программы простой игры "23 спички".

12.3. Сенас игры с простой программой "23 спички".

12.4. Сеанс игры с интеллектуальной программой "23 спички".

12.5. Структурная схема программы "Обезьяна и бананы"

12.6. Сенас игры с программой "Обезьяна и бананы"

12.7. Диаграмма состояний для задачи "Обезьяна и бананы"

12.8. Структурная схема для программы "Воссоединении семьи Сми-

та".

12.9. Диалог с программой "Воссоединение семьи Смита".

12.10. История семьи Смита

12.11. Дополнительная информация показана во вложенном окне.

12.12. Часть информации из базы данных программы "Воссоединение

семьи Смита".

12.13. Различные меню для программы "Воссоединение семьи Смита".

Надписи на рисунках главы 12

N рисунка N надписи и ее текст

12.1. -

12.2. -

12.3. -

12.4. -

12.5. -

12.6. -

12.7. 1) Начальное состояние

2) Конечное состояние

3) (Состояние, соответствующее цели)

12.8. -

12.9. -

12.10. -

- 36 -

12.11. -

12.12. -

12.13. -

- 37 -

Названия таблиц главы 12

N Название таблицы

12.1 В тексте

12.2 В тексте

Надписи к таблицам главы 12

N таблицы N надписи и ее текст

12.1 В тексте

12.2 В тексте

- 38 -

Листинги программ главы 12

Листинг 12.1.

_________________________________________________________

/* Программа: Отгалай число Файл: PROG1201.PRO */

/* Назначение: Демонстрация простого варианта игры в */

/* "Отгадай число" */

/* Указание: Запустите программу. Цель содержится в */

/* программе */

domains

predicates

play_the_game

give_info

play_it

generate_rand(integer)

play_it_sam(integer)

test_and_tell(integer,integer)

say_you_got_it_right(integer)

say_too_big

say_too_small

goal

play_the_game.

clauses

/* цель является правилом */

- 39 -

play_the_game :-

give_info,

play_it.

/* выдача информации пользователю об игре */

give_info :-

makewindow(1,7,7,"",0,0,25,80),

makewindow(2,7,7," A NUMBER Guessing Game",

2,20,22,45),

nl,write(" This is a number guessing game."),

nl,write(" I shall think of an integer number"),

nl,write(" between 1 and 100. You make a guess"),

nl,write(" and type in your guess. If your gues"),

nl,write(" is correct, I shall say so. If not, "),

nl,write(" I shall say your guess is too big or"),

nl,write(" too small."),nl,

nl,write(" When you are ready, press the space bar."),

nl,readchar(_),

clearwidow.

/* выполнение игры */

play_it :-

generate_rand(A),

play_it_sam(A).

/* генерация случайного числа */

generate_rand(X) :-

random(R),

X = 1 + R * 100,

nl,write(" I have thought of a number."),

nl,write(" Now, it is your turn !"),nl.

- 40 -

/* запрос к пользователю */

play_it_sam(X) :-

nl, write(" Type in your guess. "),

nl, readint(G),

test_and_tell(X,G),

play_it_sam(X).

/* проверка и выдача результата */

test_and_tell(X,G) :-

X = G,

say_you_got_it_right(X).

test_and_tell(X,G) :-

X > G,

say_too_big.

test_and_tell(X,G) :-

X < G,

say_too_small.

/* выдача сообщений */

say_too_big :-

nl,write(" Your guess is too big. "),

nl,write(" Try a smaller number. ").

say_too_small :-

nl,write(" Your guess is too small. "),

nl,write(" Try a bigger number. ").

say_you_got_it_right(X) :-

nl,write("You got it right."),

nl,write(" It is",X,"."),

- 41 -

nl,write(" Good bye !"),

nl,write(" Press the space bar."),

nl,readchar(_),

exit.

/* конец программы */

_________________________________________________________

- 42 -

Листинг 12.2.

_________________________________________________________

/* Программа: Простой вариант Файл: PROG1202.PRO */

/* игры в "23 спички" */

/* Назначение: Демонстрация игры "23 спички" */

/* Указание: Запустите программу. Цель содержится в */

/* программе */

domains

predicates

play_the_game

do_windows

play(integer,integer,integer)

play_it_again(integer,integer,integer)

real_int(real, integer)

goal

play_the_game.

clauses

/* цель является правилом */

play_the_game :-

do_windows,

play(23,0,0).

/* правило для образования окон */

do_windows :-

makewindow(1,7,7,"",0,0,25,80),

makewindow(2,7,7," Game of 23 Matches ",

- 43 -

1,5,22,40),

nl,write(" Welcome to the game of 23 Matches."),

M = 23,

H = 0,

C = 0,

nl,write(" There are ",M," matches to begin."),

nl,write(" We will take turns removing matches."),nl,

nl,write(" Each time you may remove 1, 2, or 3"),

nl,write( matches and then I'll do the same."),nl,

nl,write(" The player who has to remove"),

nl,write(" the last match will lose."),

nl,write(" To begin, there are 23 matches."),

nl,write(" The human has removed ",H," match."),

nl,write(" The computer has removed ",C,"

match."),nl.

play(M,H,C) :-

play_it_again(M,H,C).

/* правило для определения победителя */

play_it_again (M,_,_) :-

M <= 0,

nl, write(" You've won !"),nl,

nl, write(" Press the SPACE bar."),

readchar(_),

clerawindow, !,

exit.

play_it_again (M,_,_) :-

M = 1,

nl, write(" I, the computer, won !"),nl,

readchar(_),

clerawindow, !,

exit.

- 44 -

play_it_again(M,_,_) :-

nl,write(" Your turn."),

nl,write(" How many do you want to remove?"),

readint(Hn),

M2 = M2 - Hn,

H2 = Hn,

write(" Now there are ",M2," match(es)."),

nl,nl,write(" My turn."),

nl,write(" I am deciding !"),

random(F),

Rea = 1 + 3 * F,

real_int(Rea,Rint),

M3 = M2 - Rint,

nl,write(" I removed ",Rint,"."),

nl,write(" Now there are is(are) ",M3,"

match(es)."),nl,

M7 = M3,

H7 = H2,

C7 = Rint,

play_it_again(M7,H7,C7).

/* вспомогательное правило */

real_int(Re,In) :- Re = In.

/* конец программы */

__________________________________________________________

- 45 -

Листинг 12.3.

__________________________________________________________

/* Программа: Интеллектуальный Файл: PROG1203.PRO */

/* вариант игры "23 спички" */

/* Назначение: Демонстрация игры в 23 спички */

/* Используется выигрышная стратегия */

/* Указание: Запустите программу. Цель содержится в */

/* программе */

domains

predicates

play_the_game

do_windows

play(integer,integer,integer)

play_it_again(integer,integer,integer)

real_int(real, integer)

goal

play_the_game.

clauses

/* цель является правилом */

play_the_game :-

do_windows,

play(23,0,0).

/* правило для образования окон */

do_windows :-

makewindow(1,7,7,"",0,0,25,80),

- 46 -

makewindow(2,7,7," Game of 23 Matches ",

1,5,22,40),

makewindow(3,7,7," Observer ",1,50,10,20),

cursor(2,2),

write("RESULT UPDATE"),

gotowindow(2),

nl,write(" Welcome to the game of 23 Matches."),

M = 23,

H = 0,

C = 0,

nl,write(" There are ",M," matches to begin."),

nl,write(" The human has removed ",H," match."),

nl,write(" The computer has removed ",C," match."),nl.

/* правило для выполнения игры */

play(M,H,C) :-

play_it_again(M,H,C).

/* правило для выдачи сообщения, что выиг-*/

/* рал человек */

play_it_again (M,_,_) :-

M <= 0,

nl, write(" You the human won !"),nl,

makewindow(4,7,7,"Result ",13,50,10,15),

nl,write(" YOU WON !"),nl,nl,nl,

/* звуковой сигнал для пользователя */

sound(4,392),

sound(4,440),

sound(4,494),

sound(4,440),

sound(4,494),

sound(4,392),

nl, write(" Press the SPACE bar."),

- 47 -

readchar(_),

clerawindow, !,

exit.

/* правило для выдачи сообщения, что выиг-*/

/* рал компьютер */

play_it_again (M,_,_) :-

M = 1,

nl, write(" I, the computer, won !"),nl,

makewindow(5,7,7,"Result ",13,50,10,20),

nl,write(" I WON !"),nl,nl,nl,

/* звуковой сигнал для пользователя */

sound(4,394),

sound(4,440),

sound(4,494),

sound(4,440),

sound(4,494),

sound(12,392),

nl, write(" Press the SPACE bar."),

readchar(_),

clerawindow, !,

exit.

/* основное правило, выполняющее игру */

/* и повторяющееся несколько раз */

play_it_again(M,_,_) :-

nl,write(" Your turn."),

nl,write(" How many do you want to remove?"),

readint(Hn),

M2 = M2 - Hn,

H2 = Hn,

write(" Now there are ",M2," match(es)."),

gotowindow(3),

- 48 -

cursor(4,3),

write(M2, " match(es) "),

gotowindow(2),

nl,nl,write(" My turn."),

nl,write(" I am thinking !"),

A_r = M2/4 - 0.45,

real_int(A_r, A_int),

A1_int = M2 - (4 * A_int),

A2_r = (A1_int + 3)/4 - 0.45,

real_int(A2_r, A2_int),

A3_int = (A1_int + 3) - (4 * A2_int),

M3 = M2 - A3_int,

nl,write(" I removed ",A3_int,"."),nl,

nl,write(" Now there are is(are) ",M3," match(es)."),nl,

gotowindow(3),

cursor(4,3),

write(M3, " match(es) "),

gotowindow(2),

M7 = M3,

H7 = H2,

C7 = A3_int,

play_it_again(M7,H7,C7).

/* правило преобразования дейсвительного */

/* числа в целое */

real_int(Re,In) :- Re = In.

/* конец программы */

__________________________________________________________

- 49 -

Листинг 12.4.

__________________________________________________________

/* Программа: Обезьяна и бананы PROG1204.PRO */

/* Назначение: Демонстрация решения головоломки о */

/* обезьяне и бананах */

domains

database

is_at(symbol, integer)

monkey_is_off_box

predicates

solve_the_problem

request_position(integer,integer,integer)

go_and_get_bananas(integer,integer,integer)

monkey_works(integer,integer,integer)

move_to(symbol,integer,integer)

go_to(integer,integer)

push_box(integer,integer)

climb_box

grasp_bananas

goal

solve_the_problem

clauses

/* база данных */

monkey_is_off_box.

- 50 -

is_at(bananas,1). is_at(bananas,2).

is_at(bananas,3). is_at(bananas,4).

is_at(bananas,5). is_at(bananas,6).

is_at(bananas,7). is_at(bananas,8).

is_at(bananas,9). is_at(bananas,10).

is_at(box,1). is_at(box,2).

is_at(box,3). is_at(box,4).

is_at(box,5). is_at(box,6).

is_at(box,7). is_at(box,8).

is_at(box,9). is_at(box,10).

is_at(monkey,1). is_at(monkey,2).

is_at(monkey,3). is_at(monkey,4).

is_at(monkey,5). is_at(monkey,6).

is_at(monkey,7). is_at(monkey,8).

is_at(monkey,9). is_at(monkey,10).

/* правила достижения бананов */

solve_the_problem :-

make_window(1,7,7,"",0,0,25,80),

make_window(2,7,7," MONKEY AND BANANAS ",

1,10,23,50),

request_position(B,Bo,M),

nl,write(" Monkey is thinking. "),

nl,write(" 'I want those bananas"),

write(" hanging up there !'"), nl,

go_and_get_bananas(B,Bo,M),

write(" Monkey gets the bananas !"), nl,nl,

write(" THREE CHEERS !!!"), nl,nl,

- 51 -

write(" Press the SPACE BAR."),

readchar(_).

request_position(B,Bo,M) :-

nl,nl,

write(" Enter position of the bananas(1-10). "),

readint(B),

write(" Enter position of box(1-10). "),

readint(Bo),

write(" Enter positin of monkey(1-10). "),

readint(M).

go_and_get_bananas(B,Bo,M) :-

is_at(bananas,B),

is_at(box,Bo),

is_at(monkey,M),

monkey_works(B,Bo,M).

monkey_works(B,Bo,M) :-

nl, write(" Monkey looks around and spies the box. "),

move_to(monkey,Bo,M),

nl, write(" Monkey goes from ",M," to ",B,"."),nl,

move_to(box,B,Bo),

nl, write(" Monkey pushes the box from ",Bo,

" to ",B,"."),nl,

climb_box,

grasp_bananans.

move_to(monkey,B,M) :-

is_at(monkey,B),

is_at(monkey,M),

go_to(M,B),

fail.

move_to(box,B,M),

- 52 -

is_at(box,B),

is_at(box,C),

push_box(C,B).

go_to(B,C) :-

monkey_is_off_box,

retract(is_at(monkey,B)),

assert(is_at(monkey,C)),

nl,write(" Monkey goes ",B," to ",C,".").

push_box(B,C) :-

monkey_is_off_box,

move_to(monkey,B,M),

retract(is_at(monkey,B)),

retract(is_at(box,B)),

assert(is_at(monkey,C)),

assert(is_at(box,C)).

climb_box :-

monkey_is_off_box,

retract(monkey_is_off_box),

write(" Monkey climbs the box."),nl.

grasp_bananans :-

write(" Monkey grasp the bananas."),nl.

/* конец программы */

__________________________________________________________

- 53 -

Листинг 12.5.

__________________________________________________________

/* Программа: Воссоединение Файл: PROG1205.PRO */

/* семьи Смита */

/* Назначение: Решение головоломки при помощи */

/* Турбо-Пролога */

/* Указание: Запустите программу. Цель содержится в */

/* программе */

domains

P, Q, R = integer

database

married(string,string)

diet(string,string)

entertainment(string,string)

location(string,string)

rise_time(string,string)

predicates

show_menu1

show_menu2

repeat

process(P)

proces(Q)

do_the_job

conversation

select_pairs(R)

match_rule(string,string)

goal

- 54 -

do_the_job.

clauses

/* база данных */

/* объяления женатых пар */

married("John","Mary").

married("Sam", "Jane").

married("Ron", "Amy").

married("Bill","Alice").

/* информация о диетах */

diet("John","vegetarian").

diet("Sam", "non-vegetarian").

diet("Ron", "vegetarian").

diet("Ron", "non-vegetarian").

diet("Bill","vegetarian").

diet("Bill","non-vegetarian").

/* информация о развлечениях */

entertainment("John","movies").

entertainment("Sam", "movies").

entertainment("Ron", "movies").

entertainment("Ron", "dancing").

entertainment("Bill","dancing").

/* информация о месте проведения */

/* отдыха */

location("John","city").

location("John","country").

- 55 -

location("Sam", "country").

location("Ron", "country").

location("Bill","city").

/* информация о привычках */

rise_time("John","early").

rise_time("Sam", "late").

rise_time("Ron", "early").

rise_time("Bill","late").

/* правило повтора */

repeat.

repeat :- repeat.

/* цель является правилом */

do_the_job :-

makewindow(1,7,7,"The Smith Family Reunion ",0,0,25,80),

nl,write(" The four Smith sisters have all married. Returning to "),

nl,write(" their parents' home for family reunion, the four "),

nl,write(" couples discovered that they have several interests and"),

nl,write(" habits in common. In fact, the girls thought that perhaps"),

nl,write(" two or more of the couples had enough in common that they"),

nl,write(" could spend their summer vacation together. "),nl,

nl,write(" The married couples are: John and Mary; Sam and Jane"),

nl,write(" Ron and Amy; and Bill and Alice."),nl,

nl,write(" If you match the facts and interests each"),

nl,write(" person reveals in casual conversation, you "),

nl,write(" will know the couples that the best suited "),

nl,write(" for a pleasant and rewarding vacation together. "),

nl,write(" Each person speaks for both spouses as married "),

nl,write(" people often do."),

nl,

- 56 -

nl,write(" The random snatches of conversation"),

write(" the data and see the matches "),

nl,write(" the conversation would imply. "),

nl,write(" Finally, the matching couples will be shown."),

nl,write(" --Press the SPACE BAR to continue."),

nl,write(""),

nl,write(""),

readchar(_),

clearwindow,

conversation.

/* правило для демонстрации информацион- */

/* окна */

conversation :-

makewindow(3,7,7," Conversation overhead ",2,4,20,68),

nl,write(" These are the pertinent snatches of conversation "),

nl,write(" that were overheard. "),

nl,

nl,write(" Mary prefers movies as entertainment;"),

write(" she likes to rise erly."),

nl,write(" Sam likes to vacation in the country;"),

write(" he really prefers "),

nl,write(" vegetarian food."),

nl,write(" Ron would be happy with either movies"),

write(" or dancing. He can eat any"),

nl,write(" kind of food."),

nl,write(" Alice is happy eating any kind of food;"),

write(" exploring a new city is"),

nl,write(" her favorite vacation."),

nl,write(" John is not vegetarian and can be"),

write(" happy vacationing in the"),

nl,write(" city or in the country."),

nl,write(" Jane likes movies as entertainment;"),

write(" she is a late riser."),

- 57 -

nl,write(" Amy rises early; she likes vacations"),

write(" in the country."),

nl,write(" Bill likes to go dancing frequently."),

write(" He is late riser."),

nl,

nl,write(" --Press the SPACE BAR to continue. "),

readchar(_),

show_menu_1.

/* правило для демонстрации информаци- */

/* ционного окна */

show_menu1 :-

repeat,

makewindow(4,7,7," Information Window ",2,2,22,38),nl,

write(" Enter one of the numbers shown"),nl,

write(" to view the information below "),nl,nl,

write(" 0. The married Couples. "),nl,

write(" 1. Diet Interests. "),nl,

write(" 2. Entertainment Interests."),nl,

write(" 3. Vacation Location Interests."),nl,

write(" 4. Rising habits. "),nl,

write(" 5. to go to the Matching Menu."),nl,nl,

write(" 6. to exit the program."),nl,nl,

write(" Please enter choice: (0-6) "),

readint(P),

P < 7,

process(P),

P >= 7, !.

/* демонстрация женатых пар */

process(0) :-

clearwindow,

nl,write(" Married Couples "),nl,

- 58 -

married(X1,Y1),

nl,write(" ",X1," is married to ",Y1," ."),

nl,write(" Press the SPACE BAR to continue."),

nl, readchar(_),

fail.

/* демонстрация диетологических привычек */

process(1) :-

clearwindow,

nl,write(" Turbo Prolog has searched "),

nl,write(" the list of dietary preferences"),

nl,write(" and marriage matches."),

nl,write(" This search shows that "),nl,

married(X1,Y1),

diet(X1,D1),

nl,write(" ",X1," or ",Y1," or both "),

nl,write(" like ", D1," food."),

nl,write(" --Press the SPACE BAR to continue."),

nl, readchar(_),

fail.

/* демонстрация предпочтения развлечений */

process(2) :-

clearwindow,

nl,write(" Turbo Prolog has searched the list"),

nl,write(" of entertainment preferences and marriage matches."),nl,

nl,write(" This search shows that "),nl,

married(X1,Y1),

entertainment(X1,E1),

nl,write(" ",X1," or ",Y1," or both "),

nl,write(" ","enjoy",E1," for entertainment."),

nl,write(" --Press the SPACE BAR to continue."),

nl, readchar(_),

- 59 -

fail.

/* демонстрация предпочтений места отдыха */

process(3) :-

clearwindow,

nl,write(" Turbo Prolog has searched the list"),

nl,write(" of vacation location preferences"),

nl,write(" and marriage matches."),nl,

nl,write(" This search shows that "),nl,

married(X1,Y1),

entertainment(X1,E1),

nl,write(" ",X1," or ",Y1," or both like the"),

nl,write(" ",L1," for a vacation location."),

nl,write(" --Press the SPACE BAR to continue."),

nl, readchar(_),

fail.

/* демонстрация предпочтения времени */

/* подъма утром */

process(4) :-

clearwindow,

nl,write(" Turbo Prolog has searched the list"),

nl,write(" of rasing habits and"),

nl,write(" marriage matches."),

nl,write(" This search shows that "),nl,

married(X1,Y1),

rise_time(X1,R1),

nl,write(" ",X1," or ",Y1," or both like the"),

nl,write(" like to rise ",R1,"."),

nl,write(" --Press the SPACE BAR to continue."),

nl, readchar(_),

fail.

- 60 -

process(5) :-

show_menu_2.

process(6) :- exit.

show_menu_2 :-

makewindow(4,7,7," Preference Matching ",2,40,22,38),

nl,write(" Enter one of the numbers below to"),

nl,write(" view all matches for category"),nl,nl,

nl,write(" 1. Diet Matches."),

nl,write(" 2. Entertainment Matches."),

nl,write(" 3. Vacation Location Matches."),

nl,write(" 4. Rising Habit Matches. "),

nl,write(" 5. You Match the Couples. "),

nl,write(" 6. The most compatible couples."),nl,

nl,write(" Please enter choice: (1-6) "),

readint(Q),

Q <= 6,

proces(Q),

Q > 6, !.

/* правило для сопоставления детологичес- */

/* кой информации */

proces(1) :-

clearwindow,

nl,write(" Turbo Prolog has serached the list"),

nl,write(" of dietary preferences and found "),

nl,write(" a match. It has also searched the "),

nl,write(" list of married people and put "),

nl,write(" husbands and wifes together."),nl,

nl,write(" The results are: "),

married(X1,Y1),

diet(X1,D1),

married(X2,D2),

- 61 -

X1<>X2,

diet(X2,D2),

D1 = D2,

nl,write(" ",X1," and ",Y1,", and ",X2," and ,Y2),

nl,write(" are possible matching couples "),

nl,write(" because both couples are happy"),

nl,write(" eating ",D1," food."),nl,

nl,write(" --Press the SPACE BAR to continue."),

nl, readchar(_),

fail.

/* правило для сопоставления информации о */

/* развлечениях */

proces(2) :-

clearwindow,

nl,write(" Turbo Prolog has serached the list"),

nl,write(" of entertainment preferences and"),

nl,write(" found a match. It has also searched"),

nl,write(" the list of married people and put "),

nl,write(" husbands and wifes together."), nl,

married(X1,Y1),

entertainment(X1,E1),

married(X2,D2),

X1<>X2,

entertainment(X2,E2),

E1=E2,

nl,write(" ",X1," and ",Y1,", and ",X2," and ,Y2),

nl,write(" are possible matching couples "),

nl,write(" because both couples are happy"),

nl,write(" with ",E1," for entertainment."),nl,

nl,write(" --Press the SPACE BAR to continue."),

nl, readchar(_),

fail.

- 62 -

/* правило для сопоставления информации о */

/* о месте проведения отдыха */

proces(3) :-

clearwindow,

nl,write(" Turbo Prolog has serached the list"),

nl,write(" of vacation preferences and"),

nl,write(" found a match. It has also searched"),

nl,write(" the list of married people and put "),

nl,write(" husbands and wifes together."),nl,

married(X1,Y1),

location(X1,L1),

married(X2,D2),

X1<>X2,

location(X2,L2),

L1=L2,

nl,write(" ",X1," and ",Y1,", and ",X2," and ,Y2),

nl,write(" are possible matching couples "),

nl,write(" because both couples like to "),

nl,write(" vacation in the ",L1,"."),nl,

nl,write(" --Press the SPACE BAR to continue."),

nl, readchar(_),

fail.

/* правило для сопоставления информации о */

/* времени подъема утром */

proces(4) :-

clearwindow,

nl,write(" Turbo Prolog has serached the list"),

nl,write(" of rise-time preferences and"),

nl,write(" found a match. It has also searched"),

nl,write(" the list of married people and put "),

nl,write(" husbands and wifes together."),nl,

- 63 -

married(X1,Y1),

rise_time(X1,R1),

married(X2,D2),

X1<>X2,

rise_time(X2,R2),

R1=R2,

nl,write(" ",X1," and ",Y1,", and ",X2," and ,Y2),

nl,write(" are possible matching couples "),

nl,write(" because both couples like to "),

nl,write(" rise ",R1,"."),nl,

nl,write(" --Press the SPACE BAR to continue."),

nl, readchar(_),

fail.

/* правило для сопоставления двух пар */

proces(5) :-

clearwindow,

makewindow(14,7,7," You Match Couples ",0,0,25,80),

nl,write(" Now, remember that the aim is to match the couples"),

nl,write(" whose interests are most compatible. You may take as"),

nl,write(" much time as you need. When you ready, enter the"),

nl,write(" number for the couples you think match best."),

nl,write(" 1) John and Mary & Sam and Jane "),

nl,write(" 2) John and Mary & Ron and Amy "),

nl,write(" 3) John and Mary & Bill and Alice "),

nl,write(" 4) Sam and Jane & Ron and Amy "),

nl,write(" 5) Sam and Jane & Bill and Alice "),

nl,write(" 6) Ron and Amy & Bill and Alice "),

nl,write(" Enter the number for couples and press ENTER."),

readint(R),

R < 7,

select_pairs(R),

R >= 7, !.

- 64 -

proces(6) :-

clearwindow,

makewindow(15,7,7," You Match Couples ",0,0,25,80),

married(X1,Y1),

diet(X1,D1),

entertainment(X1,E1),

location(X1,L1),

rise_time(X1,R1),

married(X2,Y2),

X1 <> X2,

diet(X2,D2),

entertainment(X2,E2),

location(X2,L2),

rise_time(X2,R2),

D1 = D2,

E1 = E2,

L1 = L2,

R1 = R2,

nl,nl,

nl, write(" ",X1," and ",Y1,", and "X2),

write(" and ",Y2," would be happy on a"),

nl, write(" vacations because"),

nl, write(" both couples are happy eating "),

write(" ",D1," food,"),

nl, write(" both couples are happy with"),

write(" ",E1," for entertainment,"),

nl, write(" both couples like to"),

write(" vacation in the ",L1,", and"),

nl, write(" both couples like to"),

write(" rise ",R1,"."),

!,

nl,nl, write(" Press the SPACE BAR."),

readchar(_),

- 65 -

clearwindow,

show_menu_1.

select_pairs(1) :-

X1 = "John", X2 = "Sam",

match_rule(X1,X2).

select_pairs(1) :-

nl,write(" Incomplete match results!"),

nl,write(" Press the SPACE BAR."),

readchar(_).

select_pairs(2) :-

X1 = "John", X2 = "Ron",

match_rule(X1,X2).

select_pairs(3) :-

X1 = "John", X2 = "Bill",

match_rule(X1,X2).

select_pairs(3) :-

nl,write(" Incomplete match results!"),

nl,write(" Press the SPACE BAR."),

readchar(_).

select_pairs(4) :-

X1 = "Sam", X2 = "Ron",

match_rule(X1,X2).

select_pairs(4) :-

nl,write(" Incomplete match results!"),

nl,write(" Press the SPACE BAR."),

readchar(_).

select_pairs(5) :-

- 66 -

X1 = "Sam", X2 = "Bill",

match_rule(X1,X2).

select_pairs(5) :-

nl,write(" Incomplete match results!"),

nl,write(" Press the SPACE BAR."),

readchar(_).

select_pairs(6) :-

X1 = "Ron", X2 = "Bill",

match_rule(X1,X2).

select_pairs(6) :-

nl,write(" Incomplete match results!"),

nl,write(" Press the SPACE BAR."),

readchar(_).

match_rule(X1,X2) :-

married(X1,Y1),

diet(X1,D1),

entertainment(X1,E1),

location(X1,L1),

rise_time(X1,R1),

married(X2,Y2),

diet(X2,D2),

entertainment(X2,E2),

location(X2,L2),

rise_time(X2,R2),

D1 = D2,

nl,nl,nl,

nl,write(" ",X1," and ",Y1,", and ",X2),

write(" and ",Y2," would be happy on a"),

nl,write(" vacation to the extent that"),

nl,write(" both couples are happy eating "),

write(" ",D1," food."),

- 67 -

E1 = E2,

nl,write(" Both couples are happy with"),

write(" ",E1," for entertainment."),

L1 = L2,

nl,write(" Both couples like to"),

write(" vacation in the ",L1,"."),

R1 = R2,

nl,write(" Both couples like to"),

write(" rise ",R1,"."),

!,

nl,write(" Press the SPACE BAR."),

readchar(_).

/* конец программы */

__________________________________________________________

Приложение А. Использование редактора Турбо-Пролога

Редактор Турбо-Пролога предоставляет пользователю много-

численные средства, которые делают написание программ более

быстрым и удобным. Даже не считая скорость обращения с клавиа-

турой своим коньком, вы извлечете для себя пользу, научившись

применять наиболее типичные средства редактирования. Эти ос-

новные средства рассматриваются в первой части данного прило-

жения. Дополнительные средства описываются во второй части.

Вполне возможно, вы обнаружите, что знание только нес-

кольких команд редактирования уже дает хорошие результаты.

Когда вы почувствуете, что можете достаточно свободно обра-

щаться с этими командами, выберите еще пару для того,чтобы ис-

пользовать их при программировании.Скоро ваш арсенал средств

редактирования будет в достаточно богат.

А.1. Основные команды редактирования

Тремя наиболее часто употребляемыми операциями редактиро-

вания являются движение курсора к выбранной позиции файла

программы, удаление слова или строки, а также вставка слова

или строки. Научившись делать эти операции, вы достаточно лег-

ко сможете вносить изменения в тексты программ Турбо-Пролога.

А.1.1. Управление курсором

Передвижение курсора к определенной позиции достигается

пролистыванием экранных страниц вверх или вниз и смещением его

по экрану в пределах выбранной страницы. Для постраничного

пролистывания вверх или вниз можно использовать либо клавиши

PgUp(вверх) и PgDn(вниз), либо комбинации клавиш Ctrl-R и

Ctrl-C. (Для ввода комбинации Ctrl-C нужно при нажатой клавише

Ctrl нажать клавишу с буквой С. При написании комбинации кла-

виш обычно указываются большие буквы, однако в сочетании с

Сtrl можно использовать как большие буквы, так и маленькие.)

Для позиционирования курсора в пределах экранной страницы

используются стрелки, помещенные в правой части клавиатуры.

Когда курсор достигает верхней или нижней границы экрана, то

он начинает действовать в режиме скролинга. Для смещения кур-

сора на одну строку вверх или вниз можно также использовать

комбинации Ctrl-E и Ctrl-X.

Комбинации Ctrl-F и Ctrl- сдвигают курсор на одно "сло-

во" вправо, а Ctrl-D - на один интервал вправо. Ctrl-A и

Ctrl- сдвигают курсор на одно слово влево, Ctrl-S - на один

интервал влево.

Комбинация Ctrl-Home возвращает курсор в начало текста на

экране, а при нажатии Ctrl-End курсор попадает в его конец.

Сдвинуть курсор в начало программы (т.е. за первую строку

текста на экране) можно при помощи Ctrl-QR или Ctrl-PgUp. Ана-

логичным способом можно сместить курсор в конец программы, ис-

пользуя либо комбинацию Ctrl-QC, либо комбинацию Ctrl-PgDn.

Начав работать, вы заметите, что строка статуса всегда

показывает текущее положение курсора (номер строки файла и но-

мер колонки, где он находится). Поместить курсор в любую стро-

ку файла программы можно при помощи функциональной клавиши

F2. При ее нажатии запрашивается номер строки. При введении

номера и повторного нажатия F2, курсор попадет в начало строки

с указанным номером. Если строка в настоящий момент на экране

не высвечена,то текст программы сдвинется относительно экрана

так, что указанная строка окажется в центре экрана.

А.1.2. Удаление текста

Для того чтобы удалить слово, нужно подогнать курсор в

его начало, а затем нажать Ctrl-T. Для удаления одного символа

нажимается комбинация Ctrl-G. Каждое нажатие Ctrl-G удаляет

один символ или пробел, находящиеся над курсором. Для удаления

символов можно также использовать клавишу вычеркивания Del,

расположенную в нижнем правом углу цифровой клавиатуры. Клави-

ша Del стирает за один раз один символ, сдвигая при этом кур-

сор влево. Для того чтобы слово "exampled" исправить на "exa-

mple", необходимо поместить курсор справа от d и нажать клави-

шу вычеркивания, что и устранит ошибку.

Удаление строки достигается посредством размещения курсо-

ра в произвольной колонке строки и нажатия любой из двух ком-

бинаций Ctrl-Y или Ctrl-Backspace. Следует иметь в виду, что

нажав по ошибке Ctrl-Y вместо заглавного Y на верхнем регист-

ре, можно тем самым нечаянно удалить из программы целую стро-

ку.

А.1.3. Выбор режима вставки или режима замены

Редактор текстов работает в одном из двух режимов: либо в

режиме вставки, либо в режиме замены. Слова Insert (вставка)

или Owerwrite (замена) в строке статуса информируют, в каком

режиме находится редактор в настоящий момент. Для переключения

режима нужно нажать клавишу Ins на малой цифровой клавиатуре

или же комбинацию Ctrl-V. Рис. А.1 показывает строку статуса

при включенном режиме вставки.

В этом режиме вводимые символы сдвигают уже имеющийся

текст или пробелы вправо. Если же включен режим замены, то

вводимые символы заменяют собой уже имеющиеся.

А.1.4. Автоматическое выравнивание

Характерной особенностью редактора Турбо-Пролога является

обеспечение им автоматического выравнивания строк программы.

То есть, если нажать клавишу Enter, то курсор сдвинется на

следующую строку в колонку, с которой начинался текст предыду-

щей строки. Если же начнать набирать текст с другой позиции,

то в дальнейшем текст программы будет выравниваться именно по

этой новой колонке.

Режим автоматического выравнивания, задаваемый по умолча-

нию, обозначается на экране надписью Indent в строке статуса.

Для отмены этого режима нужно нажать комбинацию клавиш

Ctrl-QI. Надпись Indent при этом исчезнет. Возврат к режиму

автоматического выравнивания осуществляется при помощи той же

комбинации.

При редактировании уже существующей программы, автомати-

ческое выравнивание функционирует только при включенном режиме

вставки. Смена режима вставки на режим замены означает, что

неоходимо изменить текст программы, и поэтому автоматическое

выравнивание становиться ненужным.

А.1.5. Изменение размеров окна редактора

Во время редактирования файла с программой можно расши-

рить окно редактора до полного экрана посредством комбинации

Ctrl-F10. Возврат к начальным габаритам осуществляется повтор-

ным нажатием Ctrl-F10.

А.1.6. Использование подсказки

Для получения полного перечня команд редактора и другой

полезной информации нужно в режиме Edit главного меню нажать

функциональную клавишу F1. За более подробной информацией чи-

татель отсылается к гл. 1.

А.2. Дополнительные команды редактирования

Приведенные ниже команды редактирования принадлежат к од-

ному из двух типов. Команды работы с фрагментами выделяют

фрагмент текста и производят над ним некую операцию. Команды

поиска просто находят текст и заменяют его другим текстом.

А.2.1. Выделение фрагмента текста

При помощи команд работы с фрагментами можно проделать

несколько полезных операций редактирования. Эти команды выде-

ляют кусок текста программы (фрагмент) с целью выполнения од-

ного из трех действий:

1) перемещения фрагмента в другое место программы

2) копирования фрагмента

3) удаления фрагмента

Для того чтобы попрактиковаться в использовании этих ко-

манд, войдите в режим редактирования Edit главного меню. Убе-

дитесь в том, что программа, с которой вы до этого работали,

сохранена на внешнем носителе. Затем, чтобы иметь некий текст,

с которым вы будете работать, напечатайте на экране следующие

строки:

Name:

Address:

City,State,ZIP:

Telephone:

Work Phone:

Теперь посмотрите, как легко пометить этот текст как вы-

деленный фрагмент. Поместите курсор в начало строки, содержа-

щей Name, и нажмите комбинацию Ctrl-KB (для этого необходимо

нажать К при нажатой клавише Ctrl, затем В, причем при нажатии

В уже не важно, остается нажатой Ctrl или нет). Поместите кур-

сор в конец строки с Work Phone и отметьте конец фрагмента на-

жатием комбинации Ctrl-KK. Теперь весь отмеченный Вами фраг-

мент будет выделен на экране. В зависимости от типа используе-

мого Вами монитора выделение будет осуществляться либо при по-

мощи контрастного цвета, либо при помощи повышенной яркости.

Выделенный фрагмент можно скопировать в другое место фай-

ла. Прежде всего нажмите клавишу Enter несколько раз подряд,

чтобы иметь рабочее пространство из нескольких пустых строк (в

противном случае копия фрагмента очутится за пределами окна

редактора). Затем поместите курсор двумя строками ниже выде-

ленного фрагмента и нажмите комбинацию Ctrl-KC - фрагмент це-

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

рите комбинацию для получения по крайней мере еще одного эк-

земпляра текста. Заметьте, что при копировании выделение фраг-

мента перемещается вместе с самим фрагментом. Начальный текст

и его копия показаны на рис. А.2 .

Выделение исчезнет, если нажать комбинацию Ctrl-КН. Дейс-

твие этой команды не зависит от расположения курсора; нет не-

обходимости, чтобы он находился в пределах отмеченного фраг-

мента.

Теперь можно попытаться удалить одну из копий текста.

Подгоните курсор в начало строки Name и отметьте начало фраг-

мента при помощи Ctrl-KB. Поместите курсор в начало строки,

следующей за строкой Work Phone, и отметьте конец фрагмента

при помощи Ctrl-KK. Удалите фрагмент при помощи Ctrl-KY.

Для копирования, перемещения и удаления фрагментов можно

также пользоваться функциональными клавишами, так, как это по-

казано в табл. А.1. Каждая из операций начинается с подведения

курсора в начало фрагмента текста и нажатия соответствующей

функциональной клавиши. Далее необходимо следить за запросами

редактора, появляющимися в середине экрана. Каждый раз будут

запрашиваться начало и конец фрагмента и разрешение выполне-

нить операцию, которое дается повторным нажатием функциональ-

ной клавиши.

______________________________________________________________

Таблица А.1. Список команд работы с фрагментами текста.

______________________________________________________________

Операция: │ Комбинация клавиш: │ Функциональная клавиша:

_____________│____________________│___________________________

копирование │ Ctrl-KC │ F5

перемещение │ Ctrl-KV │ F6

удаление │ Ctrl-KY │ F7

_____________│____________________│___________________________

Комбинация Shift-F5 используется для повторного выполне-

ния команды копирования. Курсор помещается в то место, куда

текст нужно скопировать еще раз, после чего нажимается

Shift-F5.

А.2.2. Использование команд поиска

Команды поиска предназначены для нахождения опеределенно-

го фрагмента текста в файле программы. Они могут быть исполь-

зованы как просто для поиска нужного фрагмента текста, так и

для замены его другим.

Прежде чем воспользоваться этими командами, необходимо

поместить курсор в произвольное место файла выше искомого

фрагмента текста. Самым подходящим таким местом является нача-

ло программы.

Для поиска фрагмента текста без его замены нужно нажать

функциональную клавишу F3. В середине экрана при этом появится

строка подсказки; наберите текст для поиска в пределах этой

строки, а затем повторно нажмите F3 - курсор укажет на первое

вхождение набранного в строке подсказки текста. Если такой

фрагмент отсутствует в файле программы, или же его нет ниже

курсора , то курсор не сдвинется с места. Для повторного поис-

ка того же фрагмента нужно нажать комбинацию Shift-F3.

Посмотреть, как работает эта команда, можно, к примеру,

ищя вхождения слова ZIP в только что введенном тексте. Нажав

Ctrl-PgUp, поместите курсор в начало файла. Затем нажмите F3 и

введите ZIP в строку подсказки. На рис. А.3 показано, как дол-

жен выглядеть экран в данный момент. Снова нажмите F3 для на-

чала поиска. Почти одновременно с нажатием клавиши курсор

сместится к первому вхождению ZIP.

Команда поиск-замена позволяет найти фрагмент текста и

заменить его другим. Например, необходимо заменить Work Phone

на Work Extension в только что введенном тексте. Нажмите сна-

чала F4. Появившаяся подсказка предложит ввести текст для за-

мены. Наберите этот текст и снова нажмите F4. Другая подсказка

теперь запросит текст, на который нужно заменить только что

набранный. Введите Work Extension и нажмите клавишу Enter.

Рис. А.4 показывает экран с подсказкой замены.

Теперь следует указать, какую замену нужно произвести:

локальную или глобальную. Если нажать клавишу G - произвести

глобальные поиск и замену, то будут замещены все вхождения

текста для замены. Если же нажать L - локальный поиск-замена,

то будет замещено только первое его вхождение ниже курсора. В

нашем примере следует выбрать глобальный поиск-замену. Теперь

редактор попросит указать, нужно ли запрашивать разрешение на

замену при каждом обнаружении искомого фрагмента текста; сос-

тояние экрана в этот момент отражено на рис. А.5 . Если отве-

тить на запрос нажатием клавиши Y, то при нахождении каждого

экземпляра текста для замены редактор будет осведомляться,

нужно ли замещать этот экземпляр. В нашем примере на запрос

следует ответить нажатием клавиши N. Как только ответ будет

введен, то редактор Турбо-Пролога заменит все Work Phone на

Work Extension.

Команды поиска и поиска-замены можно задать и при помощи

комбинаций с использованим Ctrl. Точно так же команды повтора

поиска и поиска-замены допускают как использование функцио-

нальных клавиш, то и комбинаций с Ctrl (cм. табл. А.2).

______________________________________________________________

Таблица А.2 .Команды поиска и поиска-замены.

______________________________________________________________

Операция: │ Комбинация клавиш:│ Функциональная клавиша:

__________________│___________________│_______________________

Поиск │ Ctrl-QF │ F3

Поиск и замена │ Ctrl-QA │ F4

Повтор последнего │ Ctrl-L │ Shift-F3

поиска │ │

Повтор последнего │ Ctrl-L │ Shift-F4

поиска и замены │ │

__________________│___________________│_______________________

Зачастую лучше не избегать хлопот с запросами редактором

санкции произвести замену, так как глобальное редактирование

замещает все вхождения указанного текста. Невинная "космети-

ческая" глобальная замена phone на telephone заодно переделала

бы все microphone в microtelephone, если эту операцию произво-

дить без проверки правильности для каждого вхождения текста

замены.

А.2.3. Использование вспомогательного редактора

Вспомогательный редактор Турбо-Пролога вызывается функци-

ональной клавишей F8. После нажатия этой клавиши в середине

экрана появляется окно с запросом имени дополнительного требу-

ющего редактирования файла. После ввода имени файла в нижней

правой части экрана появится окно, в котором можно будет отре-

дактировать этот файл. Такая возможность особенно полезна,

когда нужно внести изменения в файл, вызываемый отлаживаемой

программой.

При работе со вспомогательным редактором можно использо-

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

тельного редактора осуществляется нажатием функциональной кла-

виши F10. Отредактированную версию файла можно записать на

внешний носитель и вновь вернуться к отлаживаемой программе.

А.2.4. Копирование текста из другого файла

В отличии от большинства других редакторов, которые поз-

воляют подклеивать к редактируемому файлу другой лишь целиком,

редактор Турбо-Пролога дает также возможность считать в рабо-

чий файл только часть этого файла. Для того, чтобы воспользо-

ваться этим средством, необходимо поместить курсор в то место,

куда нужно вставить фрагмент из другого файла, а затем нажать

функциональную клавишу F9. После ввода имени файла, из которо-

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

появится содержимое этого файла, как это показано на рис. А.7

.

Теперь, используя обычные команды управления курсором,

нужно поместить курсор в начало копируемого фрагмента и нажать

F9. Затем нужно сдвинуть курсор в конец этого фрагмента и сно-

ва нажать F9. Дополнительное окно при этом исчезнет, а отме-

ченный фрагмент скопируется в рабочий файл.

Приложение В. Дополнительные сведения о Турбо-Прологе

В первой части данного приложения более подробно описыва-

ются системные опции Турбо-Пролога. Во второй части поясняет-

ся, как компилировать и редактировать Турбо-Прологовские прог-

раммы с целью получения автономных файлов, которые можно за-

пускать вне среды Турбо-Пролога. В третьей части рассматрива-

ется использование директивы трассировки trace компилятора,

позоляющей облегчить разработку и отладку программ.

В.1. Системные опции Турбо-Пролога

Вся работа в рамках системы Турбо-Пролог организуется при

помощи различного рода меню. Главное меню, высвечиваемое в

верхней части экрана, имеет семь опций (команд): Run (Запуск

на счет), Compile (Компиляция),Edit (Редактирование), Options

(Опции компилятора), Files (файлы), SetUp (Установка) и Quit

(Выход). Команды основного меню Run, Edit и Quit, а также не-

которые подкоманды команд главного меню Files и SetUp уже были

рассмотрены в первой главе книги. В этой части настоящего при-

ложения описываются остальные команды главного меню.

В.1.1. Команда Сомрile

Выдача команды Compile активизирует процесс компиляции

программы на Турбо-Прологе. Если программа содержит ошибку, то

Турбо-Пролог выдает краткое сообщение об ошибке и помещает

курсор в ту позицию текста программы, где эта ошибка была об-

наружена. После этого можно исправить ошибку и нажать функцио-

нальную клавишу F10 для повторной компиляции программы. Когда

в программе не останется ошибок, ее можно запустить на счет

командой Run.

По умолчанию команда Compile хранит в памяти объектный

код программы, однако по желанию можно задать опцию компиляции

на диск; эта опция обсуждается во второй части приложения.

В.1.2. Команда Edit

При выдаче команды Edit происходит переход в редактор

Турбо-Пролога. В окне редактора при этом появляется курсор,

так что вы можете начать вводить вашу программу или же редак-

тировать ее. Работе редактора Турбо-Пролога было уделено дос-

таточно места в приложении А.

В.1.3. Команда Options

Команда Options используется для установки опций компиля-

тора, каковыми являются Memory, OBJ file и EXE file. Если за-

дана первая из опций приведеного списка (она устанавливается

по умолчанию), то оттранслированная программа будет содержать-

ся в оперативной памяти; задание других позволяет создать либо

объектный файл (опция OBJ file) для дальнейшего совместного

редактирования с другими объектными файлами, либо автономный

файл (опция EXE file). Задействованная в настоящий момент оп-

ция высвечивается в первой строке меню команды, которое появ-

ляется при выборе Options. На рис. В.1 показана картинка дисп-

лея в тот момент, когда активной является опция EXE file (ав-

томатическое редактирование).

В.1.4. Команда Files

При выборе команды Files на экране дисплея появляется

специальное меню, показывающее многочисленные подкоманды ко-

манды Files. Таковыми являются Load (Загрузка), Save (Запись

на диск), Directory (Задание рабочей директории), Print(Пе-

чать), Copy (Копирование), Rename (Переименование), File Name

(Имя файла), Module list (Список модулей), Zap file in editor

(Очистка окна редактора), Erase (Удаление файла из директории)

и Operating system (Временный выход в операционную систему).

Подкоманды Save, Directory и Zap были рассмотрены в гл.1,

остальные будут описаны в этом разделе.

* Подкоманда Сopy

Эта команда позволяет скопировать файл на диске. Если

воспользоваться этой командой, то система попросит ввести име-

на входного и выходного файлов.

* Подкоманда Rename

Подкоманда Rename позоляет переименовать файл на диске.

При задании этой команды Турбо-Пролог запрашивает старое и но-

вое имена файла.

* Подкоманда File Name

Подкоманда File Name используется для присвоения нового

имени находящемуся в памяти рабочему файлу.

* Подкоманда Erase

Данная подкоманда уничтожает выбранный Вами файл из рабо-

чей директории.

* Подкоманда Module List

Эта подкоманда используется для создания файла со списком

модулей программы. Турбо-Пролог позоляет разбить программу на

отдельные модули, которые раздельно компилируются, а затем

скомпоновать законченную программу при помощи редактора свя-

зей. Имена модулей перечисляются в файле, который создается

при помощи подкоманды Module List.

* Подкоманда Operating System

Эта подкоманда временно передает управление DOS. Обычно

подкоманда Operating System используется достаточно редко, так

как наиболее часто употребимые средства работы с файлами дос-

тупны внутри Турбо-Пролога. Для возврата в систему из DOS не-

обходимо выдать команду операционной системы EXIT.

В.1.5 Команда SetUp

Различные опции команды SetUp предназначены для создания

Вашего собственного варианта настройки системы Турбо-Пролог.

Если вы выбрали SetUp, на экране дисплея появится специальное

меню с опциями Colors (Цвет), Window Size (Размеры окна),

Directories (Директории), Miscellaneous setting (Установка па-

раметров), Load configuration (Загрузка конфигурации окон) и

Save Configuration (Сохранение конфигурации окон). Описание

опций приведено ниже.

* Опция Colors

Опция Colors предназначена для изменения цветов переднего

плана и фона. При выборе этой опции появляется меню, при помо-

щи которого выбирается окно, цвета которого вы хотели бы изме-

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

редактора. В этом случае следует выбрать строку Edit появивше-

гося меню и нажать клавишу Enter. Меню исчезнет, а в середине

экрана появится специальное сообщение (см. рис. В.2).

Из него следует, что цвет фона можно изменить при помощи

стрелок и , а цвет переднего плана - стрелками и .Нажа-

тие любой другой клавиши означает завершение этого процесса.

Надпись Attr в правой части строки показывает номер выбранного

цвета. Так, если вы остановили свой выбор на голубом цвете

средней интенсивности в качестве цвета фона, то Attr примет

значение 18. Выход из опции Сolors осуществляется по нажатию

клавиши Esc.

* Опция Window Size

Опция Window Size предназначена для настройки размеров

окон в соответствии с вашими потребностями. Предположим, что

необходимо иметь большое окно редактора и большое окно для ди-

алога с программой. Для изменения размеров окна, например, ок-

на редактора, необходимо проделать следующие действия:

1. Выбрать опцию Window Size.

2. Выбрать строку Еdit во вновь появившемся меню опции. (Ме-

ню после этого сразу же исчезнет, а в середине экрана возник-

нет строка с подсказкой, как это видно из рис. В.3.)

3. Манипулируя стрелками и (изменение горизонтального

размера окна), а также и (изменение вертикального размера

окна), получить окно нужных габаритов. Каждая из стрелок сдви-

гает окно за один раз на одну колонку или одну строку соотвес-

твенно. Для того, чтобы сдвинуться сразу на пять колонок, мож-

но воспользоваться комбинациями Ctrl и Ctrl. Изменение мес-

тоположения окна производится при помощи комбинаций Shift со

стрелками. Нажатие любой другой клавиши прекращает этот про-

цесс. Нажатие Esc возвращает Вас в меню команды SetUp.

* Опция Save Configuration

Опция Save Configuration позволяет сохранить текущее рас-

положение окон для последующего его использования. Выбор дан-

ной опции вызывает появление на экране дисплея строки для вво-

да имени конфигурационного файла. Желательно, чтобы имя явля-

лось достаточно походящим для этой цели, например,

EDWINDO1.SYS. После ввода имени необходимо нажать клавишу

Enter. По умолчанию,если не задать путь доступа, конфигураци-

онный файл запишется в директорию исходных текстов прог-

рамм,так называемую .PRO- директорию . (Если ввести имя

PROLOG.SYS и записать файл в директорию системных файлов Тур-

бо-Пролога, то данная конфигурация в дальнейшем станет загру-

жаться по умолчанию.)

* Опция Load Configuration

Для загрузки новой конфигурации окон с диска необходимо

выбрать в меню опцию Load Configuration, ввести имя конфигура-

ционного файла и нажать клавишу Enter. По умолчанию поиск фай-

ла будет осуществляться в директории файлов с расширением

.PRO. После загрузки файла нужная вам конфигурация окон поя-

вится на экране. Для возврата в главное меню необходимо нажать

на пробел.

* Опция Directories

Опция Directories предназначена для задания имен директо-

рий, к которым Турбо-Пролог будет обращаться по умолчанию. Та-

ковыми являютя .PRO directory (директория исходных текстов

программ, то есть файлов с расширением PRO), .OBJ diretory

(директория объектных файлов с расширением OBJ), .EXE

directory (директория для выполнимых файлов (EXE- фай-

лов)),Turbo directory (системная директория Турбо-Пролога) и

DOS directory (директория команд DOS).

* Опция Miscellaneous Setting

Опция предназначена для настройки расширенного графичес-

кого адаптера IBM EGA и для установки размера стека. По умол-

чанию длина стека равна 4000. Длину можно задавать в интервале

от 600 до 4000. Турбо-Пролог использует стек для реализации

механизмов отката и рекурсии. Желательно устанавливать макси-

мально большой размер, который допускается размером памяти

компьютера. Это снижает вероятность переполнения стека, веду-

щюю к аварийному завершению программу и потере данных.

В.2. Компиляция и редактирование программы на Турбо-Прологе

Исходный текст любой программы на Турбо-Прологе представ-

ляет из себя совокупность символов ASCII. Обычно файлы исход-

ных текстов имеют расширение .PRO. Турбо-Пролог позволяет от-

компилировать исходный текст программы в память и запустить

его на счет в рамках системы. Для создания выполнимых файлов,

которые могут запускаться вне системы Турбо-Пролог, необходимо

откомпилировать и отредактировать исходный текст программы.

Средства Турбо-Пролога позволяют справиться и с этими задача-

ми.

Для создания выполнимого файла Турбо-Пролог создает

файлы с объектным кодом модулей, имеющие расширение .OBJ. Их

можно отредактировать совместно с библиотечными файлами Тур-

бо-Пролога и получить выполнимый файл с расширением .EXE. Если

вы выбрали опцию EXE file в меню команды Options, то программа

будет отредактирована автоматически.

Для создания выполнимых файлов требуется проделать следу-

ющие шаги:

1. Загрузить программу в память.

2. Задать команду Options в главном меню, и опцию .EXE в ме-

ню команды Options.

3. Задать команду Compile в главном меню и нажать клавишу

Enter. Турбо-Пролог начнет компилировать программу. За ходом

компиляции можно следить по сообщениям, появляющимся в инфор-

мационном окне. В случае успешного завершения трансляции сис-

тема создаст .OBJ, .SYM, .MAP и .EXE файлы.

Следует отменить, что редактор связей после завершения

редактирования программы выдает пригашение для запуска прог-

раммы на выполнение. Если вы действительно хотите запустить

программу на счет, необходимо нажать в ответ на приглашение

клавишу Y,и N - в противном случае.

В.3. Трассировка программы

Турбо-Пролог предоставляет пользователю возможность трас-

сировки программы, которая дает отчет о пошаговом выполнении

программы. Для того чтобы задействовать это средство, необхо-

димо включить в программный файл директиву trace, откомпилиро-

вать программу в память и запустить ее на счет. Директива

trace должна помещаться в программе впереди раздела

predicates. Лучше всего поместить ее непосредственно перед

разделом domains.

Включение директивы трассировки приостанавливает выполне-

ние программы после каждой попытки удовлетворения подцели. В

этот момент в окне трассировки печатаются значения переменных

и некоторая другая информация (см. рис. В.4). Для продолжения

выполнения программы необходимо нажать функциональную клавишу

F10. Таким образом можно проследить за выполнением программы

вплоть до ее окончания. Прервать выполнение программы в любой

момент позволяет клавиша Esc.

Если требуется произвести трассировку только некоторых

предикатов программы, то имена этих предикатов необходимо пе-

речислить в параметрах директивы trace.

При трассировке программы, содержащей ошибки, то курсор

редактора укажет на начало предиката или правила, в которых

эта ошибка произошла; одновременно будет выдана трассировка

соотвествующего предиката (предикатов). Таким образом будет

локализовано место возникновения ошибки. Трассирока является

удобным и вместе с тем мощным средством отладки программы, к

услугам которого следует прибегать по возможности чаще.

Комбинация Ctrl-T во время пошагового выполнения програм-

мы позоляет включать и выключать трассировку по желанию.

Директива shorttrace является аналогом директивы trace с

той лишь разницей, что в окно трассировки выдается более крат-

кая информация.

Приложение С. Основные команды и утилиты DOS

Для работы на Турбо-Прологе пользователю необходимо знать

некоторые команды и программы-утилиты операционной системы PC

DOS (или МS-DOS, которая функционально эквивалентна PC DOS).

Этот минимум команд и утилит кратко описывается в настоящей

главе, поясняется их назначение применительно к Турбо-Прологу.

За более подробными инструкциями по использованию команд чита-

тель отсылается к руководству по DOS или другим книгам, специ-

ально посвященным этой операционной системе.

Команды, рассматриваемые в данном приложении, перечислены

в табл. С.1. Некоторые из этих команд имеют как длинную, так и

короткую форму записи: например, команду создания новой дирек-

тории можно задать либо как MD, либо как MKDIR. Обе команды

дают одинаковый эффект. В настоящем приложении все команды ис-

пользуются в короткой форме, так как именно эта форма обычно

предпочитается большинством пользователей DOS.

Замечание: Команды, отмеченные в табл.1 звездочкой, пред-

ставляют собой так называемые внешние команды. Этот термин

означает, что эти команды реализуются в виде отдельных прог-

рамм. К примеру, программа, реализующая команду PRINT, называ-

ется PRINT.COM. Если вы собираетесь использовать эти команды,

то программы для их поддержки должны присутствовать на вашем

диске с DOS.

Команды DOS, имена файлов и тому подобные вещи можно вво-

дить, используя как строчные буквы, так и заглавные. В настоя-

щем приложении все команды будут записываться заглавными бук-

вами только с целью их выделения.

В приложении предполагается, что операционная система DOS

уже поставлена на компьютер, Появление на экране дисплея подс-

казки DOS ( А> при работе с гибким диском и С> при работе с

винчестерским диском ) показывает, что DOS уже загружен, и что

компьютер готов выполнить команды, описанные в данном приложе-

нии. Инструкции по включению компьютера и загрузке DOS были

приведены в гл. 1.

Таблица С.1. Команды DOS

______________________________________________________________

Операция: │ Команда DOS:

____________________________│_________________________________

Форматирование диска │ FORMAT *

Копирование диска │ DISKCOPY *

Выдача каталога директории │ DIR

Создание новой директории │ MD (или MKDIR)

Смена директории │ CD

Удаление директории │ RD (или RMDIR)

Использование масок │ * и ? (в командах СOPY,DIR и DEL)

Копирование файла │ COPY

Удаление файла │ DEL (или ERASE)

Переименование файла │ REN (или RENAME)

Просмотр содержимого файла │ TYPE

Печать содержимого файла │ PRINT *

____________________________│__________________________________

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

систему с двумя гибкими дисками, и что диск с DOS вставлен в

дисковод А:, другой диск - в дисковод В:. (Не забывайте нажать

клавишу Enter после ввода очередной команды DOS). Все перечис-

ленные команды применимы и при работе с компьютером, оснащен-

ным винчестерским диском.

С.1. Команды работы с диском

Команды, описываемые в этой части приложения относятся к

диску в целом. В дополнение к рассматриваемым здесь командам,

FORMAT и DISKCOPY, существует еще одна команда, знакомство с

которой не бесполезно, особенно если вы собираетесь писать

программы, работающие с файлами на диске. Этой командой явля-

ется CHKDSK (для проверки диска). CHKDSK используется для раз-

личных целей, в том числе для восстановления кластеров,поте-

рянных в результате ошибок при записи. Узнать информацию об

этой команде можно из руководства по DOS или из книг по этой

тематике.

С.1.1. Форматирование диска (FORMAT)

Для того чтобы диск стал пригоден для записи на него ка-

кой-либо информации, он должен быть сформатирован. Форматиро-

вание - это подготовка поверхностей диска для записи и считы-

вания данных. Операционная система PC DOS включает в себя

программный файл FORMAT.COM, который используется для формати-

рования дисков.

Для того чтобы сформатировать диск, необходимо вставить

пустой диск в дисковод В: и набрать команду

FORMAT B:

При этом DOS попросит нажать любую клавишу, как только

несформатированный диск будет вставлен в дисковод В:. Нажмите

клавишу; после этого вы,вероятно, будете некоторое время слы-

шать звук, напоминающий жужжание, который будет свидетельство-

вать о разметке диска программой FORMAT. Когда этот процесс

будет завершен, на экран будет выдано сообщение об окончании

форматирования, а также будет напечатана статистика о состоя-

нии сформатированного диска. Затем программа осведомится, не

нужно ли сформатировать еще один диск. Если да, то нажмите Y,

программа проинформирует о последующих действиях.

Диск, предназначенный для первоначальной загрузки компью-

тера, должен обязательно содержать специальные системные фай-

лы. Простейшим путем заставить PC DOS скопировать эти систем-

ные файлы является задание специальной опции в команде FORMAT:

FORMAT B: /S

В остальном все будет выглядеть точно также, как при

простом форматировании. Опция /S помещает копию файлов опера-

ционной системы на вновь сформатированный диск.

С.1.2. Копирование диска (DISKCOPY)

Довольно часто бывает необходимо получить точную копию

гибкого диска. Для этой цели в операционной системе существует

команда DISKCOPY. Для того,чтобы воспользоваться DISKCOPY,

нужно вставить ваш системный гибкий диск в дисковод А: и наб-

рать команду

DISKCOPY A: B:

(Заметьте, что для копирования файлов с гибкого диска на

винчестерский диск команду DISKCOPY использовать нельзя. Вмес-

то этого можно воспользоваться командой COPY. Командой

DISKCOPY, однако, можно пользоваться и на машине с одним дис-

ководом для гибких дисков. При выполнении команды DISKCOPY A:

B: на таком компьютере DOS будет представлять один физический

дисковод как два логических. Поэтому DISKCOPY при копировании

будет просить менять гибкие диски.)

После ввода команды DISKCOPY будет попеременно выдавать с

ледующие подсказки:

Insert SOURCE diskette in drive A:

(Вставьте исходный диск в дисковод А:)

Insert TARGET diskette in drive A:

(Вставьте целевой диск в дисковод А:)

Press any key when ready . . .

(Нажмите любую клавишу, если все готово)

Диск, названный как SOURCE, это диск, откуда будет произ-

водиться копирование. Диск, названный как ТARGET, это диск,

на который будет производиться копирование. Этот диск не обя-

зательно должен быть сформатирован, он будет сформатирован в

процессе копирования. Вся информация, содержащаяся на этом

диске до начала копирования при этом будет затерта.

После того, как вы вставите гибкий диски и нажмете произ-

вольную клавишу, программа DISKCOPY начнет копирование. Когда

оно будет завершено, можно дать новому диску имя, отличное от

имени исходного диска. Названия типа PROGRAMS-Archive и

PROGRAMS-April 1987 помогают вам отличать рабочие диски от ар-

хивных.

С.2. Команды работы с директориями

PC DOS поддерживает иерархически структурированные дирек-

тории, которые также называют древовидными директориями. Все

файлы, вне зависимости от того, являются ли они файлами прог-

рамм на Турбо-Прологе или же системными утилитами, хранятся в

поддиректориях, имена которых должны каким-то образом отражать

назначение хранящихся в них файлов, чтобы можно было легко

добраться до нужного. (Логически организованное хранение фай-

лов особенно важно в системе с винчестерским диском.) Пример

иерархически организованной директории показан на рис. С.1.

Самая верхняя директория на рис. С.1 называется корневой

директорией. Эта директория является главной на диске; она

создается при форматировании диска. На рисунке также показаны

две поддиректории, созданные пользователем. Они имеют имена

TBPROLOG и PASCAL. Директория TBPROLOG в свою очередь имеет

три поддиректории: EXAMPLES, ANSWERS и PROGRAMS.

Следует заметить, что директория PASCAL также имеет под-

директорию PROGRAMS, остальные поддиректории PASCAL на рисунке

не показаны. Наличие двух директорий с одинаковыми именами не

порождает никаких проблем, так как DOS идентифицирует каждую

директорию посредством уникального пути доступа, который будет

пояснен ниже. Если, однако, попытаться создать в директории

TBPROLOG еще одну поддиректорию с именем PROGRAMS, то DOS вы-

даст сообщение о невозможности такого действия:

Unable to create directory.

(Создание директории не представляется возможным)

С.2.1. Использование пути доступа

Если вы прочли материал о командах работы с файлами и ди-

ректориями, изложенный в этом приложении, то можно было заме-

тить, что многие из этих команд используют параметры, содержа-

щие имена одной или нескольких директорий; некоторые параметры

заканчиваются именем файла. Примером может служить команда

ERASE \TBPROLOG\PROGRAMS\TESTFILE.PRO

Параметр \TBPROLOG\PROGRAMS\TESTFILE.PRO называется пу-

тем доступа. Он определяет путь по иерархическому "дереву" ди-

ректорий, ведуший к нужной директории или файлу. Грубо говоря,

предыдущая команда означает следующее: "Удалить файл

TESTFILE.PRO из директории PROGRAMS, которая является подди-

ректорией в директории TBPROLOG, которая является поддиректо-

рией корневой директории." Другой расшифровкой этой же команды

может служить фраза: "Найти в директории TBPROLOG поддиректо-

рию PROGRAMS; в ней найти файл TESTFILE.PRO и удалить его."

Если директория PROGRAMS не содержит файла с именем

TESTFILE.PRO, то операционная система выдаст сообщение об от-

сутствии файла:

File not found.

(Файл не найден)

Если определенный вами путь доступа в действительности не су-

ществует; к примеру, вы набрали PROGRAM вместо PROGRAMS, то

DOS выдаст сообщение о неверном имени пути или файла:

Invalid path or file name.

(Ошибка при задании пути доступа или имени файла)

Отметьте для себя использование обратного слэша (\) в ка-

честве префикса к имени директории. Обратный слэш, иногда

также называемый символом задания пути доступа, имеет в зави-

симости от контекста имеет два значения:

1. Если обратный слэш стоит в начале пути доступа, то это

означает, что путь доступа начинается из корневой директории.

(При отсутствии обратного слэша путь доступа начинается из те-

кущей директории.)

2. В остальных случаях обратный слэш служит разделителем

между именами.

Будем считать в дальнейшем, что текущей директорией явля-

ется корневая. О том, как сменить текущую директорию, можно

будет прочесть в разделе "Смена директории".

В соответствии с интерпретацией DOS использования обрат-

ного слэша в начале пути доступа, команда MD \TBPROLOG означа-

ет создание поддиректории TBPROLOG в корневой директории. (Са-

ма команда MD будет рассмотрена несколько ниже.)

Для того чтобы понять использование второго обратного

слэша, вам нужно создать поддиректорию PROGRAMS в директории

TBPROLOG. Команда, реализующая это действие, выглядит так:

MD \TBPROLOG\PROGRAMS

Второй обратный слэш не только разделяет, но одновременно

и соединяет два элемента пути доступа (TBPROLOG и PROGRAMS).

В действительности использование первого слэша перед име-

нем TBPROLOG не является обязательным. Мы предположили, что

текущей директорией является корневая, и поэтому путь доступа

начинался бы с корневой директории и при отсутствии слэша.

Следовательно, для создания новой директории была бы достаточ-

на и команда MD TBPROLOG\PROGRAMS.

Большинство пользователей, однако, предпочитают ставить

обратный слэш даже тогда, когда без него можно было бы и обой-

тись, с целью избежать ошибок. Предположим, например, что вы

ошибочно считаете корневую директорию текущей, в то время как

на самом деле находитесь в ее какой-либо поддиректории. Пред-

положим также, что вы хотите создать в корневой директории

поддиректорию MISC. Если в этой ситуации ввести команду MD

\MISC, то поддиректория все равно создастся в корневой дирек-

тории, т. е. там, где это и задумывалось.

Другой составной частью пути доступа является индикатор

дисковода, который, если он, конечно, используется, ставится в

начале пути. Если индикатор отсутствует, то считается, что ко-

манда DOS относится к текущему диску. (Более подробно о поня-

тии текущего диска в следующем разделе.) Когда диск А: являет-

ся текущим, то команда MD TBPROLOG создаст директорию на А:

Для создания директории на диске В: необходимо воспользоваться

командой MD B:TBPROLOG (или MD B:\TBPROLOG).

С.2.2. Cmeна текущего диска

После начальной загрузки DOS текущим диском становится

тот, с которого была загружена операционная система. Если вы

используете компьютер с флоппи-дисками, то текущий диск обычно

именуется как А:, при наличии же винчестерского диска как С:.

Имя текущего диска присутствует в приглашении, выдаваемом DOS:

A>

или

С>

Если специально не указать диск, то все команды DOS будут

относиться к текущему диску, например, команда DIR распечатает

каталог текущей директории диска А:. Для выдачи каталога ди-

ректории с диска В: требуется выдать приказ DIR B:.

Для того чтобы сменить текущий диск, нужно просто набрать

букву и двоеточие, обозначающие другой диск, т.е. для задания

диска В: в качестве текущего надо выдать команду

В:

(Пробелы или какие либо другие символы между буквой и

двоеточием недопустимы.)

С.2.3. Просмотр каталога директории

Картинка экрана дисплея, возникающая в результате выпол-

нения этой команды, приведена на рис. С.2. Необходимо отме-

тить, что помимо информации о файлах на экран выдается список

всех поддиректорий текущей директории. (Дерево директорий дис-

ка В: в нашем примере отличается от дерева на рис. С.1. Если

бы оно было таким же, то на рис. С.2 строку Directory of В:

следовало бы заменить строкой Directory of B:\TBPROLOG.).

С.2.4. Создание новой директории (MD или MKDIR)

Для создания новых директорий в DOS существует команда

MKDIR (сокращенно MD), в качестве параметра которой нужно ука-

зать имя создаваемой директории. Например, для заведения ди-

ректории TBPROLOG, необходимо выдать команду

MD \TBPROLOG

Имя директории может состоять максимально из восьми сим-

волов.

Также, как для большинства других команд DOS, при созда-

нии директорий можно использовать путь доступа. Если вы уже

создали на диске директорию TBPROLOG, то поддиректорию

PROGRAMS можно завести, используя приказ

MD TBPROLOG\PROGRAMS

С.2.5. Смена текущей директории (CD или CHDIR)

После начальной загрузки компьютера текущей директорией

становится корневая директория того диска, с которого была

загружена операционная система. Поэтому при задании имени фай-

ла в приказе (в том числе имени командого файла) DOS будет

осуществлять поиск файла именно в этой текущей директории. Во-

обще текущей директорией называется некая "зафиксированная"

компьютером директория. Если вы уже работаете на компьютере

некоторое время, то текущей директорией будет именно та, с ко-

торой вы работаете. Рассмотрим, к примеру, следующую команду:

COPY TESTFILE.PRO FILETEST.PRO

Эта команда будет исполнена при условии, если файл

TESTFILE.PRO присутствует в текущей директории. Если же файл

находится в другой директории, то операция копирования произ-

ведена не будет, а DOS выдаст сообщение об ошибке

File not found.

(Файл не найден:)

В том случае, если исходный и целевой файлы находятся в

разных директориях, можно использовать путь доступа для того,

чтобы избавиться от привязки к текущей директории. Например,

для копирования файла TESTFILE.PRO из директории EXAMPLES в

директорию PROGRAMS с именем FILETEST.PRO необходима команда

COPY \TBPROLOG\EXAMPLES\TESTFILE.PRO

\TBPROLOG\PROGRAMS\FILETEST.PRO

Если, однако, сменить текущую директорию, то запись этого

приказа можно будет несколько сократить, при этом уменьшится

вероятность допустить ошибку при наборе приказа на клавиатуре.

Одним из способов сократить запись являяется настройка на ди-

ректорию PROGRAMS командой

СD \TBPROLOG\PROGRAMS

Теперь все используемые вами команды будут относиться уже

к директории PROGRAMS, если, конечно, в них не указывается

путь доступа. Команда копирования файла в эту директорию может

выглядеть уже так:

COPY \TBPROLOG\EXAMPLES\TESTFILE.PRO FILETEST.PRO

Файл TESTFILE.PRO будет скопирован в директорию PROGRAMS под

именем FILETEST.PRO.

Еще один способ сократить запись приказа - это воспользо-

ваться тем, что обе директории: EXAMPLES и PROGRAMS являются

поддиректориями директории TBPROLOG. Поэтому можно сначала

настроиться на директорию TBPROLOG, а потом выдать команду

COPY EXAMPLES\TESTFILE.PRO PROGRAMS\FILETEST.PRO

Другим назначением команды CD является "путешествие" по

дереву директорий. Так, команда

CD \

делает текущей корневую директорию, а команда

CD ..

позволяет вернуться в "родительскую" директорию, т.е. ту, для

которой текущая является поддиректорией. Так, если компьютер

был настроен на директорию EXAMPLES, то команда CD .. вернет

его в директорию TBPROLOG. Повторное же использование данной

команды сделает текущей директорией корневую.

Команда CD позоляет также смещаться по дереву директорий

вниз. Так для замены директории TBPROLOG директорией EXAMPLES

требуется команда

CD EXAMPLES

Приказ CD можно использовать и для прямого перехода из

одной директории в другую:

CD \TBPROLOG\EXAMPLES

С.2.6. Удаление директории (RD или RMDIR)

Реорганизацию файлов директории иногда нужно завершить

удалением этой директории как таковой. Пусть, например, дирек-

тория ANSWERS содержит поддиректорию DEMO, которая подлежит

уничтожению. Команда, которая проделает это действие, выглядит

так:

RD B:\TBPROLOG\ANSWERS\DEMO

Как можно заметить, путь доступа здесь содержит ссылки на

дисковод и директорию ANSWRERS, содержащую директорию, которую

вы хотите удалить. (Если директория находится на диске, с ко-

торым вы только что работали, то указание дисковода необяза-

тельно.)

Директория не может быть удалена, если в ней еще содер-

жатся какие-либо файлы. Команды удаления файлов будет рассмот-

рены ниже.

С.3. Команды для работы с файлами

Теперь, когда уже известно, что представляют собой дирек-

тории и путь доступа, изучены команды, позволяющие менять ра-

бочие директории, вы достаточно подготовлены для того, чтобы

ознакомиться с командами работы с одиночными файлами или их

группами. Вероятно, вы найдете их наиболее полезными из всех

команд DOS.

С.3.1. Имена файлов

Имя любого файла в DOS состоит из двух частей: собственно

имени и его расширения. Друг от друга эти части отделяются

точкой (.):

<имя файла>.<расширение>

Имя файла может быть произвольной комбинацией от одного

до восьми символов из следующего набора: латинские буквы от А

до Z, цифры от 0 до 9, специальные символы и знаки препинания:

! @ # $ % ^ & ( ) - _ { } ' ~ '

Расширение файла является произвольной комбинацией симво-

лов из того же набора, количеством не более трех.

Следующие имена допускаются DOS:

TEST.PRO TEST.123 123.123

_TEST.&&& -THIS.FIL -THATX.DAT

MYLIFE.TXT 12345678.123 _NEXT.LIN

LOOK3.PXY $$$$$.$$$

Конечно, некоторые из приведенных выше имен весьма неин-

формативны. Имена файлов следует выбирать таким образом, чтобы

они содержали как можно больше информации о содержимом файла и

его функциях. Расширение файла обычно свидетельствует о его

функциональном назначении. Так, например, расширение .DAT

обычно используется, когда файл содержит некие данные, .TXT -

для текстового файла, .DOC - когда в файле хранится некий до-

кумент, .HLP - для файла-подсказки, .EXE - для выполняемых

файлов. Имена файлов часто описывают их содержимое: МЕМО12,

МYLIFE, PROGRAM6.

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

Также как и некоторые другие операционные системы, DOS

позволяет обращаться к файлам при помощи так называемых неоп-

ределенных символов. Если еще раз просмотреть список допусти-

мых в именах файлов символов, то можно увидеть, что в этом

списке нет звездочки (*) и вопросительного знака (?). Эти два

символа зарезервированы для использования в качестве неопреде-

ленных.

Символ * используется для обозначения произвольного числа

символов в именах директорий, файлов, расширений файлов. Сле-

дующие примеры могут проиллюстрировать использование этого

специального символа.

Для обращения ко всем файлам директории, имеющим расшире-

ние PRO, применяется спецификация *.PRO. Так, команда

DIR *.PRO

выдаст список всех текущей файлов директории с этим расширени-

ем. Аналогично, для выдачи списка всех файлов с именем

PRESIDENT и с произвольным расширением требуется команда

DIR PRESIDENT.*

а для просмотра списка файлов, первые четыре символа в имен

которых это TEST, команда

DIR TEST*.PRO

Последний из приведенных выше приказов распечатает на экране

информацию о таких, например, файлах: TEST1.PRO, TESTPRED.PRO

и даже TEST.PRO. (Звездочка замещает собой любое множество

символов, в том числе и пустое.)

Таким образом, если вас интересуют все файлы текущей ди-

ректории, все зависимости от имени и расширения, то можно при-

менить спецификацию *.* . Команда

DEL *.*

к примеру, целиком очистит текущую директорию. В разделе "Уда-

ление файлов" будут перечислены наиболее важные предупреждения

DOS при использовании неопределенных символов в команде DEL

(или команде ERASE, эквиваленте DEL).

Заметим, что символ * всегда замещает собой в именах фай-

лов и их расширениях все символы, начиная с той позиции, где

эта звездочка стоит. Предположим, например, что на диске запи-

саны файлы с именами PGM12OLD.PRO, PGM13OLD.PRO и

PGM14OLD.PRO, а также файлы с именами PGM13NEW.PRO,

PGM14NEW.PRO и PGM15NEW.PRO. Предположим также, что вы хотите

скопировать все файлы "OLD" с диска А: на диск В:, но не хоти-

те копировать файлы "NEW". Команда

COPY A:PROG*OLD.PRO B:

не пригодна для этой цели, так как DOS проигнорирует все сим-

волы, следующие в имени файла за * ,и все файлы, включая как

"OLD", так и "NEW", будут скопированы. Аналогичный эффект дает

команда

COPY A:PROG*.PRO B:

Нужную степень селективности при указании имен файлов, однако,

можно достигнуть, используя другой неопределенный символ -

знак вопроса (?).

Отличие действия символа ? от действия * состоит в том,

что ? замещает собой только один символ имени. Поэтому для ко-

пирования одних только "OLD"-файлов требуется команда

COPY A:PROG??OLD.PRO B:

Cледует отметить, что эта команда не скопировала бы файлы

PROG1.PRO и PROG2.PRO, так как каждый знак вопроса замещает

ровно один символ спецификации.

Неопределенные символы заметно облегчают работу с файла-

ми. Команда DIR является наиболее подходящей для тренировки по

использовании этих символов.

С.3.3. Копирование файлов (COPY)

Копирование файлов является одной из наиболее часто упот-

ребимых операций. Для того чтобы скопировать, например, файл

TESTFILE.PRO, надо сначала вставить в дисковод А: содержащий

этот файл гибкий диск, потом поместить в дисковод В: сформати-

рованный диск для копии и ввести команду

COPY A:TESTFILE.PRO B:

Следует обратить особое внимание на то, что имя файла

здесь идет непосредственно за именем дисковода, пробелы в дан-

ном случае недопустимы.

На естественном языке введенная команда означает приказ

"скопировать файл TESTFILE.PRO с диска из дисковода А: на диск

из дисковода В:". Необязательная опция /V сообщает DOS о необ-

ходимости выполнения проверки идентичности копии.

При использовании приказа COPY в том виде, как это было

сделано в примере, имя нового файла будет совпадать с именем

исходного файла. Если вы хотите, чтобы новый файл-копия имел

имя, отличающееся от имени исходного файла, то приказ COPY

должен иметь следующие параметры

COPY A:TESTFILE.PRO B:NEWFILE.PRO

Cнова, пробелы между именами файла и дисковода недопустимы.

При использовании команды COPY необходимо соблюдать осто-

рожность, так как если на диске, на который копируется файл,

уже существует файл с таким же именем, то этот уже существую-

щий файл будет затерт новым; DOS по этому поводу не выдает ни-

каких предупреждающих сообщений.

Естественно, команда COPY допускает использование путей

доступа. Так для копирования файла TESTFILE.PRO из директории

EXAMPLES в директорию PROGRAMS под именем NEWFILE.PRO необхо-

дима команда

COPY \TBPROLOG\EXAMPLES\TESTFILE.PRO

\TBPROLOG\PROGRAMS\NEWFILE.PRO

Если же необходимо переименовать файл, то создавать копии

при этом не требуется. Команда

COPY \TBPROLOG\EXAMPLES\TESTFILE.PRO

\TBPROLOG\PROGRAMS

которая создаст файл с именем TESTFILE.PRO уже в директории

PROGRAMS.

Вероятно, вы уже отметили для себя, что путь доступа в

приведенных приказах достаточно длинен, поэтому было бы не

лишне до выполнения копирования прибегнуть к помощи команды

смены директории CD.

С.3.4. Удаление файла (DEL или ERASE)

Если потребуется удалить файл с целью освободить место на

диске, или избавиться от ненужной копии программы, то можно

прибегнуть к помощи команды DEL. Для удаления, к примеру, фай-

ла TESTFILE.PRO необходимо вставить содержащий этот файл гиб-

кий диск в дисковод В: и ввести команду

DEL B:TESTFILE.PRO

Когда файл будет удален, DOS снова выдаст свое приглаше-

ние. Команду DEL нужно использовать с осторожностью, так как

если опция команды будет оканчиваться именем директории, то

DOS удалит все файлы этой директории. Так команда

DEL \TBPROLOG\EXAMPLES

удалит все файлы директории EXAMPLES. Чтобы исключить непред-

намеренное уничтожение всей директории, DOS запрашивает подт-

верждение приказа перед тем, как начнет удаление файлов

Are you sure (Y/N)?

(Вы уверены ? Да/Нет)

Если нажать в ответ клавишу N, то команда не выполняется.

DOS, однако, не выдает никаких предупреждающих сообщений,

если в опции приказа использованы неопределенные символы, как

в случае c *.PRO, даже если это и приведет к уничтожению всех

файлов директории. (Такое может случиться, например, если все

файлы директории имеют одно и то же расширение .PRO, а команда

удаления задана в виде DEL *.PRO ). Так что будьте осторожны !

С.3.5. Переименование файла (REN или RENAME)

Иногда может возникнуть необходимость переименовать уже

имеющийся файл; к примеру, изменить имя TESTFILE.PRO на

FILETEST.PRO. Если диск с файлом TESTFILE.PRO вставлен в дис-

ковод В:, то команда переименования имеет следующий вид:

REN B:\TBPROLOG\TESTFILE.PRO FILETEST.PRO

Заметим, что при указании нового имени файла путь досту-

па должен отсутствовать.

С.3.6. Просмотр содержимого текстового файла (TYPE)

Если потребуется просмотреть содержимое текстового файла,

то можно воспользоваться командой TYPE. Предположим, например,

что нужно вывести на экран дисплея содержимое файла

TESTFILE.PRO. Для того, чтобы проделать эту операцию, необхо-

димо вставить нужный гибкий диск в дисковод В: и набрать ко-

манду

TYPE B:TESTFILE.PRO

Oтметим, что команда TYPE непригодна для работы с бинар-

ными файлами, т. е. имеющими расширения .OBJ, .EXE либо .COM.

С.3.7. Печать текстового файла (PRINT)

Довольно часто бывает необходио получить листинг тексто-

вого файла, скажем, чтобы проверить правильность исходного

текста программы на Турбо-Прологе. Для получения распечатки

программы,так называемой твердой копии, необходимо поместить

диск с нужным файлом в дисковод В: и ввести команду

PRINT B:TESTFILE.PRO

Принтер к этому моменту должен находиться уже во

включенном состоянии. При появлении подсказки

Name of list device [PRN:]

(Имя печатающего устройства, по умолчанию PRN:)

слудует нажать клавишу Enter. Так же, как и приказ TYPE, PRINT

можно применять только в отношении текстовых файлов.

Приложение D. Глоссарий терминов

Анализ ключевых слов - метод анализа словесного текста посредс-

твом использования определенных слов в качестве ключей для

выполнения неких заранее определенных действий.

Анонимная переменная - переменная, используемая вместо по-

именнованной переменной в утверждениях в тех случаях, когда

значение переменной не представляет интерес. Обозначается

при помощи подчерка (_).

Атом - имя, число без знака или символ.

База данных (БД) - совокупность утверждений, содержащих данные

(факты). Факты используются посредством правил и предикатов,

оперирующих над базой данных.

База знаний - динамическая база данных; обычно является состав-

ной частью экспертной системы.

Внешняя цель - целевое утверждение, вводимое пользователем во

время работы программы на ТУРБО-ПРОЛОГе.

Внутренняя цель - целевое утверждение, содержащееся в тексте

программы на ТУРБО-ПРОЛОГе.

Возврат - встроенный механизм ПРОЛОГа. После вычисления очеред-

ной подцели ПРОЛОГ осуществляет возврат к предыдущей подцели

и пытается удовлетворить ее иным способом.

Возврат после неудачи - применяемый в ПРОЛОГе метод, использую-

щий предикат fail для перебора всех имеющихся утверждений ба-

зы данных с целью отбора всех удовлетворяющих целевому

утверждению.

Вызов процедуры - начало выполнения действий, связанных с дан-

ным встроенным предикатом.

Диаграмма потоков данных (ДПД) - графическая диаграмма, демонс-

трирующая потоки данных и порядок передачи управления в от-

дельных модулях или во всей программе; средство, используемое

при структурном проектировании программы.

Динамическая база данных - база данных, в которую можно добав-

лять новые факты, корректировать их и удалять. Может распола-

гаться на диске или в оперативной памяти.

Домен - диапазон и тип значений, определенные для базисного ти-

па данных. В ТУРБО-ПРОЛОГе базисными типами являются char,

integer, real, string и symbol.

Запрос - обращение к программе с целью получения содержащейся в

базе дааных информации, формулируемое обычно в виде предложе-

ния или комманды.

Интеллектуальная база данных - база данных, допускающее общение

на более или менее естественном для человеке языка (например,

с естественноязыковым интерфейсом), позволяющая заносить но-

вые данные, модифицировать и уничтожать их.

Интерфейс пользователя - часть программы, отвечающая за диалог

с пользователем; может иметь форму естественно-языковой сис-

темы, как в случае с интеллектуальными базами данных или экс-

пертными системами.

Искусственный интеллект (ИИ) - область науки об ЭВМ, связанная

с проектированием компьютерных систем, имеющих свойства, ас-

социирующиеся с разумным поведением человека.

Контекстно-свободная грамматика - модель конструирования пред-

ложений, в которой смысл предложения распознается

безотносительно контекста, в котором употребляются составляю-

щие его слова.

Лексический анализ - метод анализа текста с использованием лек-

сикона допустимых слов и фраз.

Метод деления списка на голову и хвост - в ПРОЛОГе метод работы

с элементами непустого списка, рассматриваемого как комбина-

ция головы и хвоста списка.

Модуль - совокупность правил и предикатов ТУРБО-ПРОЛОГа для вы-

полнения логически законченного набора операций.

Неозначенная переменная - переменная, которой в данных момент

не присвоено никакого значения.

Нисходящее программирования - метод разработки программ, в рам-

ках которого исходная цель программы разбивается на несколько

меньших подцелей, что приводит к формированию иерархической

структуры модулей.

Общение с ЭВМ на искусственном языке - область искусственного

интеллекта, изучающая возможность диалога с ЭВМ на естествен-

ном языке.

Объект - название отдельного элемента в конструкции ТУРБО-ПРО-

ЛОГа.

Переменная - символическое имя, начинающееся с заглавной буквы

или с подчерка.

Правило - утверждение о связи некого факта с другими фактами. В

ПРОЛОГе правила имеют вид A <- B1,B2 ...,Bn , где A есть за-

головок правила, а компоненты B1,B2, ...,Bn составляют его

тело. В ТУРБО-ПРОЛОГе правило записывют в виде A if B1,B2,

...,Bn.

Предикат - утверждение о наличии связи между объектами посредс-

твом задания имени отношения и доменов его аргументов. Приме-

ром может служить утверждение likes(domain1,domain2), где

likes является именем предиката, а domain1 и domain2 - имена-

ми доменов объектов.

Предикат базы данных - предикат, применяемый с целью описания

заносимых в базу данных фактов.

ПРОЛОГ (Prolog) - язык программирования; аббревитура словосоче-

тания "PROgramming LOGic". Структура языка базируется на ло-

гике предикатов.

Разбор - метод разбиения предложения или командной строки на

составные части.

Рекурсия - свойство структуры или правила, заключающееся в воз-

можности обращения к самой (-му) себе один или более число

раз.

Синтаксический анализ - метод обработки текста путем анализа

синтаксиса предложений; обычно требует синтаксического разбо-

ра предложений.

Сложный домен - домен ТУРБО-ПРОЛОГа, созданный на основе базис-

ных, обычно с использованием функторов.

Структурная схема (СС) - схема, в рамках которой программа

представляется в форме иерархической структуры модулей.

Функтор - имя составного объекта. В ТУРБО-ПРОЛОГе функторы объ-

являются в разделе программы predicates.

Цель - совокупность подцелей, которые пытается удовлетворить

ТУРБО-ПРОЛОГ. Может быть внешней или внутренней.

Экспертная система - компьютерная система, имитирующая построе-

ние экспертных оценок специалистом-человеком в некоторой

узкой области знаний. Должна обладать средствами для опериро-

вания над данными и способностью делать логические выводы из

имеющихся фактов.

Приложение Е. Литература

Clark, K.L. and S.A.Tarnlund. Logic Programming. New York:

Academic Press,Inc.,1982.

Сборник статей, позволяющий получить начальное предс-

тавление о логическом программировании. Особый интерес пред-

ставляют статьи Ковальски, Колмераура, Брунофи, Меллиша и

Кларка.

Clocksin, W.F., and C.S.Mellish. Programming in Prolog. New

York: Springer-Verlag, 1981.

(имеется русский перевод: У.Клоксин, К.Меллиш Программиро-

вание на языке ПРОЛОГ М.:Мир, 1987.)

Реализации ПРОЛОГа, придерживающиеся описанной в книге

Клоксина и Меллиша версии, обычно называют семейством "C & M

ПРОЛОГ". Эта классическая книга знакомит с "обычными" преди-

катами и правилами C & M ПРОЛОГа. В ТУРБО-ПРОЛОГе воплощены

многие из отличительных черт C & M.

Colmerauer, Alain. "Prolog in 10 Figures," in Communications

of ACM, Vol.28, No. 12, December, 1985.

Один из лидеров разработчиков ПРОЛОГа поясняет здесь

работу с языком при помощи рисунков. Статья позволяет по но-

вому взглянуть на процедуру унификации и представляемые в

виде деревьев структуры данных.

Date, C.J. Database: A Primer. Reading, Mass.: Addison-Wesley

Publishing Co., 1983.

В настоящей книге на начальном уровне описаны структура

и организация баз данных. Особое внимание уделено реляцион-

ным базам данных. Книга очень легка для чтения.

Hayes-Roth, F., D.A. Waterman and D.B.Lenat. Building Expert

Systems. Reading, Mass.: Addison-Wesley Publishing Co., 1983.

Классическая работа по экспертным системам; содержит

многочисленные примеры реальных баз данных, а также подроб-

ный разбор методов и техники создания систем на основе пра-

вил.

Hogger, C.J. Introduction to Logic Programming. New York:

Academic Press, Inc., 1984.

В книге дается ориентированное на ПРОЛОГ освещение

принципов логического программирования. Приводятся примеры

логических программ и их исходные тексты на ПРОЛОГе, имеющие

различную степень сложности. Книга одинаково полезна как на-

чинающему программисту, так и специалисту в данной области.

Jackson, Peter. Introduction to Expert Systems. Reading,

Mass.: Addison-Wesley Publishing Co., 1986.

Данная книга может быть использована для начального оз-

накомления с понятиями экспертных систем и искусственного

интеллекта. Описываются структура и организация экспертных

систем. Рассматриваются примеры как классических экспертных

систем, основанных на логических принципах, так и экспертных

систем, базирующихся на аппарате правил.

Kluznick, F. and S.Spakowicz. Prolog for Programmers. New

York: Academic Press, Inc., 1985.

В книге освещены основы работы с правилами ПРОЛОГа с

уклоном в сторону практических приложений. Использована вер-

сия языка Toy-Prolog, написанная на Паскале.

Kowalski, R.A. Logic for Problem Solving. New York: Elsevier

Holland, 1979.

Эта ставшая классической книга содержит подробное и яс-

но изложенное описание принципов логики предикатов. В ней

представлены исчисление предикатов первого порядка, утверж-

дения Хорна и унификационная теорема Робинсона. Книга Ко-

вальски является достаточно полной монографией по логике

предикатов.

Li, Deyi.A Prolog Database System. Letchworth, Hertfordshire,

England: Research Studies Press Ltd., 1984.

В этой работе ПРОЛОГ используется для конструирования

реляционных баз данных, особое внимание уделено написанию

правил для реализации запросов к базе данных. Приложение 2

"Progamming in PROLOG" содержит краткое описание C & M ПРО-

ЛОГа, а наряду с ним большое число примеров различных пра-

вил.

Nilsson, N.J.Problem-Solving Methods in Artificial Intelli-

gence. New York: McGraw-Hill Book Co., 1971.

В книге рассмотрен основанный на принципе резолюции

способ доказательства теорем исчисления предикатов и приме-

нение его к решению логических игр. Автор подробно останав-

ливается на играх и головоломках. В книге не затрагивается

вопрос о приемах программирования; отсутствуют тексты прог-

рамм. Однако программа для классической задачи "Обезьяна и

бананы", представленная в настоящей книге, написана на осно-

ве приведенного там материала.

Pereira, F.C.N., and D.H.D.Warren. "Definite Clause Grammar

for Language Analysis," in Readings in Natural Language Pro-

cessig. Edited by Barbara J. Grosz et al. Los Altos, Calif.:

Morgan Kaufmann Publisher, Inc., 1986.

Написаннае хорошим языком описание КС-грамматик. Под-

робно освещены методы анализа предложений. Работа относится

к числу основополагающих в области естественноязыкового

программирования.

Rubin, Darril. "Turbo Prolog: A Prolog Compiler for the PC

Programmer," in AI EXPERT, Vol.1,No.1 (Primer Issue), 1986.

Обзорная статья по особенностям ТУРБО-ПРОЛОГа, написан-

ная сразу после появления на рынке программного обеспечения

версии 1.0. Адресована как программистам, так и пользовате-

лям. Особое внимание уделено программе Geobase (БД по геогр-

фии США) как иллюстрации некоторых интересных приемов прог-

раммирования и области искусственного интеллекта.

Wah, B., and G.-J. Li, Editors. Computers for Artificial

Intelligence Applications. IEEE Computer Society, The Insti-

tute of Electrical and Electronics Engineers, Inc., 1986.

Сборник классических статей по искусственному интеллек-

ту и его приложениям. Программирование на ПРОЛОГе посвящены

гл.3 "Artificial Intelligence Languages and Programming" и

гл.7.А "Logic Programs".

Winograd, T. "A Procedural Model of Language Understanding,"

in Readings in Natural Language Processing. Edited by Barbara

J. Grosz et al. Los Altos, Calof.: Morgan Kaufmann Publisher,

Inc., 1986.

В этой известной работе исследуется взаимосвязь между

различными типами информации, необходимой для языкового рас-

познавания, причем освещение материала ведется на примере

английского языка. Кроме этого, описан проект программы для

анализа структуры предложений.

Winston, P.A. Artificial Intelligence, 2nd edition. Reading,

Mass.: Addison-Wesley Publishing Co., 1984.

В работе затронуто большое число разработак по искусст-

венному интеллекту. Особый интерес представляет гл.6

"Problem-Solving Paradigms", которая может быть полезной при

создании экспертных систем с применением правил, и гл.9

"Language Understanding for Natural Language Processing".

Приложение F. Встроенные предикаты Турбо-Пролога

Встроенные (стандартные) предикаты Турбо-Пролога явля-

ются той основой, на которой строится язык. В первом разделе

настоящего приложения предикаты сгруппированы в зависимости

от их функций. Во втором разделе они приводятся уже в алфа-

витном порядке; о каждом из них дается такая информация:

предикат(список аргументов) (типы доменов):(возможные спосо-

бы употребления)

Список дополнен кратким словесным описанием того, что

получается в результате вызова каждого из предикатов.

F.1. Функциональные группы предикатов

Системные предикаты:

beep, bios, comline, date, keyword, membyte, memword,

portbyte, ptr_dword, sound, storage, system, time, trace

Языковые предикаты:

bound, exit, fail, findall, free, not

Предикаты для работы с файлами:

closefile, consult, deletefile, dir, disk, eof, existfile,

filemod, filepos, file_str, flush, openappend, openmodify,

openread, readdevice, renamefile, save, writedevice

Предикаты для чтения данных:

readchar, readint, readln, readreal, readterm

Предикаты для записи данных:

nl, write, writedevice, writef

Предикаты для работы с экраном монитора:

attribute, back, clearwindow, cursor, cursorform, display,

dot, edit, editmsg, field_attr, field_str, forward,

gotowindow, graphics, line, makewindow, pencolor, pendown,

penpos, penup, removewindow, scr_attr, scr_char, scroll,

shiftwindow, text, window_attr, window_str

Предикаты базы данных:

asserta, assertz, consult, retract, save

Предикаты для работы со строками:

concat, frontchar, frontstr, fronttoken, isname, str_len

Предикаты преобразования типов:

char_int, str_char, str_unt, str_real, upper_lower

F.2. Алфавитный список предикатов

asserta(<факт>) (dbasedom) : (вх)

заносит факт (утверждение) в начало резидентной БД (домен,

обозначенный как dbasedom автоматически объявляется для

каждого предиката из раздела database)

assertz(<факт>) (dbasedom) : (вх)

заносит факт (утверждение) в конец резидентной БД

attribute(Attr) (integer) : (вх),(вых)

(вх): устанавливает значение атрибута

(вых): присваивает переменной Attr установленное по умол-

чанию значение атрибута

back(Step) (integer) : (вх)

сдвигает экранное перо на несколько позиций назад. Величи-

на сдвига задается значением параметра Step. Если резуль-

тирующая позиция находится за пределами экрана, то данный

предикат неуспешен

beep (вх)

при вызове этого предиката раздается звуковой сигнал

bios(InterruptNo,RegsIn,RegsOut) (integer,regdom,regdom)

(вх,вх,вых)

происходит обращение к подпрограммам системы прерываний.

InterruptNo задает номер прерывания, RegsIn содержит новые

значения регистров, а RegsOut - старые. Тип regdom счита-

ется в Турбо-Прологе предописанным. Его описание выглядит

так:

regdom = (integer, integer, integer, integer,

integer, integer, integer, integer)

Компоненты типа integer соответствуют регистрам микропро-

цессора AX, BX, CX, DX, SI, DI, DS и ES

bound(Variable) (<произвольная переменная>) : (вх)

предикат успешен в случае, если переменная означена

char_int(CharParam,IntParam) (char,integer) : (вх,вых),

(вых,вх), (вх,вх)

(вх,вых) : присваивает переменной IntParam код ASCII зна-

чения IntParam

(вых,вх) : присваивает CharParam символ, код которого ра-

вен значению IntParam

(вх,вх) : предикат успешен, если код символа CharParam

совпадает со значением IntParam

clearwindow

очищает активное в настоящий момент текстовое окно, запол-

няя его цветом фона

closefile(SymbolicFileName) (file) : (вх)

закрывает физический файл, отождествленный с логическим

файлом SymbolicFileName. Предикат успешен даже в том слу-

чае, если этот файл уже был закрыт

comline(Line) (string) : (вых)

позволяет считать управляющие параметры Вашей программы

сoncat(String1,String2,String3) (string, string, string) :

(вх,вх,вых), (вых,вх,вх), (вх,вых,вх), (вх,вх,вх)

(вх,вх,вых) : создает String3 путем склеивания String1 и

String2

(вых,вх,вх) : если значением String2 является часть строки

String3, то String1 означивается оставшейся частью

(вх,вых,вх) : если значением String1 является часть строки

String3, то String2 означивается оставшейся частью

(вх,вх,вх) : предикат успешен, если значение String3 сов-

падает с результатом конкатенации String1 и String2

cursor(DOS_FileName) (string) : (вх)

загружает в память файл БД DOS_FileName (файл должен быть

текстовым)

cursor(Row,Column) (integer,integer) : (вх,вх), (вых,вых)

(вх,вх) : помещает курсор в позицию с координатами (Row,

Column)

(вых,вых): присваивает переменным Row и Column значения

текущих координат курсора

cursorform(Startline,Endline) (integer,integer) : (вх,вх)

определяет высоту и вертикальное положение курсора в пре-

делах отведенной ему области из 14 линий точек (величины

могут лежать в пределах от 1 до 14 )

date(Year,Month,Day) (integer,integer,integer) : (вх,вх,вх),

(вых,вых,вых)

(вх,вх,вх) : устанавливает новое значение текущей даты при

помощи переменных Year (год), Month (месяц), Day (день).

(вых,вых,вых) : считывает текущую дату, которая определя-

ется по показаниям встроенных часов компьютера

deletefile(DOS_FileName) (string) : (вх)

удаляет из текущей директории файл с заданным именем

dir(Pathname,FileSpecString,DOS_FileName)

(string,string,string) : (вх,вх,вых)

активизирует средства Турбо-Пролога для работы с файлами.

Значения ыходных переменных Pathname и FileSpecString оп-

ределяют путь доступа и расширения файлов, имена которых

появятся в окне каталога директории. Имя выбранного поль-

зователем в каталоге файла будет присвоено переменной

DOS_FileName

disk(DOS_Path) (string) : (вх,вых)

вх : определяет новый текущий диск и новый текущий путь

доступа. Предикат успешен, если диск и путь заданы пра-

вильно

вых : присваивает переменной DOS_Path значения заданных по

умолчанию имени диска и пути доступа

display(String) (string) : (вых)

высвечивает значение переменной String в том окне, которое

активно в настоящий момент

dot(Row,Column,Color) (integer,integer,integer) :

(вх,вх,вх), (вх,вх,вых)

(вх,вх,вх) : рисует на экране точку (небольшой пиксель)

цвета Color в позиции с координатами (Row,Column), если

дисплей находится в графическом режиме

(вх,вх,вых) : переменная Color получает номер цвета пиксе-

ля, координаты которого задаются переменными Row и Column

edit(InputString,OutputString) (string,string) : (вх,вых)

активизирует радактор Турбо-Пролога, что дает возможность

отредактировать строку InputString; новая редакция будет

присвоена переменной OutputString

editmsg(InStr,OutStr,LeftHeader,RightHeader,Message,

HelpFileName,Position,Code) (string,string,

string,string,string,string,integer,integer) :

(вх,вых,вх,вх,вх,вх,вх,вых)

вызывает редактор Турбо-Пролога. Позволяет отредактировать

входную строку InStr, исправленный вариант которой будет

содержать переменная OutStr. LeftHeader и RightHeader со-

держат тексты заголовков, Position задает расположение

курсора. HelpFileName указывает имя файла, загружаемого по

нажатию функциональной клавиши F1(Help). Code определяет

клавишу для завершения процесса редактирования (0 - функ-

циональная клавиша F10, 1 - Esc)

eof(SymbolicFileName) (file) : (вх)

предикат успешен, если указатель файла стоит на метке кон-

ца файла SymbolicFileName

existfile(DOS_FileName) (string) : (вх)

предикат успешен, если в текущей директории существует

файл с именем, задаваемым переменной DOS_FileName

exit

прекращает выполнение программы и передает управление сис-

теме Турбо-Пролог, если программа запускалась в среде Тур-

бо-Пролога, или DOS, если запуск производился вне рамок

этой системы

fail

вызывает откат ввиду неуспеха данного предиката

field_attr(Row,Column,Length,Attr) (integer,integer,integer,

integer) : (вх,вх,вх,вх), (вх,вх,вх,вых)

(вх,вх,вх,вх) : создает поле символов длиной Length, име-

еющее атрибут Attr, и начинающееся в позиции с координата-

ми (Row,Column) в пределах активного окна (окно должно со-

ответствовать заданным значениям длины и координат)

(вх,вх,вх,вых) : присваивает Attr значение атрибута поля,

длина которого есть Length, а начальная позиция определя-

ется координатами (Row,Column)

field_str(Row,Column,Length,String) (integer,integer,integer,

string) : (вх,вх,вх,вх), (вх,вх,вх,вых)

записывает в активное окно экрана Length символов из стро-

ки String, начиная с позиции с координатами (Row,Column)

(заданное поле чтения должно находиться в пределах актив-

ного в настоящий момент окна)

filemode(SymbolicFileName,FileMode) (file,integer) : (вх,вх),

(вх,вых)

(вх,вх) : позволяет получить доступ к двоичному файлу.

SymbolicFileName задает имя файла, а FileMode - его тип (0

- текстовой, 1 - двоичный)

(вх,вых) : возвращает значение FileMode для файла

SymbolicFileName

filepos(SymbplicFileName,FilePosition,Mode) (file,integer,

integer) : (вх,вх,вх), (вх,вых,вх)

(вх,вх,вх) : задает в файле SymbolicFileName позицию, из

которой будет считан, или в которую будет записан очеред-

ной символ (Mode=0 указывает на то, что смещение будет от-

считываться от начала файла, Mode=1 - от текущей позиции,

Mode=2 - от конца файла)

(вх,вых,вх) : переменная FilePosition получает значение

смещения текущего положения указателя файла. Смещение

берется относительно начала файла

file_str(DOS_FileName,StringVariable) (string,string) :

(вх,вх), (вх,вых)

(вх,вх) : записывает строку StringVariable в файл

DOS_FileName (максимум 64К)

(вх,вых) : считывает в строку StringVariable символы, со-

держащиеся в файле DOS_FileName (до 64 Кб)

findall(Variable,<предикат>,ListVariable)

записывает значение объекта Variable в список ListVariable.

Variable должен являться одним из аргументов указанного

предиката

flush(SymbolicFileName) (file) : (вх)

вызывает вывод на текущее выводное устройство writedevice

содержимого находящегося в оперативной памяти буфера файла

forward(Step) (integer) : (вх)

в графическом режиме forward сдвигает экранное перо на

Step позиций вперед

free(Variable) (<переменная>) : (вых)

успешен, если переменная Variable не означена

frontchar(String,FrontChar,RestString) (string,char,string) :

(вх,вых,вых), (вх,вх,вых), (вх,вых,вх), (вх,вх,вх),

(вых,вх,вх)

(вх,вых,вых) : присваивает первый символ строки String пе-

ременой FrontChar, а остаток строки - переменной

RestString

Возможны и другие комбинации входных и выходных парамет-

ров; важно лишь то, чтобы либо была означена переменная

String, либо переменные FrontChar и RestString одновремен-

но

frontstr(NumberOfChars,String1,StartStr,String2)

(integer,string,string,string) : (вх,вх,вых,вых)

присваивает первые NumberOfChars символов строки String1

переменной StertStr, а остаток - переменной String2

fronttoken(String,Token,RestString) (string,string,string) :

(вх,вых,вых), (вх,вх,вых), (вх,вых,вх), (вх,вх,вх),

(вых,вх,вх)

(вых,вх,вх) : переменной String присваивается результат

конкатенации Token и RestString. Token может быть либо

группой символов, задающих допустимое в Турбо-Прологе имя,

либо символьным представлением целого или действительного

числа, либо одиночным символом, отличным от пробела.

В любых других комбинациях входных и выходных параметров

должны быть означены по крайней мере два аргумента преди-

ката

gotowindow(WindowNo) (integer) : (вх)

осуществляет очень быстрый переход из одного окна в дру-

гое, если эти два окна не пересекаются. Может также быть

использован для перехода в окно, находящееся позади актив-

ного в настоящий момент окна

graphics(ModeParam,Palette,Background)

(integer,integer,integer) : (вх,вх,вх)

активизирует графические средства Турбо-Пролога и устанав-

ливает номер режима работы (ModeParam), палитры (Palette)

и цвета фона (Background)

isname(StringParam) (string) : (вх)

предикат успешен, если значением аргумента StringParam яв-

ляется допустимое в Турбо-Прологе имя

keypressed(stringParam) (string) : (вх)

успешен, если будет нажата произвольная клавиша

line(Row1,Col1,Row2,Col2,Color)

(integer,integer,integer,integer) : (вх,вх,вх,вх,вх)

в графическом режиме рисует линию между точками с коорди-

натами (Row1,Col1) и (Row2,Col2), номер цвета задается ар-

гументом Color

makewindow(WindowNo,ScrAtt,FrameAttr,Header,Row,Col,Height,

Width)

(integer,integer,integer,string,integer,integer,integer,

integer) : (вх,вх,вх,вх,вх,вх,вх,вх), (вых,вых,вых,вых,вых,

вых,вых.вых)

создает окно, номер которого задается WindowNo. Координаты

окна задаются аргументами Row и Col, высота и ширина -

Height и Width. Окно должно умещаться на экране. Если

FrameAttr отличен от 0, вокруг окна появится бордюр.

Header задает название окна

membyte(Segment,Offset,Byte) (integer,integer,integer) :

(вх,вх,вх), (вх,вх,вых)

(вх,вх,вх) : записывает значение Byte (1 байт) в память по

адресу, задаваемому при помощи Segment и Offset

(вх,вх,вых) : считывает в переменную Byte из памяти байт,

адрес которого задается аргументами Segment и Offset

В обоих случаях адрес вычисляется по формуле

Segment*16+Offset

memword(Segment,Offset,Word) (integer,integer,integer) :

(вх,вх,вх), (вх,вх,вых)

(вх,вх,вх) : записывает значение Word (1 слово) в память

по адресу, задаваемому при помощи Segment и Offset

(вх,вх,вых) : считывает в переменную Word из памяти слово,

адрес которого задается аргументами Segment и Offset

В обоих случаях адрес вычисляется по формуле

Segment*16+Offset

nl

посылает на текущее устройство writedevice комбинацию

спецсимволов возврат каретки и перевод строки

not(<утверждение>)

успешен, если <утверждение> представляет собой цель, ока-

завшуюся при доказательстве неуспешной

openappend(SymbolicFileName,DOS_FileName) (file,string) :

(вх,вх)

открывает для дозаписи файл DOS_FileName и отождествляет

его с логическим файлом SymbolicFileName

openmodify(SymbolicFileName,DOS_FileName) (file,string) :

(вх,вх)

открывает для чтения и записи файл DOS_FileName и отождес-

твляет его с логическим файлом SymbolicFileName

openread(SymbolicFileName,DOS_FileName) (file,string) :

(вх,вх)

открывает для чтения файл DOS_FileName и отождествляет его

с логическим файлом SymbolicFileName

openwrite(SymbolicFileName,DOS_FileName) (file,string) :

(вх,вх)

открывает для записи файл DOS_FileName и отождествляет его

с логическим файлом SymbolicFileName

pencolor(Color) (integer) : (вх)

задает цвет, в который будет окрашено графическое эранное

перо. Применим только в графическом режиме

pendown

после выполнения этого предиката становится возможным ри-

сование линий при помощи предикатов forward и back

penpos(Row,Column,Direction) (integer,integer,integer) :

(вх,вх,вх), (вых,вых,вых)

(вх,вх,вх) : помещает графическое перо в позицию с коорди-

натами (Row,Column) и ориентирует его в направлении, зада-

ваемом аргументом Direction

(вых,вых,вых) : присваивает переменным координаты текущей

позиции пера и номер его направления

penup

прекращает рисование, то есть выполняет действие, обратное

действию предиката pendown

portbyte(PortNo,Value) (integer,integer) : (вх,вх), (вх,вых)

(вх,вх) : значение Value посылается в порт ввода-вывода

номер PortNo

(вх,вых) : присваивает Value десятичный эквивалент значе-

ния байта из порта ввода-вывода номер PortNo

ptr_dword(StringVar,Segment,Offset) (string,integer,integer)

: (вх,вых,вых), (вых,вх,вх)

(вх,вых,вых) : выдает номер сегмента (Segment) и смещение

(Offset) означенной переменной StringVar

(вых,вых,вх) : присваивает переменной StringVar строку

символов, располагающуюся по адресу, задаваемому аргумен-

тами Segment и Offset. Адрес вычисляется по формуле

Segment*16+Offset. Конец строки определяется пустым (null)

битом

readchar(CharVariable) (char) : (вых)

считывает символ с текущего устройства чтения readdevice

readdevice(SymbolicFileName) (symbol) : (вх), (вых)

(вх) : назначает для чтения файл с логическим именем

SymbolicFileName

(вых): переменная SymbolicFileName означивается логическим

именем текущего устройства чтения

readint(IntVariable) (integer) : (вых)

считывает с текущего устройства чтения readdevice целое

число

readln(StringVariable) (string) : (вых)

считывает с текущего устройства чтения readdevice символь-

ную строку

readreal(RealVariable) (real) : (вых)

считывает с текущего устройства чтения readdevice действи-

тельное число

readterm(Domain,Term) (<имя домена>,<переменная>) : (вх,вых)

позволяет считать из открытого файла любой объект, запи-

санный туда при помощи предиката write. Объект присваива-

ется переменной Term, коль скоро он соответствут описанию

домена этой переменной

removewindow

удаляет текущее окно

renamefile(OldDOS_FileName,NewDOS_FileName) (string,string)

: (вх,вх)

переименовывает файл с именем OldDOS_FileName, новое имя

задается переменной NewDOS_FileName

save(DOS_FileName) (string) : (вх)

сохраняет утверждение динамической базы данных в текстовом

файле DOS_FileName

scr_attr(Row,Col,Attr) (integer,integer,integer) :

(вх,вх,вх), (вх,вх,вых)

(вх,вх,вх) : определяет значение аттрибута позиции экрана

с координатами (Row,Col)

(вх,вх,вых) : присваивает переменной Attr значение атрибу-

та позиции экрана с координатами (Row,Col)

scr_char(Row,Column,Char) (integer,integer,char) :

(вх,вх,вх), (вх,вх,вых)

(вх,вх,вх) : записывает символ Char в позицию экрана с ко-

ординатами (Row,Column)

(вх,вх,вых) : означивает переменную Char символом из пози-

ции экрана с координами (Row,Column)

scroll(NoOfRows,NoOfCols) (integer,integer) : (вх,вх)

смещает активное окно вверх или вниз на количество строк,

задаваемое параметром NoOfRows, влево или вправо на коли-

чество колонок, задаваемое параметром NoOfCols. Смещение

вверх и влево соответствует отрицательным числам, вниз и

вправо - положительным

shiftwindow(WindowNo) (integer) : (вх,вых)

(вх) : активизирует окно с номером WindowNo, а также сох-

раняет содержимое окна, активного в момент вызова предика-

та

(вых) : присваивает переменной WindowNo номер активного в

настоящий момент окна

sound(Duration,Frequency) (integer,integer) : (вх,вх)

вызывает звучание ноты частоты Frequency и длительности

Duration (длительность задается в сотых долях секунды)

storage(StackSize,HeapSize,TrailSize) (real,real,real) :

(вых,вых,вых)

выдает доступный объем (в Кб) трех динамических областей

памяти

str_char(StringParam,CharParam) (string,char) : (вх,вых),

(вых,вх), (вх,вх)

(вх,вых) : присваивает CharParam символ, заданный при по-

мощи StringParam

(вых,вх) : присваивает StringParam символ, заданный при

помощи CharParam

(вх,вх) : успешен, если StringParam и CharParam представ-

ляют один и тот же символ

str_int(StringParam,IntParam) (string,integer) : (вх,вых),

(вых,вх), (вх,вх)

(вх,вых) : присваивает IntParam двоичный эквивалент деся-

тичного символьного представления целого числа StringParam

(вых,вх) : присваивает StringParam строку, являющуюся де-

сятичным символьным представлением целого числа IntParam

(вх,вх) : успешен, если StringParam и IntParam представля-

ют одно и то же число

str_len(String,Length) (string,integer) : (вх,вх), (вх,вых)

(вх,вх) : успешен, если в строке String содержится Length

символов

(вх,вых) : присваивает переменной Length количество симво-

лов, содержащихся в строке String

str_real(StringParam,RealParam) (string,real) : (вх,вых),

(вых,вх), (вх,вх)

(вх,вых) : присваивает RealParam двоичный эквивалент деся-

тичного символьного представления действительного числа

StringParam

(вых,вх) : присваивает StringParam строку, являющуюся де-

сятичным символьным представлением действительного числа

RealParam

(вх,вх) : успешен, если StringParam и RealParam представ-

ляют одно и то же число

system(DOS_CommandString) (string) : (вх)

позволяет исполнить команду операционной системы, предс-

тавленную в виде символной строки

text

возвращает экран в алфавитно-цифровой режим

time(Hours,Minutes,Seconds,Hundreds) (integer,integer,

integer,integer) : (вх,вх,вх,вх), (вых,вых,вых,вых)

(вх,вх,вх,вх) : устанавливает системные часы: Hours - ча-

сы, Minutes - минуты, Seconds - секунды, Hundreds - сотые

доли секунды

(вых,вых,вых,вых) : присваивает переменным показания сис-

темных часов

trace(Status) (symbol) : (вх,вых)

вх : внесение предиката trace(on) в самое начало программы

задает пошаговое ее выполнение - трассировку. Выключение

трассировки осуществляется при помощи trace(off). Анало-

гичные функции имеет и предикат shorttrace, с той лишь

разницей, что несколько меньшим становится количество ин-

формации, выдаваемой в окно трассировки (Trace Window).

(вых) : присваивает переменной Status значение on или off,

в зависимости от режима выполнения программы

upper_lower(StringInUpperCase,StringInLowerCase)

(string,string) : (вх,вых), (вых,вх), (вх,вх)

(вх,вых) : присваивает переменной StringInLowerCase экви-

валент строки StringInUpperCase, в котором все большие

буквы заменены на маленькие

(вых,вх) : присваивает переменной StringInUpperCase экви-

валент строки StringInLowerCase, в котором все маленькие

буквы заменены на большие

(вх,вх) : успешен, если переменные StringInLowerCase и

StringInUpperCase представляют соответственно нижнерегист-

ровую и верхнерегистровую версии одной и той же строки

window_attr(Attr) (integer) : (вх)

приводит в соответствие со значением Attr атрибут активно-

го окна

window_str(ScreenString) (string) : (вх), (вых)

(вх) : высвечивает в активном окне экрана значение пере-

менной ScreenString

(вых) : присваивает переменной ScreenString строку, высве-

ченную в активном окне

write(e1,e2,e3, ... ,eN) ((вх)*)

осуществляет вывод на текущее устройство writedevice конс-

тант или значений. Число аргументов произвольно; это могут

быть либо константы, либо переменные, значения которых от-

носятся к одному из стандартных доменных типов

writedevice(SymbolicFileName) (symbol) : (вх), (вых)

(вх) : если файл с логическим именем SymbolicFileName отк-

рыт, то данный предикат переназначает на него устройство

вывода writedevice

(вых) : присваивает переменной SymbolicFileName логическое

имя writedevice

writef(FormatString,Arg1,Arg2,Arg3, ... ) (вх,(вх)*)

осуществляет форматированный вывод информации. Форматы за-

даются в виде строки FormatString обычного текста, где

маркеры % отмечают положение аргументов. Допустимые специ-

фикации формата - "-", "m", "p", "f", "e", "g". "-" озна-

чает выравнивание слева; целые числа, следующие за "m" и

"p", задают количество цифр слева и справа от десятичной

точки. Спецификации "f" и "e" определяют мантиссу и поря-

док числа. Спецификация "g" задает печать в максимально

короткой форме

Предметный указатель

= оператор

, (запятая)

разделитель между именами доменов одного типа

заместитель and

:- (двоеточие с дефисом)

заместитель if

; (точка с запятой)

заместитель or

_ (подчерк)

анонимная переменная

\ (обратный слэш)

разделитель при задании пути доступа

------------------------- А -------------------------

автоматическое выравнивание (automatic identation)

адаптер (adapter)

- расширенный графический (EGA)

- цветной графический (CGA)

альтернативные доменные структуры

анализ языка

- ключевых слов

- и контекстно-свободные грамматики

- прагматический

- синтаксический

анонимная переменная (anonimous variable)

арифметические операторы

арность (arity)

- отношения

- правила

атрибуты объектов

------------------------- Б -------------------------

база данных (database) - БД

- динамическая

- доступ

- загрузка в память

- запись в файл на диске

- интерфейс

- модели

- - иерархическая

- - сетевая

- - реляционная

- нерезидентная (на внешнем носителе)

- нормализация

- построение

- предикаты

- - описание

- резидентная (в оперативной памяти)

- статическая

- схема

- "Университетский футбол"

- файл

- - данных

- - индексный

- футбольная

бинарный граф-дерево (binary tree graph)

- ветвь дерева (branch)

- лист дерева (leaf)

- корень (root)

- узел (node)

- и списки

- и функтор списка

------------------------- В -------------------------

вспомогательный редактор (Auxilary Editor)

вызов (call)

вычитание - арифметическая операция

------------------------- Г -------------------------

голова (head)

- списка

грамматика (grammar)

граф (graph)

- бинарный

- линейный

------------------------- Д -------------------------

данные (data)

- в ТУРБО-ПРОЛОГе

- вводимые как поток символов

- вводимые с клавиатуры в виде строк

- диаграмма потоков

- запись в файл на диск

- модуль

- - ввода

- - выборки

- - удаления

- правила оперирования над ними

- создание составных объектов

- символьные строки

- типы

- файлы

- - добавление новых

- - дозапись в конец уже существующего файла

- - запись

- - модификация

- - чтение

- формирование списка

- числовые

- чтение

- - из файла

- - вводимых с клавитуры

- чтение строки, вводимой с клавиатуры

действитеьные числа

- тип домена

- правила оперирования

- записи

деление - арифметическая операция

диаграмма

- потоков данных (data flow diagram) - ДПД

- и составные структуры

директория (directory)

- ANSWERS

- иерархия

- каталог

- - выдача

диск (disk)

- LIBRARY AND SAMPLE PROGRAMS

- PROGRAM

- ввод/вывод

- винчестерский (hard disk)

- гибкий (floppi disk)

- форматирование

длина

- списка

- строки

домен (domain)

- имя

- описание

- организация

- типы

- - char

- - file

- - integer

- - string

- - symbol

- - real

- - и списки

- - описание составных объектов

доменная структура (domain structure)

- альтернативная (alternative)

- и функторы

допущение (assumption)

------------------------- З -------------------------

загрузка

- программного файла

- конфигурационного файла

заданные по умолчанию (default)

- имя файла

- маска файлов

- устройство

- - ввода - клавиатура

- - вывода - монитор

заключение (conclusion)

запись на диск

- данных в файл

- конфигурации окон

- файла

запуск программы на счет

- в ТУРБО-ПРОЛОГе

- - в системе с двумя гибкими дисками

- - в системе с винчестерским диском

значения

- совокупность

- параметра Mode предиката filepos

------------------------- И -------------------------

иерархическая структура

имя файла, заданное по умолчанию

интерактивная программа (interactive)

интерфейс (interface)

- естественно-языковый (natural launguage)

искусственный интеллект (artifical intelligence)

------------------------- К -------------------------

клавиатура

клавиша

- возврата (backspace)

- Enter

- Esc

- F10

- Shift-F10

- Ў

- ў

команды (commands)

- Compile (компиляция)

- DOS

- - CHKDSK (проверка диска)

- - COPY (копирование)

- - DEL или ERASE (удаление файла)

- - DIR (выдача каталога директории)

- - DISKCOPY (копирование диска)

- - FORMAT (форматирование диска)

- - MD (создание новой директории)

- - PRINT (печать файла)

- - RD (удаление директории)

- - RENAME (переименование файла)

- - СD (смена директории)

- - TYPE (просмотр содержимого файла)

- - поиска и замены

- - для работы с файлами

- - задание пути доступа

- - использование масок

- Edit (редактирование текста)

- Files (работа с файлами)

- Options (задание опций компилятора)

- Quit (выход из системы)

- Run (запуск на счет)

- Setup (установка)

- редактора Wordstar и ТУРБО-ПРОЛОГ

комментарии

компиляция

- и редактирование программы

конструирование

- баз данных

- правил

контекстно-свободная модель

контекстно-свободные грамматики (КС-грамматики)

контекстно-свободный анализ (КС-анализ)

конфигурация устройств (device configuration)

- стандартная (standard)

- расширенная (extended)

- заданная по умолчанию (default)

копирование файла

курсор (cursor)

- перемещение

- - к новой строке

- редактора

------------------------- Л -------------------------

линейный граф

- и списки

листинг (listing)

------------------------- М -------------------------

маска файлов

меню

- главное меню системы ТУРБО-ПРОЛОГ

- подсказки

метод опережающего чтения (read ahead)

множество значений

модуль

- ввода данных

- выборки данных

- главный

- окончания работы с программой

- реакции на ошибку

- удаления данных

------------------------- Н -------------------------

неопределенные символы (wild-card symbols)

нисходящее (top-down) программирование

------------------------- О -------------------------

общение с компьютером на естественном языке

объект

- атрибуты

- взаимосвязь

- простой

- предиката

- составной

- утверждения

окно (window)

- диалога (Dialog)

- подсказки (Help)

- размер

- редактора (Editor)

- сообщений (Message)

- трассировки (Trace)

- цвет

описание

- доменов

- предикатов

- файлового домена

опции

- Colors

- Directories

- Load Configuration

- Miscellaneous Setting

- Save Configuration

- Window Size

отношение

- арность

- мощность

- элемент

отрицание

------------------------- П -------------------------

память (memory)

- оперативная (RAM)

- внешняя

переадресация ввода/вывода (redirection)

переименование файла

переменная (variable)

- анонимная

- и внешняя цель

- и заглавные буквы

- имена

печать

- файла

- - текстового

подкоманды

- Copy

- Directory

- File

- File Name

- Erase

- Load

- Module List

- Operating System

- Print

- Rename

- Zap file in editor

подсказка

- меню

- окно

поиск

- ключевых слов в утверждении базы данных

- в списке

- строк текста

получение твердой копии (providing hardcopy output)

порядок

- объектов

- слов

поток символов

правило (rule)

- арность

- и утверждения

- и цель программы

предикат (predicate)

- collection

- cos

- error

- menu

- player

- readchar(_)

- sin

- аргументы

- арифметической операции

- базы данных

- взаимосвязь

- встроенный (built-in)

- - asserta

- - assertz

- - attribute

- - back

- - beep

- - bios

- - bound

- - char_int

- - clearwindow

- - closefile

- - comline

- - concat

- - consult

- - cursor

- - cursorform

- - cut

- - date

- - deletefile

- - dir

- - disk

- - display

- - dot

- - edit

- - editmsg

- - eof

- - existfile

- - exit

- - fail

- - field_attr

- - field_str

- - filemode

- - filepos

- - filestr

- - findall

- - flush

- - forward

- - free

- - frontchar

- - frontstr

- - fronttoken

- - gotowindow

- - graphics

- - isname

- - keypressed

- - left

- - line

- - makewindow

- - membyte

- - memword

- - nl

- - not

- - openappend

- - openmodify

- - openread

- - openwrite

- - pencolor

- - pendown

- - penpos

- - penup

- - portbyte

- - ptr_dword

- - random

- - readchar

- - readdevice

- - readint

- - readln

- - readreal

- - readterm

- - removewindow

- - renamefile

- - retract

- - right

- - save

- - scr_attr

- - scr_char

- - scroll

- - shiftwindow

- - sound

- - storage

- - str_char

- - str_int

- - str_len

- - str_real

- - system

- - text

- - time

- - trace

- - upper_lower

- - window_attr

- - window_str

- - write

- - wtitedevice

- - writef

- имя

- объект

- описание

- и рекурсивные правила

- для работы с файлами

предпосылка

преимущества

- рекурсии

- повтора

- ТУРБО-ПРОЛОГа

программа

- "Библиотека" (листинг 3.7)

- "Библиотека-2" (листинг 3.8)

- "Ввод данных" (листинг 7.8)

- "Ввод символов" (листинг 7.6)

- "Голова - хвост" (листинг 5.2)

- "Деление списка" (листинг 5.4)

- "Естественно-языковый интерфейс" (листинг 11.3)

- "Запись в файл" (листинг 7.4)

- "Игроки" (листинг 7.10)

- "Ключевые слова" (листинг 11.2)

- "Конструктор слов" (листинг 3.1)

- "Лексический анализатор предложений" (листинг 11.4)

- "Макбет - 1" (листинг 7.1)

- "Макбет - 2" (листинг 7.2)

- "Очки" (листинг 5.7)

- "Пары стран Европы" (листинг 3.6)

- "Печать файла" (листинг 7.5)

- "Подбор партнера" (листиенг 3.5)

- "Предметы" (листинг 3.9)

- "Предметы-2" (листинг 3.10)

- "Президенты" (листинг 3.3)

- "Присоединение списка" (листинг 5.5)

- "Распечатка файла" (листинг 7.3)

- "Родственники" (листинг 3.4)

- "Синтаксический анализатор предложений" (листинг 11.5)

- "Словарь" (листинг 3.2)

- "Создание списка" (листинг 11.1)

- "Создание файла прямого доступа" (листинг 7.11)

- "Сортировка" (листинг 5.6)

- "Списки" (листинг 5.1)

- "Университетский футбол" (листинг 9.2)

- "Футбольная база данных" (листинг 9.1)

- "Числа" (листинг 3.11)

- "Чтение символов" (листинг 7.7)

- "Чтение файла прямого доступа" (листинг 7.12)

- "Чтение файла" (листинг 7.9)

- "Элементы" (листинг 5.3)

- "дружественная пользователю"

- использование списков

- комментарии

- проектирование (design)

- - средства (tools)

- структура

путь доступа

------------------------- Р -------------------------

работа с группой объектов

разбиение объектов по классам

разбор (parsing)

раздел программы (division)

- clause

- database

- domains

- goal

размеры окна

редактирование (editing)

- автоматическое выравнивание (automatic identation)

- выбор режима

- - вставки

- - замены

- выделение фрагмента

- данных

- изменение размеров окна редактора

- использование

- - вспомогательного редактора

- - подсказки

- команды

- - поиска и замены

- опции главного меню

- программного файла

- в ТУРБО-ПРОЛОГе

редактирование (linking) программы

редактор (editor)

- курсор

- окно

- ТУРБО-ПРОЛОГа

режимы

- вставки (Insert)

- замены (Overwrite)

- скролинга (scrolling)

рекурсия

------------------------- С -------------------------

символ

- тип домена

символическое имя

- тип домена

- файла

символьные

- данные

- - создание файлов

- строки

- - ограничение на длину

система

- с винчестерским диском

- с двумя гибкими дисками

слияние списков

сложение - арифметическая операция

создание директории

сортировка (sorting)

- метод вставки

- метод выборки

- метод перестановки

составные (compaund)

- объекты

- структуры

- - и диаграммы

сохранение программного файла

список (list)

- и бинарный граф

- ввод

- голова

- графическое представление

- длина

- домен

- исходный

- и линейный граф

- метод деления на голову и хвост

- операции над ним

- предикаты

- и символы ASCII

- сортировка

- и типы доменов

- функтор

- хвост

- целевой

- элемент

- - поиск

средства (tools) разработки программ

стандартные типы доменов

строки

- тип домена

- ввод с клавиатуры

- дополнение до заданного количества символов

структура (structure)

- многодоменнная

- однодоменная

- программы

- составная

структурная схема (structure chart) - СС

------------------------- Т -------------------------

таблица (table)

- информации об университетском футболе

- и реляционная база данных

- стандарных типов доменов

- файлов дистрибутивного диска ТУРБО-ПРОЛОГа

терм (term) - имя

- компоненты

- и пробелы

- и строчные буквы

- требования к нему

требования к установке ТУРБО-ПРОЛОГа

ТУРБО-ПРОЛОГ

- дополнительные средства

- запуск на счет

- компиляция

- меню

- начало работы

- преимущества

- редактор

- - вспомогательный

- - изменение размеров окон

- - подсказка

- установка

- и элементы данных

------------------------- У -------------------------

удаление

- директории

- текста

- файла

указатель

- на позицию в файле

умножение - арифметическая операция

унификация (unification)

усреднение значений списка

установка ТУРБО-ПРОЛОГа (installation)

устройство

- ввода

- вывода

- логическое

- физическое

утверждение (clause)

- и запросы к программе

- и их конструирование

- и логическая связь между ними

- общее число объектов

- и правила

- раздел программы

- факты и правила

------------------------- Ф -------------------------

файл (file)

- ANSWERS

- GEOBASE.DBA

- GEOBASE.INC

- GEOBASE.PRO

- INIT.OBJ

- PROGRAMS

- PROLOG.ERR

- PROLOG.EXE

- PROLOG.HLP

- PROLOG.LIB

- PROLOG.OVL

- PROLOG.SYS

- README

- README.COM

- WORK.PRO

- базы данных

- на диске

- данных

- дистрибутивного диска

- дозапись

- загрузка

- заданное по умолчанию имя

- закрытие

- запись

- имя

- - в DOS

- - логическое

- - расширение (extension)

- - символическое

- индексный

- объектный

- открытие

- печать

- прямого доступа (random access)

- редактирование

- создание

- сохранение

- текстовый

- чтение

фрагмент текста (block)

- выделение (marking)

функтор (functor)

- и доменные структуры

- имя

------------------------- Ц -------------------------

цветной монитор

- атрибуты

- заданные по умолчанию цвета окон

целые числа

- тип домена

- правила оперирования

------------------------- Ч -------------------------

численные вычисления

числовые

- данные

- доменные типы

------------------------- Э -------------------------

элемент

- отношения

- списка

------------------------- Я -------------------------

язык программирования

- Бэйсик (Basic)

- высокого уровня

- декларативный

- Лисп (Lisp)

- императивный

- интерпретируемый

- КОБОЛ (COBOL)

- компиляторного типа

- машинно-ориентированный

- Паскаль (Pascal)

- ПРОЛОГ (Prolog)

- - C&M

- - ТУРБО (Turbo Prolog)

- процедурный

- Си (C)

- ФОРТРАН (Fortran)

Надписи к рисункам. Глава 3.

рис.3.1 1) комментарии

2) комментарии

3) <описания доменов>

4) <описания предикатов динамической базы данных>

5) <описания предикатов>

6) <целевое утверждение>

7) <утверждения>

рис.3.13 1) домен

2) уровень 0

3) уровень 1

рис.3.14 1) предикат (главный функтор)

2) уровень 0

3) уровень 1

4) функтор

5) уровень 2

рис.3.15 1) домен

2) уровень 0

3) уровень 1

4) уровень 2

рис.3.16 1) предикат (главный функтор)

2) уровень 0

3) уровень 1

4) функтор

5) уровень 2

6) уровень 3

Надписи к рисункам. Глава 5.

рис.5.4 1) голова

2) хвост

3) голова

4) хвост

5) голова

6) хвост

7) голова

8) хвост (хвостом является пустой список)

рис.5.6 1) Искомый элемент : 3

2) Список : [1, 2, 3, 4, 5]

3) Голова списка

4) Хвост списка

5) Поиск успешен

рис.5.7 1) Компаратор : 40

2) Голова списка

3) Хвост списка

Надписи к рисункам. Глава 7.

рис.7.1 1) монитор

2) оперативная память, процессор и т.п.

3) операционная система

4) клавиатура

рис.7.2 1) монитор

2) оперативная память, процессор и т.п.

3) операционная система

4) клавиатура

5) принтер

6) коммуникационный порт

рис.7.4 1) монитор

2) запись

3) файлы на диске

4) чтение

5) клавиатура

6) чтение

7) оперативная память, процессор и т.п.

8) операционная система

9) запись

10) чтение

11) запись

12) запись

13) принтер

14) коммуникационный порт

рис.7.5 1) целевое утверждение

рис.7.6 1) экран

2) (файл)

3) база данных

4) целевое утверждение

рис.7.7 1) целевое утверждение

2) экран

рис.7.8 1) целевое утверждение

рис.7.9 1) клавиатура

2) целевое утверждение

3) экран

4) файл

рис.7.12 1) файл

2) экран

3) принтер

рис.7.15 1) клавиатура

2) экран

3) файл

рис.7.17 1) файл

2) экран

3) принтер

рис.7.19 1) экран

2) файл

3) клавиатура

Надписи к рисункам. Глава 9.

рис.9.1 1) запись 1

2) запись 2

3) запись 3

4) запись 4

5) поле имени

6) поле отдела

7) поле ставки

рис.9.2 1) Отношение: игрок

2) элемент отношения 1

3) элемент отношения 2

4) элемент отношения 3

5) элемент отношения 4

6) элемент отношения 5

7) атрибут 1 (имя)

8) атрибут 2 (команда)

9) атрибут 3 (позиция)

10) количество элементов отношения (мощность) = 5

11) количество атрибутов (арность) = 3

рис.9.3 1) тип утверждений: dplayer

2) Различные варианты утверждений:

3) утверждение 1

4) утверждение 2

5) утверждение 3

6) утверждение 4

7) утверждение 5

8) объект 1 (имя)

9) объект 2 (команда)

10) объект 3 (позиция)

11) количество различных утверждений = 5

12) количество объектов (арность) =3

рис.9.4 1) клавиатура

2) монитор

3) база данных (в оперативной памяти)

4) добавление

5) удаление

6) просмотр

7) выход

8) menu (меню программы)

9) Условные обозначения:

10) поток данных

11) передача управления

рис.9.5 1) меню

2) выбор пользователя

рис.9.9 1) клавиатура

2) монитор

3) база данных (в оперативной памяти)

4) добавление

5) удаление

6) просмотр

7) выход

8) menu (меню программы)

9) Условные обозначения:

10) поток данных

11) передача управления

рис.9.10 1) меню

2) добавление

3) удаление

4) просмотр

5) выход

Надписи к рисункам. Приложение С.

рис.С.1 1) корневая директория

2) другие поддиректории

3) другие поддиректории

рис.С.2 1) имя файла

2) расширение имени файла

3) дата создания или модификации

4) время создания или модификации

5) размер файла (в байтах)

Заголовки к рисункам. Глава 1.

N рисунка Заголовок

1.1 Заставка системы ТУРБО-ПРОЛОГ, версия 1.1.

1.2 Главное меню системы.

1.3 Программа WELCOME.PRO в окне редактора.

1.4 Выдача на экран после трансляции и запуска программы

WELCOME.PRO.

1.5 Сохранение файла на внешнем носителе.

1.6 Просмотр каталога директории.

1.7 Загрузка файла.

1.8 Меню команды Help.

1.9 Окно команды Нelp.

1.10 Очистка окна редактора.

1.11 Задание подкоманды Print.

Заголовки к рисункам. Глава 3.

N рисунка Заголовок

3.1 Структура программы ТУРБО-ПРОЛОГа.

3.2 Выдача программы "Конструктор слов".

3.3 Выдача программы "Конструктор слов" при задании

внешней цели.

3.4 Выдача программы "Конструктор слов" при задании

другой внешней цели.

3.5 Использование двух переменных при задании внешней цели.

3.6 Выдача программы "Словарь".

3.7 Выдача программы "Президенты".

3.8 Задание внешней цели для программы "Президенты".

3.9 Выдача программы "Родственники".

3.10 Выдача программы "Пары стран Европы".

3.11 Пример диалога с программой "Библиотека".

3.12 Запрос к базе данных с использованием функтора.

3.13 Доменная структурная диаграмма программы "Библиотека".

3.14 Предикатная структурная диаграмма программы "Библиотека".

3.15 Доменная структурная диаграмма программы "Библиотека-2".

3.16 Предикатная структурная диаграмма программы "Библиотека-2".

3.17 Выдача программы "Числа".

Заголовки к рисункам. Глава 5.

N рисунка Заголовок

5.1 Направленный линейный граф списка.

5.2 Двоичное дерево списка.

5.3 Выдача программы "Списки" при задании различных внешних целей.

5.4 Процесс деления списка на голову и хвост.

5.5 Выдача программы "Голова-хвост".

5.6 Диаграмма поиска.

5.7 Диаграмма операции деления списка.

5.8 Выдача программы "Деление списка".

5.9 Выдача программы "Присоединение списка".

5.10 Выдача программы "Сортировка списка".

5.11 Выдача программы "Очки".

Заголовки к рисункам. Глава 7.

N рисунка Заголовок

7.1 Базисная конфигурация устройств ввода-вывода ТУРБО-ПРОЛОГа.

7.2 Стандартная конфигурация устройств ввода-вывода ТУРБО-ПРОЛОГа.

7.3 Выдача программы "Макбет-1".

7.4 Расширенная конфигурация устройств ввода-вывода ТУРБО-ПРОЛОГа.

7.5 Структурная схема (СС).

7.6 Диаграмма потоков данных (ДПД).

7.7 Диаграмма потоков данных программы "Распечатка файла".

7.8 Структурная схема программы "Распечатка файла".

7.9 Диаграмма потоков данных программы "Запись в файл".

7.10 Структурная схема программы "Запись в файл".

7.11 Пример диалога с программой "Запись в файл".

7.12 Диаграмма потоков данных программы "Печать файла".

7.13 Структурная схема программы "Печать файла".

7.14 Пример диалога с программой "Печать файла".

7.15 Диаграмма потоков данных программы "Ввод символов".

7.16 Структурная схема программы "Ввод символов".

7.17 Диаграмма потоков данных программы "Чтение символов".

7.18 Структурная схема программы "Чтение символов".

7.19 Диаграмма потоков данных программы "Ввод данных".

7.20 Структурная схема программы "Ввод данных".

7.21 Пример диалога с программой "Ввод данных".

7.22 Пример диалога с программой "Игроки".

7.23 Пример диалога с программой "Создание файла прямого доступа".

7.24 Пример диалога с программой "Чтение файла прямого доступа".

Заголовки к рисункам. Глава 9.

N рисунка Заголовок

9.1 Структура файла базы данных.

9.2 Отношение базы данных.

9.3 Эквивалент отношения базы данных в ТУРБО-ПРОЛОГе.

9.4 Диаграмма потоков данных резидентной БД.

9.5 Структурная схема резидентной БД.

9.6 Меню программы "Футбольная база данных".

9.7 Окно ввода данных программы "Футбольная база данных".

9.8 Просмотр данных, содержащихся в базе.

9.9 Диаграмма потоков данных нерезидентной БД.

9.10 Структурная схема нерезидентной БД.

9.11 Ввод данных о команде.

9.12 Выдача сведений о команде.

Заголовки к рисункам. Глава 11.

N рисунка Заголовок

11.1 Диалог с программой "Создание списка".

11.2 Выдача программы "Ключевые слова".

11.3 Структурная схема "Интерфейс с футбольной базой данных".

11.4 Диалог с программой "Интерфейс с футбольной базой данных".

11.5 Структурная схема программы "Лексический анализатор

предложений".

11.6 Выдача программы "Лексический анализатор предложений".

11.7 Пример диалога с программой "Синтаксический анализатор

предложений".

Заголовки к рисункам. Приложение А.

N рисунка Заголовок

А.1 Строка статуса в режиме вставки.

А.2 Скопированный фрагмент текста.

А.3 Поиск "ZIP".

А.4 Ввод текста для замены.

А.5 Запрос разрешения на замену.

А.6 Ввод имени файла для вспомогательного редактора.

А.7 Выделение фрагмента внешнего файла.

Заголовки к рисункам. Приложение В.

N рисунка Заголовок

В.1 Меню команды Options.

В.2 Изменение цветов окна.

В.3 Изменение размеров окна редактора.

В.4 Использование средства трассировки.

Заголовки к рисункам. Приложение С.

N рисунка Заголовок

С.1 Иерархически структурированные директории.

С.2 Каталог директории.

400

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]