2013-04-12 5 views
1

CLIPS에는 두 가지 규칙이 있습니다. 둘 다 사실이라면 결합하고 싶습니다 ... 어떻게해야할지 모르겠습니다. 나는 grant-eligible라고하는 속성을 가지고 있습니다. 나는 그 값을 TRUE으로 설정하면 'grant-eligible'FALSE으로 설정하고 싶었습니다.하지만 내 코드가CLIPS와이 두 규칙을 결합하는 방법은 무엇입니까?

(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 = 여성 finaid 및 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) 
     ) 
    ) 

답변

1

당신의 프로그램 (예 : 제어 사실, 중요성, 모듈). 이 대답은 응용 프로그램 처리 단계에 대한 제어 사실 (중요도 포함)을 사용합니다. 또한 각 응용 프로그램과 연결된 고유 한 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 deffact이 응용 프로그램에 대한 단계의 순서를 정의하고 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> 

을하지만 특정 단계와 관련된 규칙이있는 경우, 그들은 먼저 실행됩니다 : 당신의 프로그램에서 다른 규칙 그래서, 다음과 같은 얻을 것입니다.

(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-evaluate-grants 단계에 규칙을 추가 할 수 있습니다. 이 방법을 모델링의 장점

(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)를 포함하지 않아도된다 다음, app-apply-grants 단계에 대한 하나의 규칙이있다 . 즉, 제어 로직이 데이터 모델과 별개입니다. 여기서 CLIPS 모듈을 사용하여 (defmodule을 통해) CLIPS 모듈을 사용하여 수행 한 것과 동일한 효과를 얻을 수 있으며 이는 종종 바람직하지만 더 긴 응답이 필요하다는 점에 유의하십시오 (이 것은 이미 상당히 길다).

+0

귀하의 철저한 답변을 위해 @bogatron에게 감사드립니다 ... 나는 약간 명확하지 않습니다. 지난 몇 주간 CLIPS를 배웠습니다. 그래서 나는 이것이 무엇을 의미하는지 이해하지 못한다. (assert (grant? id female 5000))) ... 또한'apply-grants stage '도 없다. 나는'grant-eligible' 속성을 사용하여 규칙이 반복적으로 실행되는 것을 멈추는 방법으로 사용하고 있었지만 분명히 작동하지 않았습니다. – engr007

+0

추가하려면 각 응용 프로그램마다 고유 한 ID가 있어야합니다. – engr007

+0

'(assert (grant? id female 5000)))'은 응용 프로그램에 적용 할 권한을 지정합니다.나는 당신이'grant-eligible'를 통제 사실로 사용하고 있다는 것을 깨닫지 못했습니다. 업데이트 된 답변 ('grant-eligible'를 삭제합니다)을보고 그것이 의미가 있는지 확인하십시오. – bogatron