Есть программа на она делает перестановку не со словами а с цифрами, надо поправит.
type
mas=array [1..100] of integer;
var
n,i:integer;
a,p:mas;
procedure vivod(n:integer; var p:mas);
var i,j,imax:integer;
begin
imax:=1; {Определяем количество блоков в разбиении}
for i:=1 to n do
if p[i]>imax then imax:=p[i];
for i:=1 to imax do {Проходим по всем блокам данного разбиения}
begin
write('{'); {Выводим на экран i-й блок}
for j:=1 to n do {Просматриваем все элементы}
if p[j]=i then write(a[j],' '); {Если элемент принадлежит i-му блоку то выводим его на экран}
write('} ') {Блок напечатан}
end;
writeln; {Разбиение напечатано}
end;
procedure razb(i, j: integer); {i- рассматриваемый элемент}
var l: integer; {j- количество блоков в разбиении}
Begin {р - массив пометок, принадлежности к блоку разбиения}
if i>n then vivod(n, p) {Если рассматриваемый элемент больше, чем общее число элементов в множестве, то разбиение сформировано, выводим его}
else
for l := 1 to j do {Просматриваем все блоки}
begin
p[i] := l; {Ставим i-й элемент в l-й блок, l=1,..,j}
if l=j then razb(i+1, j+1) {Если i-й элемент вставили в последний блок, то переходим к следующему элементу i+1 и добавляем новый блок j+1}
else razb(i+1, j) {в противном случае переходим к следующему элементу i+1 не добавляя новый блок}
end;
end;
begin
writeln('Vvedite kol. el. v mnoj');
readln(n);
writeln('vvedite elementi mnoj');
for i:= 1 to n do
read(a[i]);
razb(1,1);
readln;
end.