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).

Разберитесь в программе и проверьте ее правильность задав вопросы. Что бы узнать все сочетания множества [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

напишите программу поиска всех размещений с повторениями.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: