You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 00:55:39