Обход комнаты - PullRequest
       2

Обход комнаты

0 голосов
/ 05 ноября 2018

Я получаю false для path_to_phone (1, 16, Path). и не могу понять, где ошибка в коде.

door(1,2).
door(1,7).
door(2,1).
door(2,8).
door(3,8).
door(4,8).
door(4,9).
door(5,9).
door(5,6).
door(6,9).
door(7,1).
door(7,8).
door(7,9).
door(7,10).
door(7,11).
door(7,12).
door(7,13).
door(7,14).
door(8,2).
door(8,3).
door(8,4).
door(8,7).
door(9,4).
door(9,5).
door(9,6).
door(9,7).
door(10,7).
door(11,7).
door(12,7).
door(13,7).
door(14,7).
door(14,15).
door(15,16).
door(16,15).
phone(5).
phone(9).
phone(16).


rooms_connected(X, Y) :- door(X, Y), door(Y, X).

path_to_phone(Start, End, Path) :- 
    move(Start, End,[Start], Room), 
    reverse(Room,Path).

move(Start, End, Path, [End|Path]) :- 
    rooms_connected(Start, End),
    phone(End).

move(Start, Middle, Visit, Path) :-
    rooms_connected(Start, End),
    End \== Middle, 
    \+member(End, Visit),
    move(End, Middle, [End|Visit], Path).

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Я думаю, что должно быть проще, не нужно обойти запутанную середину:

path_to_phone(Start, End, Path) :- 
    move(Start, [Start], [End|RPath]), 
    reverse([End|RPath], Path).

move(From, Visit, [Phone|Visit]) :- 
    door(From, Phone),
    phone(Phone).

move(From, Visit, Path) :-
    door(From, Next),
    \+memberchk(Next, Visit),
    move(Next, [Next|Visit], Path).
0 голосов
/ 05 ноября 2018

С эстетической точки зрения это выглядело бы лучше так:

move(Start, End, Visit, Path) :- rooms_connected(Start, Middle), 
                                  End \== Middle, 
                                  \+member(Middle, Visit), 
                                   move(Middle, End, [Middle|Visit], Path).

Проблема в том, что вы определили комнаты rooms_connected, потому что это заставляет соединяться в обоих направлениях. Если это то, что вы намеревались, вы должны указать в файлах дверей (15,14) и других, потому что, как и сейчас, он не может найти путь. Если нет, вы можете изменить его на:

rooms_connected(X, Y) :- door(X, Y); door(Y, X).

Это означает либо дверь (X, Y), либо дверь (Y, X).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...