我正在做一个练习,我需要创建一个简单的约会代理匹配系统。目前,每个人都有一个爱好,爱好是主动和不活跃的类别,如果两个爱好比赛和两个人有异性,那么约会机构认为这些人是一个比赛。

所以现在我需要系统能够允许多个爱好,但我似乎不能抓住这个。

这是我有的:

(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字段?以及如何调整兼容性的_hobbbies规则以与一个人可能拥有的爱好者匹配?

有帮助吗?

解决方案

亲自的MultiSlot Hobby正确宣告。但是你的规则无法正确匹配爱好,并将与表明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”)“简”))。

通配符$?变量与前面的一组符号匹配,并按照所需的匹配业余爱好。你的异性事实可能也应该是一个测试而不是事实。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top