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

Я пытаюсь реализовать программу 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 Ответ

0 голосов
/ 09 декабря 2018

Когда / 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 и повторно привязывая его к тому же или другому значению, и, таким образом, ваше распространение может называться многимираз с другим или одинаковым значением.

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