CLIPS中文手册

(hunter-game duck Brian)

表示第一个字段代表猎人,第二个字段代表游戏名称。

现在,一些定义是必需的了。一个表是一组无内在序列的项目集合。之所以称一个表为有序的,意味着表中的位置是非常重要的。一个多字段是有序字段,每个字段都有一个值,特殊符号nil意思是无,通常作为一个占位符用在空字段中。举例如下:

(duck nil)

可以表示猎人的捕鸭袋中今天一无所获。

注意,nil表示了一个占位符,虽然它没有值。举例,试想一个字段就是一个邮箱,没有邮箱和邮箱中没有信件是完全两码事。如果没有nil,这个事实就是一个单字段事实(duck),如果一个规则依赖于两字段激活,则该单字段事实不会被激活,稍后你会看到的。

这里有许多不同有效的字段类型:float,integer,symbol,string,external-address,fact-address,instance-name和instance-address。这些字段类型用来存储字段值的类型。未命名的字段中,值的类型由你的输入决定。在deftemplates中,你可以显式的声明字段所包含值的类型。显式的声明加强了软件工程的概念,是产生一个高效软件的编程训练。

Symbol是一类字段类型,该类型起始于一个可印刷的ASCII码并被选择性的加一个0或更多的可印刷字符。字段由空格或占位符被普通的分隔。举例:

(duck-shot Brian Gary Rey)

有四个字段,指示了所有的杀鸭猎人。在这个事实中,字段被空格分隔,并由圆括弧括起来。

事实中不能嵌入其他的事实。举例,下面即是一个非法的事实:

(duck (shot Brian Gary Rey))

然而,如果“shot”被当作一个字段名,上面的事实可能是一个合法的deftemplate事实。后面的三个人名为该字段下的值。

CLIPS区分大小写。同样,CLIPS中特定的符号有特殊的意义。

‘’ ( ) & | < ~ ; ? $

“&”,“|”和“~”不会独立的使用或作为符号的任何部分。

一些字符的作用等同于分隔符以结束一个符号。下面的字符的作用等同于分隔符号。 ? 所有的不可印刷的ASCII码,包括空格,回车键,制表键和换行键。 ? 双引号,“”

? 起始和结束圆括号,() ? &号 ? 竖线,|

? 小于,<.这也是尖括号的一部分。 ? 波浪字符,~

? 分号,;指示一个注释的开始,回车键结束

? ?和$?也许不能作为一个符号的开始,但是可以插入其中

分号在CLIPS的作用是指示一个注释的开始,如果你试图增加一个分号,CLIPS便会认为你在输入一段注释并等待你的完成。如果你在最高阶层(top-level)中不经意的输入了一个分号,那么输入一个圆括号的结束部分:)并回车。CLIPS会以一个错误消息响应并提示给你(就像生活中的某些时候,你得做些错误的事情以使得某些事情正确)。

随着你通读这本手册,你将会逐渐明白上面那些符号的意义。除了“&”,“|”和“~”之外,你将使用其他的表示符号,然而,也许对于有些人,在读程序和试图理解程序运行机理时有些困惑。通常情况下,最好是避免使用这些符号来表示字符,除非你有更好的理由需要用到它们。

下面是这些符号的一些例子: duck duck1 duck_soup duck-soup

duck1-1_soup-soup d!?#%^

第二类类型的字段是string。一个字符串必须用双引号引起来,双引号是字段的一部分。引号中可以有0个或多个字符。一些例子如下:

“duck” “duck1” “duck/soup” “duck soup”

“duck soup is good!!!”

第三和第四种字段类型为数字型字段。该字段用来表示整型或浮点型字段。浮点型通常被简化为float。(float-point->float)

CLIPS中的数字均为“long long”整型或双精度浮点型。没有小数点的数字即是整型,除非它们不属于整型范围。整型的范围由数字的位数决定,N,用来表示整型如下所示:

-2N-1 ? 2N-1-1

对于64位机器“long long”整型,符合该范围的数字为:

-9,223,372,036,854,775,808 ? 9,223,372,036,854,775,807

下面给出一些数字的例子,增加下面的数据到事实中,最后一个数字为指数表示法,用“e”或“E”代替乘以10。

CLIPS>(clear) CLIPS>(facts)

f-0 (initial-fact)

For a total of 1 fact. CLIPS>(assert (number 1))

CLIPS>(assert (x 1.5))

CLIPS>(assert (y -1))

