Все возможные маршруты между входом и выходом
Мне нужна помощь, чтобы решить путь лабиринта. заранее спасибо
link(a,b).
link(b,c).
link(c,d).
link(f,c).
link(b,e).
link(d,e).
link(e,f).
Напишите предикат, который определяет маршрут между любыми двумя соседними точками (например, X и Y), основываясь на том факте, что между ними существует связь, и рекурсивным предикатом, который охватывает более общий случай маршрута между любыми двумя несмежными точками. (Например, X и Z), установив факт наличия связи между X и третьей точкой в лабиринте (скажем, Y) и маршрутом между Y и Z.
Две специальные комнаты - одна подключена к "а" и называется "Вход", а другая - к "f" и называется "Выход". Добавьте ряд фактов, отражающих две новые комнаты. Используя предикаты из задачи 1, напишите предикат, который находит все возможные маршруты между входом и выходом и создает список посещенных комнат. Напишите другой предикат, который отображает список в интерактивной консоли в конце каждой итерации или, другими словами, каждый раз, когда достигается выход. Напишите план тестирования, который показывает ваши ожидаемые результаты и фактические результаты. Оцените это решение и определите любые потенциальные проблемы и ситуации, которые могут вызвать их возникновение.
Проблема с этим решением заключается в зацикливании. Если я хочу связать (а, f), пролог говорит "нет". Что-то не так с моим предикатом.
|?- ссылка (а, б). ссылка (б, в). ссылка (в, г). ссылка (е, с). ссылка (б, д). ссылка (д, е). ссылка (д, е).
маршрут (X,Y):- ссылка (X, Y). Маршрут (X,Y):- ссылка (X,Z), маршрут (Z,Y). да
да
да
да
да
да
да
! ----------------------------------------! Ошибка 20: Предикат не определен! Цель: маршрут (_31102,_31104):- ссылка (_31102, _31104)
Прервано |?- ссылка (а, е). нет
|?- маршрут (X, Y). X = a, Y = b;
X = b, Y = c;
X = c, Y = d;
X = f, Y = c;
X = b, Y = e;
X = d, Y = e;
X = e, Y = f;
Х = а, Y = с;
X = a, Y = e;
X = a, Y = d
;
X = a, Y = d
|?- ссылка (X, Z). X = a, Z = b
|?- |?- ссылка (X, Z). X = a, Z = b;
X = b, Z = c;
X = c, Z = d;
X = f, Z = c;
X = b, Z = e;
X = d, Z = e;
X = e, Z = f
1 ответ
connected_to( A,B) :-
closure0(link, A,B).
Смотрите этот вопрос для определения closure0/3
,
Или, чтобы использовать ваше новое имя:
route(A0,A) :-
link(A0,A1),
closure0(link, A1,A).