2011-02-15 6 views
2

나는이 Prolog 코드를 가지고있다.프롤로그 : 중첩 목록

pick_number_simple([],[]). 
pick_number_simple([H|T],[H|T2]):- 
    number(H), pick_number_simple(T,T2). 
pick_number_simple([H|T],T2):- 
    not(number(H)), pick_number_simple(T,T2). 

이는 목록에서 숫자를 얻는다. 예를 들면 다음과 같습니다.

pick_number_simple([d,f,7,5,e,3,g], NumList) 

는 다음을 제공합니다.

[7,5,3] 

그러나 중첩 목록에서 숫자를 가져 오려고합니다.

예 :

pick_numbers_general([a,b,1,[2,[c,3]],d],1,NumList) 

줄 것입니다 :

[2,3] 

어떻게해야합니까?

+0

대기를 사용할 수 있습니다. "중첩 목록에서 숫자를 가져 오게"하는 것은 무엇을 의미합니까? 그리고 pick_numbers_general/3의 두 번째 인수는 무엇을해야합니까? –

+0

에서와 같이 중첩 된 목록에서 숫자를 가져 오는 것과 같이 pick_numbers_genera ([a, b, 1, [2, [c, 3]], d, 1, NumList)가있는 경우를 예로들 수 있습니다. 그리고 나는 Numlist = [2,3]을 원합니다. – guest

+0

중첩 목록에서 * only *? 이 예제에서 "1"은 무엇입니까? –

답변

1

U는 flatten/2 predicate

pick_number_simple([],[]). 
pick_number_simple([H|T],[H|T2]):- 
    number(H), pick_number_simple(T,T2). 
pick_number_simple([H|T],T2):- 
    not(number(H)), pick_number_simple(T,T2). 

pick_numbers_general(List, Num, NumList) :- 
    flatten(List, NestList), 
    pick_number_simple(NestList, NumListAll), 
    findall(X, (member(X, NumListAll),X > Num), NumList). 

그래서

?- pick_numbers_general([a,b,1,[2,[c,3]],d],1,NumList). 
NumList = [2, 3] ; 
+0

예. 덕분에 많이 – guest

+0

Btw,이 답변에 확인 표시를 할 수 있습니다. –