3 последовательных элемента в Прологе с использованием concat
Поэтому я работаю над этой проблемой, чтобы иметь 3 элемента X, которые должны быть последовательными в списке и использовать только concat.
Вот что я пытался:
threeConsecutive(X, L):- concat(X, X, L2), concat(L2, X, L).
Это правильно? Если нет, не могли бы вы объяснить, что я делаю не так? Насколько я вижу, я объединяю 2 элемента X и помещаю их в другую свободную переменную с именем L2, а затем снова объединяю это с элементом X. Наконец, я сохраняю это в исходном списке L.
Буду очень признателен, если кто-нибудь сможет это проверить, поскольку я действительно пытаюсь понять концепцию concat в Prolog.
Спасибо!
2 ответа
Это правильно?
нет, первая проблема в том, что append/3 (для обсуждения, скажем, неопределенный concat/3 - это append/3) устанавливает связь между 3 списками. Так
объединение двух элементов X и помещение их в другую свободную переменную с именем L2
должно быть
concat([X], [X], L2)
Это можно было бы лучше выразить объединением, так как
[X,X] = L2
Та же проблема применяется в
..., concat(L2, X, L).
должен быть конкат (L2, X, L).
..., concat(L2, [X], L).
и тогда вы можете увидеть, что весь код будет уменьшен до
threeConsecutive(X, [X,X,X]).
Итак, вторая проблема очевидна, но, поскольку ответ @Boris уже показал требуемый шаблон, я не буду повторять его здесь.
Все, что вам нужно сделать, это использовать сопоставление с шаблоном:
?- append(_, [X,Y,Z|_], [a,b,c,d,e,f]).
X = a, Y = b, Z = c ;
X = b, Y = c, Z = d ;
X = c, Y = d, Z = e ;
X = d, Y = e, Z = f ;
false.
append/3
делает возврат для вас.
Если вы хотите иметь три элемента в своем собственном списке, вы можете использовать два вызова append/3
:
append(_, Suffix, List), append([X,Y,Z], _, Suffix)
Как сделать список из трех элементов: просто скажите List = [X,Y,Z]
, Чтобы составить список любой длины, вы могли бы даже использовать length(List, Len)
так например length(List, 3)
,
И, если вам нужно, чтобы три переменные были одинаковыми (например, объедините их), просто используйте одну и ту же переменную: List = [X, X, X]
,