1

我正在做一个练习,我需要在哪里创建一个简单的约会机构匹配系统。目前每个人都有一个爱好,爱好是按活跃和不活跃的类别,如果两个爱好匹配并且两个人有异性,约会机构认为这些人是匹配的。

所以现在我需要系统能够允许多种爱好,但我似乎无法理解这一点。

这是我所拥有的:

(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))
)

所以首先,我是否正确声明了 multislot 字段?以及如何调整我的 compatible_hobbies 规则以匹配一个人可能拥有的任何一个爱好?

4

1 回答 1

5

正确地声明了多槽爱好。但是您的规则不会正确匹配爱好,并且会将同一事实与表明 Jane 与 Jane 兼容的同一事实匹配。实际上,如果规则匹配事实,它会生成人员事实的笛卡尔积(或大量不希望的匹配)。

我将规则修改为:

(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_compatible Jim Jane) 将被断言(以及事实 (hobbies_compatible "Jim" "Jane"))。

通配符 $? 变量匹配所需匹配爱好之前和之后的一组符号。你的异性事实可能也应该是一个测试而不是一个事实。

于 2012-10-19T10:17:19.350 回答