我使用CLIPS作为知识库系统,但我遇到了理解以下三种类型的问题:
1-外部地址
2-实例名
3-实例地址
我读到以下内容:
external—address:返回的外部数据 struct 的地址 用户定义的函数(用C或Jave等语言编写), 已与CLIPS集成
我不明白,有没有一个例子?
instance—name:是由左和右包围一个符号形成的 因此纯符号不能被括号包围
好的,我知道它们是括号,但它们有什么用呢?有没有例子?
我还需要一个实例地址的例子
我使用CLIPS作为知识库系统,但我遇到了理解以下三种类型的问题:
1-外部地址
2-实例名
3-实例地址
我读到以下内容:
external—address:返回的外部数据 struct 的地址 用户定义的函数(用C或Jave等语言编写), 已与CLIPS集成
我不明白,有没有一个例子?
instance—name:是由左和右包围一个符号形成的 因此纯符号不能被括号包围
好的,我知道它们是括号,但它们有什么用呢?有没有例子?
我还需要一个实例地址的例子
外部地址是指向不受CLIPS管理的内存的指针.创建外部地址的唯一方法是使用CLIPS中的用户定义函数API调用返回内存指针的函数.外部地址的默认值是空指针,所以如果您声明slot的类型为external—address,并且在断言事实时不指定值,您将看到slot的值设置为空指针.
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,你可以定义一些用户定义的函数,分配一个窗口(打印窗口)并打印到该窗口(打印窗口).然后,你可以创建一个窗口,并将指针分配给事实的slot值:
(assert (window (pointer (create-window))))
然后,您可以从如下规则打印到窗口:
(defrule hello
(window (pointer ?window))
=>
(print-window ?window "Hello World!"))
事实地址和实例地址也是指向内存的指针,但它们是指向CLIPS维护的数据 struct 的指针.
实例名称只是一种特殊的符号,它引用了类的实例.您可以在创建实例时指定实例名称,如果未指定实例名称,则会自动创建实例名称.可以使用实例名称或实例地址将消息发送到实例.
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>