» » »

Для данного множества (представленного списком) определите список всех вариантов его разбиения на непересекающиеся подмножества.

% Bilet13
% Patched by JamshyT 14.01.13
% Special for AISTd-31 :)
% To start type: jstart.
head(X,[X|L]).
tail(L,[X|L]).

member(X,L):-head(X,L).
member(X,L):-tail(T,L),member(X,T).
                      
conk([],L,L).
conk([X|L1],L2,[X|L3]):-conk(L1,L2,L3).

sub(S,L):-
  conk(L1,L2,L),
  conk(S,L3,L2).
           

povt([],[]).
povt(L1,L2):-member(X,L1),member(X,L2).

dlina([],0).
dlina([H|T],X):-dlina(T,X1), X is X1+1.

list(L1,L3):-setof((X1,X2),(sub(X1,L1),
             sub(X2,L1),
             not povt(X1,X2)),L3).                       
            
razbPodmn(L1,X):-list(L1,L3),member(X,L3).
jstart:- write(' Vvedite spisok L: '),nl,read(LJAM1),nl,
razbPodmn(LJAM1,X),nl,
write(X).


Друзья! Приглашаем вас к обсуждению. Если у вас есть своё мнение, напишите нам в комментарии.