2017-01-05 2 views
0

Так что я пытаюсь найти направление, в котором пустая плитке в 8 плитке головоломке будет скользящей,Mandist предикат не дает ожидаемые результаты

Я использую X/Y для определения плитки.

Вот код, который у меня есть.

mandist(X /Y , X1/Y1 , D, Direction):- 
     D is abs(X - X1)+ abs(Y - Y1), 
     Y is Y1 ->(
      ( X is X1 +1 -> Direction ='left') 
      ; 
      ( X1 is X +1 -> Direction = 'right')) 
     ; X is X1 ->(
       ( Y1 is Y +1 -> Direction ='up') 
      ; 
      ( Y is Y1 +1 -> Direction ='down')). 

Проблема я получаю в том, что при вызове mandist предиката это не дает мне результаты, я надеялся.

Я уверен, что проблема с, если заявление, я написал несколько psuedocode, так что вы можете понять, что я пытаюсь сделать,

if(Y == Y1){ 
    // Change the X Axis 
    if(X == X1 +1){ 
     This is a left move 
    } 
    else{ 
     This is a right move 
    } 
}else if (X == X1){ 
    // Change the Y Axis 
    if(Y == Y1 + 1){ 
     This is an up move 
    } 
    else{ 
     This is a down move 
    } 
} 

Пример:

move([1/1, 3/1, 1/3, 2/3, 3/3, 1/2, 2/2, 3/2,2,1], X, Direction) 

Это то вызывает mandist предикат

С D установлен в 1, так что обеспечивает ее законное движение

Вот неожиданный результат:

mandist(1/1, X,1, Direction). 
Direction = up ; 
false 

Я также ожидал сказать Direction = right, потому что позиция 1/1 является очень нижней левой части 3х3 и только перемещается из нижней левой либо вверх или вправо

1/3 2/3 3/3

1/2 2/2 3/2

1/1 2/1 3/1

+0

Что является окончательным 'else' дело? –

+0

Нет окончательного еще @WillemVanOnsem – user3667111

+0

, так что в этом случае предикат должен потерпеть неудачу? Что должно произойти, если 'Y' не равно' Y1', а 'X' равно' X1'? –

ответ

1

Основываясь на ваш вопрос, вы, вероятно, хотите, чтобы написать следующее предложение:

mandist(X/Y,XD/Y,D,right) :- 
    XD is X+D. 
mandist(X/Y,X/YD,D,up) :- 
    YD is Y+D. 
mandist(X/Y,XD/Y,D,left) :- 
    XD is X-D. 
mandist(X/Y,X/YD,D,down) :- 
    YD is Y-D. 

Учитывая, что вы пишите это в файл, он будет генерировать:

?- mandist(1/1,X,1,Direction). 
X = 2/1, 
Direction = right ; 
X = 1/2, 
Direction = up ; 
X = 0/1, 
Direction = left ; 
X = 1/0, 
Direction = down. 

Кроме того, он может проверить ли расположены две координаты в определенном направлении дал D нам экземпляр:

?- mandist(1/1,1/2,1,Direction). 
Direction = up ; 
false. 

Однако это будет не работает с:

?- mandist(1/1,1/2,D,Direction). 
ERROR: is/2: Arguments are not sufficiently instantiated 

Существует, однако, способ сделать это. Пожалуйста, обновите свой вопрос, если это требование.

EDIT:

Поскольку существуют границы, вы можете просто добавить их в пунктах. Если вы можете предположить, что первая пара координат действительны, это просто:

mandist(X/Y,XD/Y,D,right) :- 
    XD is X+D, 
    XD < 4. 
mandist(X/Y,X/YD,D,up) :- 
    YD is Y+D, 
    YD < 4. 
mandist(X/Y,XD/Y,D,left) :- 
    XD is X-D, 
    XD > 0. 
mandist(X/Y,X/YD,D,down) :- 
    YD is Y-D, 
    YD > 0. 
+0

Но скажите, что 1/1 находится в левом нижнем углу плитки, тогда мы не сможем двигаться вниз или left – user3667111

+0

'1/3 2/3 3/3' ' 1/2 2/2 3/2' '1/1 2/1 3/1' – user3667111

+0

Отметьте мое редактирование – user3667111

Смежные вопросы