» » »

Определить предикат можно_составить(L1,L2) – из элементов списка L1, не используя никакой из них дважды, можно составить список L2.

Вариант 1(вхитовый) говорит всегда нет, хотя, возможно, я что-то не то ввожу:
% Bilet4
% 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).

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

moshnSost([],L2).
moshnSost([L1|T],L2):-member(L1,L2),delete(L1,L2,L3),moshnSost(T,L3).
jstart:- write(' Vvedite spisok L1: '),nl,read(LJAM1),nl,
write(' Vivod spiska L1= '),
write(LJAM1),nl,
write(' Vvedite spisok L2: '),nl,read(LJAM2),nl,
write(' Vivod spiska L2= '),
write(LJAM2),nl,
moshnSost(LJAM1,LJAM2).

Вариант 2 (работает!):
входные данные:
L1=[1,2,3].
L2=[1,2].
и
L1=[1,2,3,4].
L2=[1,2,2,1].

%20. Определить предикат можно_составить(L1,L2) - из элементов
%списка L1, не используя никакой из них дважды, можно составить список L2.

% Bilet4 Variant 2
% Patched by JamshyT 14.01.13
% Special for AISTd-31 :)
% To start type: jstart.
perestanovka([],[]).
perestanovka(L,[X|P]):-del_el(X,L,L1),
                       perestanovka(L1,P).
del_el(X,[X|L],L).
del_el(X,[Y|L],[Y|L1]):-del_el(X,L,L1).
podposled([],[]).
podposled([_|T],X):-podposled(T,X).
podposled([X|R],[X|T]):-podposled(R,T).
podmno_vo([],[]).
podmno_vo([X|T],P):-podposled([X|T],L),
                    perestanovka(L,P).
sost(L1,L2):-podmno_vo(L1,L2).
jstart:- write(' Vvedite spisok L1: '),nl,read(LJAM1),nl,
write(' Vivod spiska L1= '),
write(LJAM1),nl,
write(' Vvedite spisok L2: '),nl,read(LJAM2),nl,
write(' Vivod spiska L2= '),
write(LJAM2),nl,
sost(LJAM1,LJAM2).            


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