Bonjour à tous,
Je commence (difficilement) a digérer les bases (des bases) de la programmation Prolog.
J'ai essayé avec succès quelques petits exercices de bases (dernier élément de la liste? listes égales? ...).
Mais voilà que je bloque à un exercice:
Il faut définir insere-elem(Xs,E,Ys) tel que:
En gros, il faut intercaller entre chaque membre de la liste Xs, l'élément E. Le tout doit donner la liste Ys.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 insere-elem([titanic,a,coule],stop,X). X = [titanic,stop,a,stop,coule,stop];
Voilà la solution (qui marche).
Ce que je ne comprend pas c'est qu'avec "[X,Y|Ys]", on devrait rajouter au fur a mesure les éléments de la liste Xs (+ Y) au début de Ys.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Insere_elem( [ ] , _ , [ ]). Insere_elem( [X|Xs], Y, [X,Y|Ys] ) :-insere_elem( Xs,Y,Ys ).
Alors on aurait: coulé stop a stop titanic stop. Hors ici on a le résultat correct titanic stop a stop coulé stop.
Explication:
Xs = titanic, a, coulé
E = stop
Insere_elem( [X|Xs], Y, [X,Y|Ys] ) :-insere_elem( Xs,Y,Ys )
X = titanic
Xs = a, coulé
Y = stop
[X,Y|Ys] = titanic,stop
Insere_elem( [X|Xs], Y, [X,Y|Ys] ) :-insere_elem( Xs,Y,Ys )
X = a
Xs = coulé
Y = stop
[X,Y|Ys] = a, stop, titanic,stop
1. Donc, j'ai faux dans mon résonnement...mais ou? et en quoi?
Par ailleur, la solution que j'avais trouvé en premier en gribouillant sur ma feuille (sans regarder celle fournit par le prof) était:
En gros c'est la même, si ce n'est que Ys et [X,Y|Ys] ont été échangé. Pourquoi ce raisonnement est-il incorrect et ne marche il pas?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Insere_elem( [ ] , _ , [ ]). Insere_elem( [X|Xs], Y, Ys ) :-insere_elem( Xs,Y,[X,Y|Ys] ).
Merci d'avance.
Bonne journée!
Partager