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