%Цветы(Название, Цвет) 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(_,[],[]).