clips 使用字符串来做比较条件
clips use string to make a compare condition
我对 Clips 专家系统非常陌生
我正在寻找用于比较先前规则中的文本的语法
像这样
(defrule GetGender
(declare (salience 100))
(printout t "What's your gender ? (Male/Female): ")
(bind ?response (read))
(assert (Gender (gender ?response))))
当我从上面得到答案时 "Male" 我希望下面的规则处于活动状态。
(defrule GetShirt
(declare (salience 99))
(Gender (gender ?l))
(test (= ?l Male))
=>
(printout t "What's your shirt color ? (Blue/Black): ")
(bind ?response (read))
(assert (Shirt (shirt ?response))))
但是好像(test and =)不是字符串比较的语法,我的英文也不够好,连代码中的“?l”都不知道是什么意思
有人可以帮我解决这个问题吗?
谢谢。
=
用于比较数字。
对于字符串,您需要使用 eq
函数。
In [1]: (eq "foo" "bar")
FALSE
In [2]: (eq "foo" "foo")
TRUE
使用 = 比较数字,使用 eq 比较任何类型的值。在您的 GetShirt 规则中,标记 ?l 是一个绑定到性别槽值的变量,因此它可以在表达式 (= ?l Male) 中使用。在对常量进行简单比较时,没有必要使用 test 条件元素。您可以简单地在模式中使用常量:
CLIPS>
(deftemplate response
(slot attribute)
(slot value))
CLIPS>
(defrule GetGender
=>
(printout t "What's your gender ? (Male/Female): ")
(bind ?response (read))
(assert (response (attribute gender) (value ?response))))
CLIPS>
(defrule GetShirt
(response (attribute gender) (value Male))
=>
(printout t "What's your shirt color ? (Blue/Black): ")
(bind ?response (read))
(assert (response (attribute shirt) (value ?response))))
CLIPS> (reset)
CLIPS> (run)
What's your gender ? (Male/Female): Male
What's your shirt color ? (Blue/Black): Blue
CLIPS>
我对 Clips 专家系统非常陌生 我正在寻找用于比较先前规则中的文本的语法
像这样
(defrule GetGender
(declare (salience 100))
(printout t "What's your gender ? (Male/Female): ")
(bind ?response (read))
(assert (Gender (gender ?response))))
当我从上面得到答案时 "Male" 我希望下面的规则处于活动状态。
(defrule GetShirt
(declare (salience 99))
(Gender (gender ?l))
(test (= ?l Male))
=>
(printout t "What's your shirt color ? (Blue/Black): ")
(bind ?response (read))
(assert (Shirt (shirt ?response))))
但是好像(test and =)不是字符串比较的语法,我的英文也不够好,连代码中的“?l”都不知道是什么意思
有人可以帮我解决这个问题吗?
谢谢。
=
用于比较数字。
对于字符串,您需要使用 eq
函数。
In [1]: (eq "foo" "bar")
FALSE
In [2]: (eq "foo" "foo")
TRUE
使用 = 比较数字,使用 eq 比较任何类型的值。在您的 GetShirt 规则中,标记 ?l 是一个绑定到性别槽值的变量,因此它可以在表达式 (= ?l Male) 中使用。在对常量进行简单比较时,没有必要使用 test 条件元素。您可以简单地在模式中使用常量:
CLIPS>
(deftemplate response
(slot attribute)
(slot value))
CLIPS>
(defrule GetGender
=>
(printout t "What's your gender ? (Male/Female): ")
(bind ?response (read))
(assert (response (attribute gender) (value ?response))))
CLIPS>
(defrule GetShirt
(response (attribute gender) (value Male))
=>
(printout t "What's your shirt color ? (Blue/Black): ")
(bind ?response (read))
(assert (response (attribute shirt) (value ?response))))
CLIPS> (reset)
CLIPS> (run)
What's your gender ? (Male/Female): Male
What's your shirt color ? (Blue/Black): Blue
CLIPS>