Чтобы исправить ваш код так, как вы его хотели, вам просто нужно преобразовать Head
в [Head]
в вашем последнем вызове в concat/3
в вашем последнем предложении. Проблема заключалась в том, что вы назвали свой предикат с Head
только в качестве первого аргумента, который не является списком.
Хотя, вот несколько заметок:
[Head|[]]
эквивалентно [Head]
- Ваш алгоритм имеет плохую сложность, n! Я верю.
- без вставки выреза после вашего второго предложения, вы генерируете бесконечные точки выбора посредством вызова вашего третьего предложения со списком длины 1 (который, следовательно, вызывает ваше второе предложение, который затем проходит через ваше третье предложение и т. . бесконечный цикл).
Вот версия SWI-pl, намекающая вам на хорошую рекурсию пролога:
append([], List, List).
append([Head|Tail], List, [Head|Rest]) :-
append(Tail, List, Rest).
Вы можете найти другие ресурсы по последним сообщениям здесь или в Учебнике Prolog Now! , если вы хотите научиться правильно использовать рекурсию.