Я хотел построить гамильтонову схему, но застрял при написании предиката пути в прологе.Я уже реализовал пункты, которые отлично работают: connected(V0, V1, G)
, что успешно, когда граф G содержит вершины [V0, V1].Также есть метод с именем notcontains(X, L)
, который завершается успешно, если L не содержит X.
Моя задача - написать гамильтоновый путь, не использующий встроенные методы в прологе: path(G, Vbegin, N, Forbidden, Path, Vend)
.Этот предикат должен быть успешным, если Path - это список длиной N, начинающийся с Vbegin и заканчивающийся Vend, такой, что никакой элемент Path (за исключением первого элемента) не встречается в Forbidden, ни один элемент не встречается дважды в Path, и каждый элементв Path связан со следующим элементом с ребром G.
For Example:
graph2( G), path( G, 3, 2, [3], P, Last ).
G = [[1, 2], [2, 3], [2, 4], [3, 4], [4, 3], [3, 1], [4, 1]],
P = [3, 4],
Last = 4 ;
G = [[1, 2], [2, 3], [2, 4], [3, 4], [4, 3], [3, 1], [4, 1]],
P = [3, 1],
Last = 1 ;
Моя попытка решить эту проблему заключается в следующем (я хочу добавить Vend после успешного завершения этого предиката):
path( _, _, 0, _, []).
path( G, Vbegin, N, Forbidden, [Vbegin|Path]) :-
connected(Vbegin, X, G),
notcontains(X, Forbidden),
append(Forbidden, X, Y),
N \= 0,
J is N - 1,
path(G, X, J, Y, Path).
Но, похоже, я упускаю какой-то фундаментальный шаг.Мы будем благодарны за любую помощь в решении этой проблемы.