- •Приложения
- •1. Основная терминология
- •II. Полезные программы Различные процедуры
- •Процедуры сбора множества ответов
- •Процедуры ввода-вывода низкого уровня
- •Программа "отобразить_состояние"
- •Экранно-ориентированная программа, предназначенная для выполнения запросов к базе данных
- •III. Показательный пример программа планирования работы завода Ситуация
- •Прототип программы
- •Примеры сеансов работы с программой
- •Пользование программой
- •Программа Алгоритм планирования
- •Оценка алгоритма планирования
- •Чтение текста программы
II. Полезные программы Различные процедуры
% Изменить на обратный порядок расположения элементов списка.
% Метод № 1 :
% + -
обр_порядок([С] L1],L2) :—
обр_ порядок (L1, Выход),
присоединить (Выход, [С], L2).
обр_порядок([ ], []).
% Метод №2:
% + + -
обр_порядок(L1, [], L1).
обр_порядок(L1, [X ; L2], L3) :-
обр_порядок ([X [ L1], L2, L3).
% Запрос ко второй версии процедуры составляется следующим
% образом:
% | ?- обр_порядок ([ ], [а, Ь, с], R).
% R=[c,b,a]
% число Х возводится в степень Y, результат равен R.
% + + -
степень (0,0,0) :- ! .
степень (X,0,1) :- ! .
степень (Х,1,Х) :- ! .
степень (X, Y, R) : - степень(Х, Y, 1, R).
степень (А, 0, Окончат, Окончат) : - !.
степень (А, Р, Накопл, Окончат) : -
NP is P - 1,
НовНакопл is Накопл * А,
степень (A, NP, НовНакопл, Окончат).
Процедуры сбора множества ответов
%
% F1NDALL - найти все ответы
% ? + -
findall (Элемент, Запрос, _) : -
Запрос,
взять_врем_ список (Список),
присоединить (Список, [Элемент], Новсписок),
assert (врем_ список (Новсписок)),
fail.
findall(_, _, Список) :—
retract (врем список (Список)), ! .
взять _врем список ([]) :—
not (врем_ список (_)), !.
взять_врем_список (Список) :—
retract (врем _ список (Список)), !.
% сп_неповт_знач- список неповторяющихся значений
% Данная процедура собирает все ответы на запрос, устраняя
% повторы.
% ? + -
сп_неповт_знач(Элемент, Запрос, Список) : —
Запрос,
взять_ врем_список (Список),
( элемент (Элемент, Список),
assert (врем _ список (Список))
;
not (элемент (Элемент, Список)),
assert (врем_список( [Элемент ] Список] ))
), fail.
сп_неповт_знач(_,_,Список):—
(врем_список (Список)), !.
Процедуры ввода-вывода низкого уровня
%
% ВВОДПОЛЯ/4 (Используется в приложении III)
%
% Выдать значения переменных Сообщ_ подсказка и Умалч_знач
% (если таковое имеется). Получить от пользователя Ответ.
% "Условие" — это некоторая разновидность запроса, в котором
% может участвовать переменная Ответ.
% Вычислить Условие; если оно потерпит неудачу, то снова
% запустить подпрограмму "вводполя".
% + - ? +
ввводполя(Сообщ_подсказка, Ответ, Умалч_знач, Условие) :—
write (Сообщ_ подсказка) , п),
( nonvar (Умалч _ знач) ,
write('['), write (У малч_ знач),
write(' ]'),
;
vаr (Умалч_знач)
),
get0(C),
С = 10, % 10 - это код перевода строки в операционных
% системах UNIX и VMS Ответ = Умалч _ знач,
С \== 10,
вводсимволов (С, Список),
name(0твет. Список)
), Условие, ! .
% В предыдущем правиле "вводполя" подцель Условие потерпела
% неудачу, предпринять новую попытку:
вводполя (Сообщ_ подсказка. Ответ, Умалч_знач, Условие) :
! , вводполя (Сообщ_подсказка, Ответ, Умалч_знач, Условие) .
вводсимволов (10, []) :— ! . % 10 — код перевода строки
вводсимволов (С, [С ', Остаток] ) :—
get0(Cl), вводсимволов (С 1, Остаток), ! .
Программа "отобразить_состояние"
% ОТОБРАЗИТЬ СОСТОЯНИЕ
% Составная часть программы, описывающей мир кубиков (см.
% разд. 6.7). Аргументом процедуры "отобразить _состояние/1"
% является имя состояния. Программа печатает картину расположения
% кубиков для данного состояния.
отобразить_ состояние (Состояние) :—
% очистить экран дисплея:
очистка _ экрана,
% в строке 20 вывести слово "стол":
изобразить _ стол (20),
% построить список всех кубиков, находящихся на столе:
findall (Кубик, послать (Состояние, на (Кубик, стол)). Список) ,
% начать вывод изображений кубиков с позиции 10 строки 17:
первый _слой (Состояние, 10, 17, Список),
% оставить курсор под изображением:
курсор (1, 22), ! .
% нарисовать слой кубиков, находящихся непосредственно на столе:
первый_ слой (Состояние, X, Y, [ ] ).
первый _ слой (Состояние, X, Y, [Кубик 1 Список ]) :-
% изобразить первый кубик:
к _кубику (X, Y, Кубик),
% передвинуться вверх:
NY is Y -. 3,
% вывести изображения всех кубиков, стоящих на кубике
% "Кубик":
стек (Состояние, X, NY, Кубик) ,
% сдвинуться вправо:
NX is X+ 10,
! , первый_слой (Состояние, NX, Y, Список) .
% вывести изображения всех кубиков, стоящих на кубике "Кубик":
стек (Состояние, X, Y, Кубик) : -
% взять кубик (если таковой имеется) , стоящий над
% кубиком "Кубик":
послать (Состояние, на (Сверху, Кубик)) ,
к кубику (X,Y,Сверху),
% передвинуться вверх:
NY is Y- 3,
! , стек (Состояние, X, NY, Сверху) .
стек (_ ,_,_,_). % над кубиком "Кубик" нет другого кубика.
к кубику(X, Y, Кубик) :-
курсор (X, Y), write('---'),
NY is Y+ 1,
курсор (X,NY), write(';'),
write (Кубик), write (' ; '),
NNY is Y + 2,
курсор (X,NNY), write('---'), !.
изобразить_стол(Y) :— курсор(1, Y),
write('----------------'),
nl,
write ( ' с т о л '), nl.