Prolog максимальный цикл в графе

Узнай цену своей работы

Формулировка задачи:

Есть такой код
Он благополучно был взять с форума, и по сути должен работать... Но не выводится максимальный вариант.
В этой строчке выводятся все варианты При запуске goal выводится только false.... Хелп

Решение задачи: «Prolog максимальный цикл в графе»

textual
Листинг программы
link( 1, 2). link( 2, 3). link( 3, 4). link( 1, 4).
link( 4, 5). link( 5, 6). link( 6, 1). link( 2, 9).
link( 9, 8). link( 8, 7). link( 7, 6). link( 7, 5).
 
goal :-
  link(Finish, Start),
  for(Start, Finish, [Finish], FOR, 0, LENGTH),
  %writeln(FOR+' = '+LENGTH),
  not(another_bigger(LENGTH)),
  write(FOR).
 
for(FINISH, FINISH, FOR, FOR, LENGTH, LENGTH):- !.
for(START, FINISH, FOR0, FOR, LENGTH0, LENGTH):-
  link(START, BETWEEN),
  not(have(BETWEEN, FOR0, FINISH)),
  LENGTH2 is LENGTH0 + 1,
  %writeln(FOR0+' = '+LENGTH2),
  for(BETWEEN, FINISH, [BETWEEN|FOR0], FOR, LENGTH2, LENGTH).
 
another_bigger(LENGTH):-
  link(Finish, Start),
  for(Start, Finish, [Finish], _, 0, LENGTH1),
  LENGTH1 > LENGTH.
 
have(VERTEX, _, VERTEX) :- !, fail.
have(VERTEX, [VERTEX|_], _) :- !.
have(VERTEX, [_|FOR], FINISH) :- have(VERTEX, FOR, FINISH).

Объяснение кода листинга программы

Код, представленный в списке, является реализацией алгоритма поиска самого длинного пути в графе с использованием языка программирования Prolog. Вот список, описывающий каждый элемент кода:

  1. link( 1, 2). link( 2, 3). link( 3, 4). link( 1, 4). - Это определение графа, представленное в виде фактов Prolog. Здесь создаются связи между вершинами графа. Например, первая строка говорит о том, что существует связь между вершинами 1 и 2.
  2. goal :- - Это определение цели или задачи, которую должен выполнить программист. В данном случае цель состоит в нахождении самого длинного пути в графе.
  3. link(Finish, Start), - Это часть условия задачи, которая говорит о том, что вершины Finish и Start должны быть связаны.
  4. for(Start, Finish, [Finish], FOR, 0, LENGTH), - Это часть условия задачи, которая говорит о том, что переменная FOR должна быть равна Finish, а переменная LENGTH должна быть равна 0. Здесь также инициируется цикл for.
  5. %writeln(FOR+' = '+LENGTH), - Это часть кода, которая используется для отладки и вывода информации о состоянии выполнения программы. Здесь в консоль выводится значение переменных FOR и LENGTH.
  6. not(another_bigger(LENGTH)), - Это часть условия задачи, которая говорит о том, что функция another_bigger(LENGTH) должна возвращать ложь (false), если существует путь большей длины.
  7. write(FOR). - Это часть кода, которая используется для вывода результата выполнения программы. Здесь в консоль выводится значение переменной FOR.
  8. for(FINISH, FINISH, [FINISH], FOR, LENGTH, LENGTH):- !. - Это часть цикла for, которая говорит о том, что если FINISH равно FOR, то цикл прерывается.
  9. for(START, FINISH, [START|FOR0], FOR, LENGTH0, LENGTH):- - Это часть цикла for, которая говорит о том, что если START равно FOR, то переменные FOR и LENGTH обновляются, и в цикле продолжаются поиски.
  10. another_bigger(LENGTH):- - Это определение функции another_bigger(LENGTH), которая проверяет, существует ли путь большей длины.
  11. have(VERTEX, _, VERTEX) :- !, fail. - Это часть кода, которая используется для проверки наличия вершины в списке путей. Если вершина отсутствует, то выполняется функция fail, что приводит к прерыванию выполнения программы.
  12. have(VERTEX, [VERTEX|_], _) :- !. - Это часть кода, которая используется для проверки наличия вершины в списке путей. Если вершина присутствует в списке, то выполнение кода продолжается.
  13. have(VERTEX, [_|FOR], FINISH) :- have(VERTEX, FOR, FINISH). - Это часть кода, которая используется для проверки наличия вершины в списке путей. Если вершина присутствует в списке FOR, то выполняется рекурсивный вызов функции have с новыми значениями переменных.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5
Похожие ответы