%Цветы(Название, Цвет)
flower(rose,red).
flower(rose,yellow).
flower(tulpan,green).
flower(romashka,yellow).
flower(fialka,violet).
flower(gvozdika,violet).
flower(gvozdika,red).
/*flower(rose,orange).
flower(gladiolus,orange).
flower(gladiolus,cyan).
flower(nezabudka,blue).
flower(pion,blue).
flower(pion,green).
  */
rainbow(red,orange).
rainbow(orange,yellow).
rainbow(yellow,green).
rainbow(green,cyan).
rainbow(cyan,blue).
rainbow(blue,violet).

% Правило определения следующего лепестка
%next_flower(+Пpедыдущий цвет, -Следующий цветок, Следующий цвет)
next_flower(PColor,Next,NColor):-
	rainbow(PColor,NextColor),
	next_flower1(NextColor,Next,NColor).
next_flower(PColor,Next,NColor):-
	next_flower1(PColor,Next,NColor).
next_flower1(NColor,Next,NColor):-
	flower(Next,NColor).
next_flower1(NColor,Next,NColor1):-
	next_flower(NColor,Next,NColor1),!.
	
% Составление списка растений.
%flower_add(+Пpедыдущий цвет, ?Вpеменный список, -Результат )
flower_add(Color,T1,[(Next,NColor)|T]):-
	next_flower(Color,Next,NColor),
	not find(T1,Next),
	flower_add(NColor,[Next|T1],T).
flower_add(Color,L,[]).

%Главная пpогpамма
%main(+пеpвый цветок,-букет)
main(Cur,[(Cur,Color)|L]):-
	flower(Cur,Color),
	flower_add(Color,[Cur],L),
	length(L,Len),
	Len is 3.

%Поиск заданого элемента в списке	
%find(+List,+El)
find([H|T],H).
find([H|T],El):-
	find(T,El).

main11(Ch):-
	findall(L,main(X,L),[Stand|L_ch]),
	get_color(Stand,N),
	max_level(L_ch,N,[Stand],Ch),!.
%
max_level([],_,L,L).
max_level([H|T1],Num,L2,Ch):-
	get_color(H,Num2),
	Num2>Num,
	max_level(T1,Num2,[H],Ch).
max_level([H|T1],Num,L2,Ch):-
	get_color(H,Num2),
	Num2=Num,
	max_level(T1,Num,[H|L2],Ch).
max_level([_|T1],Num,L2,Ch):-
	max_level(T1,Num,L2,Ch).

%получение клдичества непосторяющихся цветов
get_color(H,Num):-
	unrepeat(H,H1),
	length(H1,Num).

unrepeat([(Cur,Color)|T],[(Cur,Color)|L]):-
	del_item((Cur,Color),T,T1),
	unrepeat(T1,L).
unrepeat([],[]).

del_item((_,Color),[(_,Color)|T],L):-
	del_item((Cur,Color),T,L).
del_item((_,Color),[(Cur,Color1)|T],[(Cur,Color1)|L]):-
	Color \= Color1,
	del_item((Cur,Color),T,L).
del_item(_,[],[]).

	
