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