Я прочитал here как вызвать функцию python на lhs правила клипов.Функция Python в LHS правила CLIPS называется несколько раз - как ждать, пока переменная не будет содержать значение?
Теперь у меня есть следующее правило:
(defrule python_func_lhs "comment me"
(object (is-a clips_TEST_CLASS) (some_slot ?some_slot_value))
(test (eq (python-call python_print (str-cat "some_slot: " ?some_slot_value)) TRUE))
=>
;(assert (do_something))
)
Моя проблема заключается в том, что функция питона вызывается дважды, первый печать
some_slot: ноль
, а затем
some_slot: some_slot_value
Кажется, что вторая часть правила, содержащая функцию python, не «ждет», когда первая часть правила LHS будет согласована.
Как я могу сделать клипы, вызывающие функцию python только один раз, как только первая часть правила LHS будет сопоставлена? Другими словами, я хочу подождать, пока значение переменной ?some_slot_value
.
Если возможно, я хотел бы избежать создания нескольких правил и использования «контрольных фактов».
Что с этим связано Джесс? – laune
@laune вопрос не является специфическим для pyclips. В jess также должно быть возможно вызвать java-функцию на lhs правила. Но вы правы, я буду перефразировать вопрос или удалить тег. – stackoverflowwww
Я просто попробовал '(deffacts someData (Data (obj (new String" A "))))' и '(defrule find? Data <- (Data (obj? A)) (test (eq (call? длина) 1)) => (printt t "find выполнено" crlf)) 'в Джессе, и он отлично работает. – laune