Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LP_3.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
110.59 Кб
Скачать

4. Важные особенности программ на Прологе

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

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

Мы уже попробовали Пролог для работы с декларативной базой данных, задавая факты статически. Но мы можем определить их и динамически и как и в любом процедурном языке.

4.1 Пример программы

go:- write('Как зовут-то тебя? '),

read(Sимя),

write(' - Что тебе, '),

write(Sимя),

write(', надо?'),

nl.

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

?- go.

Как зовут-то тебя? клава.

- Что тебе, клава, надо?

Yes

?-

Обратите внимание на новый предикат read, который определяет значение переменной считывая с клавиатуры атом, целое число, вещественное число или строку, заключенную в кавычки (символ ‘), но НЕ ПЕРЕМЕННУЮ(!), т.е. не с ЗАГЛАВНОЙ буквы, требуя в конце ввода точку и <ENTER>.

4.1.2 Вот программа с реализацией выбора, т.е. меню.

/* ПРЕОБРАЗОВАНИЕ МЕСЯЦА */

moco:- write('Соответствие целого числа названию месяца'), nl,nl,

write('Введите месяц, как целое число: '),

read(Sмесяц),

write('Значит месяц - '), month(Sмесяц), nl.

month(1):-write('Январь').

month(2):-write('Февраль').

month(3):-write('Март').

month(4):-write('Апрель').

month(5):-write('Май').

month(6):-write('Июнь').

month(7):-write('Июль').

month(8):-write('Август').

month(9):-write('Сентябрь').

month(10):-write('Октябрь').

month(11):-write('Ноябрь').

month(12):-write('Декабрь').

month(_):-write(' ...? Нет такого месяца! ').

Проверка работы.

?- moco.

Соответствие целого числа названию месяца

Введите месяц, как целое число: 3.

Значит месяц - Март

Yes

?- moco.

Соответствие целого числа названию месяца

Введите месяц, как целое число: 8.

Значит месяц - Август

Yes

?- moco.

Соответствие целого числа названию месяца

Введите месяц, как целое число: 23.

Значит месяц - ...? Нет такого месяца!

4.1.3 Теперь мы можем составить программу построения более сложного меню.

/* Арифметический интерпретатор */

runar:-write('Введите число: '), read(Num1),

write(' Теперь другое число: '), read(Num2), nl,

write('Что бы Вы хотели сделать?'), nl, nl,

write(' a. Сложить их '), nl,

write(' b. Вычесть'), nl,

write(' c. Умножить'), nl,

write(' d. Разделить первое на второе'), nl,

write(' e. Ничего'), nl, nl,

write('Наберите одну букву: a, b, c, d или e: '),

read(Sвыбор), nl,

choice(Sвыбор, Num1, Num2), nl, nl.

choice(a, N1, N2):- X is N1+N2, write('ответ = '), write(X).

choice(b, N1, N2):- X is N1-N2, write('ответ = '), write(X).

choice(c, N1, N2):- X is N1*N2, write('ответ = '), write(X).

choice(d, N1, N2):- X is N1/N2, write('ответ = '), write(X).

choice(e, N1, N2).

choice(_, _, _) :- write('... Вы выбрали не ту букву. ').

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

Ловушка в конце программы работает, когда ни одна из альтернатив не будет успешна, т.е, если сделан любой неправильный ввод.

Из этого примера можно сделать следующие важные выводы:

  • Имя переменной имеет значение только в пределах одного правила.

Обратите внимание на способ, которым переменные (как параметры) передаются из runar в choice . Переменные Sвыбор, Num1 и Num2 имеют значение только в правиле runar, а слова Sвыбор, Num1 и Num2 не будут иметь того же самого значения в правиле сhoice.

  • Область действия переменной - только то правило, в котором она встречается.

  • В Прологе нет никаких 'глобальных' переменных.

  • Величины между правилами передаются как параметры.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]