오늘은 저번과 동일하게 Jess 기초 실습을 해 볼 것이다.
코드를 통해서 Jess는 어떻게 쓰는지 알아 본다.
firstname, lastname , age를 속성으로 갖는 person ( template )를 만들어 본다 .
watch all 로써 , 확인을 해본다.
reset함으로써 최종 완료를 한다.
하나의 규칙을 만들어 본다.
세 개의 값을 갖는 grocery-list 변수이다 .
만약 이 변수가 3개의 값을 갖는다면 , printout 문이 실행이 될 것이다.
바로 확인해 본다 .
assert 로써 grocery-list 에 각각의 값을 대입해 본다.
(run)으로 실행하게 되면 , 규칙에 걸려서 , 규칙의 printout이 출력된다.
또하나의 규칙을 새워보자.
위의 규칙은 위에서 만들어 놓은 grocery-list를 규칙의 조건으로 사용해본다.
grocery-list가 list이냐 라는 것을 물어 보고 있다.
그렇게 된다면 printout이 출력되게 해라 라는 의미 .
run을 해서 확인해보면
grocery-list의 값들이 printout 을 통해 출력된다.
위의 규칙들은 ?fact에 값을 대입하고 , 제거하는 규칙과
?fact에 초기화를 시킨뒤 초기화된 갑을 불러오는 규칙이다.
위의 규칙은 foo ( fact ) 에 xy , xyyz , xyyyz 필드에 매치된다고 한다.
위의 규칙은 foo (fact) 는 a ( Symbol ) 에 ?x 가 바인딩 되는데 , & ( 연결 연산자 ) 를 통해 , def , ef , ddef 필드에 매치된다고 한다.
bar (fact)는 ?x 와 매치가 된다.
위의 규칙은 , 우선순위를 부여 하는 규칙이다..
https://herzberg.ca.sandia.gov/docs/70/rules.html
위는 Jess _ Document 이다 .
잘 모르겠어서 위를 참고했다.
6.7. Salience and conflict resolution
Each rule has a property called salience that is a kind of rule priority. Activated rules of the highest salience will fire first, followed by rules of lower salience. To force certain rules to always fire first or last, rules can include a salience declaration:
Declaring a low salience value for a rule makes it fire after all other rules of higher salience. A high value makes a rule fire before all rules of lower salience. The default salience value is zero. Salience values can be integers, global variables, or function calls. See the set-salience-evaluation command for details about when such function calls will be evaluated.
The order in which multiple rules of the same salience are fired is determined by the active conflict resolution strategy. Jess comes with two strategies: "depth" (the default) and "breadth." In the "depth" strategy, the most recently activated rules will fire before others of the same salience. In the "breadth" strategy, rules fire in the order in which they are activated. In many situations, the difference does not matter, but for some problems the conflict resolution strategy is important. You can write your own strategies in Java; see the chapter on extending Jess with Java for details. You can set the current strategy with the set-strategy command.
Note that the use of salience is generally discouraged, for two reasons: first it is considered bad style in rule-based programming to try to force rules to fire in a particular order. Secondly, use of salience will have a negative impact on performance, at least with the built-in conflict resolution strategies.
You can see the list of activated, but not yet fired, rules with the agenda command.
Jess> (예 6- 실패 (선언 (돌출부 -100)) (명령 출구 - 유휴) => (printout "exiting ..."crlf))
쉽게 말하면 위와 같은 것인데 ,
돌출부 - 100 을 뺀다 .
그리고 출구 - 유휴시간을 뺀다.
결과는 exiting ....
그정도로만 이해한다.
다음은 or 연산자를 사용한 규칙이다.
or (a) (b) (c) 의 주장을 하고 있다 .
assert로써 (a) (b) (c)를 대입하고 ,
printout 으로써 (run)을 실행시켜 보면
3개가 매치된 것을 알 수 있따.
위 규칙은 number라는 변수에 특정 값을 바인딩 하고 있는데 , ?n의 숫자 여부를 묻고 있다.
즉 , doop는 오타이며 , oddp로 이해하자.
oddp 가 아니라면 printout 의 결과값이 도출된다.
Jess> (defrule forall-example (not (and (a ?x) (not (b ?x)))) =>)
위의 코드는 not 연산자와 and연산자를 같이 써 본 것인데 ,
a는 ?x이며 , b는 ?x가 아니고 , 이 둘의 and 연산자의 not을 다시 한번 해준 것이다.
위의 규칙은 eq 로써 4와 (+ 2 2 )의 값이 동일한 가의 대해서 평가하고 있으며
동일하다면 , printout을 출력한다 .
위의 예제를 다음과 같이 다시 나타내 본다.
Jess> (defrule rule-1 (logical (faucet-open)) => (assert (water-flowing)))
TRUE
Jess> (assert (faucet-open))
<Fact-0>
Jess> (run)
1
Jess> (facts)
f-0 (MAIN::faucet-open) f-1 (MAIN::water-flowing) For a total of 2 facts in module MAIN.
Jess> (watch facts)
TRUE
Jess> (retract (fact-id 0))
<== f-0 (MAIN::faucet-open) <== f-1 (MAIN::water-flowing) TRUE
위의 규칙은 논리적인 규칙을 나타내고 있다 .
어떤 플로우차트의 느낌인데 , 이 것을 코드로 나타낸 정도라고 이해하면 쉽다.
위를 보게 되면 , logical (faucet-open) 을 통해 , 수도꼭지를 연다라는 논리적인 규칙을 설정한다
그리고 나서 assert를 통해서 꼭지를 틀게되면 어떠한 상황이 일어나는지에 대해서 규칙을 정해준다
아마 , 물이 흐를 것이다 .
retract 로써 fact-id 0 번째를 삭제해 보겠다.
다음 그림은 , 0번째 fact인 initial-fact가 사라진 부분이다.
다음은 여러개의 template를 만들고 , 각각의 규칙을 만들고 , 중복 조건을 만족한다면 printout하는 수식을 적용해보겠다.
3개의 template를 만들어 준뒤 , 각각의 template에 속성을 지정해 준 다음 , 규칙을 지정해 준다.
facts로써 확인해 보면 3개의 fact가 존재하는걸 확인할 수 있다.
(run)을 하게 되면 규칙에 의해서 printout이 출력되고 , 1을 반환하게 된다
module은 template보다 좀 더 큰 의미인거 같다.
defmodule 로써 WORK를 지정해준다.
template를 만들어 줄 것인데 , 설정해준 module에 ::를 함으로써 이어주고 , job ( template ) 을 설정해주고 ,
속성 salary 를 지정해준다.
모듈의 template들을 확인해 주기 위해서는
list-deftemplates WORK로써 확인 가능하다.
내가 설정해준 module을 화인해 보고 싶다면 , get-current-module를 사용해서 확인가능하다.
설정해준 module의 이름을 변경하고 싶다면 , defmodule을 다시 사용해서 변경하고자 하는 이름을 다시 적어준다.
다시 현재의 모듈을 확인해 보면 바뀐것을 확인할 수 있다.
다음은 bus ( template ) 이다 .
속성으로는 route-number이 있다.
Jess> (deftemplate bus (slot route-number))
TRUE
Jess> (defrule take-the-bus ?bus <- (bus (route-number 76)) (have-correct-change) => (get-on ?bus))
TRUE
Jess> (ppdefrule take-the-bus)
"(defrule COMMUTE::take-the-bus ?bus <- (bus (route-number 76)) (have-correct-change) => (get-on ?bus))"
'학부공부 > 인공지능' 카테고리의 다른 글
eclipse 에서 Jess 맛보기 (0) | 2018.12.06 |
---|---|
Jess 기초 실습2 (0) | 2018.11.26 |
퍼지 전문가 시스템 (0) | 2018.11.25 |
Jess 기초 실습 (0) | 2018.11.23 |
Jess_Download + eclipse plugins (0) | 2018.11.20 |
#IT #먹방 #전자기기 #일상
#개발 #일상