我使用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> 

C++相关问答推荐

如何将匿名VLA分配给指针?

Apple Libm的罪恶功能

C指针地址和转换

C中的__attributor__((aligned(4),packed))与 struct 的用法

在C中使用动态内存分配找到最小的负数

模拟shell并运行.sh文件

如何在不使用其他数组或字符串的情况下交换字符串中的两个单词?

防止C++中递归函数使用堆栈内存

用gcc-msse 2编译的C程序包含AVX 1指令

等同于铁 rust 的纯C语言S未实现!()宏

如何在C++中安全地进行浮点运算

当内存来自Malloc时,将char*转换为另一个指针类型是否违反了严格的别名规则?

C11/C17标准允许编译器清除复合文字内存吗?

C语言中神秘的(我认为)缓冲区溢出

在运行时判断C/C++指针是否指向只读内存(在Linux操作系统中)

SSE 向量与 Epsilon 的比较

如何正确探测平台设备?

C23 中的 [[reproducible]] 和 [[unsequenced]] 属性是什么?什么时候应该使用它们?

定义 int a = 0, b = a++, c = a++;在 C 中定义了行为吗?

计算 e^x 很好.但不是 x 的罪