Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Основное / Методическое пособие по Turbo Prolog (старое)

.pdf
Скачиваний:
83
Добавлен:
20.10.2020
Размер:
372 Кб
Скачать
☆

мерцающими, если к значению атрибута экрана добавить 128.

Чтобы вычислить значение Screen_attribute для различных комбинаций цветов, прежде всего, выберите необходимый цвет текста и цвет фона. Затем сложите соответствующие значения атрибутов. Если вы хотите, чтобы символы мерцали, прибавьте к результирующему значению 128. Вычисленное значение используется как второй аргумент в предикате makewindow, т.е. Screen_attribute.

Чтобы создать окно с белыми символами на черном фоне, сложите 7 (белый текст) и 0 (черный фон), результат будет 7.

Аргумент Frame_attribute предиката makewindow есть целое число, значение которого определяет рамку окна. Если значение атрибута - 0, окно не имеет видимой границы. Другие значения определяют рамку окна с параметрами, указанными в табл. 3.

Часть значений атрибута рамки окна задает ее цвет. Это делается аналогично заданию значения атрибута экрана. Если задается мерцающая граница, то она всегда будет белой, с мерцающей тонкой линией (в середине границы), имеющей указанный цвет.

Аргумент Frame_string задает метку окна. Например, меткой окна может быть "Главное Меню", "Окно Вывода". Строка, задаваемая в качестве атрибута Frame_string, будет размещена в центре верхней линии рамки окна. Значение метки окна также может быть не определено, что соответствует отсутствию метки. В этом случае вводится аргумент, состоящий из двух последовательных знаков кавычки.

Таблица 3. Значение атрибута, определяющего цвет рамки окна в Турбо-Прологе.

Значение атрибута

Вид рамки окна

0

Нет рамки

1

Синяя рамка

2

Зеленая рамка

3

Светло-синяя рамка

11

4

Красная рамка

5

Фиолетовая рамка

6

Желтая рамка

7

Белая рамка

8

Коричневая рамка

-1

Мерцающая белая рамка

-2

Мерцающая желтая рамка

-3

Мерцающая фиолетовая рамка

-4

Мерцающая красная рамка

-5

Мерцающая светло-синяя рамка

-6

Мерцающая светло-зеленая рамка

-7

Мерцающая синяя рамка

-8

Мерцающая серая рамка

Аргумент Starting_row есть целое число, определяющее верхнюю строку (линию) создаваемого окна. Максимальное количество строк, умещающихся на экране, 25. Значение 4 указывает, что окно начинается с четвертой строки. Нумерация начинается с 0.

Аргумент Starting_column указывает крайний левый столбец окна. Значения аргумента изменяются от 0 до 79.

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

Аргумент Window_width указывает число столбцов, занимаемых окном. Предикат shiftwindow используется для смены текущего окна

(переключения). Его форма: shiftwindow(Window_number).

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

В то же время Турбо-Пролог "помнит" предыдущие окна и их атрибуты. Например, если окно 3 имеет такие атрибуты, что оно будет перекрывать текущее окно (окно 4), то выполнение предиката shiftwindow (3) вызовет появление окна 3, в которое вложено окно 4. Информация из окна 4, частично закрытая окном 3, сохраняется и появится на экране, когда произойдет переключение и окно 4 вновь станет текущим.

12

Предикат gotowindow позволяет выполнять быстрое переключение между двумя окнами, которые не перекрываются. Его форма: gotowindow (Window_number).

Этот предикат выполняется быстрее, чем shiftwindow, и поэтому его следует использовать для переключения между окнами, содержащими большое количество текста.

Предикат clearwindow. Данный предикат удаляет из текущего окна все текстовые и графические изображения. Предикат не имеет аргументов. Окно и рамка окна, если она имеется, не разрушаются. Окно целиком закрашивается соответствующим цветом фона.

Предикат removewindow удаляет текущее окно с экрана. Предикат аргументов не имеет. Все текстовые и графические изображения, находящиеся в окне, также удаляются. Если за данным окном находится другое окно, то это окно и его содержимое становятся видимыми. Если удаляется последнее из заданных окон, на экране появляется то изображение, которое было на нем до создания окон.

