Не ожидаемые результаты строительства - PullRequest
0 голосов
/ 29 апреля 2020

У меня небольшой вопрос по поводу моего кода: (например, его можно интерпретировать как сетку)

free(1,1).
free(1,3).
free(2,3).
free(2,1).
free(1,5).
free(5,6).
free(5,2).
free(5,4).

busy(5,1,white,pion).
busy(1,2,black,pion).
busy(1,4,black,pion).
busy(1,6,black,pion).
busy(5,3,white,pion).
busy(5,5,white,pion).

%all clauses for  move/6

move(X,Y, X2,Y2,white,pion) :-
   busy(X,Y,white,pion), free(X2,Y2), X2=X-1, Y2=Y-1.
move(X,Y, X2,Y2,white,pion) :-
   busy(X,Y,white,pion), free(X2,Y2), X2=X-1, Y2=Y+1.
move(X,Y, X2,Y2,black,pion) :-
   busy(X,Y,black,pion), free(X2,Y2), X2=X+1, Y2=Y-1.
move(X,Y, X2,Y2,black,pion) :-
   busy(X,Y,black,pion), free(X2,Y2), X2=X+1, Y2=Y+1.

Когда я выполняю это:

move(1,2,X,Y,black,pion).

в SWI-Prolog это говорит: ложь. тогда как он должен сказать true и вернуть два утверждения:

  • X2 = 2, Y2 = 1
  • X2 = 2, Y2 = 3

Я делаю не понимаю, почему это не работает, не могли бы вы мне помочь?

1 Ответ

1 голос
/ 29 апреля 2020

Это просто потому, что вы используете = («убедитесь, что левая и правая стороны объединены») вместо is/2 (вычислите арифметическое выражение c с правой стороны и объедините с левой стороны) или, что еще лучше, #= (ограничьте значения арифметических c одинаковыми, даже если не все переменные еще можно разрешить), здесь:

X2=X-1, Y2=Y-1.

Это объединяет X2 с фактической структурой -(X,1). Что не удастся, так как X2 будет значением.

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

:- use_module(library(clpfd)).  % for #= predicate
move(X,Y, X2,Y2,white,pion) :-
   busy(X,Y,white,pion), free(X2,Y2), X2 #= X-1, Y2 #= Y-1.

Также сдвиньте тест вперед:

move(X,Y, X2,Y2,white,pion) :-
   busy(X,Y,white,pion), X2 #= X-1, Y2 #= Y-1, free(X2,Y2).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...