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

4.1.4 Вот пример программы на Прологе, которая работать не будет:

/* плохая АРИФМЕТИЧЕСКАЯ ПРОГРАММА */

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

write(' Теперь другое число: '), read(N2), 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(Bвыбор),nl,

choice, nl, nl.

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

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

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

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

choice:- Bвыбор=e.

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

Вот ее проба

?- runar_err.

Введите число: 2.

Теперь другое число: 3.

Что бы Вы хотели сделать?

a. Сложить их

b. Вычесть

c. Умножить

d. Разделить первое на второе

e. Ничего

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

ERROR: Arguments are not sufficiently instantiated

^ Exception: (8) _G199 is _G186+_G187 ? creep

Exception: (7) choice ? abort

% Execution Aborted

В пределах правила переменная может иметь только одно значение!

В варианте SWI-Prolog Version 6.0.2 диагностика ошибки будет другой и более точной

4.1.5 Ещё один пример программы, не работающей на Прологе.

runar2:- Total = 0,

write('Задай любое целое: '),

read(Num), Total is Total+Num,

write('Теперь еще одно целое: '),

read(Num), Total is Total+Num,

write('В сумме будет '),

write(Total),nl.

При проверке получится

?- runar2.

Задай любое целое: 2.

No

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

Эта особенность Пролога, нужна, чтобы можно было доказать истинность всех правил одновременно. Определение чего-либо через переменную не означает, что это «что-то» может изменяться в пределах правила. Это означает только то, что его значение будет не известно до тех пор, пока не произойдет вызов данного правила из базы данных.

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

4.1.6 Правильна программа на Прологе

runar3:- Total = 0,

write('Задай любое целое: '),

read(Num1), Total1 is Total+Num1,

write('Теперь еще одно целое: '),

read(Num2), Total2 is Total1+Num2,

write('В сумме получилось '),

write(Total2),nl.

Теперь проверка дает предполагаемый результат

?- runar3.

Задай любое целое: 2.

Теперь еще одно целое: 3.

В сумме получилось 5

Yes

Замечание

Хотя подцели в правиле выполняются подобно командам процедурного языка, они - не команды, а цели, которые проверяются и становятся успешными или терпят неудачу.

стр. 13 из 13

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