Domanda

Sto facendo un esercizio e dove ho bisogno di creare un semplice sistema di corrispondenza dell'agenzia di appuntamenti.Attualmente ogni persona ha un hobby, gli hobby sono categorie da attive e inattive e se i due hobby corrispondono e le due persone hanno sesso opposto, l'agenzia di incontri pensa che queste persone siano una partita.

Così ora ho bisogno del sistema per consentire di consentire più hobby ma non riesco a farmi prendere la testa.

Ecco cosa ho:

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

Quindi prima, dichiaro correttamente il campo MultiLlot?E come aggiusta la mia regola Compatible_Hobbies per abbinare uno dei due hobby che una persona potrebbe avere?

È stato utile?

Soluzione

L'hobby multislot di persona è dichiarato correttamente.Ma la tua regola non corrisponderà correttamente agli hobby e corrisponderebbe lo stesso fatto allo stesso fatto che mostra che Jane è compatibile con Jane.In realtà se la regola corrisponde ai fatti, genererebbe il prodotto cartesiano dei fatti della persona (o un gran numero di partite non desiderate).

Ho modificato la regola a:

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

Quindi se asserisci due fatti di persona come

(person (name "Jane") (hobby blah1 gardening blah2)) e (person (name "Jim") (hobby blah3 gardening blah4)) Allora la regola spara e il fatto (Hobbies_Compatibile Jim Jim Jane) sarà affermato (così come il fatto (Hobbies_Compatibile "Jim" "Jim")).

The Wildcard $?La variabile corrisponde a un insieme di simboli precedenti e seguendo l'hobby corrispondente desiderato.Il tuo fatto sessuale opposto dovrebbe probabilmente anche essere un test invece di un fatto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top