Использование окон для ввода и вывода С любым текущим окном работают стандартные предикаты ввода и

вывода – readln,readint,readchar - также.

По умолчанию, курсор расположен в верхнем левом углу окна. Используя предикат cursor и помещать курсор в любую позицию текущего окна. Этот предикат имеет вид: cursor (Row_number, Col_number ).

Аргументы Row_number и Col_number являются целыми числами, задающими номера строки и столбца, по отношению к верхней строке и крайнему левому столбцу экрана. Строки и столбцы нумеруются, начиная с нуля: предикат cursor(0,0) обеспечивает вывод текста, начиная с верхнего левого угла экрана.

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

13

сообщения в центре экрана.

makewindow( 1,7,7,"", 1,1, 8,28), cursor(4,12),

write("Доброе утро!").

Пример 1.

Predicates start run(integer) do_sums

Программа 1. Работа с окнами

set_up_windows clear_windows

Clauses

start:- set_up_windows, do_sums. set_up_windows :-

makewindow(l, 7, 7, “”, 0, 0, 25, 80), makewindow( 1, 7, 7, "Left operand", 2, 5, 5, 25), makewindow(2, 7, 7,"", 2, 35, 5, 10),

nl, write(" PLUS"),

makewindow(2, 7, 7, "Right operand", 2, 50, 5, 25), makewindow(3, 7, 7, "Gives", 10, 27, 5, 25), makewindow(4, 7, 7,"", 17, 22, 5, 35).

do_sums :- run(_), clear_windows, do_sums. run(Z) :-

shiftwindow(l), cursor(2, 1), readint(X), shiftwindow(2),

cursor(2, 10), readint(Y),

shiftwindow(3), Z=X+Y, cursor(2, 10), write(Z), shiftwindow(4),

write(" Please press the space bar"), readchar(_).

Clear_windows :-

shiftwindow(l), clearwindow, shiftwindow(2), clearwindow, shiftwindow(3), clearwindow, shiftwindow(4), clearwindow.

Использование звука и музыки

Пролог поддерживает два предиката генерации звука: sound и beep. Предикат beep генерирует звук высокой частоты. Он не имеет параметров. Правило, генерирующее три звуковых сигнала, имеет вид:

beep:- beep, beep, beep.

Предикат sound имеет вид: sound(Duration, Frequency). Первый параметр задает продолжительность звукового сигнала в сотых долях секунды, второй-частоту генерируемого звука.

14

Программа 2. Тренажер для обучения сложению

Таблица 4.

Работа со звуком

Нота

До

До

Ре

Ре

Ми

Фа

Фа

Соль

Соль

Ля

Ля

Си

До

 

 

диез

 

диез

 

 

диез

 

диез

 

диез

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Частота

262

278

294

302

330

350

370

392

416

440

466

494

524

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

Predicates gen_rand_num(integer) say_good_work say_more_work

test_and_reward(integer, integer) make_exercise_set(integer) do_cal

Goal

do_cal.

Clauses

do_cal:-

makewindow(1,7,7, “Тренажер для обучения сложению”, 2,20,20,34), nl,

write(“Вашему вниманию предлагаем упражнения для выполнения”), make_exercise_set(3),

nl, write(“Желаем удачи! Пока!”),

nl, write(“Нажмите на любую клавишу”), readchar(_),

removewindow. make_exercise_set(0):-!. make_exercise_set(Count):-

gen_rand_num(A),

nl, write(“1-е число ”,A), nl, gen_rand_num(B),

nl, write(“2-е число ”,B), nl, C=A+B,

write(“Чему равна сумма?”), nl, readint(U), test_and_reward(C,U), Newcount=Count-1,

make_ exercise_set(NewCount). gen_rand_num(X):-random(Y), X=Y*5+1. test_and_reward(C,C):-say_good_work,!. test_and_reward(_,_):-say_more_work. say_good_work:-

makewindow(2,7,7, “Хорошая работа!”, 12, 40, 8, 30), nl, write(“Вы правы”), nl, nl,

