1

私はエクササイズをしていて、簡単な結婚相談所のマッチングシステムを作成する必要があります。現在、各人の趣味は1つで、趣味はアクティブと非アクティブのカテゴリに分類されます。2つの趣味が一致し、2人の性別が異性である場合、結婚相談所はこれらを人に一致すると見なします。

だから今、私は複数の趣味を可能にするシステムが必要ですが、私はこれに頭を悩ませることができないようです。

これが私が持っているものです:

(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ルールを調整して、人が持つ可能性のある趣味のいずれかと一致させるにはどうすればよいですか?

4

1 に答える 1

5

マルチスロットの個人的な趣味は正しく宣言されています。しかし、あなたのルールは趣味に正しく一致せず、同じ事実を、ジェーンがジェーンと互換性があることを示す同じ事実に一致させます。実際、ルールが事実と一致した場合、人の事実 (または多数の望ましくない一致) のデカルト積が生成されます。

ルールを次のように変更しました。

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

したがって、次のような2人の事実を主張する場合

(person (name "Jane") (hobby blah1 gardening blah2))その後、(person (name "Jim") (hobby blah3 gardening blah4))ルールが実行され、ファクト (hobbies_compatible Jim Jane) がアサートされます (ファクト (hobbies_compatible "Jim" "Jane") と同様)。

ワイルドカード $? 変数は、目的の一致する趣味の前後の記号のセットに一致します。あなたの異性の事実は、おそらく事実ではなくテストであるべきです.

于 2012-10-19T10:17:19.350 に答える