Работа со списком - Prolog (227193)

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

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

В общем задача следующая: Найти в графе все пути от вершины к вершине без повторных ребер и вершин. Вот программа для поиска всех путей:
Листинг программы
  1. DOMAINS
  2. edgelist=edge*
  3. edge=edge(symbol,symbol)
  4. symbollist=symbol*
  5. PREDICATES
  6. path(symbol,symbol,edgelist,symbollist)
  7. path_aux(symbol,symbollist,edgelist,symbollist)
  8. connect(symbol,symbol,edgelist)
  9. belong_s(symbol,symbollist)
  10. belong_e(edge,edgelist)
  11. start
  12. CLAUSES
  13. start:-path(a,d,[edge(a,b),edge(b,c),edge(c,d),edge(b,d),edge(v,d),edge(a,v)],Path),write(Path),nl,fail.
  14. start.
  15. path(Begin,End,Graph,Path):-path_aux(Begin,[End],Graph,Path).
  16. path_aux(Begin,[Begin|Tail_Path],_,[Begin|Tail_Path]):-!.
  17. path_aux(Begin,[Head_Path|Tail_Path],Graph,Path):-
  18. connect(Tmp,Head_Path,Graph),
  19. not(belong_s(Tmp,Tail_Path)),
  20. path_aux(Begin,[Tmp,Head_Path|Tail_Path],Graph,Path).
  21. connect(Node1,Node2,Graph):-belong_e(edge(Node1,Node2),Graph).
  22. connect(Node1,Node2,Graph):-belong_e(edge(Node2,Node1),Graph).
  23. belong_s(N,[N|_]).
  24. belong_s(N,[_|T]):-belong_s(N,T).
  25. belong_e(N,[N|_]).
  26. belong_e(N,[_|T]):-belong_e(N,T).
  27. GOAL
  28. start.
Листинг программы
  1. ["a","b","c","d"]
  2. ["a","b","d"]
  3. ["a","v","d"]
Для нахождения "неповторяющихся" путей, я думаю, нужно после получения пути в предикате

start

после

path

и перед выводом списка, добавить какой-то предикат, который будет сравнивать полученный список с общим, в котором буду хранится все пройденные вершины. Если есть больше 3 повторяющихся элементов, (первый, последний всегда совпадают и ещё какой-либо), то возвращаем fail, и ищем новый путь, иначе добавляем символы (вершины) с полученного списка в общий. Но реализовать этот предикат никак не получается...

Решение задачи: «Работа со списком»

textual
Листинг программы
  1. not(belong_s(Tmp,Tail_Path)),

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


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

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

6   голосов , оценка 4.167 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут