2014-11-24 5 views
-2

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

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, напишите предикат, который найдет все возможные маршруты между Entry и Exit и создаст список посещенных комнат. Напишите еще один предикат, который отображает список в интерактивной консоли в конце каждой итерации, или, другими словами, каждый раз, когда выйдет Exit. Напишите план тестирования, который показывает ожидаемые результаты и фактические результаты. Оцените это решение и определите любые потенциальные проблемы и ситуации, которые могут привести к их возникновению.

Проблема с этим решением - цикл. Если я хочу связать (a, f), пролог говорит no.Is что-то не так с моим предикатом.

| ? - ссылка (a, b). ссылка (b, c). ссылка (c, d). ссылка (f, c). ссылка (b, e). ссылка (d, e). ссылка (e, f).

route (X, Y): - link (X, Y). маршрут (X, Y): - ссылка (X, Z), маршрут (Z, Y). да

да

да

да

да

да

да

! ---------------------------------------- ! Ошибка 20: предикат не определен ! Цель: маршрут (_31102, _31104): - ссылка (_31102, _31104)

Aborted | ? - link (a, f). no

| ? - маршрут (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;

X = a, Y = c;

X = a, Y = e;

Х = а, Y = д

;

Х = а, Y = д

| ? - ссылка (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;

Х = е, Z = F

+2

Вы должны объяснить лучше, что вы пробовали, прежде чем задать вопрос на этом сайте. Никто не будет делать домашнее задание для вас, но многие люди готовы помочь вам понять некоторые технические моменты, которые у вас нет. Не отправляйте упражнение, которое вы должны делать, надеясь, что кто-то сделает это за вас ... – Antwane

+0

Получите информацию об этом сайте, прочитав [тур] (http://stackoverflow.com/tour). – false

ответ

1
connected_to(A,B) :- 
    closure0(link, A,B). 

См this question для определения closure0/3.

Или использовать новое имя:

route(A0,A) :- 
    link(A0,A1), 
    closure0(link, A1,A).