% KSP 19-2-6 2.Permutující slepice perm([],[[]]). perm(S,P) :- perm([],S,[],P). % Procyklíme přes všechny prvky v zadaném seznamu. % Každý prvek utrhneme se seznamu, % rekurzivně vytvoříme všechny permutace se seznamu % bez tohoto prvku a tento prvek předřadíme % před všechny tyto částečné permutace perm(_,[],P,P). perm(Sused,[X|S],P,R) :- spoj(Sused,S,SbezX), % vytvoříme seznam bez daného prvku perm(SbezX,Y), % z tohoto seznamu uděláme všechny permutace pripoj(X,Y,P,Q), % před tyto permutace předřadíme daný prvek perm([X|Sused],S,Q,R). % zavoláme se na další prvek % (cyklíme seznamem dál) % pripoj(Prvek,Sezn,MeziVysl,Vysl) % Předřadí Prvek jako hlavu před všechny seznamy v seznamu % seznamů Sezn (permutace bez prvku Prvek) % Takto vytvořené permutace přidá do seznamu již % vytvořených permutací MeziVysl a výsledek uloží do Vysl pripoj(_,[],P,P). pripoj(X,[Y|Ys],P,[[X|Y]|R]) :- pripoj(X,Ys,P,R). % spoj(Sezn1,Sezn2,VyslSezn) spojí seznamy Sezn1 a Sezn2 % za sebe do VyslSezn spoj([], Sezn2, Sezn2). spoj([Hlava|Telo], Sezn2, [Hlava|Sezn3]) :- % předřadíme Hlavu pred Sezn3, spoj(Telo,Sezn2,Sezn3). % který se nám vrátí z rekurze