13 Security Lab

Jess 자바 전문가 시스템 개발환경 원숭이 바나나 잡기 본문

Computer Science/Study

Jess 자바 전문가 시스템 개발환경 원숭이 바나나 잡기

Maj0r Tom 2012. 10. 8. 00:43

 

jess 제스 _ martin_strauss.pdf
다운로드


 

(clear)

(reset)

(watch all)

(deffunction goto-box ()

(printout t "원숭이가 상자로 간다." crlf) )

 

(deffunction goto-bananas ()

(printout t "원숭이가 바나나로 간다." crlf) )

 

(deffunction push-box ()

(printout t "원숭이가 상자를 바나나로 민다." crlf) )

(deffunction climb-box ()

(printout t "원숭이가 상자에 올라간다." crlf) )

(deffunction grab-bananas ()

(printout t "원숭이가 바나나를 잡는다." crlf) )

 

(assert (원숭이위치 A))

(assert (원숭이손 empty))

(assert (원숭이발 onFloor))

(assert (상자위치 B))

(assert (바나나위치 C))

 

(defrule GOTOBOX

?boxFact<- (상자위치 ?boxP) ;상자위치랑 바나나위치다를떄

?monkeyFact <- (원숭이위치 ~?boxP)

?handFact <- (원숭이손 empty)

?feetFact <- (원숭이발 onFloor)

=>

(goto-box)

(retract ?monkeyFact)

(assert (원숭이위치 ?boxP) ) )

 

 

(defrule GOTOBANANAS 

; (declare (salience -100))

 ?bananasFact <- (바나나위치 ?bananasP);바나나랑 원숭이위치다를떄

 ?monkeyFact <- (원숭이위치 ~?bananasP)

 ?handFact <- (원숭이손 empty)

 ?feetFact <- (원숭이발 onFloor)

 =>

 (goto-bananas)

 (retract ?monkeyFact)

 (assert (원숭이위치 ?bananasP) ) ) 

 

 

Jess 기반 원숭이 바나나 잡기

(defrule PUSHBOX

 ?bananasFact <- (바나나위치 ?bananasP)

 ?monkeyFact <- (원숭이위치 ?monkeyP)

 ?boxFact <- (상자위치 ?boxP & :(eq ?boxP ?monkeyP) &:(neq ?boxP ?bananasP))

 ?handFact <- (원숭이손 empty)

 ?feetFact <- (원숭이발 onFloor)

 =>

 (push-box)

 (retract ?monkeyFact)

 (retract ?boxFact)

 (assert (원숭이위치 ?bananasP) )

 (assert (상자위치 ?bananasP) ) )

 

 

(defrule CLIMBOX 

?monkeyFact <- (원숭이위치 ?monkeyP)

 ?boxFact <- (상자위치 ?boxP & :(eq ?boxP ?monkeyP))

 ?handFact <- (원숭이손 empty)

 ?feetFact <- (원숭이발 onFloor)

 ?bananasFact <- (바나나위치 ?bananasP & :(eq ?bananasP ?monkeyP) )

 =>

 (climb-box)

 (retract ?feetFact)

 (assert (원숭이발 onBox) ) ) 

 

(defrule GRAB

 ?monkeyFact <- (원숭이위치 ?monkeyP)

 ?bananasFact <- (바나나위치 ?bananasP & :(eq ?bananasP ?monkeyP))

 ?boxFact <- (상자위치 ?boxP&:(eq ?boxP ?monkeyP)) 

 ?handFact <- (원숭이손 empty) 

 ?feetFact <- (원숭이발 onBox)

 =>

 (grab-bananas)

 (retract ?handFact)

 (assert (원숭이손 grab) ) )

 

 

 


 

 

Jess 규칙기반 시스템으로 규칙을 만들고 경험을 통한 데이터베이스를 만듬 & 추론

 

 

Jess 충돌 해결 방법

–depth 방식

충돌집합에 있는 규칙 중 가장 늦게 활성화된 규칙 선택

–breath 방식

충돌집합에 있는 규칙 중 가장 먼저 활성화된 규칙 선택

–(declare (salience 100))

규칙마다 우선 순위 부여 가능

 

원숭이잡기에서는 충돌이 한번 발생하는데, 세번쨰 방법 salience -100을 쓴다.

 

 


 

 

 

(defrule GOTOBANANAS 

; (declare (salience -100))

 ?bananasFact <- (바나나위치 ?bananasP)    ; 바나나위치 C가 ?bananasP(변수)에 들어감

 ?monkeyFact <- (원숭이위치 ~?bananasP)    ;원숭이 위치가 바나나위치랑 같지 않으면  룰 조건만족!!!!

 ?handFact <- (원숭이손 empty)

 ?feetFact <- (원숭이발 onFloor)

 =>

 (goto-bananas)

 (retract ?monkeyFact)

 (assert (원숭이위치 ?bananasP) ) ) 

 
Sometimes it may be useful to be able to refer to not just slot values but
the entire fact on the right hand side of a rule. Jess allows us to bind a fact to
a variable using the <- symbol:
martin_strauss.pdf 에서 참고한것으로
 
 "<-"를 씀으로서 왼쪽 value가 오른쪽에 있는 룰을 참조하게 할수도 있다고 한다.이걸몰라서 해맸어 예~
 

 ?bananasFact <- (바나나위치 ?bananasP) 

 ?monkeyFact <- (원숭이위치 ~?bananasP) 

 
;따라서 이렇게 하면 바나나의 위치의 값을 ?bananasP로 할껀데
;그때 원숭이위치가 다르다

; 첫번쨰꺼는 바나나위치 값을 변수에넣는거지만 두번쨰꺼는 "원숭이위치랑 바나나위치랑 같이 않으면" 이라는 조건임

 

 

 

(retract ?monkeyFact)

 (assert (원숭이위치 ?bananasP) ) ) 

;그리고 저장한 ?monkeyFact를 삭제
그리고 원숭이위치 ?bananasP Fact를 만들지
?bananas는 위에서 넣은대로 원래 바나나위치인 C일테고 원숭이 위치는 C가됨..... 즉 원숭이 위치를 새로만듬 A->C

 

;고투박스는 비슷하다
;그리고 푸쉬박스로 오게되는데
(defrule PUSHBOX
 ?bananasFact <- (바나나위치 ?bananasP) ;바나나위치 참조시키고
 ?monkeyFact <- (원숭이위치 ?monkeyP) ; 원숭이위치 참조시키고
 ?boxFact <- (상자위치 ?boxP & :(eq ?boxP ?monkeyP) &:(neq ?boxP ?bananasP)) ; 박스위치가 같고 박스위치랑 바나나위치가다르면 참조시켜
 ?handFact <- (원숭이손 empty)
 ?feetFact <- (원숭이발 onFloor)
 =>
 (push-box)
 (retract ?monkeyFact) ;지우고
 (retract ?boxFact) ;지우고
 (assert (원숭이위치 ?bananasP) )  ;원숭이위치 바나나로
 (assert (상자위치 ?bananasP) ) ) ; 박스위치 바나나로 즉, 원숭이가 박스밀면서 바나나위치로 ..
 
;나머지는 위 규칙대로 진행하면되고
;마지막에 원숭이손 empty -> grab으로 하면 끝나게 된다.
 

 

 

 

 

Comments