write(“Музыка для победителя!”),nl,nl, sound(4, 262), sound(4, 350),

sound(4, 440), sound(8, 516), sound(4, 440), sound(112, 516),

nl, nl, write(“Нажмите на любую клавишу”), readchar(_),

15

removewindow. say_more_work:-

makewindow(3,7,7, “Продолжим!”, 14, 6, 7, 28), nl, write(“Вам нужно поработать ещё”), nl, nl,

beep, beep, beep,

write(“Нажмите на любую клавишу”), readchar(_),

removewindow.

Правило make_exercise_set задает три контрольных вопроса. Для каждого вопроса правилом gen_rand_num генерируется два случайных целых числа в диапазоне от 1 до 5, эти числа выводятся на экран, затем предлагается ввести ответ, предикат test_and_reward оценивает ответ пользователя.

Задание. Усовершенствуйте программу. Предложите пользователю выбрать 1 из 4 тренажеров и проверить его знания арифметических операций, оценив его способности по 5-бальной шкале.

16

Часть 2. Лабораторные работы Лабораторная работа №1. Общие сведения об языке логического

программирования Пример 1. Наша первая Пролог программа будет содержать информацию

о военнослужащих некоторого воинского подразделения и их званиях: “Павлов генерал”, “Сабо полковник”, “Денисов капитан”, “Матвеев капитан”, “Кулёмин сержант”, “Николаев сержант”. Сформулировать на Прологе следующие вопросы: 1) Павлов генерал? 2) Кто является полковником? 3)Кем является Денисов? 4)В подразделение есть военный в звание сержанта? 5) В подразделение есть военный в звание подполковника?

6)Вывести военных, имеющих одинаковые звания.

Впрограмме каждого военного мы представим предикатом military размерности 2, каждый компонентатом, первый представляет фамилию, а второй – его звание.

Domains

s=symbol

Программа 3. База данных «Военная часть»

Predicates

military(s,s)

Clauses

military(pavlov, general). military(sabo, polkovnik). military(denisov, kapitan). military(matveev, kapitan). military(kulemin, serzhant). military(nikolaev, serzhant).

Сформулируем запросы:

1) ? military(pavlov, general)

Ответ: yes

2) ? military(X, polkovnik)

Ответ: X= sabo

3) ? military(denisov, X)

Ответ: X= kapitan

4) ? military(_, serzhant)

Ответ: yes

5)? military(_, podpolkovnik)

Ответ: no

17

6) ? military(X,Y), military(Z, Y), X<>Z

Ответ: X= denisov Z= matveev Y= kapitan X= kulemin Z= nikolaev Y= serzhant

Пример 2. Данные о крупных реках России сведены в таблицу:

Таблица 5.

Данные о крупных реках России

Название

 

Годовой

Площадь

 

Куда

Длина, км

бассейна,

Истоки

реки

сток, км3

впадает

 

тыс. км2

 

 

 

 

 

 

Амур

4416

350

1855

Яблоневый хребет

Татарский

пролив

 

 

 

 

 

Лена

4400

488

2490

Байкальский

Море

хребет

Лаптевых

 

 

 

 

Обь

4070

400

2990

Предгорья Алтая

Карское

море

 

 

 

 

 

Иртыш

4248

323

1643

Китай

Обь

Енисей

3487

600

2580

Восточный Саян

Карское

море

 

 

 

 

 

Волга

3530

255

1360

Валдайская

Каспийское

возвышенность

море

 

 

 

 

 

 

 

 

 

Восточноси

Колыма

2129

44

643

Хребет Черского

бирское

 

 

 

 

 

море

Урал

2428

54

231

Южный Урал

Каспийское

море

 

 

 

 

 

Дон

2200

45

504

Среднерусская

Азовское

возвышенность

море

 

 

 

 

Кама

1805

130

507

Верхне — Камская

Волга

возвышенность

 

 

 

 

 

Печора

1809

130

322

Северный Урал

Баренцево

море

 

 

 

 

 

Ангара

1779

