Vous pouvez effectuer "à la main" le processus d'unification, pour vérifier que la ligne de trace étiquetée Exit :(9) a effectivement "cons-édé" [c] à [x,y,z] :
?- [Head|[]]=[c],List=[x,y,z],[Head|List]=O.
Head = c,
List = [x, y, z],
O = [c, x, y, z].
mais vous ne pouvez pas prétendre que cela fonctionne :
?- concat([a,b,c],[x,y,z],L).
L = [a, b, c, x, y, z] ;
L = [a, b, c, x, y, z] ;
...
ce n'est pas le cas résilier Cela indique clairement qu'il y a un problème. La deuxième clause est redondante, tant sur le plan du comportement que de la syntaxe. Elle s'écrirait généralement comme suit
concat([Head], List, [Head|List]).
depuis la liste de queue vide, c'est implicitement présent dans chaque liste - sauf lorsqu'une queue est explicitement indiquée :
?- [Head|[]]=[X].
Head = X.
En ce qui concerne le comportement, vous pouvez voir sur votre trace qu'il s'agit de la fonction premier qui n'est jamais utilisée. On peut donc penser que c'est la première qui est redondante - peut-être avez-vous ajouté la seconde à cause du dernier appel de la troisième clause, où une liste "singleton" est requise (je veux dire ...,concat([Head], C, Concat).
). Mais ce type d'appel est à l'origine du problème de non-résiliation. Il est préférable de simplifier l'ensemble du programme, en supprimant la deuxième clause et en simplifiant la troisième.....