Jess

2,780 views

Published on

Blogcocktail Dev team Aug.2009 Workshop
by kyoe

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,780
On SlideShare
0
From Embeds
0
Number of Embeds
148
Actions
Shares
0
Downloads
31
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Jess

  1. 1. Jess (Java Expert System Shell) 전문가 시스템(Expert System)을 구축하기 위한 Shell이다.
  2. 2. 전문가 시스템 전문가시스템 (expert system) 은 전문가가 가지고 있는 지식을 인위적으로 컴퓨터에게 부여하여 그 방면에 비전문가라 할지라도 그러한 전문가의 지식을 이용하여 상호 대화를 통하여 원하는 결과를 얻는 일종의 자문형 컴퓨터 시스템이다
  3. 3. 연역법 (Deduction) Deduction (연역법) : A → B 즉 A를 알면 B를 안다. 1) 모든 포유동물은 심장을 가지고 있다. 2) 모든 말은 포유동물이다. ∴ 모든 말은 심장을 가지고 있다. 전제와의 논리적 관계만으로 필연적으로 결론이 도출되는 추론을 연역추론이라한다.
  4. 4. 귀납법(Induction) Instance로부터 Rule을 만들어 낸다. * 이 백조는 흰색이다 ........ 모든 백조는 흰색이다. * 당구볼은 큐로 쳤을때 움직인다 ........... 모든 행동에 대해, 동등한 반작용이 있다. 증명으로부터 가설을 유도해낸다. 즉 결론은 얻어진 사실로부터 추론된다. 은행나무는 낙엽이 진다. 단풍나무는 낙엽이 진다. ⇒ 모든 나무는 낙엽이 진다 : False 결과는 False일 수 있다. : Instance가 모든 Case를 전부 보여줄 수는 없기 때문이다. 유도된 결론은 정확하지 않을수 있고 또한 새로운 사실이 알려질 경우 변할수 있다.
  5. 5. Rule-base Expert System 사실(Facts) 관계를 간단한 이름으로 표현 사실은 여러개일수 있고 규칙에 따라 만들어지고 삭제되어 진다. 규칙(Rules) 다른사실로부터 하나의 또다른 사실을 추론할수 있게함
  6. 6. 추론엔진 수행과정 1. 패턴매칭 (Pattern Matching) : 새로운 사실 (fact) 가 입력된 작업기억 (working memory) 에서 규칙 (rule) 이 있는 production memory 간의 패턴 매칭하여 매칭되는 rule 들을 찾아낸다. 2. 충돌해결 (Conflict Resolution) : 복수개의 rule 이 해당될 때 최적의 rule 을 선택한다. 3. 실행 (Execution) : 선택된 rule 을 실행하고 새로이 얻은 fact 를 모두 작업기억에 저장하여 다시 패턴매칭을 시작한다.
  7. 7. 충돌 해결 (conflict resolution) 각 주기에서 수행 가능한 규칙이 하나 이상인 경우 해결 정책 1. Working Memory에 의하여 만족되는 최초의 규칙 2. 가장 높은 우선순위(priority)를 가진 규칙 선택 3. 현재의 작업 메모리에 만족되는 가장 특수한(specific) 규칙 즉, 가장 세분화된 조건을 갖는 규칙. 조건부를 구성하는 논리곱요소 (conjunct)가 가장 많은 규칙 4. 작업 메모리에 삽입된 가장 최근의 정보에 만족되는 규칙 5. 가장 새로운 규칙. 이전에 수행되지 않았던, 혹은 수행되었더라도 다른 변수값으로 수행되었던 규칙 6. 임의의 규칙 7. 순서에 상관없이 만족되는 모든 규칙을 병행하여 수행
  8. 8. JESS Syntax
  9. 9. 변수(Variable) - 일반변수 - (bind ?age 25) (O) (bind ?age = 25) (X) (bind ?name "kyoe") (O) => 모든 변수는 ‘?’로 선언 => Bind 키워드를 사용해 데이터를 할당한다. - 전역변수 - (defglobal ?*temp* = 100) => 변수 선언시 '?* *' 이런형식으로 선언하며 데이터할당시 '='을 사용한다. => 전역변수는 reset 명령어를 사용해도 초기화 되지 않는다. => 프로그램이 종료될때 소멸
  10. 10. 데이터 출력 (printout t"결과값2 : " ?age crlf) (printout t"결과값5 : " ?*imsi* crlf) printout 을 사용해서 변수에 할당된 데이터를 콘솔창에 출력 한다. 't' → 콘솔창에 출력 ‘crlf’ → 한줄 개행
  11. 11. 연산 JESS : (bind ?x(+(+ 2 2)(* 3 3))) C언어 : x = (2+2) + (3*3) Jess에서는 lisp에서와 마찬가지로 선행표기법을 쓴다.
  12. 12. 리스트 (List) - 리스트 선언 - (bind ?com-list (create$ 모니터 본체 스피커)) =>리스트 선언시 특수 함수인 create$ 함수 사용 - 헤드와 꼬리 - (printout t"첫번째 원소 : " (first$ ?com-list) crlf) (printout t"나머지 원소 : " (rest$ ?com-list) crlf) => 헤드(head) : 모니터 => 꼬리(tail) : 본체 스피커 => first$ 와 rest$라는 특수 함수를이용해 헤드와 꼬리부분을 받아올수 있다. - 특정 원소 선택 - (printout t"특정위치의 원소 : " (nth$ 2 ?com-list) crlf) => nth$ 함수는 리스트의 특정원소를 얻어올수있다. - 리스트에 데이터 추가 - (bind ?addcom-list (create$ ?com-list 키보드 마우스)) => 생성된 com-list 리스트를 할당 할 수있다. => 결과값 : 모니터 본체 스피커 키보드 마우스
  13. 13. Control - foreach - (bind ?com-list (create$ 모니터 본체 스피커)) (bind ?num 0) (foreach ?data-list ?com-list (printout t (++ ?num)" : " ?data-list crlf) ) - for - (for (bind ?i 0) (<= ?i 9) (++ ?i) (printout t"3 *" ?i " = " (* 3 ?i) crlf) ) - while - (bind ?num 1) (while (<= ?num 9) do (printout t "2 * " ?num " = "(* 2 ?num) crlf) (++ ?num) )
  14. 14. Control - IF - (bind ?num 100) (if (> ?num 95)then (printout t"A+" crlf) else (printout t"A+이 아닙니다." crlf) ) - member$ - (bind ?com-list (create$ 모니터 본체 스피커)) (if (member$ 본체 ?com-list)then (printout t"본체가 있습니다." crlf) else (printout t"본체가 없습니다." crlf) ) => PHP의 in_array() 함수와 동일한 역할
  15. 15. 함수(Function) - 큰수를 구하는 함수 - (deffunction test_fct(?x ?y) (if(> ?x ?y)then (return ?x) else (return ?y) ) ) (printout t"MAX : " (test_fct 100 200) crlf) => deffunction : 함수 선언 return이 생략되도 ?x 값이나 ?y값을 리턴할수 있다. (if(> ?x ?y)then ?x else ?y )
  16. 16. Multifeld변수 를 사용한 함수 예제 (deffunction show-list(?data1 ?data2 $?datas) (bind ?list-num 0) (bind ?com-list(create$ ?data1 ?data2 ?datas)) (foreach ?com-data ?com-list (printout t " "(++ ?list-num) ":" ?com-data) ) (printout t crlf) ) (show-list 모니터) ; 에러발생 (show-list 모니터 본체) (show-list 모니터 본체 스피커) (show-list 모니터 본체 스피커 키보드 마우스) => 인수 앞에 ‘$’ 가 붙으면 multifield인수 Multifeld인수는 여러개의 데이터를 받을수 있다.
  17. 17. 자바 연동 (bind ?file (new java.io.File file.txt)) (bind ?fr (new java.io.FileReader ?file)) (bind ?br (new java.io.BufferedReader ?fr)) (bind ?a (call ?br readLine)) (bind ?b (call ?br readLine)) (bind ?c (call ?br readLine)) (bind ?d (call ?br readLine)) (printout t"A : " ?a crlf) (printout t"B : " ?b crlf) (printout t"C : " ?c crlf) (printout t"D : " ?d crlf) => Java의 모든클래스를 객체화하여 사용할수 있다 => ‘call’ 메소드를 불러들일때 사용
  18. 18. 사실(Fact)과 규칙(Rule)
  19. 19. 사실(Fact) - 단순 facts 추가 - (assert (원숭이위치 A)) (assert (원숭이손 empty)) (assert (원숭이발 onFloor)) (assert (상자위치 B)) (assert (바나나위치 C)) => assert 키워드를 사용해 단순 fact를 작업메모리에 추가 - facts 정의 - template 정의 (deftemplate MAIN::status (slot search-depth) (slot parent) (multislot jugs) (slot last-move) ) => 이름과 슬롯들의 집합으로 이루어짐 => 하나의 사실에 하나의 템플릿이 존재 Facts 정의 (deffacts MAIN::initial-positions (status (search-depth 1) (parent root) (jugs 0 0) (last-move no-move) ) ) =>fact 는 template을 기반으로 작성해야 한다.
  20. 20. 규칙(Rule) - 규칙(Rule) - 논리적으로 참인 정보를 if-then 형식으로 표현 IF 실험을 좋아한다. AND 과학책을 많이 읽는다. AND 새로운 것을 발견한다. AND Facts 상상을 많이 한다. THEN 과학자의 소질이 있다. 새로운 Fact생성
  21. 21. 규칙(Rule) - 규칙 정의 - 4리터 컵에 물을 채운다 (defrule MAIN::FULL-4L-JUG ?node <- (status (search-depth ?num) (jugs ?x&:(< ?x 4) ?y)) => (duplicate ?node (search-depth (+ 1 ?num)) (parent ?node) (jugs 4 ?y) (last-move FULL-4L-JUG) ) ) 3리터컵에 있던 물을 4리터컵에모두 붓는다. (defrule MAIN::POUR-34-FULL ?node <- (status (search-depth ?num) (jugs ?x&:(< ?x 4) ?y&:(and(> ?y 0) (>= (+ ?y ?x) 4)))) => (bind ?y (- ?y (- 4 ?x))) (duplicate ?node (search-depth (+ 1 ?num)) (parent ?node) (jugs 4 ?y) (last-move POUR-34-FULL) ) )
  22. 22. 추론 과정 원숭이를 찾기위한 추론 과정 Depth : 1 포유류 파충류 조류 Depth : 2 육식동물 초식동물 Depth : 3 4발로 걷는다 2발로 걷는다 2, 4발로 걷는다 Depth : 4 Fact 생성 손가락 5개 손가락 3개 손가락 2개 Depth : 5 지문이 있다 지문이 없다 3개의 Rule 활성화 규칙 충돌. Depth : 6 도구사용 O 도구사용 X 바나나를 좋아한다. 바나나를 싫어한다. Depth : 7 원숭이 Depth : 8

×