2014-12-15 6 views
-2

conc 작업을 사용하여 프롤로그의 List에서 첫 번째 N 개의 요소를 잘라내는 프롤로그 프로그램을 작성하는 방법.프롤로그의 List에서 첫 번째 N 개의 요소를 잘라내는 방법

trim(L1,N,L2) which is true if L2 contains the first N elements of L1 

누군가 나를 도와주세요.

내 대답은 정확합니까?

trim(L1, N, L2):- conc(L2,T,L1), length(L2,N),length(L1,N2), N2>= N 
+2

'append/3'을 사용해보세요. –

+0

@ Tudor 답변을 말씀해 주실 수 있습니까? 나는 N을 포함하는 방법과 혼동 스럽다 –

+2

'trim/3' 관계를 표현하기 위해'length/2'와'append/3'을 혼합 해보십시오. –

답변

4

쉬운 솔루션은 이러한 라인을 따라, length/2append/3 사용 순서는별로 중요하지 않습니다

trim(L,N,S) :- % to trim N elements from a list 
    length(P,N) , % - generate an unbound prefix list of the desired length 
    append(P,S,L) . % - and use append/3 to get the desired suffix. 

참고. 이 역시 작동합니다 :

trim(L,N,S) :- % to trim N elements from a list 
    append(P,S,L) , % - split L into a prefix and suffix 
    length(P,N) . % - succeed if the prefix is of the desired length 

나는 강사는 당신이/재귀 솔루션을 파악하고자하는 것을 상상한다. 하나는 목록의 왼쪽 끝에서 항목을 트리밍 알고리즘은 매우 간단 있습니다 있습니다

  • 워크 목록 당신이 N 요소를 방문한 때까지.
  • 일단 작업을 완료하면 원하는 결과가 남습니다. 간단한 해결책에 이르게

: 당신이 학자가되고 싶었 경우

trim(L  , 0 , L) . % Trimming zero elements from a list yields the original, unchanged list 
trim([H|T] , N , R) :- % Otherwise, 
    N > 0 ,    % - assuming N is greater than zero 
    N1 is N-1 ,   % - we decrement N 
    trim(T , N1 , R)  % - and recurse down, discarding the head of the list. 
    .      % That's about all there is too it. 

은, 하나는 목록이 실제로 목록이어야합니다 제약 (또는 적어도 목록과 같은)을 적용 할 수있는, 뭔가 같은 :

trim([] , 0 , [] ) . % Trimming zero elements from the empty list yields the empty list 
trim([H|T] , 0 , [H|T]) . % Trimming zero elements from a non-empty list yields the same list 
trim([H|T] , N , R ) :- % Otherwise, 
    N > 0 ,     % - given that N is greater than zero 
    N1 is N-1 ,    % - we decrement N 
    trim(T , N1 , R)   % - and recurse down, discarding the head of the list. 
    .       % That's about all there is to it. 

주 그 무언가

trim([a,b,c] , 5 , R) . 

같은

이 실패합니다 : R = []으로 위와 같은 것을 만드는 방법을 알아낼 수 있는지 확인하십시오. 힌트 : 어렵지 않습니다.

편집 참고하기 :를 실제로 1 N리스트의 요소를 먹고 싶어하면, 그것은 더 이상 어려운 없습니다 :

prefix_of(L,N,P) :- 
    append(P,_,L) , 
    length(P,N) 
    . 

또는 자신의 압연, 당신은 같은 것을 할 수있는 :

prefix_of(_  , 0 , [] ) . % once we've counted down to zero, close the result list and succeed. 
prefix_of([X|Xs] , N , [X|Ys]) :- % otherwise, 
    N > 1 ,       % - given that N is greater than zero, 
    N1 is N-1 ,      % - decrement N 
    prefix_of(Xs , N1 , Ys)   % - and recurse down, with X prepended to the resullt list. 
    .         % Again, that's about all there is to it. 
+1

Arg3은 "첫 번째 N 집단". 물론 직관적이지 못하며 제목과 일치하지 않습니다. – false

+2

* 순서는 중요하지 않습니다. * 중요합니다. 두 버전 모두 다른 종료 동작을 수행합니다. – false

+0

다른 종료 동작 외에,'trim/3'의 두 버전은 또한 논리적 인 추론의 수를 의미합니다. 성능은 종종 로직 프로그래밍에서는 무시되지만, 여전히 중요한 측면입니다. 두 가지 이유로 (종료와 효율성) '길이', '추가'순서가 선호됩니다. –

관련 문제