1

CLIPS には 2 つのルールがあり、両方とも true の場合に結合したいのですが、どうすればよいかわかりません。grant-eligible...という属性があります。それを設定するとTRUE、次のルールを読み取って'grant-eligible'からFALSE...に設定できると考えていましたが、コードが無限ループに陥っているようです。これを行う...

だからここに私のルールがあります:

    (defrule complete "rule for app completeness"
  ?f <- (application (transcript-received Yes) (app-complete FALSE)
    (gpa
                ?v_gpa&:(
                    > ?v_gpa 0)))

  =>
  (modify ?f (app-complete TRUE)))


    (defrule denied "rule for admission - DENIED"
  ?f <- (application (app-complete TRUE) (app-decision FALSE)
    (gpa
                ?v_gpa&:(
                    < ?v_gpa 3.0))

    (ssat
                ?v_ssat&:(
                    >= ?v_ssat 0.0))



        )


  =>
  (modify ?f (app-decision DENIED))

  )

(defrule accepted "rule for admission - ACCEPTED"
  ?f <- (application (app-complete TRUE) (app-decision FALSE)
    (gpa
                ?v_gpa&:(
                    >= ?v_gpa 3.5))

    (ssat
                ?v_ssat&:(
                    >= ?v_ssat 1500))


        )

  =>
  (modify ?f (app-decision ACCEPTED))

  )

これは私が今実装しようとしているものです

(defrule female-finaid "rule for finaid applications for female students"
  ?f <- (application (app-decision ACCEPTED) 
    (gender F) (grade-entry Freshman) (country USA)
    (grant-eligible TRUE)
    (grant ?v_grant)
    )

  =>
  (modify ?f
            (grant (+ ?v_grant 5000))
            (grant-eligible TRUE)
        )
    )

    (defrule great-students-finaid "rule for finaid applications for female students"
  ?f <- (application (app-decision ACCEPTED) 
    (country USA)
    (grant-eligible TRUE)
    (grant ?v_grant)
    (gpa
                ?v_gpa&:(
                    >= ?v_gpa 4.0))
    )

  =>
  (modify ?f
            (grant (+ ?v_grant 4500))
            (grant-eligible FALSE)
        )
    )

これらのルールが両方とも当てはまる場合、授与される助成金は 9500、5000、または 4500 になるはずです...何かアイデアはありますか?

解決策: (どこにff-grant-eligiblees-grant-eligible私のコントロール ファクトがあります...それらは ff=女性フィナイド、および es=優秀な学生の略です)

    (defrule female-finaid "rule for finaid applications for female students"
  ?f <- (application (app-decision ACCEPTED) (ff-grant-eligible TRUE)
    (gender F) (grade-entry Freshman) (country USA)

    (grant ?v_grant)
    )

  =>
  (modify ?f
            (grant (+ ?v_grant 5000))
            (ff-grant-eligible FALSE)
        )
    )

    (defrule great-students-finaid "rule for finaid applications for female students"
  ?f <- (application (app-decision ACCEPTED) (es-grant-eligible TRUE)
    (country USA)

    (grant ?v_grant)
    (gpa
                ?v_gpa&:(
                    >= ?v_gpa 4.0))
    )

  =>
  (modify ?f
            (grant (+ ?v_grant 4500))
            (es-grant-eligible FALSE)
        )
    )
4

1 に答える 1

2

プログラムの実行を制御する方法は多数あります (制御ファクト、顕著性、モジュールなど)。この回答では、アプリケーション処理の段階で制御事実 (顕著なもの) を使用します。また、各アプリケーションに固有のidスロットが関連付けられていると仮定します。

次の事実と規則を考慮してください。

(deffacts application-stages "ordered sequence of stages for an application"
  (stages app-received app-accept-reject app-evaluate-grants
          app-apply-grants app-complete))

(defrule go-to-next-stage "Advances to the next application stage"
  ?stage <- (app-stage ?id ?current-stage)
  (stages $? ?current-stage ?next-stage $?)
  =>
  (retract ?stage)
  (assert (app-stage ?id ?next-stage))
  (printout t "Application " ?id " moved from stage " ?current-stage
              " to " ?next-stage "." crlf))

デファクトはアプリケーションの段階のapplication-stages順序を定義し、go-to-next-stageルールはアプリケーションの段階を進めます。ルールの顕著性はデフォルト (0) よりも低いため、現在のステージに対応するルールが他にない場合にのみ実行されます。したがって、プログラムに他のルールがない場合、次のようになります。

CLIPS> (reset)
CLIPS> (assert (app-stage app-001 app-received))
<Fact-2>
CLIPS> (run)
Application app-001 moved from stage app-received to app-accept-reject.
Application app-001 moved from stage app-accept-reject to app-evaluate-grants.
Application app-001 moved from stage app-evaluate-grants to app-apply-grants.
Application app-001 moved from stage app-apply-grants to app-complete.
CLIPS> 

ただし、特定のステージに関連付けられたルールがある場合は、それらが最初に実行されます。app-evaluate-grantsしたがって、次のようにルールをステージに追加できます。

(defrule female-finaid "rule for finaid applications for female students"
  (app-stage ?id app-evaluate-grants)
  (application (app-decision ACCEPTED) (id ?id)
    (gender F) (grade-entry Freshman) (country USA)
  =>
  (assert (grant ?id female 5000)))

同様にgreat-student-finaidルールを追加します。次に、app-apply-grantsステージには 1 つのルールがあります。

(defrule apply-grant "Adds the amount of a grant to an application"
  (app-stage ?id app-apply-grants)
  ?grant <- (grant ?id ? ?amount)
  ?app <- (application (id ?id) (grant ?v_grant))
  =>
  (retract ?grant)
  (modify (?app (grant (+ ?v_grant ?amount))))

grant-eligibleこのようにモデル化する利点の 1 つは、アプリケーションのデータにコントロール ファクト (例: ) を含める必要がないことです。つまり、制御ロジックはデータ モデルから分離されています。CLIPS モジュールを使用して ( 経由で) ここで行ったことと同じ効果を達成できることに注意してください。これdefmoduleは多くの場合望ましいものですが、より長い回答が必要になります (これはすでにかなり長いです)。

于 2013-04-12T14:34:09.453 に答える