web-dev-qa-db-fra.com

Concaténation de listes dans Prolog

Quelqu'un peut-il aider à trouver une erreur dans ces règles?

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
12
damluar

Pour corriger votre code, comme vous le souhaitiez, il vous suffit de transformer Head en [Head] lors de votre dernier appel à concat/3 dans votre dernière clause. Le problème était que vous avez appelé votre prédicat avec Head uniquement en tant que premier argument, ce qui n'est pas une liste.

Bien que, voici plusieurs notes:

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

Voici la version de SWI-pl, pour vous orienter vers une bonne récurrence du prologue:

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

Vous pouvez trouver d'autres ressources sur des publications récentes ici ou dans Learn Prolog Now! tutorial si vous voulez apprendre à utiliser correctement la récursivité.

16
m09

Cela peut être fait en utilisant append.

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

J'espère que cela t'aides.

4
João Rodrigues

Voici la règle de concaténation entre deux listes:

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