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!

Était-ce utile?

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 []

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top