使用FuzzyClips v6.10.d时,无法用修饰符过滤模糊变量事实
解决FuzzyClips中模糊变量修饰符过滤事实的问题
看起来你在FuzzyClips v6.10.d里尝试使用模糊修饰符时,遇到了没法用它们过滤模糊变量相关事实的问题。我先帮你梳理下代码里的小问题,再一步步说明正确的使用方法:
1. 先修正模板定义的语法问题
你写的temperature模板里,(hyperhot very hot)的写法不符合FuzzyClips的语法规范。如果hyperhot是你想基于hot用very修饰出来的模糊集,得改成嵌套括号的形式:
(deftemplate temperature 0.0 1.0 ( (cold (z 0.1 0.2)) (warm (PI 0.3 0.6)) (hot (s 0.7 0.9)) (hyperhot (very hot)) ) ; 这里修正为(修饰符 模糊值)的嵌套结构 )
另外你提供的deffacts里(temp-day (day Thursday) (day-temp h...是不完整的,建议补全成合理的模糊值,比如hot或者hyperhot,方便后续测试。
2. 用修饰符过滤事实的正确姿势
要在规则里用修饰符筛选temp-day事实,关键是在规则的条件槽中,用正确的语法把修饰符和模糊值结合起来。给你几个实用的示例:
示例1:匹配「very warm」的天气事实
如果想找出温度属于“非常暖和”的日子,规则可以这么写:
(defrule match-very-warm-days (temp-day (day ?day) (day-temp (very warm))) => (printout t "Day " ?day " has a very warm temperature." crlf) )
示例2:匹配「extremely hot」的天气事实
要是需要更强烈的修饰,比如“极热”,可以直接在规则里链式使用修饰符(哪怕模板里没预先定义这个模糊集也没关系):
(defrule match-extremely-hot-days (temp-day (day ?day) (day-temp (extremely hot))) => (printout t "Day " ?day " is extremely hot!" crlf) )
示例3:匹配预定义的hyperhot模糊值
如果你已经在模板里把hyperhot定义成了(very hot),也可以直接匹配这个预定义的模糊集:
(defrule match-hyperhot-days (temp-day (day ?day) (day-temp hyperhot)) => (printout t "Day " ?day " is hyperhot—stay cool!" crlf) )
3. 常见坑点排查
- 修饰符拼写要准确:FuzzyClips支持的标准修饰符有
very、extremely、somewhat、slightly这些,别写错单词。 - 语法结构要正确:修饰符和模糊值必须用
(修饰符 模糊值)的形式包裹,不能直接写very warm,括号不能少。 - 模糊匹配的隶属度:FuzzyClips会自动计算修饰后的模糊值的隶属度,只要事实的模糊值和规则里的修饰后值有足够的隶属度匹配,规则就会触发,不用手动计算。
把代码修正补全后,运行这些规则应该就能顺利用修饰符过滤模糊变量的事实了。
内容的提问来源于stack exchange,提问作者Keka Bron
相关产品推荐
相关产品推荐

