Concatenation of Lists in Prolog
Here is the concatenation between two lists rule:
concat([],L2,L2). concat([Head|Tail],L2,[Head|L3]) :- concat(Tail,L2,L3).
It can be done by using append.
concatenate(List1, List2, Result):-
append(List1, List2, Result).
Hope this helps.
To fix your code, the way you intended it, you just need to transform Head
into [Head]
in your last call to concat/3
in your last clause. The problem was that you called your predicate with Head
only as first argument, which is not a list.
Though, here are several notes :
[Head|[]]
is equivalent to[Head]
- your algorithm has a poor complexity, n! I believe.
- with no cut inserted after your second clause, you generate infinite choice points through the call of your third clause with a list of length 1 (that hence calls your second clause, that then is ran through your third clause, etc... infinite loop).
Here is SWI-pl's version, to hint you towards good prolog recursion :
append([], List, List).
append([Head|Tail], List, [Head|Rest]) :-
append(Tail, List, Rest).
You can find other resources on recent posts here or in Learn Prolog Now! tutorial if you want to learn how to use recursion properly.