реализация гамильтоновой схемы в прологе - PullRequest
0 голосов
/ 25 октября 2018

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

Но, похоже, я упускаю какой-то фундаментальный шаг.Мы будем благодарны за любую помощь в решении этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...