Работа со списками

Приобретение навыков работы со списками в программах на Visual Prolog. Изображение списка в виде головы и хвоста. Удаление всех вхождений элемента в списке. Обозначение пустого списка. Вычисление суммы элементов, стоящих в списке на нечетных местах.

Рубрика Программирование, компьютеры и кибернетика
Вид лабораторная работа
Язык русский
Дата добавления 27.11.2014
Размер файла 94,9 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РЕСПУБЛИКИ БЕЛАРУСЬ

БЕЛОРУССКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

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

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

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

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

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

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

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

Минск 2014

Задание

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

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

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

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

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

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

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

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

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

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

domains

list = real*

predicates

nondeterm read_list(integer,list)

nondeterm nov_spisok(integer,list,list)

nondeterm result

clauses

read_list(0,[]).

read_list(N,[H|T]):-readreal(H),N1 = N - 1,read_list(N1,T).

nov_spisok(0,[],[]):-!.

nov_spisok(1,[H|T],[H1|T1]):- H1 = H/3,nov_spisok(0,T,T1).

nov_spisok(2,[H|[H1|T]],[H2|T1]):- H2 = (H1+H)/2,nov_spisok(0,T,T1).

nov_spisok(N,[H|[H1|[H2|T]]],[H3|T3]):- H3 = (H+H1+H2)/3,

N1 = N - 3,nov_spisok(N1,T,T3).

result :- write("Vvedite chislo elementov massiva : "),readint(N),nl,

write("Vvedite elementi massiva : "),nl,read_list(N,H),nov_spisok(N,H,H1),nl,

write("Noviy spisok : "),write(H1),nl.

Goal result.

/*domains

list=real*

predicates

nondeterm read_list(integer,list)

nondeterm result

nondeterm chg (list, real, list)

clauses

read_list(0,[]).

read_list(N,[H|T]):-readreal(H),N1=N-1, read_list(N1,T).

chg ([], _ , []) if !.

chg ([H|T], H, T1) if chg (T, H, T1),!.

chg ([H|T], S, [H|T1]) if chg (T, S, T1),!.

result:-write("Введите число элементов списка"),nl, write("N="),readint(N),nl,

write("Вводите элементы списка"),nl, read_list(N,L), write("Исходный список L="),

write (L),nl,nl,write("Введите искомый элемент"),nl, readreal(E),nl, chg(L, E, LL),write ("Результирующий список:"), nl, write(LL), nl.

goal

result.*/

/*domains

list=real*

predicates

nondeterm read_list(integer,list)

nondeterm result

nondeterm del (real, list, list)

clauses

read_list(0,[]).

read_list(N,[H|T]):-readreal(H),N1=N-1, read_list(N1,T).

del(X, [X|T], T).

del(X, [Y|T], [Y|T1]) if del(X, T, T1).

result:-write("Введите число элементов списка"),nl, write("N="),readint(N),nl,

write("Вводите элементы списка"),nl, read_list(N,L), write("Исходный список L="),

write (L),nl,nl,write("Введите искомый элемент"),nl, readreal(E),nl, del(E, L, LL),write ("Результирующий список L="), write(LL), nl.

goal

result.*/

domains

list=integer*.

predicates

nondeterm summ_nechet(list,integer, integer)

nondeterm summ_chet(list,integer, integer)

nondeterm readlist(list)

Clauses

summ_nechet([], _, 0):-!.

summ_nechet([H|T], I, R):-

I mod 2 = 0, !, II = I + 1, summ_nechet(T, II, TR), R = TR + H;

II = I + 1, summ_nechet(T, II, R).

summ_chet([], _, 0):-!.

summ_chet([H|T], I, R):-

I mod 2 = 1, !, II = I + 1, summ_chet(T, II, TR), R = TR + H;

II = I + 1, summ_chet(T, II, R).

readlist([H|T]):-readint(H),!,readlist(T). readlist([]).

goal

write("Vvodite elementi spiska"),nl,

readlist(L),

write("Summa chetnih:"),nl,

summ_chet(L, 0, S).*/

domains

ilist=integer*

predicates

pravo(integer,ilist,ilist).

del_last(ilist,ilist).

add_last(ilist,ilist).

b(ilist,integer,ilist).

readlist(ilist).

clauses

del_last([_],[]):-!.

del_last([H|Tail],[H|NewTail]):-del_last(Tail,NewTail).

add_last([],[0]):-!.

add_last([H|Tail],[H|NewTail]):-add_last(Tail,NewTail).

pravo(0,L,L):-!.

pravo(N,T,L):-del_last(T,T1),N1=N-1,pravo(N1,[0|T1],L).

b(A,N,B):-pravo(0,A,A1),pravo(N,A1,B).

readlist([H|T]):-readint(H),!,readlist(T). readlist([]).

goal

write("Vvod N "),

readint(N),

write("Введите элементы (конец ввода - двойное нажатие на ENTER): "),nl,

