2014-11-30 2 views
0

중첩 된 목록의 첫 번째 숫자가 x와 같은지 확인하는 방법을 찾으려고합니다.숫자의 첫 번째 항목이 x와 같은지 어떻게 확인합니까?

check (X, L), X = 숫자 및 Y는 중첩 목록입니다.

check(2,[a,b[g,4],y,8]). 
false 

check(2,[a,b[g,2],y,8]). 
true 

재귀 가장 할 것으로 보인다. 하지만 프롤로그에서 재귀를 사용하여 접근하는 방법을 아직도 이해할 수 없습니다. 중첩 목록을 병합 한 다음 첫 번째 요소가 숫자이고 X와 동일한 지 확인합니다. 아무도 도와 줄 수 있습니까?

답변

0

아이디어를 세분화해야합니다. 일부 코드는 첫 번째 발생과 일치해야합니다. 내가 '속임수'것 :

check(X,L) :- flatten(L,F), include(number,F,[X|_]). 
0
그것은 잘 간단한 재귀와 함께 할 수

:

check(X,[X|_]) :- number(X). 
check(X,[NL|_]) :- is_list(NL), check(X, NL). 
check(X,[V|L]) :- not(number(V)), check(X, L). 

UPDATE :

이 @CappelliC에 의해 문제 발견 해결

check(X,[X|_]) :- number(X). 
check(X,[V|L]) :- not(number(V)), not(is_list(V)), check(X, L). 
check(X,[NL|L]) :- is_list(NL), append(NL,L,BL), check(X, BL). 

결과 :

?- check(2,[a,b,[g,4],y,8]). 
false. 

?- check(2,[a,b,[g,2],y,8]). 
true . 
+1

은 X가 첫 번째가 아닐 때도 성공한 것으로 보입니다. – CapelliC

+0

@CapelliC, 확실합니까? check (2, [1,2])에'false '가 붙습니다. –

+0

@CapelliC, 내'check/2'가 잘못 작동 할 때의 예를 제공하십시오. –

관련 문제