Лабораторная работа №5
скачать (56.5 kb.)
Доступные файлы (1):
1.doc | 57kb. | 13.12.2011 22:40 | ![]() |
1.doc
«ЛОГИЧЕСКОЕ ПРОГРАММИРОВАНИЕ»ЛАБОРАТОРНАЯ РАБОТА №5
«Рекурсивные процедуры и списки»
Теория:
Рассмотрите программу, реализующую следующие функции работы со списками:
Формирование списка поэлементно с помощью
добавления элемента в начало списка
или
добавления элемента в конец списка
удаление элемента
удаление всего списка
запись списка в обратном порядке
сортировка списка в нужном порядке (по возрастанию или убыванию).
DOMAINS
list = symbol*
order = inc;dec
PREDICATES
%добавить элемент в начало списка
addfront (list, string, list)
%добавить элемент в конец списка
addend (list, string, list)
%добавить элемент в порядке сортировки
addsort(list, string, list, order)
%удалить все элементы из списка
deleteall(list).
%удалить элемент из списка
delete(list, string, list)
%отсортировать список в порядке order
sort(list, list, order)
%определение порядка: больше или равно
strge(string,string)
%вывод списка
writelist(list)
%получение списка в обратном порядке
revers (list,list)
%целевой предикат
runmenu
%получение списка
main(list)
%выполнение с данным списком операции с %данным номером
oper(list,integer)
%ввод элемента
readitem(string)
%определение типа сортировки
dosort(list,integer)
CLAUSES
addfront(L1,S,[S|L1]).
addend([],S,[S]).
addend([H|L1],S,[H|L2]):-addend(L1,S,L2).
addsort([],S,[S],_).
addsort([H|T],S,[S|[H|T]],inc):-strge(H,S),!.%добавить по возрастанию
addsort([H|T],S,[S|[H|T]],dec):-strge(S,H),!.%добавить по убыванию
addsort([H|L1],S,[H|L2],Order):- addsort(L1,S,L2,Order).
delete([S|T],S,T).
delete([H|L1],S,[H|L2]):-delete(L1,S,L2).
deleteall(_):-main([]).%при удалении элементов из любого списка вызвать предикат main с аргументом в виде пустого списка
strge(G,L):-G>L.
strge(G,L):-G=L.
sort([],[],_).
sort([H|L],L2,Order):-sort(L,L1,Order),addsort(L1,H,L2,Order).
writelist([]).
writelist([S]):-write(S).
writelist([H|T]):-write(H,","),writelist(T).
revers([],[]).
revers([H|T],L):- revers(T,T1),addend(T1,H,L).
/*создание меню*/
runmenu:-
/*makewindow(3,12,12,"Обработка cписков",0,0,25,80),
makewindow(2,30,31,"Меню",9,20,10,40),*/
write("0. Выход\n"),
write("1. Добавить элемент в начало\n"),
write("2. Добавить элемент в конец\n"),
write("3. Удалить элемент из списка\n"),
write("4. Удалить все элементы\n"),
write("5. Отсортировать элементы списка\n"),
write("6. Список в обратном порядке\n"),
main([]).
/*Предикат main(L) выводит на экран полученный список
читает номер пункта меню и запускает соответствующую операцию работы со списком oper(L,C)*/
main(L):-writelist(L),
write("\nВыберите пункт:"),readint(C),oper(L,C).
oper(_,0):-write("Обработка закончена, нажмите Esc"),exit.
oper(L,1):-write("Какой элемент добавить в начало?"),readitem(I),addfront(L,I,L1),write("Полученный список"),main(L1).
oper(L,2):-write("Какой элемент добавить в конец?"),readitem(I),addend(L,I,L1),write("Полученный список"),main(L1).
oper(L,3):-write("Какой элемент удалить?"),readitem(I),delete(L,I,L1),write("Полученный список"),main(L1).
oper(L,4):-deleteall(L).
oper(L,5):-
write("1.По возрастанию\n"),
write("2.По убыванию"),
readint(C),dosort(L,C).
oper(L,6):-revers(L,L1),write("Полученный список"),main(L1).
oper(L,_):-main(L).
readitem(I):-
readln(I).
dosort(L,1):-
sort(L,L1,inc),write("Полученный список"),
main(L1).
dosort(L,2):-
sort(L,L1,dec),write("Полученный список"),
main(L1).
dosort(L,_):-
beep,
main(L).
GOAL
runmenu.
Скачать файл (56.5 kb.)