Question

Je suis en train de faire un exercice et où j'ai besoin de créer une simple agence de rencontres, système de correspondance.Actuellement, chaque personne a un passe-temps, hobbies sont des catégories actives et inactives et si les deux passe-temps du match et les deux personnes sont de sexe opposé, l'agence de rencontres, pense que ces personnes sont un match.

Alors maintenant, j'ai besoin le système pour être en mesure de permettre plusieurs passe-temps, mais je ne peux pas sembler obtenir ma tête autour de cela.

Voici ce que j'ai:

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

Alors d'abord, dois-je déclarer la multislot champ correctement?Et comment puis-je régler mon compatible_hobbies règle de match contre l'une des passe-temps qu'une personne pourrait avoir?

Était-ce utile?

La solution

Le multislot hobby en personne est déclarée correctement.Mais votre règle de ne pas correspondre le passe-temps correctement et correspondent à la même fait même fait montrant que Jane est compatible avec Jane.En fait, si la règle appariés faits qu'elle génère le produit Cartésien de la personne qui fait (ou un grand nombre de non-désiré matches).

J'ai modifié la règle:

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

Donc, si vous affirmez deux faits comme personne

(person (name "Jane") (hobby blah1 gardening blah2)) et (person (name "Jim") (hobby blah3 gardening blah4)) alors la règle de l'incendie et de fait (hobbies_compatible Jim Jane) sera revendiquée (ainsi que le fait (hobbies_compatible "Jim", "Jane")).

Le caractère générique de $?variable correspond à un ensemble de symboles précédant et suivant la correspondance requise hobby.Votre sexe opposé fait devrait probablement être aussi un test au lieu d'un fait.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top