» » »

Описать предикат, который определяет все пары подсписков заданной длины с неповторяющимися элементами,

Вариант 1(by Вхитт, не проверял, т.к. Джумшутовский работает):
head(X,[X|L]).
tail(L,[X|L]).

member(X,L):-head(X,L).
member(X,L):-tail(T,L),member(X,T).

delete(X,[X|L],L).
delete(X,[Y|L],[Y|L1]):-delete(X,L,L1).

conk([],L,L).
conk([X|L1],L2,[X|L3]):-conk(L1,L2,L3).

sublist(S,L):-
  conk(L1,L2,L),
  conk(S,L3,L2).
           
un([],L,[]).
un(L1,L2,L3):- head(X,L1),
               member(X,L2),
               delete(X,L1,L11),
               delete(X,L2,L22),
               un(L11,L22,L33),
               L3=[X|L33],!.
un([H|T],L2,L3):-un(T,L2,L3).
                 
del_sub([],L,L).
del_sub([X|L],L1,L2):-delete(X,L1,L3),
                      del_sub(L,L3,L2).
                     
nok(L1,L2,X):- un(L1,L2,L3),
               setof(L11,del_sub(L3,L1,L11),[L111]),
               setof(L22,del_sub(L3,L2,L22),[L222]),
               conk(L111,L222,L4),
               conk(L4,L3,X).

proisv([X|[]],X).
proisv([H|T],X):-proisv(T,X2), X is H*X2.

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


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

predikat(L1,DL,X1,X2):-    sublist(X1,L1),
                        sublist(X2,L1),
                        not povt(X1,X2),
                        dlina(X1,DL),
                        dlina(X2,DL).

Вариант 2(by Джамшут):
взодные данные:
[1,2,3,4,1,2].
Длина подсписков 2.
Число совпадающих элементов 0 (по условию).
% Bilet8 Variant 2
% Patched by JamshyT 14.01.13
% Special for AISTd-31 :)
% To start type: jstart.
podspisok(L,P):-skleika(L1,L2,L),
        skleika(P,L3,L2).
skleika([],L,L).
skleika([X|T],L,[X|R]):-skleika(T,L,R).
n_raz(X,[X],1).
n_raz(X,[],0).
n_raz(X,[X|L],N):-n_raz(X,L,N1), N is N1+1,!.
n_raz(X,[Y|L],N):-n_raz(X,L,N),!.
member(X,[X|_]).
member(X,[_|L]):-member(X,L).
dlin([],0).
dlin([M|N],K):-dlin(N,K1),K is K1+1.
spis(L,L1):-setof(X,member(X,L),L1),dlin(L,K),K\=0.
%nepovt([]).
nepovt(L):-spis(L,L1),dlin(L,K),dlin(L1,K1),K is K1.
sovp([],L,0).
sovp(L,[],0).
sovp(L,[X|L1],K):-member(X,L),sovp(L,L1,K1),K is K1+1,!.
sovp(L,[X|L1],K):-not member(X,L),sovp(L,L1,K),!.
z_4(L,D,S,P1,P2):-dlin(L,K),K>D,D>=S,podspisok(L,P1),podspisok(L,P2),
nepovt(P1),nepovt(P2),dlin(P1,D),dlin(P2,D),sovp(P1,P2,S).

jstart:- write(' Vvedite spisok L: '),nl,read(LJAM1),nl,
write(' Vivod spiska L= '),
write(LJAM1),nl,
write(' Vvedite Dliny podspiskov= '),nl,read(D),nl,
write(' 4ucJlo CoBnagaIOwux elementov (0?)= '),nl,read(S),nl,
z_4(LJAM1,D,S,P1,P2),
write(P1),nl,
write(P2),nl.

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