od univ » 22. 5. 2007 14:55
Kód: Vybrat vše
% natretiny(+,-,-,-)
natretiny(Seznam,Prvni,Druhy,Treti):-
prvni_tretina(Seznam,Prvni,Zbytek),
napoloviny(Zbytek,Druhy,Treti).
% prvni_tretina(+,-,-)
prvni_tretina(Seznam,Prvni,Zbytek):-
tretina2(Seznam,Seznam,Prvni,Zbytek).
% tretina2(+,+,-,-)
tretina2(L1,L2,P,Zb):-
odeber3modre(L1,L1Zb),!,
odeber1modry(L2,PZb,P,L2Zb),
tretina2(L1Zb,L2Zb,PZb,Zb).
tretina2(_,L2,[],L2).
% odeber1modry(+,+,-,-)
odeber1modry([H|L],PZb,[H|L2],Zb):-
modry(H),!,L2=PZb,Zb=L;
odeber1modry(L,PZb,L2,Zb).
% odeber2modre(+,-)
odeber2modre([H|L],Zb):-
modry(H),!,odeber1modry(L,_,_,Zb);
odeber2modre(L,Zb).
% odeber3modre(+,-)
odeber3modre([H|L],Zb):-
modry(H),!,odeber2modre(L,Zb);
odeber3modre(L,Zb).
% napoloviny(+,-,-)
napoloviny(L,L1,L2):-polovina2(L,L,L1,L2).
% polovina2(+,+,-,-)
polovina2(L1,L2,P,Zb):-
odeber2modre(L1,L1Zb),!,
odeber1modry(L2,PZb,P,L2Zb),
polovina2(L1Zb,L2Zb,PZb,Zb).
polovina2(_,L2,[],L2).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% TEST
:-op(100,xfy,->).
modry(m).
s([m,m,a,m,m,b,m,m]).
s([a,m,b,m,c,m,d,m,e,m,f]).
s([a,b,c,m,m,d,e,f,m,g,h,i,m,j,k,l]).
test:-s(X),natretiny(X,L1,L2,L3),write(X->L1+L2+L3),nl,fail.
[code]% natretiny(+,-,-,-)
natretiny(Seznam,Prvni,Druhy,Treti):-
prvni_tretina(Seznam,Prvni,Zbytek),
napoloviny(Zbytek,Druhy,Treti).
% prvni_tretina(+,-,-)
prvni_tretina(Seznam,Prvni,Zbytek):-
tretina2(Seznam,Seznam,Prvni,Zbytek).
% tretina2(+,+,-,-)
tretina2(L1,L2,P,Zb):-
odeber3modre(L1,L1Zb),!,
odeber1modry(L2,PZb,P,L2Zb),
tretina2(L1Zb,L2Zb,PZb,Zb).
tretina2(_,L2,[],L2).
% odeber1modry(+,+,-,-)
odeber1modry([H|L],PZb,[H|L2],Zb):-
modry(H),!,L2=PZb,Zb=L;
odeber1modry(L,PZb,L2,Zb).
% odeber2modre(+,-)
odeber2modre([H|L],Zb):-
modry(H),!,odeber1modry(L,_,_,Zb);
odeber2modre(L,Zb).
% odeber3modre(+,-)
odeber3modre([H|L],Zb):-
modry(H),!,odeber2modre(L,Zb);
odeber3modre(L,Zb).
% napoloviny(+,-,-)
napoloviny(L,L1,L2):-polovina2(L,L,L1,L2).
% polovina2(+,+,-,-)
polovina2(L1,L2,P,Zb):-
odeber2modre(L1,L1Zb),!,
odeber1modry(L2,PZb,P,L2Zb),
polovina2(L1Zb,L2Zb,PZb,Zb).
polovina2(_,L2,[],L2).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% TEST
:-op(100,xfy,->).
modry(m).
s([m,m,a,m,m,b,m,m]).
s([a,m,b,m,c,m,d,m,e,m,f]).
s([a,b,c,m,m,d,e,f,m,g,h,i,m,j,k,l]).
test:-s(X),natretiny(X,L1,L2,L3),write(X->L1+L2+L3),nl,fail.[/code]