readlist(L),

b(L,N,B).*/

domains

list=real*

predicates

nondeterm readlist(list).

nondeterm max(list,integer).

nondeterm min(list,integer).

nondeterm res(integer,integer,integer).

clauses

max([X], X).

max([H|Tail], H)if max(Tail, M), H>M,!.

max([_|Tail], M)if max(Tail, M).

min([X], X).

min([H|Tail], H)if min(Tail, M), H<M,!.

min([_|Tail], M)if min(Tail, M).

res(X,Y, R) if R=X-Y.

readlist([H|T]):-readint(H),!,readlist(T). readlist([]).

goal

write("Введите элементы (конец ввода - двойное нажатие на ENTER): "),nl,

readlist(L),

max(L, X),

min(L,Y),

res(X, Y, Res).

*/

domains

list = integer*

predicates

nondeterm print(list)

nondeterm replace(list, integer, integer, list)

clauses

print([]) :- !.

print([H|[]]) :- write(H).

print([H|T]) :- write(H, ", "), print(T).

replace([], _, _, []) :- !.

replace([H|T], X, Y, [H|R]) :- H <> X, replace(T, X, Y, R).

replace([H|T], X, Y, [Y|R]) :- H = X, replace(T, X, Y, R).

goal

write("Enter list:"), nl,

readterm(list, L), nl,

write("Enter X:"), nl,

readint(X), nl,

write("Enter Y:"), nl,

readint(Y), nl,

replace(L, X, Y, R),

write('['),

print(R),

write("]."), nl,

readchar(_).

*/

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

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

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

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

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

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

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

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

Нет.

5. Что означают следующие виды изображения списка: L, [X], [ _ , A], [ _ |T], [H| _ ], [ _ ], [ _ ,B|C] ?

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

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

Да, может.

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

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

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

Да.

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

Нет.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Нет

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

Вывод

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

Размещено на Allbest.ru


Подобные документы

  • Понятие и обработка списков. Имя домена списка. Примеры записи списков. Основные принципы работы со списками. Рекурсивная программа обработки списка. Определение номера элемента или элемента по номеру. Решение задач, использующих структуру графа.

    презентация [65,0 K], добавлен 29.07.2012

  • Операции, осуществляемые с однонаправленными списками. Порядок создания однонаправленного списка, вставка и удаление элементов. Алгоритмы основных операций с двунаправленными списками. Примеры реализации однонаправленных и двунаправленных списков.

    курсовая работа [172,7 K], добавлен 20.01.2016

  • Расположение элементов списка в памяти. Информация о полях структуры TMember. Логическая структура двусвязного кольцевого списка. Логические схемы наиболее важных операций со списками. Алгоритмы обработки основных структур. Руководство пользователя.

    курсовая работа [2,3 M], добавлен 27.08.2012

  • Формирование матрицы и выполнение заданий: вычисление сумы четных элементов; максимума из нечетных элементов в строке; произведение элементов в нечетных столбцах; количество четных элементов выше главной диагонали. Создание программы в Visual Basic.

    контрольная работа [12,0 K], добавлен 07.10.2012

  • Решение задачи на составление компромиссного списка. Построение математической модели. Цена перемещения элементов. Вывод программы. Закреплении элемента а1 на первом месте, а а4 на пятом. Матрица оценок для задачи. Оптимальное решение в виде списка.

    курсовая работа [37,5 K], добавлен 30.01.2016

  • Общие сведения о Microsoft Excel. Формирование таблицы продаж в виде списка. Создание формы для ввода информации командой Данные-Форма. Выполнение сортировки, фильтрации данных в списке. Формирование промежуточных итогов по ежемесячной прибыли.

    курсовая работа [23,5 K], добавлен 16.12.2010

  • Создание классов, реализующих работу со списками и применение их к задаче построения графических моделей. Использование языка С++ для реализации списковой структуры. Назначение и условия применения программы. Руководство для программиста и оператора.

    курсовая работа [131,1 K], добавлен 19.03.2010

  • Стандартные функции для работы с динамической памятью. Представление списков цепочками звеньев. Организация файлового каталога в файловой системе в виде линейного списка на языке Visual C++. Создание блок-схемы и инструкции по работе с программой.

    курсовая работа [252,0 K], добавлен 22.01.2015

  • Правила задавания адреса при создании гиперссылок, применение атрибутов и тэгов. Способы создания якоря (метки). Использование рисунков в качестве гиперссылки. Работа с упорядоченными, неупорядоченными и вложенными списками, списками определений.

    презентация [347,9 K], добавлен 19.08.2013

  • Основы языка Visual Prolog. Введение в логическое программирование. Особенности составления прологов, синтаксис логики предикатов. Программы на Visual Prolog. Унификация и поиск с возвратом. Использование нескольких значений как единого целого.

    лекция [120,5 K], добавлен 28.05.2010

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.