2010-01-21 11 views
1

다음을 수행해야합니다. 목록 목록 제공 목록의 가능한 모든 조합을 찾을 필요가 있습니다. 이러한 목록 중 일부가 그러한 조합에 속해 있으면 요소를 공통으로 사용하고 조합에 목록을 추가하여 작성된 목록은 주어진 길이를가집니다. 어떤 아이디어?목록 목록에서 목록 만들기

예 :

Say P= [[1,2,3],[4,5,6],[2,5],[7,9],[7,10],[8],[10]]. 

N 소정 개수는 N = 10를 말한다. 나는 공통 요소가없는 적절한 목록을 찾고 L의 합집합 길이가 10이되도록 목록 L에 추가해야합니다. 위의 예에서 :

L=[[1,2,3],[4,5,6],[7,9],[8],[10]]. It 아주 쉬울 지 모르지만 나는 프롤로그에서 새로운 사람이다.

+0

예를 들려 줄 수 있습니까? 이렇게하면 질문이 명확해질 수 있습니다. –

+0

매우 명확합니다. – rvirding

+0

왜 이렇게 오래된 스레드에 댓글을 달고 있습니까? Prolog의 분위기가 아주 좋아야합니다. :-) 그는 N 개의 고유 한 (하위) 요소를 포함하는 P의 하위 집합을 요구하는 것처럼 들립니다. 그렇지 않으면 거짓. – azhrei

답변

0

Prolog에서 아무 것도 쓰지 않았기 때문에 아무도 대답을 얻지 못했고, 나는 연습을해야한다고 생각했다.

먼저 조합 생성을 쉽게하기 위해 길이를 여러 번 가져야하는 번거 로움을 피하기 위해 목록을 전처리하여 길이와 쌍을 이루는 용어를 만듭니다. 컷 불필요한 역 추적을 피할 수 :

with_lengths([], []) :- !. 
with_lengths([H|T1], [(Len, H)|T2]) :- 
    length(H, Len), 
    with_lengths(T1, T2). 

다음은 조합을 생성하기 위해 사용하는 comb/3 술어의 :

comb(L, R, Max) :- 
    with_lengths(L, L1), 
    comb1(L1, R, Max). 

comb1/3 실제 작업을 수행합니다. 의견은 진행 상황을 설명합니다.

% Combination works. 
comb1([], [], 0). 
% Try combining the current element with the remainder. 
comb1([(Len, Elem)|T1], [Elem|T2], Max) :- 
    NewMax is Max - Len, 
    comb1(T1, T2, NewMax). 
% Alternatively, ignore the current element and try 
% combinations with the remainder. 
comb1([_|T1], T2, Max) :- 
    comb1(T1, T2, Max).