如何在CLIPS中匹配无序学生列表以找到对应教室编号
解决CLIPS中精确匹配教室学生集合的问题
问题分析
你当前的规则仅验证了教室的学生列表是查询列表的子集,但未验证查询列表的学生也全部属于该教室。这就导致教室3、4这类学生数量更少的条目被错误匹配——它们的学生确实都在查询列表中,但查询列表里的Sebastian并不在这些教室中,不符合「恰好包含且仅包含」的要求。
解决方案
要实现精确匹配(两个集合元素完全一致,顺序无关),需同时验证双向子集关系:既保证教室的所有学生都在查询列表中,也保证查询列表的所有学生都在教室中。修改规则的条件部分即可:
(defrule match_classroom_and_students (classroom (classroom_number ?number) (students $?students)) (students_to_classroom_lookup (students $?students_lookup&:(and (subsetp $?students $?students_lookup) (subsetp $?students_lookup $?students)))) => (printout t "Classroom number " ?number crlf) )
代码说明
(subsetp $?students $?students_lookup):确保教室的每一个学生都存在于查询列表中(subsetp $?students_lookup $?students):确保查询列表的每一个学生都存在于教室中- 两者结合等价于两个集合的元素完全相同(
subsetp不受元素顺序影响)
验证结果
运行修改后的规则,输入查询事实(students_to_classroom_lookup (students Paul Peter Sebastian Lucy)),会得到期望输出:
Classroom number 1
内容的提问来源于stack exchange,提问作者Flying_Lightbulb8266
相关产品推荐
相关产品推荐

