2 votes

Processus d'unification de Prolog (concat)

Le code suivant fonctionne, mais j'ai quelques doutes sur la façon dont il fonctionne sous le capot. Par exemple, lors du premier appel à Exit(9), je ne comprends pas comment c est déplacé vers la variable O. Cela fait-il partie du processus d'unification ou s'agit-il de quelque chose d'entièrement différent ? Quelqu'un peut-il m'expliquer ?

concat([], List, List).
concat([Head|[]], List, [Head|List]).
concat([Head|Tail], List, Concat) :- concat(Tail, List, C), concat([Head], C, Concat).

trace

1voto

CapelliC Points 30055

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.....

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X