Факультет информационных технологий и робототехники




Кафедра программного обеспечения вычислительной техники и автоматизированных систем

 

Отчет по лабораторной работе № 6

по дисциплине: ”Функциональное и логическое программирование”

на тему: ”РАБОТА СО СПИСКАМИ. ”

 

 

Выполнили: студенты группы 02213 Малич К.В. Шарко А.В.

Приняла: ст.пр. Ковалькова И.А.

 

 

Минск 2014

 


 

Задание

 

Цель работы: приобретение навыков работы со списками в программах на Visual Prolog.

Из списка L1 получить список L2, очередной элемент которого равен среднему арифметическому очередной тройки элементов списка L1. Если число элементов списка L1 не кратно 3, то последний элемент списка L2 получается делением на 3 одного или суммы двух последних элементов списка L1. Список L1 вводится по подсказке с экрана. В результате выполнения программы должны выдаваться исходный L1 и результирующий L2 списки.

Удалить все вхождения заданного элемента в списке.

Б Произвести сдвиг элементов списка (не циклический):

на N позиций влево (вправо).

Определить разность между максимальным и минимальным элементами списка.

Удалить первое вхождение заданного элемента в списке.

Вычислить сумму элементов, стоящих в списке на нечетных местах, и сумму элементов, стоящих на четных местах.

Заменить в списке все элементы со значением X на значения Y.

 

Код программы

= real*read_list(integer,list)nov_spisok(integer,list,list)result_list(0,[])._list(N,[H|T]):-readreal(H),N1 = N - 1,read_list(N1,T)._spisok(0,[],[]):-!._spisok(1,[H|T],[H1|T1]):- H1 = H/3,nov_spisok(0,T,T1)._spisok(2,[H|[H1|T]],[H2|T1]):- H2 = (H1+H)/2,nov_spisok(0,T,T1)._spisok(N,[H|[H1|[H2|T]]],[H3|T3]):- H3 = (H+H1+H2)/3,= N - 3,nov_spisok(N1,T,T3).:- write("Vvedite chislo elementov massiva: "),readint(N),nl,("Vvedite elementi massiva: "),nl,read_list(N,H),nov_spisok(N,H,H1),nl,("Noviy spisok: "),write(H1),nl.result.

/*domains=real*read_list(integer,list)resultchg (list, real, list)_list(0,[])._list(N,[H|T]):-readreal(H),N1=N-1, read_list(N1,T).([], _, []) if!.([H|T], H, T1) if chg (T, H, T1),!.([H|T], S, [H|T1]) if chg (T, S, T1),!.:-write("Введите число элементов списка"),nl, write("N="),readint(N),nl,("Вводите элементы списка"),nl, read_list(N,L), write("Исходный список L="),(L),nl,nl,write("Введите искомый элемент"),nl, readreal(E),nl, chg(L, E, LL),write ("Результирующий список:"), nl, write(LL), nl..*/

/*domains=real*read_list(integer,list)resultdel (real, list, list)_list(0,[])._list(N,[H|T]):-readreal(H),N1=N-1, read_list(N1,T).(X, [X|T], T).(X, [Y|T], [Y|T1]) if del(X, T, T1).:-write("Введите число элементов списка"),nl, write("N="),readint(N),nl,("Вводите элементы списка"),nl, read_list(N,L), write("Исходный список L="),(L),nl,nl,write("Введите искомый элемент"),nl, readreal(E),nl, del(E, L, LL),write ("Результирующий список L="), write(LL), nl..*/=integer*.summ_nechet(list,integer, integer)summ_chet(list,integer, integer)readlist(list)_nechet([], _, 0):-!._nechet([H|T], I, R):-mod 2 = 0,!, II = I + 1, summ_nechet(T, II, TR), R = TR + H;= I + 1, summ_nechet(T, II, R)._chet([], _, 0):-!._chet([H|T], I, R):-mod 2 = 1,!, II = I + 1, summ_chet(T, II, TR), R = TR + H;= I + 1, summ_chet(T, II, R).([H|T]):-readint(H),!,readlist(T). readlist([]).("Vvodite elementi spiska"),nl,(L),("Summa chetnih:"),nl,_chet(L, 0, S).*/=integer*(integer,ilist,ilist)._last(ilist,ilist)._last(ilist,ilist).(ilist,integer,ilist).(ilist)._last([_],[]):-!._last([H|Tail],[H|NewTail]):-del_last(Tail,NewTail)._last([],[0]):-!._last([H|Tail],[H|NewTail]):-add_last(Tail,NewTail).(0,L,L):-!.(N,T,L):-del_last(T,T1),N1=N-1,pravo(N1,[0|T1],L).(A,N,B):-pravo(0,A,A1),pravo(N,A1,B).([H|T]):-readint(H),!,readlist(T). readlist([]).("Vvod N "),(N),("Введите элементы (конец ввода - двойное нажатие на ENTER): "),nl,(L),(L,N,B).*/=real*readlist(list).max(list,integer).min(list,integer).res(integer,integer,integer).([X], X).([H|Tail], H)if max(Tail, M), H>M,!.([_|Tail], M)if max(Tail, M).([X], X).([H|Tail], H)if min(Tail, M), H<M,!.([_|Tail], M)if min(Tail, M).(X,Y, R) if R=X-Y.([H|T]):-readint(H),!,readlist(T). readlist([]).("Введите элементы (конец ввода - двойное нажатие на ENTER): "),nl,(L),(L, X),(L,Y),(X, Y, Res).

