我正在使用 CLIPS 作为知识库系统,但我面临着理解以下三种类型的问题:
1-外部地址
2-实例名称
3-实例地址
我读了以下内容:
external-address:返回的外部数据结构的地址 用户定义的函数(用 C 或 Jave 等语言编写) 已与CLIPS整合
我无法理解,有这个例子吗?
instance-name:由 left 和 right 内包含一个符号组成 括号,因此纯符号可能不会被括号包围
好吧,我知道它们是符号周围的括号,但是它们有什么用呢?有例子吗
另外,我需要一个实例地址的示例
外部地址是指向不受 CLIPS 管理的内存的指针。创建外部地址的唯一方法是使用 CLIPS 中的用户定义函数 API 来调用返回内存指针的函数。外部地址的默认值是空指针,因此如果您将槽的类型声明为外部地址,并且在断言事实时不指定该值,您将看到该槽的值设置为空指针。
CLIPS> (deftemplate window (slot pointer (type EXTERNAL-ADDRESS)))
CLIPS> (assert (window))
<Fact-1>
CLIPS> (facts)
f-1 (window (pointer <Pointer-C-0x0>))
For a total of 1 fact.
CLIPS>
如果您想创建一个可由 CLIPS 操作的 GUI,您可以定义一些用户定义的函数,它们分配一个窗口 (create-window) 并打印到该窗口 (print-window)。然后,您可以创建一个窗口并将指针分配给事实的槽值:
(assert (window (pointer (create-window))))
然后您可以从这样的规则打印到窗口:
(defrule hello
(window (pointer ?window))
=>
(print-window ?window "Hello World!"))
事实地址和实例地址也是指向内存的指针,但这些是指向 CLIPS 维护的数据结构的指针。
实例名称只是一种特殊的符号,引用类的实例。您可以在创建实例时指定实例名称,如果未指定,则自动创建实例。可以使用实例名称或实例地址将消息发送到实例。
CLIPS> (defclass POINT (is-a USER) (slot x) (slot y))
CLIPS> (make-instance [p1] of POINT (x 1) (y 2))
[p1]
CLIPS> (make-instance of POINT (x 0) (y 3))
[gen1]
CLIPS> (instances)
[p1] of POINT
[gen1] of POINT
For a total of 2 instances.
CLIPS> (send [p1] get-x)
1
CLIPS> (instance-address [p1])
<Instance-p1>
CLIPS>
(defrule example
?i <- (object (is-a POINT) (name ?n))
=>
(println "The instance address is " ?i)
(println "The instance name is " ?n))
CLIPS> (run)
The instance address is <Instance-gen1>
The instance name is [gen1]
The instance address is <Instance-p1>
The instance name is [p1]
CLIPS>