combin2_rep([],C,C).
combinK(C1,A1,R,K,C):-K1 is K+1,K1=<R,
CombinK_K1(C1,A1,L),combinK(L,A1,R,K1,C).
CombinK(C,A1,R,R,C).
combinK_K1(C1,A,C):-comb(C1,A,[],C).
comb(C1,[H|A1],Ac,C):-
Findall(X,(member(X,C1),member(H,X)),L),difset(C1,L,C2),
Findall(X,(member(Y,C2),add(H,Y,X)),C1H),
Append(Ac,C1H,Ac1),comb(C2,A1,Ac1,C).
comb([],A1,C,C).
add(X,L,[X|L]).
Difset(X,Y,T):-dif1(X,Y,X,T).
dif1([R|X],Y,[R|Z],T):-not(member(R,Y)),
append(Z,[R],Z1),dif1(X,Y,Z1,T).
dif1([R|X],Y,[R|Z],T):-member(R,Y),dif1(X,Y,Z,T).
dif1([],Y,Z,Z).
append([],L,L).
append([X|L1],L2,[X|L3]):-append(L1,L2,L3).
member(X,[X|Y]).
member(X,[Y|Z]):-member(X,Z).
Разберитесь в программе и проверьте ее правильность задав вопросы. Что бы узнать все сочетания множества [a,b,c,d,e] по 4 необходимо задать вопрос:
?- d(A,4,R).
ПРОГРАММЫ ВЫЧИСЛЕНИЯ РАЗМЕЩЕНИЙ БЕЗ ПОВТОРЕНИЙ
Размещение из n элементов по r есть упорядоченный набор, состоящий из r Попарно различных элементов, взятых из n-элементного множества M.
Обозначим через ArM множество всех размещений из n элементов по r и через Arn число всех размещений из n элементов по r. Заметим, что для n-элементного множества M множество перестановок PM=AnM, а их число Pn=Ann.
Пример. M={a,b,c}; A1M={(a),(b),(c)}; A2M={(a,b),(a,c),(b,c),(b,a),(c,a),(c,b)}; A31=|A1M|=3; A23=|A2M|=6.
|
|
Процедура allocation(A,R,Res) вычисляет множество Res размещений элементов алфавита A по R элементов в каждом размещении.
Процедуры combination и permutation вычисляют множества сочетаний и перестановок; подробнее о них сказано в соответствующих программах.
Процедура comb_permut(C,R) по сочетанию C строит множество R всех его перестановок.
d(A,R,Res):-A=[a,b,c,d,e],allocation(A,R,Res).
allocation(A,R,Res):-length(A,L),(R=0;R>L), Res=[].
allocation(A,R,Res):-length(A,L),R=1,Res=A.
allocation(A,R,Res):-length(A,L),R\=0,R<L+1,R\=1,combination(A,R,C), comb_permut(C,Res).
comb_permut(C,R):-comb_permut1(C,[],R).
comb_permut1([H|T],Ac,R):-permulation(H,PH),
Append(Ac,PH,Ac1),comb_permut1(T,Ac1,R).
comb_permut1([],R,R).
Permulation(A,L):-findall(P,permut(A,P),L).
permut([],[]).
permut([X|L],P):-permut(L,L1),insert(X,P,L1).
insert(X,[X|T],T).
insert(X,[Y|T],[Y|T1]):-insert(X,T,T1).
insert(X,[],[X]).
Combination(A,R,C):-combin2(A,C1),combinK(C1,A,R,2,C).
combin2(A,C1):-combin2_rep(A,[],C1).
combin2_rep([H|T],Ac,C):-findall([H,X],member(X,T),L),
Append(Ac,L,L1),combin2_rep(T,L1,C).
combin2_rep([],C,C).
combinK(C1,A1,R,K,C):-K1 is K+1,K1=<R,
CombinK_K1(C1,A1,L),combinK(L,A1,R,K1,C).
CombinK(C,A1,R,R,C).
combinK_K1(C1,A,C):-comb(C1,A,[],C).
comb(C1,[H|A1],Ac,C):-
Findall(X,(member(X,C1),member(H,X)),L),difset(C1,L,C2),
Findall(X,(member(Y,C2),add(H,Y,X)),C1H),
Append(Ac,C1H,Ac1),comb(C2,A1,Ac1,C).
comb([],A1,C,C).
add(X,L,[X|L]).
Difset(X,Y,T):-dif1(X,Y,X,T).
dif1([R|X],Y,[R|Z],T):-not(member(R,Y)),
append(Z,[R],Z1),dif1(X,Y,Z1,T).
dif1([R|X],Y,[R|Z],T):-member(R,Y),dif1(X,Y,Z,T).
dif1([],Y,Z,Z).
append([],L,L).
append([X|L1],L2,[X|L3]):-append(L1,L2,L3).
member(X,[X|Y]).
member(X,[Y|Z]):-member(X,Z).
ЗАДАНИЕ 1.1
Напишите программу поиска всех перестановок с повторениями
ЗАДАНИЕ 1.2
Напишите программу поиска всех сочетаний с повторениями
ЗАДАНИЕ 1.3
напишите программу поиска всех размещений с повторениями.