문제

나는 운동을하고, 간단한 데이트 대행사 일치 시스템을 만들어야하는 곳에서.현재 각 사람이 한 가지 취미를 가지고 있으며, 취미는 적극적이고 비활성으로 카테고리이며 두 명의 취미가 일치하고 두 사람이 이성을 갖는 경우 데이트 기관은 이들을 사람들에게 경기라고 생각합니다.

이제는 여러 가지 취미를 허용 할 수 있도록 시스템이 필요하지만이 주위에 머리를 가져 오는 것처럼 보입니다.

여기있는 것이 있습니다 :

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

그래서 먼저 멀티 슬롯 필드를 올바르게 선언합니까?그리고 사람이 가질 수있는 취미 중 하나와 일치하도록 내 호환 _hobbies 규칙을 어떻게 조정합니까?

도움이 되었습니까?

해결책

직접 멀티 슬롯 취미가 올바르게 선언되었습니다.그러나 귀하의 규칙은 취미와 정확하게 일치하지 않으며 Jane이 Jane과 호환되는 것을 보여주는 동일한 사실과 동일한 사실과 일치합니다.실제로 규칙이 일치하는 사실을 일치시킨 경우 사람의 사실 (또는 많은 비 원하는 일치)의 데카르트 제품을 생성합니다.

나는 규칙을 수정했다 :

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

그래서

와 같은 두 사람의 사실을 주장한다면

(person (name "Jane") (hobby blah1 gardening blah2))(person (name "Jim") (hobby blah3 gardening blah4)) 그런 다음 규칙이 화재되고 사실 (hobbies_compatible jim jane)이 주장 될 것입니다 (사실 (hobbies_compatible "jim" "제인")).

와일드 카드 $?가변은 선행하는 일련의 기호와 원하는 일치하는 취미를 따릅니다.당신의 이성이있는 사실은 아마도 사실 대신 시험 일 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top