*/= integer*print(list)replace(list, integer, integer, list)([]):-!.([H|[]]):- write(H).([H|T]):- write(H, ", "), print(T).([], _, _, []):-!.([H|T], X, Y, [H|R]):- H <> X, replace(T, X, Y, R).([H|T], X, Y, [Y|R]):- H = X, replace(T, X, Y, R).("Enter list:"), nl,(list, L), nl,("Enter X:"), nl,(X), nl,("Enter Y:"), nl,(Y), nl,(L, X, Y, R),('['),(R),("]."), nl,(_).

*/

 


 

Скриншоты результатов

 

 

 


 

 

 

 


 

Ответы на контрольные вопросы

 

. Что такое список?

Список - это специальный вид сложного терма, состоящий из последовательности термов, заключенных в квадратные скобки и разделенных запятой. Как обозначается отсечение в программе?

. Голова и хвост списка. Изображение списка в виде головы и хвоста.

Н - голова, Т - хвост списка. Изображается в виде [H|T]. H- первый элемент, Т - список оставшийся.

. Как обозначается пустой список?

. Можно ли изобразить пустой список в виде головы и хвоста?

Нет.

. Что означают следующие виды изображения списка: L, [X], [ _, A], [ _ |T], [H| _ ], [ _ ], [ _,B|C]?- тип списка; [X] - список состоящий из одного элемента; [_,A] - список из двух элементов, первый элемент может принимать любое значение; [ _ |T], - список в котором голова принимает любое значение; [H| _ ] - список в котором не важен хвост; [_] - список из одного элемента значение которого не имеет значения; [ _,B|C] - список в голове которого 2 элемента, и первый может принимать любое значение.

. Может ли быть в голове списка более одного элемента?

Да, может.

. Принадлежит ли элемент 5 списку [[1, 2, 3], [4, 5, 6]]?

Нет, он принадлежит элементу списка.

. Сопоставимы ли два списка: [5, 6, 7] и [H|T]?

Да.

. Можно ли в процедурах ввода списка ввод_списка1 и ввод_списка2 поменять местами первое и второе предложения?

Нет.

. Как нужно изменить процедуру удал_перв_эл, чтобы можно было удалить из списка: a) два первых элемента; б) второй элемент?

удал_перв_эл([ _ | T], T).

А) удал_перв_эл([ _,_| T], T).) удал_перв_эл([ H,_ | T], [H|T]).

. Как нужно изменить процедуру удал_посл_эл, чтобы из списка были удалены: a) два последние элементы; б) предпоследний элемент?

А) удал([_,_],[]).

удал([H|T],[H|T1]) if удал(T,T1).

удал([_],[]).) удал [_,X],[X]).

удал([H|T],[H|T1]) if удал(T,T1).

удал([_],[]).

. Как нужно изменить процедуру выдел_перв_эл, чтобы можно было выделить из списка: a) два первых элемента; б) второй элемент?

А) выдел_перв_эл([H,H1| _ ], H,H1).) выдел_перв_эл([H,H1| _ ], H1).

. Как нужно изменить процедуру выдел_посл_эл, чтобы из списка можно было выделить: a) два последние элементы; б) предпоследний элемент?

А) выдел_посл_эл([X,H], X,H).

выдел_посл_эл([ _ |T], X,H):- выдел_посл_эл(T, X,H).) выдел_посл_эл([X,_], X).

выдел_посл_эл([ _ |T], X):- выдел_посл_эл(T, X).

. Как нужно изменить процедуру доб_эл_в_начало, чтобы можно было вставить заданный элемент между первым и вторым элементами списка?

доб_эл_в_начало(E, [H,H1|T], [H,E,H1|T]).

. Как нужно изменить процедуру доб_эл_в_конец, чтобы заданный элемент вставился перед последним элементом списка?

доб_эл_в_конец(E, [H], [E,H]).

доб_эл_в_конец(E, [H|T], [H|T1]):- доб_эл_в_конец(E, T, T1).

. Можно ли в программе со списками обойтись без раздела domains?

Нет

список вхождение хвост нечетный


 

Вывод

 

Приобрели навыки работы со списками в программах на Visual Prolog.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2020-03-12 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: