CLIPS茉莉花猜测程序:如何支持句子输入及优化季节选项
问题解决方案
问题1:允许用户输入“spring to autumn”这类多词短语
当前代码用(read)只能读取单个符号(遇到空格即停止),要支持包含空格的短语输入,需改用(readline)读取整行内容,再将用户输入的格式转换为程序模板中定义的标准化值:
(defrule in-temporada => (printout t "Inserte en que temporada florece: ") (bind ?input (readline)) ; 将用户输入的空格分隔短语转换为连字符格式 (bind ?temporada (cond ((str-compare ?input "primavera a otoño") 0) "primavera-a-otoño" ((str-compare ?input "verano a otoño") 0) "verano-a-otoño" ((str-compare ?input "invierno a primavera") 0) "invierno-a-primavera" ((str-compare ?input "primavera") 0) "primavera" ((str-compare ?input "verano") 0) "verano" (t ?input) ; 未匹配到预设格式时保留原输入,后续触发未找到规则 ) ) (assert (temporada ?temporada)) )
问题2:优化跨季节选项,无需整句作为单一值
可以将temporada改为多值slot,存储品种开花的所有单个季节,再通过规则判断用户输入的季节是否落在品种的开花范围内,无需预先定义所有跨季节组合:
步骤1:修改模板,使用多值slot存储单个季节
(deftemplate jazmin (slot nombre) (slot color-flor (allowed-values blanca amarilla)) (multislot temporada ; 多值slot,存储开花覆盖的所有季节 (allowed-values primavera verano otoño invierno)) )
步骤2:更新事实,填充品种实际开花季节
(deffacts jazmines (jazmin (nombre Jazmin-Blanco) (color-flor blanca) (temporada primavera verano otoño)) (jazmin (nombre Jazmin-Chino) (color-flor blanca) (temporada primavera)) (jazmin (nombre Jazmin-Silvestre) (color-flor amarilla) (temporada verano)) (jazmin (nombre Jazmin-Azor) (color-flor amarilla) (temporada primavera)) (jazmin (nombre Jazmin-Espanol) (color-flor blanca) (temporada verano otoño)) (jazmin (nombre Jazmin-Amarillo) (color-flor amarilla) (temporada invierno primavera)) )
步骤3:修改输入与匹配规则,支持单个季节或范围输入
; 处理季节输入,解析单个季节或季节范围 (defrule in-temporada => (printout t "Inserte en que temporada florece (ej: primavera, primavera a otoño): ") (bind ?input (readline)) (bind ?user-seasons (create$)) (cond ; 解析范围输入(如"primavera a otoño") ((str-index "a" ?input) (bind ?parts (explode$ ?input)) (bind ?start (nth$ 1 ?parts)) (bind ?end (nth$ 3 ?parts)) (bind ?all-seasons (create$ invierno primavera verano otoño)) (bind ?start-pos (member$ ?start ?all-seasons)) (bind ?end-pos (member$ ?end ?all-seasons)) ; 处理跨年度的季节范围(如"invierno a primavera") (if (<= ?start-pos ?end-pos) then (bind ?user-seasons (subseq$ ?all-seasons ?start-pos ?end-pos)) else (bind ?user-seasons (create$ (subseq$ ?all-seasons ?start-pos 4) (subseq$ ?all-seasons 1 ?end-pos))) ) ) ; 解析单个季节输入 (t (bind ?user-seasons (create$ ?input))) ) (assert (user-temporadas ?user-seasons)) ) ; 匹配规则:用户输入的季节与品种开花季节有交集即命中 (defrule buscar-jazmin (color-flor ?color) (user-temporadas ?user-seasons) (jazmin (nombre ?nombre) (color-flor ?color) (temporada $?jaz-seasons)) (test (not (is-empty$ (intersection$ ?user-seasons ?jaz-seasons)))) => (printout t "El nombre del jazmin descrito es: " ?nombre crlf) ) ; 未匹配到品种的规则 (defrule jazmin-no-encontrado (color-flor ?color) (user-temporadas ?user-seasons) (not (jazmin (nombre ?nombre) (color-flor ?color) (temporada $?jaz-seasons) (test (not (is-empty$ (intersection$ ?user-seasons ?jaz-seasons)))))) => (printout t "El jazmin descrito no se encuentra" crlf) )
这种方式的优势是无需预先定义所有跨季节组合,扩展性更强,且用户输入单个季节或范围都能匹配对应的品种。
内容的提问来源于stack exchange,提问作者Manuel Villanueva
相关产品推荐
相关产品推荐

