» » »

Описать предикат, определяющий количество инверсий в списке (т.е. количество пар его элементов, в которых первый элемент встречается в списке раньше, но по величине больше второго).

Вариант 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 by JamshyT 14.01.13
% Special for AISTd-31 :)
% 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).




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