我正在做一个练习,我需要创建一个简单的约会机构匹配系统。目前每个人都有一种爱好,爱好按活跃和不活跃进行分类,如果两个爱好匹配并且两个人有异性,那么婚介所就认为这些人是匹配的。
所以现在我需要这个系统能够允许多种爱好,但我似乎无法理解这个问题。
这是我所拥有的:
(deftemplate MAIN::person
(slot name)
(slot age)
(multislot hobby)
(slot town)
(slot sex))
(person (name "Jane")
(age 25)
(hobby fashion gardening)
(town montrose)
(sex female))
(deffacts hobby_types "Hobby categories"
(hobby_type gardening active)
(hobby_type swinging active)
(hobby_type reading inactive)
(hobby_type fashion inactive)
)
(defrule compatible_hobbies
(opposite_sex ?name1 ?name2)
(person (name ?name1) (hobby ?hobby1))
(person (name ?name2) (hobby ?hobby2))
(hobby_type ?hobby1 ?type)
(hobby_type ?hobby2 ?type)
=>
(assert (hobbies_match ?name1 ?name2))
)
Run Code Online (Sandbox Code Playgroud)
首先,我是否正确声明了多槽字段?如何调整兼容的爱好规则以匹配一个人可能拥有的任何爱好?
本人的多槽爱好已正确声明。但是您的规则不会正确匹配爱好,并且会将相同的事实与表明简与简兼容的相同事实相匹配。实际上,如果规则与事实匹配,它将生成个人事实的笛卡尔积(或大量非期望的匹配)。
我将规则修改为:
(defrule compatible_hobbies
(person (name ?n1) (hobby $? ?h1 $?))
(person (name ?n2) (hobby $? ?h1 $?))
(hobby_type ?h1 ?x)
(test (neq ?n1 ?n2))
=>
(assert (hobbies_compatible ?n1 ?n2))
)
所以如果你断言两个人的事实,比如
(person (name "Jane") (hobby blah1 gardening blah2))然后(person (name "Jim") (hobby blah3 gardening blah4))规则将被触发,并且事实(hobbies_兼容 Jim Jane)将被断言(以及事实(hobbies_兼容“Jim”“Jane”))。
通配符 $? 变量匹配所需匹配爱好之前和之后的一组符号。你的异性事实可能也应该是一个测试而不是一个事实。