62

1039

Байкал

Енисей

Селенга

1024

14

447

Монголия

Байкал

Кубань

870

11

58

Кавказ

Азовское

море

 

 

 

 

 

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

1)Определить реки, впадающие в Азовское море.

2)Определить реки, исток которых находится на Валдайской возвышенности?

3)Какие реки короче Камы?

4)Какие реки длиннее Иртыша?

18

5) Как задать вопрос, определяющий все данные о реке Кама?

Программа 4. База данных «Реки России»

Domains

S=symbol

N=integer

Predicates

reka(S,N,N,N,S,S)

Clauses

reka(amur, 4416, 350, 1855,yablonevi_hrebet,tatar_proliv). reka(lena, 4400, 488, 2490, baikal_hrebet, more_laptevih). reka(ob, 4070, 400, 2990, altai, more_karskoe). reka(irtish, 4248, 323, 1643, kitai, ob).

reka(enisei, 3487, 600, 2580, vost_cain, more_karskoe). reka(volga, 3530, 255, 1360, valdais_vozvishennost, more_kaspi). reka(kolima, 2129, 44, 643, hrebet_cherskogo, vost_sibir_more). reka(ural, 2428, 54, 231, yuzhni_ural, more_kaspi).

reka(don, 2200, 45, 504, sredn_rus_vozvvishennost, more_azov). reka(kama, 1805, 130, 507, verhne_kamsk_ vozvvishennost, volga). reka(pechora, 1809, 130, 322, sever_ural, barenzevo_more). reka(angara, 1779, 62, 1039, baikal, enisei).

reka(selenga, 1024, 14, 447, mongolia, baikal). reka(kuban, 870, 11, 58, kavkaz, more_azov).

Запросы:

reka(X, _, _, _, _, more_azov)

reka(X, _, _, _, valdais_vozvishennost,_)

reka(X, Y, _, _, _, _), reka(lena, Z, _, _, _, _), Y<Z reka(X, Y, _, _, _, _), reka(irtish, Z, _, _, _, _), Y>Z reka(kama, A,B,C,D,E)

Пример 3. Известно, что Лене нравится теннис, Денису нравится футбол, Борису – бейсбол, Эдику – плавание, Марку нравится теннис, а Фёдору то, что нравится Борису. Записать факты на Прологе и ответить на вопросы: 1)Кому нравится теннис? 2) Что нравится Федору? 3)Кто занимается одинаковыми видами спорта?

Predicates

likes(symbol,symbol)

Программа 5. База знаний «Предпочтения»

Clauses

likes(lenа, tennis). likes(denis, football). likes(boris, baseball). likes(edic, swimming). likes(mark, tennis).

likes(fedor, Activity):- likes(boris, Activity). /* Activity играет роль переменной*/

Запросы

1) ? likes(X, tennis)

19

Ответ: X= lenа X= mark

2) ? likes(fedor, X)

Ответ:

X= baseball

3) ? likes(X, T), likes(Y, T)

Ответ:

X= lenа Y= mark T= tennis X= mark Y= lenа T= tennis X= boris Y= fedor T= baseball X= fedor Y= boris T= baseball

Пример 4. Лена, Анна, Денис и Борис-люди, лада и нисан - автомобили, Лене нравится лада, Анне - пицца, Денису - футбол, а Борис - Мерседес, Ваське - рыбка. Пицца, лада, мерседес продаются. Человек может купить машину, если она продается, и она ему нравится. Сформулировать на прологе вопросы: 1)Какую машину может купить Лена? 2) Кто-нибудь может купить мерседес? 3) какие машины продаются, и ответить на них.

Программа 6. База знаний «Предпочтения и возможности»

Domains

s=symbol

Predicates human(s) car(s) likes(s,s) can_by(s,s) cells(s)

Clauses

human( lena ). human( anna ). human( denis ). human( boris ). car( lada ). car( nissan ).

likes( lena, lada ). likes( anna, pizza ). likes( denis, football ). likes( boris, mersedes ). likes( vasya, ribka ). cells(pizza).

cells(lada).

20