关于RHS变量的处理
bind
用于绑定RHS
中的变量,因为在LHS
中,可以使用?
的方式表示和绑定变量,如果是到了RHS
中,就必须使用bind
关键字和?
结合的方式:
(clear)
(defrule addition
(numbers ?x ?y)
=>
(assert (answer (+ ?x ?y)))
; 绑定变量,相当于一个变量的声明,如果注视掉,则会有变量未声明的错误
(bind ?answer (+ ?x ?y))
(printout t "answer is " ?answer crlf)
)
(assert (numbers 2 2))
(run)
(facts)
create$
用于在RHS
部分创建包含多个变量的域,这多个变量是一个实体中;如果要拆分,那么需要调用implode$
来把包装的多个变量域拆分。
(clear)
(defrule myrule
=>
(bind ?vars (create$ var1 var2 va3)) ; vars包含(var1 var2 var3)这三个变量域
(printout t ?vars crlf) ; 作为整体输出
(printout t (implode$ ?vars) crlf) ; 拆分变量输出
)
(reset)
(run)
结果输出:
(var1 var2 va3)
var1 var2 va3
自定义函数
函数包括参数和返回值,基本的格式如下:
(deffunction function-name [optional comment]
(?arg1 ?arg2 ... ?argM [$?argN])
(<action 1>
<action 2>
...
<action K -1>
<action K>
)
)
可以传入任意个参数,由多个action
,但是只有最有一个action
的值才会返回。
代码示例:
(deffunction hypotenuse
(?a ?b)
(sqrt (+ (* ?a ?a) (* ?b ?b)))
)
(defrule calculate-hypotenuse
(dimensions ?base ?height)
=>
(printout t "Hypotenuse = " (hypotenuse ?base ?height) crlf)
)
(assert (dimensions 3 4))
(run)