【问题标题】:Python function in LHS of CLIPS rule called multiple times - how to wait for a variable to contain a value?CLIPS规则LHS中的Python函数多次调用-如何等待变量包含值?
【发布时间】:2015-09-25 13:46:09
【问题描述】:

我阅读了here 如何在剪辑规则的 lhs 上调用 python 函数。

现在我有以下规则:

(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))
)

我的问题是python函数调用了两次,先打印

some_slot:无

然后

some_slot: some_slot_value

似乎包含python函数的第二个规则部分没有“等待”匹配LHS规则的第一部分。

一旦 LHS 规则的第一部分匹配,如何让剪辑只调用一次 python 函数?换句话说,我想等到?some_slot_value 变量有值。

如果可能,我想避免创建多个规则并使用“控制事实”。

【问题讨论】:

  • Jess 和这件事有什么关系?
  • @laune 问题不是特定于 pyclips 的。在 jess 中,还应该可以在规则的 lhs 上调用 java 函数。但你是对的,我会改写问题或删除标签。
  • 我刚刚在 Jess 中尝试过 (deffacts someData (Data (obj (new String "A"))))(defrule find ?data <- (Data (obj ?a)) (test (eq (call ?a length) 1)) => (printout t "find executed" crlf)),效果很好。
  • @laune 感谢您的尝试。我仍在调查这个问题,我认为问题是这样的:“在生成部分匹配时,始终评估规则的 LHS 上的测试条件”。如果使用字段约束(& | ~)可能是一个解决方案,我会尝试。
  • 这很可能是一个特定问题,具体取决于基于规则的系统的实施。 CLIPS 只是一个方言家族;规则引擎是单独的野兽。

标签: clips expert-system pyclips


【解决方案1】:

不同的规则引擎有不同的方法来指定对象更改何时完成,但一般来说,当您对一个对象进行多次不同的更改时,每次更改都会调用一次模式匹配过程。您在问题中包含了一个代码片段,而不是可重现的示例,所以我只能猜测您的问题的原因,但您可能正在做的是创建对象,然后在单独的步骤中对其进行修改。创建对象时模式匹配会延迟,直到处理完所有插槽覆盖,并且类似地,在进行对象修改时,您可以使用 modify-instance 函数将插槽更改的集合分组为一个更改。如果您需要在多个函数调用之间延迟模式匹配,可以使用 pattern-match-delay 函数。

CLIPS> 
(defclass clips_TEST_CLASS
   (is-a USER)
   (slot some_slot))
CLIPS>    
(definstances initial
   (i1 of clips_TEST_CLASS (some_slot some_slot_value)))   
CLIPS> 
(deffunction pcall (?v) (printout t ?v crlf) TRUE)
CLIPS> 
(defrule python_func_lhs 
    (object (is-a clips_TEST_CLASS) (some_slot ?some_slot_value))
    (test (pcall (str-cat "some_slot: " ?some_slot_value)))
    =>)
CLIPS> (reset)
some_slot: some_slot_value
CLIPS> (make-instance i2 of clips_TEST_CLASS (some_slot some_other_value))
some_slot: some_other_value
[i2]
CLIPS> (make-instance i3 of clips_TEST_CLASS)
some_slot: nil
[i3]
CLIPS> (send [i3] put-some_slot another_value)
some_slot: another_value
another_value
CLIPS> 
(object-pattern-match-delay
   (make-instance i4 of clips_TEST_CLASS)
   (send [i4] put-some_slot still_another_value))
some_slot: still_another_value
still_another_value
CLIPS> (modify-instance [i4] (some_slot value))
some_slot: value
TRUE
CLIPS>

【讨论】:

  • 下次我会给出一个完整的例子。您正确地发现了问题 - 感谢您在 SO 上分享您的剪辑知识
猜你喜欢
  • 2018-12-21
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 2020-05-24
相关资源
最近更新 更多