Я получил домашнее задание для моей логики, конечно, но более или менее не имеет понятия, как ее решить ... с запросом, какНайти все возможные пути без петель в графике в Прологе
?- find(a,[r(a,[b,d]),r(b,[a,c,e]),r(c,[b]),r(d,[a,e]),
r(e,[b,d,f]),r(f,[e,g]),r(g,[f])],Path).
Пролог должен возвращать все возможные пути в данном графике. Термины R (X, Список) определит граф, а это означает, что узлы в списке могут быть достигнуты от узла X. В этом случае выходной сигнал будет:
Path = [a,b,c] ;
Path = [a,b,e,d] ;
Path = [a,b,e,f,g] ;
Path = [a,d,e,b,c] ;
Path = [a,d,e,f,g] ;
false.
Хотя я получить повесить многочисленные решения здесь, в SE и в Интернете в целом, к аналогичным проблемам, я как-то слишком глуп, чтобы понять, как работать с определением графика в этом задании.
Я полагаю, что find (Start, ...) следует вызывать рекурсивно со всеми членами списка в r (Start, List), но в качестве новичка для Prolog (мы просто сделали стандартное семейное древо. ..) Я не знаю, как это сделать.
Любая помощь была бы действительно оценена. Я знаю, что мне не с чем начать, но я уже провел половину ночи, пытаясь понять что-то, и до сих пор у меня нет подсказки.
/Edit:
Для начала, я думаю, что я нужен какой-то базовый случай, чтобы прервать рекурсию. Я думаю, что это должно быть либо
find([],_,_).
потому что я предполагаю, что последний рекурсивный вызов не будет иметь ничего, чтобы начать с, или
find(_,[],_).
при условии, что список терминов, определяющих соседние узлы должны быть пустым, когда программа завершит его обработку.
Теперь фактический звонок. Возможно, что-то вроде
find(Start,[r(Start,[Adjacent|Restadj])|Rest],Path):-
find(???).
Моих проблем здесь следующее:
-Кака я сделать программу использовать элементы списка в г (...) термин, как при следующем запуске?
-Как проверить, если узел уже «посетили»/Как я могу удалить узел из определенного списка в г
-Как я помещал найденные узлы в списке Path? Просто добавить? Или выполнить рекурсивный вызов с помощью чего-то вроде [Путь | Старт]?
Как вы видите, это не так много. Некоторые наводящие вопросы, было бы хорошо, так как Пролог кажется довольно интересным, и поэтому интересно узнать ...
Пробыв некоторое время с аккуратным инструментом трассировки PDT-Eclipse, я думаю, я понял, что делает программа. То, что я не понимаю на этом, - это то, почему последний узел всегда теряется. После того, как откат завершился неудачно, например, потому что r (c, [b]) - следующий найденный член, а memberchk (b, [b]) терпит неудачу из-за отрицания (это то, что я делаю +), и никакого другого термина с r (c , X), он начинается с поиска других возможностей перехода от узла b, у которого есть соседние узлы, оставшиеся в r (b, [...]). Но почему программа забывает поместить узел c в список Path?Есть ли возможность сделать какой-то, если-то-иначе в случае
member(r(Node, Adjacent), Graph),
member(AdjNode, Adjacent),
\+ memberchk(AdjNode, Seen),
не удается, еще добавить последний узел в пути?
Покажите нам, что вы придумали. Мы понимаем, что он не является полным или правильным, но помогает понять, что вы пробовали. –
почему downvotes? это не похоже на то, что ОП просто сбросил здесь задание (как в этом другом вопросе о судоку); он ясно показывает, что он пытался его решить/подумать. –
Да, я знаю, что у меня не будет никого, кто будет выполнять мою работу для меня при написании экзамена, поэтому просто попросить решение будет немым. – PeterPanter