2014-05-16 2 views
0

CLIPS를 사용할 때 규칙을 다시 적용하고 싶습니다. 그러나 새로 고침 명령은 매번 잘 작동하지 않습니다. 그래서 나는 약간의 테스트를했지만 아직도 그것에 대해 혼란스러워합니다.클립에서 정확히 (새로 고침) 작동 방식은 무엇입니까?

Q1 : 팩트를 수정하는 규칙을 사용할 수 있습니까?

>  (defglobal ?*lock* = 0) 
>  
>  (deftemplate counter 
>  (slot number)) 
>  
>  (deffacts initial-data 
>  (counter (number 0))) 
>  
>  (defrule rule-1 
>  ?f<-(counter (number ?x)) 
>  (test (= ?*lock* 0)) 
>  => 
>  (printout t "counter number1" crlf) 
>  (bind ?*lock* (+ ?*lock* 10)) 
>  (modify ?f (number (+ ?x 1))) 
> ) 
>  
>  (defrule rule-2 
>  ?f<-(counter (number ?x)) 
>  (test (= ?*lock* 10)) 
>  => 
>  (printout t "counter number2" crlf) 
>  (bind ?*lock* 0) 
> ) 

처음 실행 한 후, 잠금이 0이된다하지만 내가 규칙-1 의제에 들어 가지 않는다 (새로 고침 규칙 1) 입력 : 은 내가 .CLP을 만듭니다. RHS의 수정 작업으로 인해 문제가 발생했는지 궁금합니다.

Q2 : 새로 고침을 사용할 때 전역 값이 LHS에서 작동합니까?

또 다른 이상한 점은 처음 실행 후입니다. 잠금이 0.I 유형 (새로 고침 규칙 -2)으로 변경되었으며 규칙 2가 다시 의제에 있음을 찾습니다. 그러나 규칙 2의 LHS는 규칙이 일치하기를 원한다면 잠금이 10이되어야한다고 제한합니다. 테스트 조건이 전혀 작동하지 않는 것 같습니다. 그러나 테스트 조건은 실제로 시스템을 실행하기 위해 타이핑 (리셋) 및 실행 (실행)을 의미하는 시스템을 실행할 때 실제로 작동합니다. 터미널에 어떤 쇼는 다음과 같이이다 :

CLIPS> (reset) 
==> Activation 0  rule-1: f-1 
CLIPS> (facts) 
f-0  (initial-fact) 
f-1  (counter (number 0)) 
For a total of 2 facts. 
CLIPS> (run) 
counter number1 
==> Activation 0  rule-2: f-2 
counter number2 
CLIPS> (refresh rule-1) 
CLIPS> (refresh rule-2) 
==> Activation 0  rule-2: f-2 
CLIPS> (run) 
counter number2 

내가 규칙을 발사 할 때 (실행) 및 (새로 고침) 사이에 다른이 궁금해?

정말 혼란 스럽습니다. 어떤 답해 주셔서 감사합니다.

답변

1

전역 변수는 패턴 일치를 트리거하지 않으므로 값이 변경되지 않는 한 규칙 조건에서 사용하지 않아야합니다. 사실이나 인스턴스를 사용하여 전역이 아닌 값을 저장하십시오. 기본 프로그래밍 가이드의 섹션 6 (http://clipsrules.sourceforge.net/documentation/v630/bpg.htm)에서 전역의 동작에 대한 정보와 여기에서의 동작에 대한 다른 정보는 Number equality test fails in CLIPS pattern matching?입니다.

이 특정 예에서 (재설정)을 수행하면 카운터 일치가 트리거되어 패턴 일치가 트리거됩니다. 규칙 1과 규칙 2의 첫 번째 조건이 일치 된 후 전역을 포함하는 후속 테스트는 전역의 현재 값을 사용하여 평가됩니다.

규칙 1을 실행하면 전역 값이 먼저 변경됩니다. 패턴 매칭을 트리거하지 않습니다. 패턴 일치가 트리거되는 카운터 사실이 수정 된 경우에만 해당됩니다. 그런 다음 규칙 1과 규칙 2의 첫 번째 조건을 다시 평가 한 다음 전역 및 현재 값을 포함하는 후속 테스트를 평가합니다.

규칙 2가 실행되면 전역 변수가 다시 변경되지만 패턴 일치는 트리거되지 않습니다. 사실에 대한 변경은 없습니다. 규칙 1과 규칙 2의 조건에 관한 한, 규칙을 만족시키는 데이터는 변경되지 않았습니다. 그래서 당신이 새로 고침을 할 때,이 두 규칙의 조건은 그 값을 고려합니까? 당신이 그들을 사용 된 방식으로 전역 변수를 사용하지 않는, 10

CLIPS> (watch rules) 
CLIPS> (watch globals) 
CLIPS> (watch facts) 
CLIPS> (watch activations) 
CLIPS> (reset) 
<== f-0  (initial-fact) 
:== ?*lock* ==> 0 <== 0 
==> f-0  (initial-fact) 
==> f-1  (counter (number 0)) 
==> Activation 0  rule-1: f-1 
CLIPS> (run) 
FIRE 1 rule-1: f-1 
counter number1 
:== ?*lock* ==> 10 <== 0 
<== f-1  (counter (number 0)) 
==> f-2  (counter (number 1)) 
==> Activation 0  rule-2: f-2 
FIRE 2 rule-2: f-2 
counter number2 
:== ?*lock* ==> 0 <== 10 
CLIPS> 

결론으로 ​​을 잠급니다. 그들은이 목적을 위해 설계되지 않았습니다. 한 규칙의 정보를 다른 규칙의 조건으로 전달하려면 사실 및/또는 인스턴스를 사용하십시오.

+0

명확한 설명, 고맙습니다. –