2012-02-19 7 views
10

Quelqu'un peut-il aider à trouver une erreur dans cette règle?Concaténation de listes dans Prolog

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

Essayer de concaténer 2 listes échoue:

| ?- concat([1,2], [4,7,0], What). 

no 

Répondre

14

Pour corriger votre code, la façon dont vous l'intention, vous avez juste besoin de transformer Head en [Head] dans votre dernier appel à concat/3 dans votre dernière clause . Le problème était que vous appeliez votre prédicat avec Head uniquement comme premier argument, ce qui n'est pas une liste.

Bien que, voici quelques notes:

  • [Head|[]] est équivalent à [Head]
  • votre algorithme a une complexité pauvre, n! Je crois.
  • sans couper après votre deuxième clause, vous générez des points de choix infinis grâce à l'appel de votre troisième clause avec une liste de longueur 1 (qui appelle donc votre deuxième clause, qui traverse ensuite votre troisième clause, etc. . boucle infinie).

Voici la version SWI-pl, vous allusion vers la bonne récursion Prolog:

append([], List, List). 
append([Head|Tail], List, [Head|Rest]) :- 
    append(Tail, List, Rest). 

Vous pouvez trouver d'autres ressources sur les messages récents ici ou dans Learn Prolog Now! tutoriel si vous voulez apprendre à utiliser récursion correctement.

+0

Merci de nous aider. Une question de plus: est-il possible de voir comment Prolog interprète le programme? par exemple, trace de la pile pourrait aider à voir le problème. – damluar

+3

yup, tapez 'trace.'. Vous allez entrer en mode trace. Pour le laisser, tapez 'notrace'. Vous serez en mode débogage. Pour quitter le mode debug, tapez 'nodebug.' et vous reviendrez en mode normal! – m09

+0

J'utilise gnu prolog, ça marche pour moi. Merci! – damluar

4

Cela peut être fait en utilisant append.

concatenate(List1, List2, Result):- 
    append(List1, List2, Result). 

Espérons que cela aide.

0

Voici l'enchaînement entre deux listes règle:

concat([],L2,L2). concat([Head|Tail],L2,[Head|L3]) :- concat(Tail,L2,L3).