Это один подход, который позволит до одного элементы в подсписке, но не пустой подсписок:
concat([[L]], [L]).
concat([[H],L|T], [H|R]) :- concat([L|T], R).
concat([[H1,H2|T]|LT], [H1|RT]) :- concat([[H2|T]|LT], RT).
метод здесь, чтобы избежать пустого списка, чтобы позвонить из двух головных элементов в рекурсивном предложении, и одинокий эль в базовом случае. Это предотвращает успешное удаление пустых подписчиков, как указано в комментариях исходного сообщения.
Если у вас есть переменная, Y
, уже инстанцированный, и вы хотите знать, если это является результатом конкатенации список списков, LL
, вы просто запрос:
concat(LL, Y).
Это будет true
если Y
является объединением списка LL
и false
если нет. Вам не нужно «возвращать и сравнивать» (как, например, в C, можно сказать, concat(LL) == Y
, или concat(LL, X); if (X == Y)...
). Это связано с тем, что concat
- отношение , определенное между двумя аргументами, и определяет, можно ли сделать запрос true
, следуя указанным правилам (предложения предиката).
Если вы уже получили результат и хотите, чтобы определить, является ли это unifiable другой переменной, Z
, то вы можете сказать:
concat(X, Y), Y = Z.
Обратите внимание, что в Прологе concat(X, Y) == Z
не является правильным, чтобы определить, является ли результат предиката равна Z
, потому что это не функция, которая возвращает значение.
Пролог не имеет * функций * с * возвращаемыми значениями *. В Prolog есть * предикаты *, которые определяют * отношения * между его аргументами. Немного непонятно, о чем вы просите. – lurker
Что происходит, если 'L' является' [] '? – lurker
concat ([], []). Но я думаю, что это не обязательно, потому что я нарушаю рекурсию с помощью!. – Saturnino