티스토리 뷰

 

먼저 코드를 보면,

 

Tablemacro: ^ConsonantPP(^Origin ^pp)

loop()

{       

   $$element = ^iterator(? member ^Origin)

   $$tmp = join($$element ^pp)

   ^CreateFact($$tmp member $$element)

}


Tablemacro라는 키워드에서 Table은 가로와 세로로 나열된 2차원 표를 말하는 것이며(엑셀의 시트를 생각하면 된다) macro는 자주 사용하는 연산식을 모듈화 해 놓음으로써 재사용이 간편하도록 만든 것이라는 뜻이다. Tablemacro CS에 등록된 명령어이다. 그 뒤에 이름 ^ConsonantPP가 나오는데 이는 작성자가 임의로 정한 것이며, 괄호 안의 인수명과 인수의 갯수도 작성자 필요에 따라 정하면 된다. loop() { }로 둘러싸인 코드를 반복하라는 명령어인데, { }로 둘러싸인 코드를 살펴 보면, 세 종류의 작업을 하도록 되어 있다. 먼저 Tablemacro를 호출할 때 넘겨주는 ^Orgin에서 그 구성 요소를 넘겨 받아 임시변수 $$element에 할당한다. 그런데 ^iterator 명령어에 의해 그 구성요소가 다 할 때까지 반복해서 $$element에 할당하게 된다. 두 번째 작업은 $$element ^pp를 한 단어로 합쳐서 $$tmp에 할당한다. 이 때 ^pp로는 조사(=/, /, /를 등)를 넘겨 줄 계획이다. 세 번째 작업은 Table을 만드는 것이다. 이상을 실제 데이타로 시뮬레이션 해 보자.

 

concept: ~과일 ( 사과 배 포도 딸기) 로 선언하고

 

Tablemacro: ^ConsonantPP(~과일 가) 로 호출하면

 

루프 내의 첫 번째 줄에서, $$element에는 사과가 할당된다. 그런 후 두 번째 줄에서 사과 + 를 합해 tmp에 할당하고, 세 번째 줄에서 (사과가 member 사과) 라는 fact를 만든다. 그런데 이 세 줄의 명령어가 loop에 의해 싸여 있으므로 ~과일의 구성요소 모두에 대해 동일한 과정을 반복한다 (^iterator) 최종적으로 다음과 같은 4개의 새로운 fact가 만들어 진다.

 

(사과가 member 사과)

(배가 member )

(포도가 member 포도)

(딸기가 member 딸기)

 

그리고 이 loop 전체를 다시 필요한 조사만큼 반복시키면 원하는 것을 얻게 된다.

 

Tablemacro: ^ConsonantPP(~과일)

가 는 를 도 만이라도 와 까지

 

CS엔진은 ^ConsonantPP 2개의 인수를 필요로 한다는 것을 알고 있는데, 현재 하나의 인수만 넘겨졌으니 나머지 두 번째 인수를 그 다음 줄에서 찾는다. 그 다음 줄에 7개의 조사가 나열되어 있기 때문에 총 7번을 반복한다.

결과는 다음과 같은 fact가 만들어 진다. (편의상 사과에 대해서만 정리하였다. 나머지 요소도 동일하다)

 

(사과가 member 사과)

(사과는 member 사과)

(사과를 member 사과)

(사과도 member 사과)

(사과만이라도 member 사과)

(사과와 member 사과)

(사과까지 member 사과)

 

이제 이렇게 만들어진 새로운 구성요소를 원래의 ~과일에 추가하기로 하자. 코드를 보면,

 

Tablemacro: ^addElement(^Origin)

loop()

{

    $$element = ^iterator(? member ^Origin)

    ^query(? member $$element)

    ^CreateFact(@0subject member ^Origin)

 }

 

인수로 넘겨받은 ^Orgin에서 그 구성요소를 하나 $$element에 할당한다. 이는 ^Orgin의 구성요소가 다 할 때까지 반복한다.(^iterator 명령) 두 번째 줄에서는 이 $$element의 멤버로 등록된 fact를 모두 찾아서 Fact-set 0번에 할당하도록 하고 있다. Fact-set은 다시 subject, verb, object로 세분된다. 즉 공간적으로 비유하면 가로로는 subject, verb, object, 세로로는 0, 1, 2, 3, … 20번까지 있는 2차원 표 형태의 자료보관소라 할 수 있다. 이제 세 번째 줄에서는 두 번째 줄에서 찾은 값 중에서 subject만 골라 ^Orgin의 멤버로 추가 하고 있다. 실제 데이터로 시뮬레이션 해 보자.

 

Tablemacro: ^addElemnet(~과일)

 

~과일의 첫 번째 요소인 사과가 $$element에 할당된다. 그런 후 이 사과에 소속되는 것을 모두 찾아서 0 fact-set에 보관한다. 앞서 만들어 놓은 사과가, 사과는, 사과를, 사과도, 사과만이라도, 사과와, 사과까지 등이 사과의 member라고 찾아 줄 것이다. 이제 세 번째 줄에서 이들이 ~과일의 요소가 되도록 추가한다. 예를 들어 (사과가 member ~과일) 이 되면, 컨셉 ~과일의 구성요소에 사과가를 추가하라는 뜻이 된다.

결과적으로 최초의 ~과일에는 사과, , 포도, 딸기의 4개 요소가 있었지만, 앞의 두 개 Tablemacro를 거치면서 ~과일에는 28 (4개의 과일 * 7개의 조사)의 요소가 추가된다. 이제 이 ~과일을 토픽에 등재하면 사용자가 명사 단독으로 입력하든 조사를 붙여서 입력하든 캐치할 수 있으므로 토픽이 활성화 된다.

  

table: ^ConsonantPP(~과일)

은 는 이 가 와 과 에는

table: ^sum()

~과일

 

댓글
댓글쓰기 폼