2012-05-14 5 views
2

나는리스트의 크기를 평가하는 조건부를 작성하려고했는데,리스트의 길이 또는 산술 연산을 계산하지 않아도된다. 그것은 아마 길이를 계산하는 것보다 쉬울 지 모르지만 나는 그것없이 그것을하는 방법을 생각하는 데 어려움을 겪고있다. 나는 일종의 재귀 기술을 추측하고 있지만 누구라도 도움이된다면 훌륭 할 것입니다.프롤로그에서 짝수 크기의 목록

+1

짝수 길이의 목록에 관심이 있습니다. – false

답변

1

나는 귀하의 질문에 답변을 너무 늦게 알아,하지만 희망이 도움이됩니다

목록을 찾으려면 홀수 길이 :

evenlength([]). 
evenlength([X,Y|R]) :- evenlength(R),!. 
: 목록을 찾으려면

oddlength([X]). 
oddlength([X,Y,Z]). 
oddlength([X,Y|R]) :- oddlength(R),!. 

도 길이가

+1

홀수/짝수 목록 길이 만 신경 쓰면 재귀 호출의 목록 꼬리를 제외하고 익명 변수를 자리 표시 자로 사용하십시오. –

+1

나는이 답변을 게시했으나 숙제에 관한 질문이므로 삭제했다. 일반적으로 숙제를하는 사람들에게 전체 솔루션을 제공하지 마십시오. 복사하여 붙여 넣습니다. – keyser

+0

@keyser 물론, 저는 여기 새로 왔습니다. 조언 해 주셔서 감사합니다. –

7

예, 재귀를 원합니다. 기본 케이스는 가질 수있는 가장 작은 홀수/짝수리스트가 될 것이고, 그러면 재귀 호출을 구성하여 기본 케이스로 끓일 수있는 방법을 알아내는 것만으로도 충분합니다. "oddList"에 대해 true를 반환해야하는 길이 3의 목록을 상상해보십시오. 기본 사례가 아니라면 다음 논리적 단계는 무엇입니까? 홀수 목록과 홀수 목록은 어떻게 다른가요?

+1

프롤로그에는 기능이 없습니다. –

+0

@larsmans 거기 우리가 (편집) – keyser

+0

+1, 좋은 힌트. – sharky

3

보존 ! 간단하게 다음과 같이 진행 :

evenlength([]).    % smallest list with even length is [] (length=0) 
evenlength([_|Xs]) :- 
    oddlength(Xs). 

oddlength([_|Xs]) :-  % smallest list with odd length is [_] (length=1) 
    evenlength(Xs). 

몇 가지 간단한 접지 evenlength/1에 대한 쿼리 및 oddlength/1 : 이러한 조건뿐만 아니라 테스트 후보 목록뿐만 아니라 그것들을 생성 할 수

?- evenlength([]). 
true. 
?- oddlength([]). 
false. 

?- evenlength([1]). 
false. 
?- oddlength([1]). 
true. 

?- evenlength([1,2]). 
true.  
?- oddlength([1,2]). 
false. 

?- evenlength([1,2,3]). 
false.  
?- oddlength([1,2,3]). 
true. 

참고 :

?- evenlength(Xs). 
    Xs = [] 
; Xs = [_A,_B] 
; Xs = [_A,_B,_C,_D] 
; Xs = [_A,_B,_C,_D,_E,_F] 
... 

?- oddlength(Xs). 
    Xs = [_A] 
; Xs = [_A,_B,_C] 
; Xs = [_A,_B,_C,_D,_E] 
; Xs = [_A,_B,_C,_D,_E,_F,_G] 
... 
+1

왜'... sized/1'입니까?크기는 종종 모든 인수를 포함하는 용어 크기를 의미합니다. – false

+1

왜 'evenlength/2'가 아닌가? – false

1

foldl/4Prolog lambdas을 사용하면 다음을 수행하면됩니다.

evenlength(Xs) :- 
    foldl(\_^E^O^(O is \E),Xs,1,1). % each item in `Xs` flips the "evenness flag" 

샘플 사용

?- evenlength([]). 
true. 

?- evenlength([_]). 
false. 

?- evenlength([_,_]). 
true. 

?- evenlength([_,_,_]). 
false. 

?- evenlength([_,_,_,_]). 
true. 

은의 가장 일반적인 쿼리에 대해 잊지 말자!

?- evenlength(Xs). 
    Xs = [] 
; Xs = [_A,_B] 
; Xs = [_A,_B,_C,_D] 
; Xs = [_A,_B,_C,_D,_E,_F] 
... 
관련 문제