2010-11-22 22 views
3

tout en apprenant Prolog, je suis en train de résoudre le problème suivant, en utilisant des accumulateurs:problème avec accumulateurs dans Prolog

Ecrire un addone2 ​​sous-jacente/dont le premier argument est une liste d'entiers, et dont le deuxième argument est la liste des entiers obtenus en ajoutant 1 à chaque entier dans la première liste. Par exemple, la requête

 addone([1,2,7,2],X). 

devrait donner

 X = [2,3,8,3]. 

J'ai créé le code suivant:

addone([], _). 
addone([E|Tail], [R|Rs]) :- 
    NewE is E+1, 
    append([R|Rs], [NewE], NewRs), 
    addone(Tail, NewRs). 

Mais il ne fonctionne pas. Quelqu'un peut-il me dire pourquoi? Alors, comment utiliser les accumulateurs dans Prolog?

Merci!

Répondre

4

Anthares est correct que vous devez affiner votre cas de base. Cependant, vous faites également des choses très inefficace avec vos appels append. En Prolog, il faut un certain temps pour s'habituer à la puissance de l'unification, mais par exemple, dans ce cas, il vous aide à configurer immédiatement votre liste de résultats. Essayez ce qui suit:

addone([E|Tail], [E1|Rs]) :- 
    E1 is E+1, 
    addone(Tail, Rs). 

C'est vraiment tout ce qu'il ya à faire. En plaçant immédiatement E1 dans le modèle de votre second argument, vous avez déjà créé le premier élément de votre liste de résultats. Les éléments restants Rs seront créés au cours de la récursivité. Un motif Prolog très typique.

+0

Merci pour votre aide Frank! N'a pas maintenant à propos de cette "astuce" sans utiliser la liste append. Merci aussi à anthares pour corriger mon cas de base! –

+0

Merci Frank! Ce truc n'est pas évident du tout et très pratique! – ProfVersaggi

1

Le fond de votre récursion devrait être addone([],[]). dans NewRs de commande à connecter avec les touches []