Pregunta

Estoy haciendo un ejercicio y donde necesito crear un sistema de coincidencia de agencias de citas simple.Actualmente, cada persona tiene un hobby, los pasatiempos son categorías de activos e inactivos, y si los dos pasatiempos coinciden y las dos personas tienen relaciones sexuales opuestas, la agencia de citas cree que estas personas son un partido.

Así que ahora necesito que el sistema pueda permitir a las múltiples pasatiempos, pero parece que no puedo obtener la cabeza alrededor de esto.

Esto es lo que tengo:

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

Primero primero, ¿declaro correctamente el campo multislot?¿Y cómo puedo ajustar mi regla compatible_hobbies para que coincida con ninguno de los pasatiempos que una persona podría tener?

¿Fue útil?

Solución

El pasatiempo multislot en persona se declara correctamente.Pero su regla no coincidirá con las aficiones correctamente y coincidirá con el mismo hecho con el mismo hecho que muestra que Jane es compatible con Jane.En realidad, si la regla coincide con los hechos, generaría el producto cartesiano de los hechos de la persona (o una gran cantidad de coincidencias no deseadas).

Modificé la regla 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)) )

así que si afirma hechos de dos personas como

(person (name "Jane") (hobby blah1 gardening blah2)) y (person (name "Jim") (hobby blah3 gardening blah4)) Entonces se incendiará la regla y el hecho (Hobbies_Compatible Jim Jane) se afirmará (así como el hecho (Hobbies_Compatible "Jim" "Jane")).

el comodín $?La variable coincide con un conjunto de símbolos que preceden y siguiendo el pasatiempo correspondiente deseado.Su hecho de sexo opuesto es probablemente también una prueba en lugar de un hecho.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top