。공부 。2008.08.08 21:08
Jess 라는 인공지능 프로그램은 Java의 모든클래스를 객체화하여 사용할수 있다.
그 방법또한 어렵지 않아 쉽고 간단하게 객체를 만들어 사용할 수 있다.

- Java의 파일클래스를 객체화하여 사용하기 -
(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)

jess에서는 변수타입과 객체형태가 따로 존재하지 않기 때문에 변수에 값을 할당할때 쓰이는
bind 키워드를 사용하여 자바클래스를 호출하여 만들어진 객체를 담을수있게 된다.
(bind ?file (new java.io.File file.txt))
위의 소스는 자바의 파일클래스 new키워드를 사용해 객체를 만드는 방법이다.
만약 자바였다면 File file = new File("file.txt"); 이런식으로 객체를 만들테지만 jess에는 위에서 설명했듯이 따로 변수타입이나 객체형태가 존재하지 않기 때문에  bind 키워드를 사용해 변수인 ?file에 File객체를 담을수 있게 된다.

위의 세줄은 파일클래스 ?file를 FileReader에 연결해 기능을 확장하고 BufferedReader클래스에 FileReader 클래스 객체인 ?fr을 연결해 버퍼단위로 데이터를 불러올수있는 최종 파일개체인 ?br객체를 만드는 과정이다.

자. 이젠 다만들어진 객체를 활용해 볼 차례지요.
파일객체에는 다양한 메소드들이 많습니다. 이번에 써볼 메소드는 제가 테스트를 할때 주로 쓰는 readLine() 메소드를 호출해 file.txt 안의 데이터를 불러와 봤습니다.

(bind ?a (call ?br readLine))
메소드를 불러들일때 사용하는 키워드는 'call' 입니다.
call 키워드를 사용해 ?br객체를 호출하고 객체의 readLine메소드를 사용한다는 뜻이죠
readLine메소드를 이용해 불러들인 데이터는 변수 ?a에 저장 되게 됩니다.

마지막 4줄은 단순히 불러들인 데이터를 변수별로 출력하게 됩니다.

이런식이로 자바의 모든클래스를 사용할수있습니다. 똑같은 방법으로 말이죠
하지만 제가 직접만든 클래스를 jess에서 객체화 하려고 했는데 잘 되질 않더군요..
객체화하는 방법이 분명 있을텐데말이죠.. 흠...

신고
Posted by kyoe
。공부 。2008.07.08 18:09
제스에서 사용자함수를 만들기 위해서 deffunction문을 앞에 써준뒤 함수명을 기능에 맞게 부여한뒤 사용하면 되는데 이역시 사용하는 방식을 일반함수와 비슷합니다.

2. 큰수를 구하는 함수
(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
        )
이런식으로 생략되도 ?x 와 ?y값은 리턴됩니다.

3. 리스트를 이용한 함수, multifield 변수
(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 모니터 본체 스피커 키보드 마우스)
show-list 함수를 선언한뒤 매개변수로 3개의 값을 받고 있네요
여기서 눈여겨 봐야 할 부분은 $?datas 이부분입니다.
개변수 앞에 '$'가 붙으면 multifield 변수로써 쓰여지게 됩니다.
여기셔 multifield변수란 위의 show-list 함수에서 3개의 매개변수를 받을수 있게끔되어 있지만 multifield변수를 사용하면 3개이상의 매개변수를 받을수 있게 되는것입니다.
또한 함수호출시 2개의 매개변수만 넘겨주게 되면 multifield변수인 $?datas는 아무값도 없는값이 되므로 2개의 매개변수만 넘겨주어도 에러가 나지 않지만
여기서 한개의 매개변수만 넘겨주게 되면 ?data2변수에 값이 지정되지 않았으므로 에러가 발생한다.

[실행결과]
Jess reported an error in routine show-list
    while executing deffunction show-list
    while executing (show-list 모니터).
  Message: Too few arguments to deffunction show-list.
  Program text: ( show-list 모니터 )  at line 10.

1:모니터 2:본체
1:모니터 2:본체 3:스피커
1:모니터 2:본체 3:스피커 4:키보드 5:마우스

신고
Posted by kyoe
。공부 。2008.07.08 17:15
1. if함수
(bind ?num 100)
(if (> ?num 95)then
   (printout t"A+" crlf)
   else
   (printout t"A+이 아닙니다." crlf)
   )
위의 소스는 ?num이 95보다 크면 A+을 출력하라는 간단한 if함수의 예제 입니다.
선행표기법을 제외하면 일반 if문과 같다는것을 알수있습니다.

