2010-03-28 16 views
4

Supposons que je souhaite construire une liste (L2) en ajoutant des éléments d'une autre liste (L) un par un. Le résultat devrait être exactement le même que l'entrée. Cette tâche est stupide, mais elle m'aidera à comprendre comment parcourir une liste et supprimer certains éléments.Utilisation de la récursivité et de l'ajout dans le prologue

J'ai mis en place le code suivant:

create(L, L2) :- (\+ (L == []) -> L=[H|T], append([H], create(T, L2), L2);[]). 

appeler par

create([1,2,3,4], L2) 

retours

L2 = [1|create([2,3,4], **)\. 

qui n'est pas le résultat souhaité.

Répondre

3

Vous dites que vous voulez comprendre comment fonctionne Prolog, donc je ne vais pas vous donner une solution complète, mais un indice. Les fonctions dans prolog ne renvoient pas de valeurs, elles créent simplement des liaisons.

Quand vous dites

append([H], create(T, L2), L2);[]). 

vous essayez d'utiliser une valeur de retour. Essayez d'ajouter des liaisons create create que vous utilisez dans l'appel récursif.

+0

Nous vous remercions de votre réponse. Je suis sorti avec cette ligne: remove1 (L, L2): - affichage (L2), (\ + (L == []) -> L = [H | T], ajout (L2, H, L2) , enlever1 (T, L2); []). Cependant, j'obtiens une erreur: _G256 ERREUR: Hors de la pile globale Pourquoi est-ce? – screenshot345

+0

Je dois avouer que je suis plus familier avec la syntaxe prolog plus conventionnelle où chaque prédicat est déclaré une fois pour chaque structure d'argument. Je peux le dire cependant, quand vous obtenez une erreur de pile, cela signifie que votre récursion n'a pas réussi à se terminer. C'est soit parce que vos critères de terminaison sont faux ou que le reste de votre programme ne réduit pas les arguments comme vous le pensez. Dans ce cas je soupçonne ce dernier et je vous conseillerais de regarder de près l'appendice car il me semble que vous ne voulez probablement pas de L2 des deux côtés. – charlieb