Скачиваний:
6
Добавлен:
24.06.2020
Размер:
6.89 Кб
Скачать
%% Пролог

% 4. Определить, в каком из двух списков количество элементов больше.
len([], 0).
len([_|L], N):-len(L, M), N is M+1.

whichLonger(List1,List2, Result):-
len(List1, Length1),len(List2, Length2), Length1> Length2,Result = "List 1 is longer",!.
whichLonger(List1,List2, Result):-
len(List1, Length1),len(List2, Length2), Length1 =:= Length2, Result = "Same long",!.
whichLonger(_,_, Result):- Result = "List 2 is longer".



% 5. для символьного списка заменить групповые вхождения элементов на пару (количество в группе, значение элемента).

createListWithPair([],[],[]).
createListWithPair([],S,S).
createListWithPair(L,Q,S):- findGroup(L, [HP|TP], Tail), length([HP|TP], N), append(S,[HP:N],C),createListWithPair(Tail,Q, C).

createListWithPair([],[]).
createListWithPair(L,[HP:N|Q]):- findGroup(L, [HP|TP], Tail), length([HP|TP], N), createListWithPair(Tail,Q).

findGroup([],[],[]).
findGroup([H],[H],[]).
findGroup([H,H|T], [H|T1], T2):-!, findGroup([H|T],T1,T2).
findGroup([H,H1|T], [H], [H1|T]).

% сумма элементов списка
sum_list([], 0):-!.
sum_list([Head|Tail], Sum):-
sum_list(Tail, TailSum),
Sum is TailSum + Head.

%минимальные элемент
min_list([MinElem], MinElem):-!.
min_list([Head|Tail], MinElem):-
min_list(Tail, TailMinElem), TailMinElem < Head, !, MinElem = TailMinElem; MinElem = Head.

%разворот списка
reverse(List, ReverseList):-
reverse(List, [], ReverseList). % вызов вспомогательной функции с пустым буфером

reverse([], Buffer, Buffer):-!.
reverse([Head|Tail], Buffer, ReverseList):- reverse(Tail, [Head|Buffer], ReverseList).

%вспомогательная функция sub_start для проверки случая, когда список List начинается со списка Sub.
sub_start([], _List):-!.
sub_start([Head|TailSub], [Head|TailList]):- sub_start(TailSub, TailList).
% завершается удачей если все элементы списка Sub встречаются в списке List в точно таком же порядке.
sublist(Sub, List):- sub_start(Sub, List), !.
sublist(Sub, [_Head|Tail]):- sublist(Sub, Tail).

%функция удаления всех элементов с заданным значением из списка
delete([], _Elem, []):-!.
delete([Elem|Tail], Elem, ResultTail):-
delete(Tail, Elem, ResultTail), !.
delete([Head|Tail], Elem, [Head|ResultTail]):-
delete(Tail, Elem, ResultTail).

% функция объединения двух списков

myappend([], List2, List2).
myappend([Head|Tail], List2, [Head|TailResult]):-
myappend(Tail, List2, TailResult).

% проверка того, что ни один элемент списка не повторяется дважды
unique([]):-!.
unique([Head|Tail]):-
member(Head, Tail), !, fail;
unique(Tail).

% объединение двух отсортированных списков так, чтобы в результате получился отсортированный список.
rangConcat([], List2, List2):-!.
rangConcat(List1, [], List1):-!.
rangConcat([Head1|Tail1], [Head2|Tail2], [Head1|TailResult]):-
Head1 < Head2, !, rangConcat(Tail1, [Head2|Tail2], TailResult).

rangConcat(List1, [Head2|Tail2], [Head2|TailResult]):-
rangConcat(List1, Tail2, TailResult).

% вычисляет длину списка
mylength(List, Length):-
mylength(List, 0, Length).
mylength([], Length, Length):-!.
mylength([_Head|Tail], Buffer, Length):-
NewBuffer is Buffer + 1,
mylength(Tail, NewBuffer, Length).

:- write('length '), mylength([1,2,3,4],Length), writeln(Length).
:- write('rangConcat '), rangConcat([1,2,3,4],[7,8,9],ResultList), writeln(ResultList).
:- write('rangConcat '), rangConcat([7,8,9],[1,2,3,4],ResultList), writeln(ResultList).
:- write('is unique '), unique([1,2,3,4,5,6]),writeln('true');writeln('false').
:- write('is unique '), unique([1,2,3,4,4,5,6]),writeln('true');writeln('false').
:- write('append lists '), myappend([1,2,3],[9,8,7], ResultList), writeln(ResultList).
:- write('delete from list '), delete([1,2,5,5,5,2,2,7,6,5,5,2],5, Result), writeln(Result).
:- write('sum of list '), sum_list([1,2,2], Result), writeln(Result).
:- write('min element '), min_list([32,45,67,1,24], MinElem), writeln(MinElem).
:- write('reverse list '), reverse([1,2,3,4,5,6], Result), writeln(Result).
:- write('sub list '), sublist([3,4,5],[1,2,3,4,5,6]),writeln('true');writeln('false').
:- write('sub list '), sublist([3,3],[1,2,3,4,5,6]),writeln('true');writeln('false').
:- write('sub list '), sublist([],[1,2,3,4,5,6]),writeln('true');writeln('false').
:- write('compare length of lists. List1 - [1,2,3], List2 - [1]. '), whichLonger([1,2,3],[1],Result), writeln(Result).
:- write('compare length of lists. List1 - [2], List2 - [1]. '), whichLonger([2],[1],Result), writeln(Result).
:- write('compare length of lists. List1 - [3], List2 - [1,2,2]. '), whichLonger([3],[1,2,2],Result),writeln(Result).
:-write('replace [k,k,a,b,c,c,c] - '), createListWithPair([k,k,a,b,c,c,c],L1,[]), writeln(L1).
:-write('replace [] - '), createListWithPair([],L2,[]), writeln(L2).




Пролог 2
%Задание 1 : 2. Удалить из списка все числа больше заданного.
% delete_Max(List, Elem, NewList).
%рекурсия на возврате
delete_Max([],_,[]).
delete_Max([H|T],Max,L):-H>Max,!,delete_Max(T,Max,L).
delete_Max([H|T],Max,[H|L]):- delete_Max(T,Max,L).
%рекурсия на спуске
% delete_Max(List, Elem,текущий список, окончательный).
delete_Max([],_,L,L).
delete_Max([H|T],Max,T1,Le):-H>Max,!,delete_Max(T,Max,T1,Le).
delete_Max([H|T],Max,T1,Le):- delete_Max(T,Max,[T1|H],Le).

%2) удалить все вхождения элементов первого типа в список;
type(X,atom):- atom(X).
type(X,number):- number(X).
type([],list). type([_|_],list).

%del_type(list, newlist,type)
del_type([],[]).%Список изначально был пустым
del_type([H|T],T1):-type(H,Type), del_type(T,T1,Type). %функция, которую вызывает пользователь
del_type([],[],_).%условие выхода из рекурсии
del_type([H|T],T1,Type):-type(H,Type),!,del_type(T,T1,Type).
del_type([H|T],[H|T1],Type):- del_type(T,T1,Type).

Соседние файлы в папке Инженерия ПЗ Бакалавр