Pergunta

Estou fazendo um exercício e preciso criar um sistema simples de correspondência para agências de namoro.Atualmente cada pessoa tem um hobby, os hobbies são categorias de ativos e inativos e se os dois hobbies combinam e as duas pessoas têm sexo oposto, a agência de namoro acha que essas pessoas combinam.

Então agora preciso que o sistema seja capaz de permitir vários hobbies, mas não consigo entender isso.

Aqui está o que eu tenho:

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

Então, primeiro, declaro o campo multislot corretamente?E como ajusto minha regra compatível_hobbies para corresponder a qualquer um dos hobbies que uma pessoa possa ter?

Foi útil?

Solução

O hobby multislot pessoalmente foi declarado corretamente.Mas sua regra não corresponderá aos hobbies corretamente e combinará o mesmo fato com o mesmo fato, mostrando que Jane é compatível com Jane.Na verdade, se a regra correspondesse aos fatos, geraria o produto cartesiano dos fatos pessoais (ou um grande número de correspondências não desejadas).

Modifiquei a regra para:

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

Então, se você afirmar fatos de duas pessoas como

(person (name "Jane") (hobby blah1 gardening blah2)) e (person (name "Jim") (hobby blah3 gardening blah4)) então a regra será acionada e o fato (hobbies_compatível Jim Jane) será afirmado (assim como o fato (hobbies_compatível "Jim" "Jane")).

O curinga $?variável corresponde a um conjunto de símbolos anteriores e posteriores ao passatempo correspondente desejado.Seu fato sobre o sexo oposto provavelmente também deveria ser um teste em vez de um fato.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top