
- •3. Механизм автоматического поиска решений на Прологе
- •3.1 Рассмотрим поиск решений на примерах
- •3.2.1 Задача о холостяке
- •3.3 Задача о Ханойской башне
- •4. Важные особенности программ на Прологе
- •4.1.4 Вот пример программы на Прологе, которая работать не будет:
- •4.1.5 Ещё один пример программы, не работающей на Прологе.
- •Замечание
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
Замечание
Хотя подцели в правиле выполняются подобно командам процедурного языка, они - не команды, а цели, которые проверяются и становятся успешными или терпят неудачу.