Гамильтонов путь в графе - Prolog
Формулировка задачи:
Доброго времени!
В прологе, откровенно говоря, я чайник. Пытаюсь разобраться.
В задании мне задано написать программу для определения гамильтонова пути в графе, заданном множеством вершин и множеством ребер. Вот что получилось:
Программа выдает ошибки именно в этих 2 строчках.
А именно говорит о вызовах adjacent и hamiltonian
Подскажите, где копать? Почему неправильно? И как это исправить?
Спасибо
Листинг программы
- domains
- G=graph(Nodes,Edges)
- nodes=i*
- edges=edge*
- edge=e(i,i)
- i=integer
- ilist=i*
- predicates
- member_e(edge,edges)
- nondeterm member_n(i,ilist)
- nondeterm member_nn(i,nodes)
- graph(nodes,edges)
- nondeterm path(i,i,G,ilist)
- nondeterm path1(i,ilist,G,ilist)
- nondeterm adjacent(integer,integer,G)
- nondeterm covers(ilist,G)
- nondeterm node(i,G)
- nondeterm hamiltonian(G,ilist)
- clauses
- graph([1,2,3,4,5],[e(1,2),e(2,3),e(3,4),e(4,5)]).
- path(A,Z,G,Path) :- path1(A,[Z],G,Path).
- path1(A,[A|Path1],_,[A|Path1]).
- path1(A,[Y|Path1],G,Path]:-adjacent(X,Y,G),not(member_n(X,Path1)),
- path1(A,[X,Y|Path1],G,Path).
- adjacent(X,Y,graph(_,Edges)):- member_e(e(X,Y),Edges); member_e(e(Y,X),Edges).
- hamiltonian(G,Path):-path(_,_,G,Path),covers(Path,G).
- covers(Path, G):-
- node(N,G),
- not(member_n(N, Path)),
- !,
- fail.
- covers(_Path,_G).
- node(N,graph(Nodes,_)):- member_nn(N,Nodes).
- member_e(X,[X | _]):-!.
- member_e(X,[_ | Rest]):-member_e(X,Rest).
- member_n(X,[X | _]):-!.
- member_n(X,[_ | Rest]):-member_n(X,Rest).
- member_nn(X,[X | _]).
- member_nn(X,[_ | Rest]):-member_nn(X,Rest).
- goal
- hamiltonian(graph([1,2,3,4],[e(1,2),e(4,3),e(3,1),e(2,4)]),Path).
Листинг программы
- adjacent(X,Y,graph(_,Edges)):- member_e(e(X,Y),Edges); member_e(e(Y,X),Edges).
- hamiltonian(G,Path):-path(_,_,G,Path),covers(Path,G).
Решение задачи: «Гамильтонов путь в графе»
textual
Листинг программы
- hamiltonian(G,Path):-path(_,_,G,Path),covers(Path,G).
Объяснение кода листинга программы
- Начинается определение функции
hamiltonian
с двумя аргументами G и Path - В первой части определения используется функция
path
, которая принимает 4 аргумента, но в данном коде они не используются - Вторая часть определения - это рекурсивный вызов функции
hamiltonian
с аргументами G и Path - Последняя часть определения - это проверка, что путь Path покрывает все вершины графа G с помощью функции
covers
- Функция
path
не определена в данном коде, поэтому ее можно считать вспомогательной функцией - Функция
covers
также не определена в данном коде, но она используется для проверки покрытия всех вершин графа G путем Path - В данном коде не определены и другие функции, такие как
path/4
иcovers/2
, поэтому их назначение неизвестно - В коде отсутствует вызов функции
hamiltonian
, поэтому невозможно проверить ее работу на практике - Код не содержит комментариев или пояснений, поэтому трудно понять его назначение без дополнительной информации
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д