일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- idb2pat
- Python
- svn update
- Rat
- x64
- NumPy Unicode Error
- MySQL
- javascript
- malware
- error
- data distribution
- TensorFlow
- ida pro
- error fix
- ecma
- mock.patch
- 포인터 매핑
- open office xml
- Ransomware
- pytest
- Analysis
- idapython
- hex-rays
- idapro
- Injection
- ida
- h5py.File
- why error
- commandline
- debugging
- Today
- Total
13 Security Lab
Jess 자바 전문가 시스템 개발환경 원숭이 바나나 잡기 본문
(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 butthe entire fact on the right hand side of a rule. Jess allows us to bind a fact toa variable using the <- symbol:
?bananasFact <- (바나나위치 ?bananasP)
?monkeyFact <- (원숭이위치 ~?bananasP)
; 첫번쨰꺼는 바나나위치 값을 변수에넣는거지만 두번쨰꺼는 "원숭이위치랑 바나나위치랑 같이 않으면" 이라는 조건임
(retract ?monkeyFact)
(assert (원숭이위치 ?bananasP) ) )