Вопрос
Я делаю упражнение, и где мне нужно создать простую систему сопоставления агентства знакомств.В настоящее время у каждого человека есть одно хобби, хобби - это категории активных и неактивных и неактивных, и если два хобби совпадают, и два человека имеют противоположный пол, агентство знакомств считает, что их лицам являются матч.
Итак, теперь мне нужна система, чтобы иметь возможность для нескольких хобби, но я не могу, кажется, не могу получить голову вокруг этого.
Вот что у меня есть:
(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))
)
.
Сначала вверх, правильно ли я объявляю многослот поле?И как я могу настроить правило Mo Compatible_hobbies, чтобы соответствовать любому из хобби, которые может иметь человек?
Решение
Мультислотовое хобби лично объявлено правильно.Но ваше правило не будет соответствовать хобби правильно и будет соответствовать тому же факту, что одинаково, что Джейн совместима с Джейн.На самом деле, если правило соответствовало фактам, он будет генерировать декартовое произведение фактов человека (или большого количества не желаемых совпадений).
Я изменил правило:
(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))
, то правило будет огонь, и тот факт (хобби_Мампастима Джима Джейн) будет утвержден (а также факт (хоббисімПодно)).
Подстановочный знак $?Переменная соответствует набору символов, предшествующих и после желаемого подходящего хобби.Ваш противоположный поб факт, вероятно, также должен быть тестом вместо факта.