2016-03-30 1 views
2

Si j'ai une liste [1,2,3,4,5], comment puis-je obtenir des paires consécutives et effectuer une opération sur elles? Par exemple, je veux obtenir (1,2) et effectuer une action sur eux. Dans la prochaine itération, je veux obtenir (2,3), et ainsi de suite. Voilà ce que j'ai jusqu'à présent:Liste de Prolog paires consécutives

listpairs([H1,H2|T]):-doSomething(H1,H2), listpairs([H2,H3|T]). 

je peux faire la première itération mais je suis bloqué lorsque l'on compare H2 et H3.

Répondre

2

Tout d'abord, si vous avez [1,2,3,4,5], puis [H1,H2|T] ensembles H1 = 1, H2 = 2, T = [3,4,5]. H1 et H2 sont les deux nombres sur lesquels vous voulez travailler. [H2|T] = [2,3,4,5] rend la liste sur laquelle vous pouvez procéder pour calculer. (. Il commence par 2,3 après tout, récursion sur elle vous donnera les deux numéros suivants que vous voulez)

donc votre cas récursif devrait être:

listpairs([H1,H2|T]) :- doSomething(H1,H2), listpairs([H2|T]). 

Ie: Prendre H1 et H2 sur , fais quelque chose avec eux, puis remets H2 et recurse.

Deuxièmement, vous avez besoin d'un cas de base pour avoir seulement un élément gauche:

listpairs([H]). 

Si vous omettez cela, vous ne serez jamais atteindre un cas de base si la liste a par exemple 5 éléments, puisque nous en mettons toujours 1 en arrière. (Par exemple, la liste que vous RECURSE sur ne sera jamais vide.)

+0

merci! Je ne peux pas croire que c'était ça. –

0

au lieu d'une « boucle » explicite, vous pouvez utiliser cette approche idiomatiques:

forall(append(_,[X,Y|_],List), doSomething(X,Y)).