2009-09-06 7 views
4

Comment comptabiliser les éléments de liste imbriqués dans Prolog? Je les prédicats suivants définis, qui comptera une liste imbriquée comme un élément:Comptage des éléments de sous-liste dans Prolog

length([ ], 0). 
length([H|T],N) :- length(T,M), N is M+1. 

Utilisation:

?- length([a,b,c],Out). 
Out = 3 

Cela fonctionne, mais je voudrais compter des éléments imbriqués ainsi dire

length([a,b,[c,d,e],f],Output). 
?- length([a,b,[c,d,e],f],Output). 

Output = 6

+0

Est-ce pour les devoirs? –

+0

Salut Shaggy, J'utilise prolog dans mon cours, mais ce n'est pas une question de devoirs directs. Je prévois d'implémenter quelque chose comme ça dans un futur projet. – Blair

Répondre

3
len([H|T],N) :- 
    len(H, LH), 
    len(T, LT), 
    !, 
    N is LH + LT. 
len([], 0):-!. 
len(_, 1):-!. 

Test:

?- len([a,b,[c,d,e],f],Output). 
Output = 6. 
+2

'len ([], 1)' réussit. – false

+0

se demandait si vous pourriez mieux expliquer la coupe pour moi? Je comprends qu'il a seulement dire que les H, T, LH, LT correspondent plusieurs fois. J'ai écrit quelque chose de très similaire sans la coupure et cela me donne un débordement im supposant qu'il faut trop de retour en arrière de la mémoire et etc. Est-ce que mon intuition est juste? –

+0

Je pense que vous avez raison. Couper lorsqu'il est exécuté annule le retour arrière. Cela signifie que si 'len (H, LH), len (T, LT),' réussit, et! croisé - il ne réessayera pas de les réussir à nouveau. – Xonix