2016-10-26 15 views
1

例は私が何をしようとしているかをより良く説明します。 例えば、私はこのプロローグリストを持っている:リストのすべての繰り返し要素から最小値を選択してください

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

そして、私はこのリストを生成したい:

L'=[(d,15),(g,23),(e,14),(h,23)] 

これは、要素(X、_)のすべての出現から、との1を残しています最小Y.

答えて

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

ないエレガントを試すことができますが、それは私が望んでいたものだし、それが動作します。ありがとう! – 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

あなたは

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). 
例えば

?- 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. 
関連する問題