Объединение списков в Prolog

может кто-нибудь помочь найти ошибку в этих правилах?

concat([], List, List).
concat([Head|[]], List, [Head|List]).
concat([Head|Tail], List, Concat) :- concat(Tail, List, C), concat(Head, C, Concat).

попытка объединить 2 списка не удается:

| ?- concat([1,2], [4,7,0], What).

no

3 ответов


чтобы исправить ваш код, как вы его намеревались, вам просто нужно преобразовать Head на [Head] в вашем последнем звонке в concat/3 в вашем последнем предложении. Проблема заключалась в том, что вы называли свой предикат с Head только в качестве первого аргумента, который не является списком.

хотя, вот несколько заметок :

  • [Head|[]] эквивалентно [Head]
  • ваш алгоритм имеет плохую сложность, n! Я считаю.
  • не обрезали вставили после второе предложение, вы создаете бесконечные точки выбора через вызов вашего третьего предложения со списком длины 1 (который, следовательно, вызывает ваше второе предложение, которое затем проходит через ваше третье предложение и т. д... бесконечный цикл.)

вот версия SWI-pl, чтобы намекнуть вам на хорошую рекурсию пролога:

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

вы можете найти другие ресурсы на последних постов здесь или в Узнайте Пролог Сейчас! учебник если вы хотите узнать, как использовать рекурсию правильно.


Это можно сделать с помощью append.

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

надеюсь, что это помогает.


вот конкатенация между двумя списками правило:

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