唯一的实例绑定顺序

时间:2016-07-13 19:57:27

标签: clips

我试图为任何一对独特的不同实例触发一次规则。

一个简单的例子如下:

(defclass USER_THING (is-a USER))

(definstances KNOWN_THINGS
    (thing-a of USER_THING)
    (thing-b of USER_THING)
    (thing-c of USER_THING))

(defrule match-things
    ?thing0 <- (object (is-a USER_THING))
    ?thing1 <- (object (is-a USER_THING))
=>
    (printout t "-------" crlf)
    (printout t "thing0 " (instance-name ?thing0) crlf)
    (printout t "thing1 " (instance-name ?thing1) crlf))

显然,我们期望KNOWN_THINGS的笛卡尔积与它本身一样,这正是我们得到的:

CLIPS> (reset)
CLIPS> (run)
-------
thing0 [thing-c]
thing1 [thing-c]
-------
thing0 [thing-c]
thing1 [thing-b]
-------
thing0 [thing-c]
thing1 [thing-a]
-------
thing0 [thing-a]
thing1 [thing-c]
-------
thing0 [thing-b]
thing1 [thing-c]
-------
thing0 [thing-b]
thing1 [thing-b]
-------
thing0 [thing-b]
thing1 [thing-a]
-------
thing0 [thing-a]
thing1 [thing-b]
-------
thing0 [thing-a]
thing1 [thing-a]

虽然我想要的输出更类似于:

CLIPS> (reset)
CLIPS> (run)
-------
thing0 [thing-a]
thing1 [thing-b]
-------
thing0 [thing-a]
thing1 [thing-c]
-------
thing0 [thing-b]
thing1 [thing-c]

我有使用Apache Jena的前向链接推理系统的经验,其中我只需添加一个规则子句来强制对实例名称进行任意排序:

(defrule match-things
    ?thing0 <- (object (is-a USER_THING))
    ?thing1 <- (object (is-a USER_THING))
    (> (str-compare (instance-name ?thing0) (instance-name ?thing1)) 0)
=>
    (printout t "-------" crlf)
    (printout t "thing0 " (instance-name ?thing0) crlf)
    (printout t "thing1 " (instance-name ?thing1) crlf))

这不是适当的CLIPS规则。我能做些什么来达到我想要的效果?我可以根据需要向实例添加信息(例如任意数字或字符串标识符)以便于实现此目的。

1 个答案:

答案 0 :(得分:1)

使用测试条件元素:

(defrule match-things
    ?thing0 <- (object (is-a USER_THING))
    ?thing1 <- (object (is-a USER_THING))
    (test (> (str-compare (instance-name ?thing0) (instance-name ?thing1)) 0))
=>
    (printout t "-------" crlf)
    (printout t "thing0 " (instance-name ?thing0) crlf)
    (printout t "thing1 " (instance-name ?thing1) crlf))