Все возможные маршруты между входом и выходом

Мне нужна помощь, чтобы решить путь лабиринта. заранее спасибо

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).
Другие вопросы по тегам