%PL 2. kisHF Max_K_Atfedok %Keszitette: Gruber Richard (V1WG4B) :-use_module(library(lists)). levag(L,0,L). levag([_|Farok],K,RESL):- Z is K-1, levag(Farok,Z,RESL). match([],_). match([A|T1],[B|T2]):- A=B, match(T1,T2). katfedo([],[],0). katfedo(K,X,Y):- X=Y -> false ; (length(X,N), length(Y,M), K>0, R is N-K, R2 is M-K, ((R<0 ; R2<0) -> false ; levag(X,R,Marad),match(Marad,Y))). maxhossz([],0). maxhossz([X|XL],H1) :- maxhossz(XL,EDDIGI_MAX), atom_codes(X,ExplodeX), length(ExplodeX,X_HOSSZ), (X_HOSSZ>EDDIGI_MAX -> H1=X_HOSSZ; H1=EDDIGI_MAX). minK(List,K,MinK) :- maxhossz(List,MaxH), (MaxH MinK=MaxH; MinK=K). %Kivalogatja az egy elemhez tartozo megoldasokat egy K eseten maxatfedok(_,_,[],[]). maxatfedok(_,[],_,[]). maxatfedok(K,X,[Y|YL],RES) :- atom_codes(X,ExplodeX), atom_codes(Y,ExplodeY), (katfedo(K,ExplodeX,ExplodeY)-> maxatfedok(K,X,YL,L2), RES=[K-Y|L2]; maxatfedok(K,X,YL,RES)). %Egy elemhez tartozo megoldasok minden K eseten maxatfedok2(K,_,_,[]) :- K<1, !. maxatfedok2(K,X,[Y|YL],RES) :- K2 is K-1, maxatfedok2(K2,X,[Y|YL],L2), maxatfedok(K,X,[Y|YL],L1), append(L2,L1,RES). %Minden elemre lefuttatja a megoldaskeresest maxatfedok4(_,[],_,[]). maxatfedok4(K,[X|XL],[Y|YL],RESList) :- maxatfedok2(K,X,[Y|YL],L1), maxatfedok4(K,XL,[Y|YL],L2), ((L1=[]) -> RESList=L2; RESList = [X-L1|L2] ). max_k_atfedok(_,[],[]). max_k_atfedok(K,List,RESList) :- K>0, sort(List,RList), minK(List,K,MinK), maxatfedok4(MinK,RList,RList,RESList).