deftemplate构造可以在插槽中具有另一个模板吗?

时间:2019-06-09 07:05:22

标签: clips

我有一个定义如下的模板:

(deftemplate fact
    (slot name)
    (multislot field)
    (multislot value))

我可以将上面定义的 fact 定义为另一个模板中的插槽/多插槽吗?

例如:

(deftemplate collection1
    (slot fact1))

(deftemplate collection2
    (slot fact1)
    (slot fact2))

在上述所需模板中,每个插槽事实都应具有定义的模板事实。我想有这样的收藏 插槽数量很多。或者至少期望的结果是使用类似于 fact 模板的字段声明 collection 。 这样我就可以在名称,字段和值之间建立逻辑链接。

(collection2
    (fact1 (name 'ID')
        (field 'Name' 'Company' 'Role')
        (value 'Bob' 'ABC' 'Admin'))
    (fact2 (name 'Event')
        (field 'Name' 'Place')
        (value 'Conference' 'USA')))

预期结果:CLIPS可以断言上述递归事实。这是可能的,还是该问题的任何替代方法。

谢谢。

1 个答案:

答案 0 :(得分:1)

当然可以,也可以将插槽类型限制为特定的事实地址。

(deftemplate fact
    (slot name)
    (multislot field)
    (multislot value))

(deftemplate collection
  (slot fact (type FACT-ADDRESS)))

(assert (collection (fact (assert (fact (name "ID")
                                        (field "Name" "Company" "Role")
                                        (value "Bob" "ABC" "Admin"))))))

事实清单:

(facts)          

f-0     (initial-fact)
f-1     (fact (name "ID") (field "Name" "Company" "Role") (value "Bob" "ABC" "Admin"))
f-2     (collection (fact <Fact-1>))