2016-10-26 3 views

답변

1

정말 멋지지만 ... 다음 코드는 어떻게됩니까?

filterList([(d,15),(e,16),(g,23),(e,14),(h,23),(d,19)], L) 

내가 얻을에서

getFirst((X, _), X). 

isMinor(_, []). 

isMinor((X1, Y1), [(X2, _) | T]) :- 
    X1 \= X2, 
    isMinor((X1, Y1), T). 

isMinor((X, Y1), [(X, Y2) | T]) :- 
    Y1 =< Y2, 
    isMinor((X, Y1), T). 

purgeList(_, [], []). 

purgeList(X1, [(X2, Y2) | Tin], [(X2, Y2) | Tout]) :- 
    X1 \= X2, 
    purgeList(X1, Tin, Tout). 

purgeList(X, [(X, _) | Tin], Tout) :- 
    purgeList(X, Tin, Tout). 

filterList([], []). 

filterList([H1 | Tin1], [H1 | Tout]) :- 
    isMinor(H1, Tin1), 
    getFirst(H1, X), 
    purgeList(X, Tin1, Tin2), 
    filterList(Tin2, Tout). 

filterList([H1 | Tin], Tout) :- 
    \+ isMinor(H1, Tin), 
    filterList(Tin, Tout). 

[(d,15),(g,23),(e,14),(h,23)] 
+0

를 들어

test((V, N), Y, Z) :- ( member((V,N1), Y) -> ( N < N1 -> select((V,N1), Y, (V,N), Z) ; Z = Y) ; append(Y, [(V,N)], Z)). my_select(In, Out) :- foldl(test, In, [], Out). 

시도 할 수 있습니다,하지만 그건 내가 원한과 작동거야. 감사! – thomas12

1

당신은 또한 쓸 수 (L이와 통합됩니다) :

select_elements(L,Lout):-   
    sort(L,L1), 
    reverse(L1,L2), 
    remove(L2,L3), 
    output_list(L,L3,Lout). 

remove([],[]). 
remove([H],[H]). 
remove([(X,Y1),(X,Y2)|T],[(X,Y1)|T1]):-remove([(X,Y2)|T],T1). 
remove([(X1,Y1),(X2,Y2)|T],[(X1,Y1)|T1]):- 
     dif(X1,X2),\+member((X2,_),T), 
     remove([(X2,Y2)|T],T1). 
remove([(X1,Y1),(X2,_)|T],[(X1,Y1)|T1]):- 
     dif(X1,X2),member((X2,_),T), 
     remove(T,T1). 


output_list([],_,[]). 
output_list([H|T],L,[H|T1]):-member(H,L),output_list(T,L,T1). 
output_list([H|T],L,T1):- \+member(H,L),output_list(T,L,T1). 

예 :

?- select_elements([(d,15),(e,16),(g,23),(e,14),(h,23),(d,19)],L). 
L = [ (d, 15), (g, 23), (e, 14), (h, 23)] ; 
false. 
0

당신은 예를 우아하지

?- my_select([(d,15),(e,16),(g,23),(e,14),(h,23),(d,19)], Out). 
Out = [(d,15),(e,14),(g,23),(h,23)] ; 
false. 
관련 문제