목록 L
과 숫자 N
을 얻고 N
이 목록 L
의 가장 긴 시퀀스의 길이 인 경우 참이됩니다. 예를 들어 :프롤로그 - 시퀀스의 목록
?- ls([1,2,2,4,4,4,2,3,2],3).
true.
?- ls([1,2,3,2,3,2,1,7,8],3).
false.
이 들어 나는 내장 -
head([X|S],X). % head of the list
ls([H|T],N) :- head(T,X),H=X, NN is N-1 , ls(T,NN) . % if the head equal to his following
ls(_,0) :- !. % get seq in length N
ls([H|T],N) :- head(T,X) , not(H=X) ,ls(T,N). % if the head doesn't equal to his following
개념은 간단하다 - 그의 다음과 같 머리, 그렇다면, 꼬리를 계속하고 N
을 감소되었는지 확인합니다.
나는 내 코드를 확인하고 그것을 잘 작동합니다 (예를 무시하는 N = 1
) -
ls([1,2,2,4,4,4,2,3,2],3).
true ;
false .
그러나 true
대답은 유한하지 않고 그 이후로 많은 대답은 나는 그것이 유한 돌아 만들 수있는 방법이있다 대답 ?
감사합니다. 매우 유용합니다. – URL87
@Daniel_Lyons : 만약 우리가 무언가를 설명해 준다면 나는 행복 할 것이다. 'once'는 우리가 단 하나의 대답만을 얻도록 말했지만'once'를 생략하고'- sequence_length_loop (X, Xs, 1, Length)'를 사용하면 결과가 더 많이 나오는지 더 많은 수표를 조사 할 수 있습니까? 여기에 우리는 단지'sequence_length_loop'에 인스턴스화 된 인자'(X, Xs, 1, Length)'만을 보냅니다 ... ... – URL87
@ URL87 원본에서와 마찬가지로'once'없이 가짜 선택 점을 얻습니다. 나는 각각의 다른 골 이후에 컷을 도입하는 것보다 더 정돈되어 루프 목표 이후의 컷보다 더 명확하게 목적을 전달하기 때문에 '한번만'을 선택했다. –