2015-01-03 3 views
3

목록의 길이로 (A, B, [...]) 형식으로 구조 목록을 정렬해야합니다. 예를 들어목록의 크기로 구조 목록 정렬

, 내가있는 경우 : 어떻게

[(A,B,[1,2]),(A,B,[1,2,3]),(A,B,[1,2,3,4]),(A,B,[1,2,3,4,5])] 

수행 할 수 정렬 후

[(A,B,[1,2,3,4]),(A,B,[1,2]),(A,B,[1,2,3,4,5]),(A,B,[1,2,3])] 

을 나는이 원하는?

답변

4

각 요소 El을 구조 N-El에 매핑하고 keysort/2을 사용하십시오. 당신의 프롤로그 시스템이 maplist/3를 제공해서는 안

el_keyed(El,N-El) :- 
    El = (_,_,L), 
    length(L, N). 

list_lulasorted(Els, ElsS) :- 
    maplist(el_keyed, Els, KVs), 
    keysort(KVs, KVsS), 
    maplist(el_keyed, ElsS, KVsS). 

this answer를 참조하십시오. 필요 library(lambda)에는 보조 정의를 사용하지 않고, 또는

keyvalue_value(_-V, V). 

..., maplist(keyvalue_value, KVsS, ElsS), ... 

:

list_lulasorted(Els, ElsS) :- 
    maplist(\El^(N-El)^(El=(_,_,L), length(L, N)), Els, KVs), 
    keysort(KVs, KVsS), 
    maplist(\(_-V)^V^true, KVsS, ElsS). 

일부 노트 : (A, B, L) 그것에서만큼 자주하지를

마지막 단계로 '가속'될 수있다 하스켈 또는 ML. 대신 AB의 의미에 따라 .(A, B, L) 또는 (A*B)-L과 같은 구조체를 사용하십시오.