2011-02-15 6 views
2

J'ai ce code Prolog:Prolog: liste imbriquée

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). 

qui obtient les numéros sur une liste. Par exemple:

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

vous donne:

[7,5,3] 

Mais je veux faire obtenir les numéros hors d'une liste imbriquée.

Par exemple:

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

Souhaitez-vous donner:

[2,3] 

comment puis-je faire cela?

+0

Attendez. Que signifie "faire en sorte que les numéros d'une liste imbriquée"? Et que devrait faire le second argument de pick_numbers_general/3? –

+0

comme pour extraire les numéros d'une liste imbriquée, par exemple si j'ai cette option pick_numbers_genera ([a, b, 1, [2, [c, 3]], d], 1, NumListe). et je veux obtenir Numlist = [2,3]. – guest

+0

De la liste imbriquée * seulement *? Qu'est-ce que "1" est dans cet exemple? –

Répondre

1

U peut utiliser 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). 

Alors

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

oui. merci beaucoup – guest

+0

Btw, vous pouvez mettre une coche sur cette réponse –