
Лаб. 3 ФЛП
.docxЛабораторная работа 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])