Конкатенация списков в прологе - PullRequest
13 голосов
/ 19 февраля 2012

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

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 ]

17 голосов
/ 19 февраля 2012

Чтобы исправить ваш код так, как вы его хотели, вам просто нужно преобразовать 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! , если вы хотите научиться правильно использовать рекурсию.

5 голосов
/ 19 ноября 2015

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

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

Надеюсь, это поможет.

1 голос
/ 12 декабря 2017

Вот соединение двух правил списков:

concat([],L2,L2). concat([Head|Tail],L2,[Head|L3]) :- concat(Tail,L2,L3). 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...