2014-03-19 1 views
0

특정 목록 구성원 절차를 적용하고, 그 목록에있는 모든 고유 요소를 제거합니다 예를 들어프롤로그 - 나는 목록을받는 함수를 가지고

repeating(Q, L):- 
     repeating(Q, Q, L). 
repeating([], _, []). 
repeating([H | T], Q, [H | L]):- 
     count(H, Q, N), 
     N > 1, !, 
     repeating(T, Q, L). 
repeating([H | T], Q, L):- 
     count(H, Q, N), 
     N = 1, 
     repeating(T, Q, L). 

repeating([1, 2, 3, 4, 5, 2, 7, 7, 3, 8], X). 

주는 쿼리를

X = [2, 3, 2, 7, 7, 3]. 

이 요소를 네 개의 요소 긴 목록으로 구성된 목록에 적용하고 세 번째 요소 만 검사하여 예를

repeating([[1, 2, 3, 4], [5, 6, 7, 8], [3, 5, 7, 9], [4, 3, 2, 1]], X). 

고유하지 않은 세 번째 요소를했다

X = [[5, 6, 7, 8], [3, 5, 7, 9]. 

만 목록을 반환합니다. 내 코드는 이제 첫 번째 코드와 같은 간단한 목록에만 적용되며, 아침마다 여러 요소가 포함 된 긴 목록의 4 개 목록에 대해 이러한 경우에 적용되도록 수정하는 방법을 고안했습니다. 그렇게 할 수있는 방법을 찾지 못했고 이것에 대한 약간의 지침을 매우 고맙게 생각합니다.

감사합니다.

+0

이 변경은'count'에 영향을 미치지 만'repeating'에 전혀 영향을 미치지 않을 수 있습니다. 'count'에서 여러분이 세고있는 원소를'[_, _, X, _]'로 처리하고 일치하는 세번째 원소를 센다. 제 생각에 원자 목록에 제약이 없기 때문에 '반복'이라고 생각합니다. – lurker

답변

1

는 각리스트의 세 번째 요소를 검색하는 기능을 가져, 다음 기예르모의 솔루션에서 이러한 요소

%get the third element of a list 
third([_,_,E|_], E). 

%Build a list made of the third elements of the input list 
buildthirdslist([],[]). 
buildthirdslist([X|Xl],[Th|Thl]):- 
    third(X,Th), 
    buildthirdslist(Xl,Thl). 


%Your code adapted 
repeatingthirds(Q, L):- 
    buildthirdslist(Q,Ths), 
     repeatingthirds(Q, Ths, L). 

repeatingthirds([], _, []). 

repeatingthirds([H | T], Q, [H | L]):- 
    third(H,Th), 
     count(Th, Q, N), 
     N > 1, !, 
     repeatingthirds(T, Q, L). 

repeatingthirds([H | T], Q, L):- 
    third(H,Th), 
     count(Th, Q, N), 
     N = 1, 
     repeatingthirds(T, Q, L). 
+0

이것은 아주 훌륭합니다. 읽는대로 매우 감동했습니다. 그것은 매우 간단하고 내가 한 것만 큼 완벽하게 수행 할 수 있으며, 심지어 코드를 읽고 무슨 일이 일어 났는지 쉽게 이해할 수 있습니다. 고맙습니다. – Qiri

+0

대단히 감사합니다 :) –

0

그냥 약간의 변화를 확인하여 코드를 적용 할 수 있습니다. |

| ?- repeating([[1, 2, 3, 4], [5, 6, 7, 8], [3, 5, 7, 9], [4, 3, 2, 1]], X). 

X = [[5,6,7,8],[3,5,7,9]] ? a 

no 

:이 사람은 변경하지 않고 repeating 조건을 나뭇잎과 count 다른 사용

repeating(Q, L):- 
     repeating(Q, Q, L). 
repeating([], _, []). 
repeating([H | T], Q, [H | L]):- 
     count(H, Q, N), 
     N > 1, !, 
     repeating(T, Q, L). 
repeating([H | T], Q, L):- 
     count(H, Q, N), 
     N = 1, 
     repeating(T, Q, L). 

count(H, Q, N) :- 
    count(H, Q, 0, N). 
count([_,_,E,_], [[_,_,E,_]|T], A, N) :- 
    A1 is A + 1, 
    count([_,_,E,_], T, A1, N). 
count([_,_,E,_], [[_,_,X,_]|T], A, N) :- 
    E \= X, 
    count([_,_,E,_], T, A, N). 
count(_, [], A, A). 

빠른 테스트를 ? -