Объединение списков в 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).