Problème avec les accumulateurs de prolog
-
27-09-2019 - |
Question
Lors de l'apprentissage de Prologue, je suis en train de résoudre le problème suivant, à l'aide d'accumulateurs:
Écrire un prédicat addone2/ dont le premier argument est une liste d'entiers, et dont le second 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).
doit 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 cela ne fonctionne pas.Quelqu'un peut-il me dire pourquoi?Alors, comment puis-je utiliser les accumulateurs dans le Prologue?
Merci!
La solution
anthares est correct en ce que vous avez à affiner votre base de cas.Cependant, vous avez également de faire des choses très inefficacement avec votre append
les appels.En Prolog, il faut un certain temps pour s'habituer à la puissance de l'unification, mais par exemple, dans ce cas, il vous aide à régler immédiatement votre liste de résultats.Essayez les solutions suivantes:
addone([E|Tail], [E1|Rs]) :-
E1 is E+1,
addone(Tail, Rs).
C'est vraiment tout là est à lui.En plaçant immédiatement E1
dans votre deuxième argument du motif, 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é.Très typique de l'Prologue de modèle.
Autres conseils
Le bas de votre récursivité devrait être addone([],[]).
afin NewRs pour être connecté avec le []