在正确设置插槽之前避免模式匹配(错误)

Avoid pattern matching (errors) until a slot is set correctly

规则的 LHS R_blup 包含

(test (>= ?s2 2))

即检查?s2是否大于等于2。?s2对应一个名为s2.

的实例槽

不幸的是,我得到了错误

Function >= expected argument #1 to be of type integer or float

问题是我的代码在我可以设置参数 #1 之前执行 (test ...,即在我可以将 s2 设置为整数或浮点值之前。 s2 应该设置为由另一个规则 R_blah.

触发的 python 调用中的整数

错误是在属于另一个规则 R_xyz 的另一个 python 调用中间触发的。此 python 调用通过 clips_instance.Slots["slot_name"] = some_value.

修改实例

这通常是如何处理的?我看到三个我不太喜欢的解决方案:

  1. 正在为 s2.
  2. 设置默认(整数)值
  3. 修改 (test ... 以首先检查 nil
  4. 添加另一个 check/rule 等到 s2 不再是 nil

是否有可能 try/except/pass 错误?

使用函数 object-pattern-match-delay 延迟模式匹配,为一系列更改创建原子操作:

CLIPS> (defclass POINT (is-a USER) (slot x) (slot y))
CLIPS> 
(defrule check 
   (object (is-a POINT) (x ?s2))
   (test (>= ?s2 2))
   =>)
CLIPS> (make-instance [p1] of POINT)
[ARGACCES5] Function >= expected argument #1 to be of type integer or float

[DRIVE1] This error occurred in the join network
   Problem resides in associated join
      Of pattern #1 in rule check

[p1]
CLIPS> (agenda)
CLIPS> 
(object-pattern-match-delay
   (make-instance [p2] of POINT)
   (make-instance [p3] of POINT)
   (send [p2] put-x 3)
   (send [p3] put-x 0))
0
CLIPS> (agenda)
0      check: [p2]
For a total of 1 activation.
CLIPS>