
Лаб. 8 ФЛП
.docxЛабораторная работа 8
%1
nu(X, Y) :-
X = Y, % Пробуем установить X = Y
!, % Если X = Y, используем cut, чтобы избежать возврата.
fail. % Если X = Y, неудача (аналог \+).
nu(_, _). % Если X не равно Y, то успешно завершаем.
% nu(X, X)
% nu(X, foo(Y))
% nu(4, 5)
%2
% Без сечений
abs(X, X) :-
X >= 0.
abs(X, Abs) :-
X < 0,
Abs is -X.
%abs(3, A)
%abs(-1, A)
% С Сечениями
% Определение для положительных чисел и нуля
abs2(X, X) :-
X >= 0, !.
% Определение для отрицательных чисел
abs2(X, Abs) :-
X < 0,
Abs is -X.
%abs2(3, A)
%abs2(-1, A)
%3
% База: объединение пустого списка с любым списком - это сам этот список
set_union([], List2, List2).
% Если элемент из List1 не встречается в Result, добавляем его в Result
set_union([Head | Tail], List2, Result) :-
member(Head, List2), % Проверяем, если элемент уже есть в List2
set_union(Tail, List2, Result). % Рекурсивно объединяем остальные элементы
% Если элемент из List1 не встречается в List2, добавляем его в Result
set_union([Head | Tail], List2, [Head | Result]) :-
\+ member(Head, List2), % Если элемент не встречается в List2
set_union(Tail, List2, Result). % Рекурсивно продолжаем с Tail
%set_union([1,2,3,4,5], [4,5,6,7], Result)
%set_union([1,2,3], [2,3,4], Result)
%5
% Базовый случай: пустой список -> пустой результат
unifiable([], _, []).
% Если Head унифицируется с Term (без изменения переменных), добавляем его в результат
unifiable([Head | Tail], Term, [Head | Result]) :-
\+ \+ (Head = Term), % Временная проверка унификации без изменения переменных
unifiable(Tail, Term, Result).
% Если Head не унифицируется с Term, пропускаем его
unifiable([_ | Tail], Term, Result) :-
unifiable(Tail, Term, Result).
%unifiable([X, b, t(Y)], t(a), List)
%unifiable([foo(A), bar, foo(B), baz(C)], foo(x), List)
%unifiable([a, b, c], d, List)
/*
?- X = a, X == a.
X = a. % True, X связан с a
?- X == a.
false. % X ещё не связан с a, проверка == не позволяет связывать переменные
?- \+ \+ (X = a).
true. % Проверка, возможно ли X = a, но X остаётся свободным
*/