Вопрос

Я делаю упражнение, и где мне нужно создать простую систему сопоставления агентства знакомств.В настоящее время у каждого человека есть одно хобби, хобби - это категории активных и неактивных и неактивных, и если два хобби совпадают, и два человека имеют противоположный пол, агентство знакомств считает, что их лицам являются матч.

Итак, теперь мне нужна система, чтобы иметь возможность для нескольких хобби, но я не могу, кажется, не могу получить голову вокруг этого.

Вот что у меня есть:

(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)), то правило будет огонь, и тот факт (хобби_Мампастима Джима Джейн) будет утвержден (а также факт (хоббисімПодно)).

Подстановочный знак $?Переменная соответствует набору символов, предшествующих и после желаемого подходящего хобби.Ваш противоположный поб факт, вероятно, также должен быть тестом вместо факта.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top