% nas_seznam(?PL, ?NL) :- NL je naše reprezentace seznamu PL. nas_seznam([], l). nas_seznam([X | Xs], l(X, Ys)) :- nas_seznam(Xs, Ys). % prvek(?X, ?L) :- L je seznam obsahující prvek X. prvek(X, [X | _]). prvek(X, [_ | L]) :- prvek(X, L). prvek_nas(X, l(X, _)). prvek_nas(X, l(_, L)) :- prvek_nas(X, L). % pridej_zacatek(?P, ?L, ?PL) :- PL je seznam L navíc s P na začátku. pridej_zacatek(P, L, [P|L]). % pridej_konec(?P, ?L, ?PL) :- PL je seznam L navíc s P na konci. pridej_konec(X, [], [X]). pridej_konec(X, [L|Ls], [L|PLs]) :- pridej_konec(X, Ls, PLs). % spoj(?A, ?B, ?L) :- L je seznam vzniklý spojením A a B. spoj([], X, X). spoj([L|Ls], X, [L|PLs]) :- spoj(Ls, X, PLs). pridej_konec_alt(P, L, PL) :- spoj(L, [P], PL). % otoc(?L, ?LR) :- LR má pořadí prvků obráceně oproti L. otoc([], []). otoc([X | Ls], LR) :- otoc(Ls, LRs), pridej_konec(X, LRs, LR). % otoc_acc(?L, ?LR) :- otoc/2 s použitím akumlátoru. otoc_acc(L, LR) :- otoc(L, [], LR). % otoc(?L, @A, ?LR) otoc([], A, A). otoc([X|Ls], A, LR) :- otoc(Ls, [X|A], LR). % ======= % Cvičení % ======= lichy([_]). lichy([_,_|L]) :- lichy(L). sudy([]). sudy([_,_|L]) :- sudy(L). liche_prvky([], []). liche_prvky([X], [X]). liche_prvky([A,B | L], [A | OL]) :- liche_prvky(L, OL). prefix1([],_). prefix1([X|Xs], [X|Ys]) :- prefix(Xs,Ys). prefix2(P, L) :- spoj(P, _, L). suffix1(S, L) :- otoc_acc(L, LR), otoc_acc(S, SR), prefix(SR, LR). suffix2(S, L) :- spoj(_, S, L).