CLIPS>(assert (z 65))

CLIPS>(assert (distance 3.5e5))

CLIPS>(assert (coordinates 1 2 3))

CLIPS>(assert (coordinates 1 3 2))

CLIPS>(facts)

f-0 (initial-fact) f-1 (number 1) f-2 (x 1.5) f-3 (y -1) f-4 (z 65)

f-5 (distance 350000.0) f-6 (coordinates 1 2 3) f-7 (coordinates 1 3 2) For a total of 8 facts. CLIPS>

如你所见,CLIPS将输入的指数表示法转换成数字350000.0,这是因为当数字足够小,就会被从指数表示转换到浮点型格式。

注意上面的每个数字前面都有一个符号开头,如“number”,“x”,“y”等。在CLIPS6.0版本以前,允许仅一个数字的事实,然而,现在必需一个符号作为第一字段,同时,CLIPS的一些专用字段不能用来作为第一字段,但是可以用来作为其他字段。举个例子,专用关键字not用来指代否定模式,但是不能作为一个事实的第一字段。

一个事实由一个或多个被圆括弧括住的字段组成。为了简单化,我们在前面七章中将仅仅讨论事实,但也有许多对模式匹配应用于对象做了讨论。例外的是,一些函数如assert和retract仅仅只能用于事实,而不能用于对象。对对象相应的处理方法将会在第八到第十二章中讨论。

一个事实可以是有序的,也可能是无序的。所有前面你已经看到的事实都是有序事实,因为字段的顺序决定了它们的不同。举个例子,注意,CLIPS会自动将包含相同数字“1”,“2”和“3”的事实区分开。

f-6 (coordinates 1 2 3) f-7 (coordinates 1 3 2)

有序事实必须用字段对位于其定义的数据。举例说明,有序事实(duck Brian)有两个字段,同样(Brian duck)也有两个字段,然而,CLIPS将其看作两个不同的事实,因为有序事实字段的值是不同的。相反,事实(duck-Brian)仅有一个字段,因为有一个“-”符号将两个值连结。

定义模板事实(Deftemplate facts),稍后会做详细的表述,它是无序的,因为它用命名字段来定义数据。这与在C和其他语言中应用结构体一样。

多字段通常被由一个或多个的空格,制表,回车或表格组成的空白隔离开来。举例说明,输入下面的例子,你将发现每个被存储的事实都是一样的。

CLIPS>(clear)

CLIPS>(assert (The duck says “Quack”))

CLIPS>(facts)

f-0 (initial-fact)

f-1 (The duck says “Quack”) For a total of 2 facts. CLIPS>(clear)

CLIPS>(assert (The duck says “Quack” ))

CLIPS>(facts)

f-0 (initial-fact)

f-1 (The duck says “Quack”) For a total of 2 facts. CLIPS>

回车的使用是为增加可读性。在下面的例子中,每个字段后加一个回车,增加的事实与将字段都写在一行的效果是一样的。

CLIPS>(clear)

CLIPS>(assert (The duck says

“Quack”))

CLIPS>(facts)

f-0 (initial-fact)

f-1 (The duck says “Quack”) For a total of 2 facts. CLIPS>

然而,当你在输入一个字符串的时候,要注意插入回车后的效果,例子如下:

CLIPS>(assert (The duck says “Quack ”))

CLIPS>(facts)

f-0 (initial-fact)

f-1 (The duck says “Quack”) f-2 (The duck says “Quack ”)

For a total of 3 facts. CLIPS>

如你所见,在双引号中插入的回车在字符串输出中会将双引号的后半部分移到下一行。CLIPS会认为f-1与f-2是两个不同的事实,这一点很重要。

同样,我们也注意到CLIPS会保存事实中字段里的大写和小写字母。也就是“The”中的“T”和“Quack”中的“Q”。CLIPS被认为是区分大小写的,因为它将大写和小写字母区别对待。举例说明,增加事实(duck)和(Duck),然后调用(facts)命令,你会发现CLIPS增加了两个不同的事实(duck)和(Duck),这正是因为CLIPS是区分大小写的缘故。

下面的例子将更清楚的表现了回车应用于表中,增加可读性的作用。增加下面的事实,使用空格和回车将字段合适的安排在行中。破折号和减号被使用来创建单字段,这样,CLIPS就会将“fudge sauce”作为一个单字段了。

CLIPS>(clear)

CLIPS>(assert (grocery-list

联系客服:779662525#qq.com(#替换为@)