Пытаясь понять это, как я могу объединить выход как этот в Прологе:Объединение нескольких списков, содержащих тот же элемент в PROLOG
[[z], [l, e, d], [j, i, d, c, a], [g, f, b], [h, b]]
, чтобы получить результат:
[z]
[l,e,d,j,i,c,a]
[g,f,b,h]
Не знаете, как объединить несколько списков, содержащих хотя бы один похожий символ.
Буду признателен за помощь более опытных парней, потому что я только начинаю, и эта задача довольно сложная.
Спасибо.
EDIT
задача получить от краев, определенных пользователем всех подключенных компонентов и распечатать их на выходе.
Для ввода пользователя экземпляра края:
data([[z,z],[a,c],[c,d],[d,i],[i,j],[d,e],[e,l],[b,f],[f,g],[b,h]]).
Так что я пытаюсь понять его, как решить эту проблему. Что я только что сделал:
data(Edges):-
dbH(Edges),
searching,
print,
retractall(e(_,_)),
retractall(lists(_)).
dbH([]).
dbH([[X, Y] | Body ]) :-
assertz(e(X,Y)),
dbH(Body).
oe(X,Y):-
e(X,Y);
e(Y,X).
searching:-
nextE.
searching([Act | RouteStartAct]):-
nextE([Act | RouteStartAct]).
nextE:-
oe(Act,New),!,
delE(Act,New),
cycle([Act],New).
nextE:-
!.
nextE([Act | RouteStartAct]):-
oe(Act,New),!,
delE(Act,New),
cycle([Act | RouteStartAct],New).
nextE(Act):-
assertz(lists(Act)),
searching.
delE(X,Y):-
retract(e(X,Y));
retract(e(Y,X)).
cycle(Act,New):-
not(mbr(New, Act)), !,
searching([New|Act]).
cycle(Act,New):-
assertz(lists(Act)),
searching.
mbr(Element, [Element|_]).
mbr(Element, [_|Body]) :-
mbr(Element, Body).
print:-
findall(C,lists(C),L),
write(L).
В конце записи (L) список печатных изданий списков, которые мне нужны для дальнейшего слияния на основе аналогичных элементов в каждом списке. Как объединить части одного графа вместе и распечатать их.
EDIT2 Результат этой команды:
?- data([[a, c], [c, d], [d, i], [i, j], [d, e], [e, l], [b, f], [f, g], [b, h]]).
является
[[j, i, d, c, a], [l, e, d], [g, f, b], [h, b]]
так из этого вывода очевидно, что список [j, i, d, c, a]
и [l, e, d]
могут быть объединены в один список [j, i, d, c, a, l, e]
. То же самое для списков [g, f, b]
и [h, b]
, эти два списка имеют общий символ b
, поэтому выход должен быть [g, f, b, h]
. В результате этих двух сливает конечный результат должен выглядеть следующим образом:
[j, i, d, c, a, l, e]
[g, f, b, h]
Это более очевидно, знаете?
Вам нужно показать, что вы пробовали, даже если не работает, и объясните, что вы намеревались сделать, и что он сделал вместо этого. Вопросы без этого обычно не получают ответов. Другими словами, это похоже на проблему домашней работы, и большинство людей не дает ответов на домашнюю работу, только помощь. –
Спасибо за ответ, ты прав. Что я могу сделать, так это сравнить два списка (A и B), и если в списке B есть один похожий символ в списке B, то я могу объединить эти два списка вместе, но что, если соединение вообще отсутствует? Оставьте их такими, какие они есть, но что, если есть еще 10 списков для сравнения? Множество списков сложной ситуации для меня ... –
Можете ли вы показать ожидаемый ответ для введенного ввода. В настоящее время мне придется угадать. –