2014-11-07 4 views
1

"일치"단계에서 이해할 수있는 것은 여러 조건이 WM의 사실에 의해 충족되기 때문에 여러 규칙이 "활성화"될 수 있습니다. 그러나 나는 분쟁 해결 단계에서 아젠다의 규칙 중 하나만 해고 될 것이라고 생각했다.충돌 해결 단계가 CLIPS에서 두 가지 규칙을 실행합니다.

이제 2 개의 규칙을 의제로 설정하고 실행 단계에서 둘 다 해고되는 프로그램이 있습니다! 하나의 규칙 만 해고한다고 생각하지 않습니까?

CLIPS> (defrule testrule1 (declare (salience 1)) 
(testfact1) (testfact2) => (printout t "testrule1 firing." crlf)) 
CLIPS> (defrule testrule2 
(testfact1) => (printout t "testrule2 firing." crlf)) 
CLIPS> (assert (testfact1) (testfact2)) 
==> f-1  (testfact1) 
==> Activation 0  testrule2: f-1 
==> f-2  (testfact2) 
==> Activation 1  testrule1: f-1,f-2 
<Fact-2> 
CLIPS> (agenda) 
1  testrule1: f-1,f-2 
0  testrule2: f-1 
For a total of 2 activations. 
CLIPS> (run) 
FIRE 1 testrule1: f-1,f-2 
testrule1 firing. 
FIRE 2 testrule2: f-1 
testrule2 firing. 
CLIPS> 

답변

3

충돌 해결로 두 규칙이 모두 실행되는 것을 막을 수는 없으며 가장 먼저 해고되는 규칙을 결정합니다. 두 규칙 중 하나만 실행하려면 원하는 규칙의 testfact1을 취소하거나 다른 방법 (예 : 제어 사실 사용)으로 다른 규칙을 의제에서 제거해야합니다.

+0

Giarratano의 저서 (이 분야의 전공 중 한 명)는 여러 곳에서 선정 과정 (즉, Conf. Res.)에서 하나의 규칙 만 선택할 것이라고 언급합니다. 즉, 한 번에 하나씩 선택하고, 그 다음에는 활성화가 아젠다에 남아 있지 않을 때까지 다음 하나를 선택한다는 의미입니까? 내가 맞습니까? – wmac

+0

예, 맞습니다. 그것은 다음 * 해고 될 예정표에 규칙을 선택합니다. 그러나 그것은 해고 된 규칙이 의제에서 벗어나기 위해 무언가를하지 않는 한, 의제에 대한 다른 규칙들이 연속적으로 발사되는 것을 막지 못한다. 주목할 점은 의제의 모든 규칙이 실행되는 것은 아닙니다. 현재 선택된 규칙은 어떤 규칙이 의제에 있는지 (예 : 사실을 철회하거나 현재 모듈을 변경하여) 변경할 수 있다는 것입니다. – bogatron