SWI-Пролог: Как использовать мой собственный предикат в качестве условия в когда /2

Я пытаюсь реализовать программу Prolog, которая может взаимодействовать с Java. Для этого я использую JPL в качестве интерфейса Prolog/Java.

Я ищу механизм, который позволяет мне выполнять действия автоматически, когда условия становятся реальностью.

Условия также представлены предикатами. Я попытался использовать предопределенный предикат "когда /2", проблема в том, что, как указано в документации здесь, условие должно быть одним из следующих:

  • nonvar(X)
  • ground(X)
  • ?=(X, Y)
  • (Cond1, Cond2)
  • (Cond2; Cond2)

Последние два условия кажутся теми, которые я должен использовать, но я не мог заставить их работать.

Что мне нужно изменить, чтобы создать свои собственные условия?

Пожалуйста примите к сведению J в качестве локальной переменной Пролога здесь.

:- use_module(library(jpl)).
:- use_module(library(when)).


should_engage(J) :-
  jpl_get(J, 'shouldEngage', V),
  V==true,
  jpl_get(J, 'players', P),
  jpl_call(P, 'canSeeEnemies', [], R),
  R==true,
  jpl_get(J, 'weaponry', W),
  jpl_call(W, 'hasLoadedWeapon', [], R),
  R==true.


call_java(J) :-
  jpl_call(J, 'stateEngage', [], R).


when(should_engage(X), call_java(X)).

1 ответ

Решение

Когда /1 является частью сопутствующей инфраструктуры, которая запускает действия при создании экземпляра переменной. Он использует атрибутивные переменные в фоновом режиме. Итак, если ваш Jобычно это переменная, которая может быть привязана в какое-то время вы можете сделать

   ...,
   when(nonvar(X), propagate(X)).

propagate(X) :-
    should_engage(X),
    call_java(X).

Или же

propagate(X) :-
    (   should_engage(X)
    ->  call_java(X)
    ;   true
    ).

Первая версия вызовет создание экземпляра X потерпеть неудачу, если should_engage/1 выходит из строя. Последняя версия нет.

Если это не привязка переменной, которая может сделать should_engage/1 true, вам нужно найти какой-то другой триггер или, возможно, иметь поток, который периодически контролирует среду и распространяется.

Обратите внимание, что вызов нелогических конструкций, когда /1, как правило, имеет мало смысла, потому что вычисления Пролога могут возвращаться назад, отменяя привязку. X и снова привязать его к тому же или другому значению, и, таким образом, ваше распространение может быть вызвано много раз с другим или одним и тем же значением.

Другие вопросы по тегам