2. member$
(bind ?com-list (create$ 모니터 본체 스피커))
(if (member$ 본체 ?com-list)then
    (printout t"본체가 있습니다." crlf)
    else
    (printout t"본체가 없습니다." crlf)  
    )
일반리스트를 활용한 if함수 예제 입니다. 여기서 눈여겨 봐야 할 함수가 member$
member$는 member$ 바로 앞의 원소가 해당리스트에 존재하면 TRUE를 리턴하게 되고
존재하지 않을시에는 FALSE를 리턴하게 됩니다.

[실행결과]
A+
본체가 있습니다.
신고
Posted by kyoe
TAG If, jess, 제스
。공부 。2008.07.08 16:43
C나 자바에서와 같이 제스 에서는 반복문이 존재 한다.
foreach나 for문 while와 같은 함수가 말이죠.

1. foreach 함수는 일반리스트의 원소를 차례차례 한개씩 받아오는 함수이다.
(bind ?com-list (create$ 모니터 본체 스피커))
(bind ?num 0)
(foreach ?data-list ?com-list
    (printout t (++ ?num)" : " ?data-list crlf)
    )
foreach 함수는 위와 같이 쓰인다.
첫번째줄에서 일반리스트를 선언해준뒤 두번째줄에서 카운터변수 ?num을 0으로 초기화 시켜주고 있다.
foreach 함수의  첫번째 변수인 ?data-list는 ?com-list의 원소값 한개를 받아와 저장하게 된다.
com-list의 원소가 nil이 아닐 동안 원소를 한개씩 받아오게 되는것이다.

[실행 결과 ]
1 : 모니터
2 : 본체
3 : 스피커

2. for 함수
(for (bind ?i 0) (<= ?i 9) (++ ?i)
    (printout t"3 *" ?i " = " (* 3 ?i) crlf)
    )
for문의 형식은 씨언어나 자바와 비슷하다 다만 제스는
선형표기법을 쓴다 라는것을 빼면 말이죠
위의 소스는 간단하게 구구단 3단을 출력하는 소스입니다.

3. while 함수
(bind ?num 1)
(while (<= ?num 9) do
    (printout t "2 * " ?num " = "(* 2 ?num) crlf)
    (++ ?num)
    )
역시 형식은 자바와 비슷하죠?
while의 조건이 만족하는 동안 do 아래의 문장을 실행하게 됩니다.
[실행결과]
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
2 * 6 = 12
2 * 7 = 14
2 * 8 = 16
2 * 9 = 18

신고
Posted by kyoe
。공부 。2008.07.08 16:24
jess 에서는 C나 자바에서와 비슷한 의미로 리스트라는걸 쓰더군요 아직 배우는수준이라 정확히 이녀석을 어디에 어떻게 쓰는지는 자세히는 모르지만 문법정도는 설명할수 있을거 같네요

1. 변수를 선언하듯 리스트를 선언해 줍니다.
(bind ?com-list (create$ 모니터 본체 스피커))
create$ 라는 것이 보이죠? 이는 제스에서 일반 리스트를 생성할때 첫번째원소는 함수로 인식하기 때문에 (예를 들어 (+ 2 2) 에서 +를 함수로 인식하는것과 마찬가지) 이를 해결하기 위해 create$를 사용합니다.
함수앞에 '$' 가 붙으면 일반리스트를 제어하는 함수라 생각하면 쉽다.
이렇게 되면 ?com-list 의 첫번째원소는 모니터 두번째는 본체 그리고 세번째는 스피커되 되는것이죠

2. 리스트의 헤드와 꼬리 부분 출력
(printout t"첫번째 원소 : " (first$ ?com-list) crlf)
(printout t"나머지 원소 : " (rest$ ?com-list) crlf)
첫번째 원소(헤드)를 받아오는 특수함수 first$  
첫번째 원소를 제외한 나머지 원소(꼬리)를  받아오는 rest$
위와 같이 first$ 와 rest$라는 특수 함수를이용해 헤드와 꼬리부분을 받아올수 있습니다.

3. 리스트의 특정원소 받아오기
(printout t"특정위치의 원소 : " (nth$ 2 ?com-list) crlf)
특정위치의 원소를 받아오는 nth$ 함수를 사용해서 원하는 원소의 값을 받아올수 있다.

4. 일반리스트 데이터 추가
(bind ?addcom-list (create$ ?com-list 키보드 마우스))
addcom-list 를 선언한뒤 데이터를 할당하는데 이때 전에 선언해둔 ?com-list를 사용해서 데이터를 추가 할수 도 있다.

(printout t"addcom-list : " ?addcom-list)
위의 addcom-list 를 출력하면 다음과 같다.
addcom-list : (모니터 본체 스피커 키보드 마우스)
신고
Posted by kyoe

티스토리 툴바