CLIPS>(+ 2.0 2.0) ; 两个浮点参数的运算结果还是浮点型 4.0
CLIPS>(+ 2 2.0) ; 混合型参数输出浮点型结果 4.0
注意最后一个情形是混合的参数,CLIPS自动将结果转变为双精度浮点型。
你可以显式的转变结果的类型,通过使用float和integer运算符,如下所示:
CLIPS>(float (+ 2 2)) ; 显式转换整型到浮点型 4.0
CLIPS>(integer (+ 2.0 2.0)) ; 显式转换浮点到整型 4
圆括号用来指定表达式的运算顺序。在?x+?y*?z的例子中,通常的计算顺序是先计算?y*?z,然后再与?x相加。然而,在CLIPS中,如果你想按照此顺序计算的话,那么必须显式的使用圆括号,如下:
(defrule mixed-cals
(numbers ?x ?y ?z) =>
(assert (answer (+ ?x (* ?y ?z)))))
在这条规则中,最内一层的圆括号里的运算最先执行,所以先执行?y*?z,然后再与?x相加。
约束变量
由模式匹配在LHS中分配一个值给变量类似于通过绑定函数(bind function)在RHS中绑定(binding)一个值到变量。如果同一个变量被重复的使用到,那么在RHS中绑定其变量值将非常方便。
以一个简单的数学计算为例,让我们首先将答案绑定到一个变量,并随后打印约束变量(bound variable)。
CLIPS>(clear)
CLIPS>(defrule addition
(numbers ?x ?y) =>
(assert (answer (+ ?x ?y))) (bind ?answer (+ ?x ?y))
(printout t “answer is ”?answer crlf)) CLIPS>
(assert (numbers 2 2))
f-0 (initial-fact) f-1 (numbers 2 2) f-2 (answer 4)
For a total of 3 facts. CLIPS>
(bind)同样可以被用在RHS中,用来绑定单或多字段值到一个变量。(bind)被用来绑定零个,一个或多个值到一个变量,而不带“$”运算符。调用LHS中的变量,你可以在一个字段中,使用“$”运算符创建多字段模式,如“$?x”。然而,在RHS中,“$”运算符是不需要的,因为(bind)的参数显式的告知了CLIPS它绑定值的个数。事实上,“$”运算符在RHS中只是一个无用的附属物。
下面的例子给出的是在RHS中绑定多个变量。多字段值函数(multifield value function),create$被用来创建一个多字段值。它的基本语法如下所示:
(create$
这里,任意个数的参数都可以被作为创建多字段值附属在一起。这些多字段值,或单字段值,可以被约束到RHS行为中的一个变量,如下所示:
CLIPS>(clear)
CLIPS>(defrule bind-values-demo =>
(bind ?duck-bachelors (create$ Dopey Dorky Dinky)) (bind ?happy-bachelor-mv (create$ Dopey)) (bind ?none (create$)) (pri