Вариант 1 (не работает):
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).
conk([],L,L).
conk([X|L1],L2,[X|L3]):-conk(L1,L2,L3).
dlina([],0).
dlina([H|T],X):-dlina(T,X1),X is X1+1.
is([H|T]):-head(X,T),H>T.
sublist(S,L):-
conk(L1,L2,L),
conk(S,L3,L2).
pred(L,Y):-setof(X,predikat(L,X),L2),dlina(L2,Y).
predikat(L,X):-sublist(X,L),dlina(X,2),is(X).
Вариант 2 (работает):
входные данные: список [1,2,4,5,3]
%9. Описать предикат, определяющий количество инверсий в
%списке (т.е. количество пар его элементов, в которых первый
%элемент встречается в списке раньше, но по величине больше второго).
% Bilet5 Variant 2
% Patched 14.01.13
% To start type: jstart.
podposled([],[]).
podposled(X,[_|T]):-
podposled(X,T).
podposled([X|T],[X|R]):-
podposled(T,R).
dlin([],0).
dlin([X|L],K):-dlin(L,K1),K is K1+1.
para(L,P):-podposled(P,L),dlin(P,2).
inv(L,[X|Y]):-para(L,[X|Y]),X>Y.
kol_inv1(L,K,S):-setof(IN,inv(L,IN),S),dlin(S,K).
kol_inv([X],0).
kol_inv([K|[P|L]],N) :-K>P,kol_inv([P|L],N1),N is N1+1.
kol_inv([K|[P|L]],N) :-K=<P,kol_inv([P|L],N).
jstart:- write(' Vvedite spisok L: '),nl,read(LJAM1),nl,
write(' Vivod spiska L= '),
write(LJAM1),nl,
kol_inv(LJAM1,N),
write(N).
Друзья! Приглашаем вас к обсуждению. Если у вас есть своё мнение, напишите нам в комментарии.