了解一些 CLIPS 原始数据类型

问题描述 投票:0回答:1

我正在使用 CLIPS 作为知识库系统,但我面临着理解以下三种类型的问题:

1-外部地址

2-实例名称

3-实例地址

我读了以下内容:

external-address:返回的外部数据结构的地址 用户定义的函数(用 C 或 Jave 等语言编写) 已与CLIPS整合

我无法理解,有这个例子吗?

instance-name:由 left 和 right 内包含一个符号组成 括号,因此纯符号可能不会被括号包围

好吧,我知道它们是符号周围的括号,但是它们有什么用呢?有例子吗

另外,我需要一个实例地址的示例

c clips expert-system
1个回答
0
投票

外部地址是指向不受 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> 
© www.soinside.com 2019 - 2024. All rights reserved.