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?
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.