Скачиваний:
19
Добавлен:
01.05.2014
Размер:
292.35 Кб
Скачать

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.

Соседние файлы в папке Гл.6,7,Прилож.,Допол