web-dev-qa-db-fra.com

Comment ajouter des listes dans Prolog?

Comment ajouter des listes dans Prolog? J'ai cherché sur Internet et je l'ai trouvé (à partir de http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/2_7.html )

append([X|Y],Z,[X|W]) :- append(Y,Z,W).  
append([],X,X).

Il obtient donc le Z en supprimant les éléments de [X|Y] Dans [X|W]. Mais comment ajouter deux listes ensemble?

Exemple,

appendlist([1,2],[3,4,5],X).

Le résultat sera X = [1,2,3,4,5].

Je ne sais pas non plus ce qui se passe dans la récursivité. (Je l'ai tracé mais je n'ai pas compris)

EDIT: Ce que je veux savoir, c'est comment il doit être codé pour fonctionner comme le append() prédéfini dans Prolog.

21
Zik

Le code tel que vous l'avez affiché est (presque) OK. L'ordre des clauses doit simplement être inversé (afin de rendre cette définition de prédicat productive, lorsqu'elle est utilisée de manière générative):

append( [], X, X).                                   % your 2nd line
append( [X | Y], Z, [X | W]) :- append( Y, Z, W).    % your first line

Ceci définit une relation entre les trois arguments, disons A, B et C.

Votre première ligne dit, "C est le résultat de l'ajout de A et B si A et C sont des listes non vides, elles ont toutes les deux la même tête (c'est-à-dire le premier élément), et queue de C est le résultat de l'ajout de la queue de A avec le même 2e argument, B ".

  a        a
  ----------
  b        b
  c        c
  .    d   d
       e   e
       .   .

Ou de gauche à droite:

         a | b c .
           |     d e .
         a | b c d e .

append(         [], 
                 Z,
                 Z ).       
append( [X | Y   ],
                 Z,
        [X |         W ] ) :- append(
             Y,  Z,  W).

Pensez-y, c'est parfaitement logique. Ce qu'il fait, c'est que nous voulons définir le append/3 relation, et nous savons ce que nous voulons qu'elle soit, alors nous écrivons simplement quelques faits évidents à ce sujet que nous voulons qu'elle respecte, les lois qu'elle doit suivre si vous voulez.

En supposant que nous ayons déjà ce code défini pour nous, quelles lois doit-il suivre? De toute évidence, l'ajout d'une queue d'une liste avec une autre liste nous donne une queue de résultat de l'ajout de la liste complète avec cette 2e liste.

Ceci définit comment nous "glissons" sur la première liste. Mais que faire s'il n'y a plus nulle part où glisser? Et si nous arrivions à la fin de cette liste? Ensuite, nous sommes arrivés à la liste vide, et l'ajout d'une liste vide avec une autre liste nous donne cette liste comme résultat. Évidemment. Et c'est ce que cette deuxième ligne de votre code nous dit, il dit: "ajouter un liste vide avec une autre liste produit cette liste comme résultat ".

Étonnamment, après avoir écrit ces deux lois qui append/3 doit suivre, revient à noter la définition elle-même.

addition: cela l'explique d'un point de vue déclaratif; vérifiez ne réponse par m09 qui le montre davantage du point de vue opérationnel.

27
Will Ness

Mais comment puis-je ajouter deux listes ensemble?

Vous avez répondu à votre propre question: vous utilisez append/3.

Si vous souhaitez ajouter X et Y et stocker le résultat dans Z, vous devez

append(X, Y, Z)

Si par exemple X = [1, 2] et Y = [3, 4, 5] puis Z sera lié à [1, 2, 3, 4, 5]:

| ?- append([1,2],[3,4,5], X).

X = [1,2,3,4,5]

yes
| ?- 
10
aioobe