Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб. 3 ФЛП

.docx
Скачиваний:
0
Добавлен:
29.05.2025
Размер:
265.4 Кб
Скачать

Лабораторная работа 3

%1

% базовый случай

split(empty, _, empty, empty) :- !.

% если значение меньше X, переход в левое дерево

split(node(Value, Left, Right), X, node(Value, Left, LT), GT) :-

Value < X,

split(Right, X, LT, GT).

% если значение меньше X, переход в правое дерево

split(node(Value, Left, Right), X, LT, node(Value, GT, Right)) :-

Value > X,

split(Left, X, LT, GT).

% если значение равно X, то оно никуда не включается, просто делится на Left и Right

split(node(Value, Left, Right), X, LT, GT) :-

Value =:= X,

split(Left, X, LT, _),

split(Right, X, _, GT).

%split(node(5, node(3, node(2, empty, empty), node(4, empty, empty)), node(8, empty, node(10, empty, empty))), 3, LT, GT)

%split(node(3, node(2, empty, empty), node(4, empty, empty)), 5, LT, GT)

%split(node(8, node(9, empty, empty), node(10, empty, empty)), 7, LT, GT)

%2

% пустое множество

empty_set([ ]) :- !.

%empty_set([ ])

%empty_set([2,4])

% проверка принадлежности элемента множеству

%O(n)

member_set(X, [X|_]) :- !. % если X в начале списка, то он в множестве

member_set(X, [_|T]) :- member_set(X, T). % поиск в хвосте

%member_set(1,[2,1,6])

%member_set(5,[2,1,6])

% добавление элемента в множество (если его там нет)

%O(n)

add_set(X, S, S) :- member_set(X, S), !. % если элемент есть, то он не добавляется

add_set(X, S, [X|S]). % иначе добавляем в начало

%add_set(4,[2,6],S)

%add_set(2,[2,6],S)

% удаление элемента из множества

%O(n)

remove_set(_, [ ], [ ]) :- empty_set([ ]). % пустое множество не меняется

remove_set(X, [X|T], T) :- !. % удаление, если нашли X

remove_set(X, [H|T], [H|T1]) :- remove_set(X, T, T1).

%remove_set(3,[],S)

%remove_set(3,[5,4],S)

%remove_set(3,[5,3,4],S)

%4

%O(n*m)

% объединение двух множеств

union_set([ ], S, S) :- !. % пустое множество + S = S

union_set([H|T], S, U) :- union_set(T, S, U1), add_set(H, U1, U).

%union_set([],[5,2],S)

%union_set([5,2],[],S)

%union_set([5,2],[5,2],S)

%union_set([5,2],[4,6],S)

%union_set([5,2],[4,6,5],S)

% пересечение двух множеств

%O(n*m)

intersection_set([ ], _, [ ]) :- !. % пустое пересечение

intersection_set([H|T1], S, [H|T2]) :- member_set(H, S), !, intersection_set(T1, S, T2).

intersection_set([_|T], S, S1) :- intersection_set(T, S, S1).

%intersection_set([], [2,8], S)

%intersection_set([2,8], [], S)

%intersection_set([2,8], [3,7], S)

%intersection_set([2,8], [3,7,8], S)

% Разность множеств (A \ B)

%O(n*m)

difference_set([ ], _, [ ]) :- !. % если первое множество пустое, то разность пуста

difference_set([H|T], S, S1) :- member_set(H, S), !, difference_set(T, S, S1).

difference_set([H|T1], S, [H|T2]) :- difference_set(T1, S, T2).

%difference_set([], [4,1], S)

%difference_set([7,2], [], S)

%difference_set([7,2], [6,4], S)

%difference_set([7,2], [6,4,7], S)

%3

%O(n*m)

% проверка, является ли Set1 подмножеством Set2

is_subset([], _) :- !. % пустое множество всегда подмножество

is_subset([H|T], S) :- member_set(H, S), is_subset(T, S).

%is_subset([], [5,7,8,9])

%is_subset([4,2], [5,7,8,9])

%is_subset([4,2,7,8], [5,7,8,9])

%is_subset([7,8], [5,7,8,9])

Соседние файлы в предмете Функциональное и логическое программирование