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
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]
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é.
Cela peut être fait en utilisant append.
concatenate(List1, List2, Result):-
append(List1, List2, Result).
J'espère que cela t'aides.
Voici la règle de concaténation entre deux listes:
concat([],L2,L2). concat([Head|Tail],L2,[Head|L3]) :- concat(Tail,L2,L3).