
CLIPS
CLIPS
Download
CLIPS(C Language Implementation Production System)는 NASA의 Johnson Space
Center 내에 있는 인공지능연구실에서 개발된 것으로서 전향추론 규칙 기반의 시스템이다.
CLIPS는 C언어를 이용하여 개발이 되었지만 CLIPS에서 사용되는 명령어나 규칙의
형태는 LISP언어와 유사하다. 이러한 CLIPS는 기본적으로 아래와 같은 세 가지 요소로
구성이 되어 있다.
- 사실 리스트(fact list) : 데이터를 저장하는 광역 메모리
- 지식베이스(knowledge-base) : 규칙들을 저장
- 추론엔진(inference engine) : 전반적인 실행을
제어
CLIPS를 이용함으로서 간단한 지식기반
시스템을 개발할 수 있으며, 본 부록에서는 이에 대하여 기술한다.
2. CLIPS의 시작과 종료
우선 CLIPS의 실행을 시작하기 위해서는
다음과 같은 명령어를 입력한다.
일단 CLIPS가 메모리로 적재되면 아래와
같은 프롬프트가 생성된다.
이 상태에서 CLIPS의 명령어를 입력할
수 있으며 CLIPS의 실행을 종료하기 위한 명령어는 다음과 같다.
3. 사실
CLIPS에서 사실(fact)은 괄호로 묶여진
하나 또는 그 이상의 항목으로 이루어진다.
- 사실의 첨가
CLIPS의 사실 리스트에
사실을 첨가할 때에는 "assert"라는 명령어를 이용한다. 예를 들어
"Ivan plays tennis."라는 사실을 첨가하기 위해서는 아래와 같이
입력하면 된다.
(facts)
- 사실의 삭제
CLIPS의 사실 리스트로부터
어떤 사실을 삭제하기 위해서는 "retract"라는 명령어를 이용한다.
이 명령어를 이용할 때에는 삭제할 사실을 지정하기 위하여 사실의 인덱스를
명시해야 한다. 예를 들어 현재의 사실 리스트에 아래와 같이 사실들이 저장되었다고
가정하자.
f-1 (play Ivan tennis)
f-2
(play Martina tennis)
위의 사실 중에서 첫 번째 사실을 삭제하고
싶다면 아래와 같이 명령어를 입력하면 된다.
(retract
1)
특정 사실이 아닌 사실 리스트를 모두 삭제하려면 아래와 같은 명령어를
이용한다.
(clear)
- 사실의 첨가와 삭제를 위한 다른 방법
사실
리스트에 사실을 입력하기 위해서는 "assert"를 이용하는 방법 이외에
"deffacts" 함수를 이용할 수도 있다. 이러한 "deffacts"
함수의 형식은 다음과 같다.
(deffacts fact-name
comment fact-1 ... fact-n)
위의 형식에서 fact-name은 사실의 이름을
의미하며 숫자가 아닌 기호를 이용해야 한다. comment는 선택 사항이며 사실을
설명해 주는 부분으로서 반드시 이중따옴표로 묶어야 한다. 그리고 "fact-1
... fact-n"은 입력하고자 하는 사실들이 기술된다. 예를 들면, 다음과
같이 사용된다.
(deffacts tennis-players
"list
of tennis players"
(athlete
Ivan very-good)
(play
Ivan tennis)
(athlete
Martina very-good)
(play
Martina tennis))
위와 같이 작성된 사실들을 사실 리스트에 저장하기 위해서는
"reset"이라는 명령어를 입력해야 한다.
(reset)
이
명령어를 입력하게 되면 현재의 사실 리스트 내에 있던 사실들은 모두 삭제되고
위의 deffacts 문장에서 정의한 사실들을 사실 리스트 내에 새로 저장하게 된다.
결과적으로 "reset" 명령어를 입력하고 나면 아래와 같은 사실들이
사실 리스트 내에 존재하게 되는 것이다.
f-0 (initial
fact)
f-1 (athlete Ivan very-good)
f-2 (play Ivan tennis)
f-3
(athlete Martina very-good)
f-4
(play Martina tennis))
이와 같이 deffacts문에 의해
정의된 사실들은 "undeffacts"라는 명령어를 이용하여 메모리로부터
삭제할 수 있다.
(undeffacts tennis-players)
위와
같이 입력한 후에 "reset" 명령어를 실행하면 deffacts문에 의해 정의되었던
tennis-players와 관련된 사실들은 모두 삭제 되게 된다.
4. 규칙
CLIPS에서 규칙은 "defrule"이라는
명령어를 이용하여 정의되며 형식은 다음과 같다.
(defrule
r-name comment
patt-1
... patt-n
=>
act-1
... act-m)
위에서 r-name은 규칙의 이름을 의미하며
comment는 선택 사항으로 규칙을 설명해 주는 부분으로서 반드시 이중따옴표로 묶어야
한다. "patt-1 ... patt-n"은 규칙의 전제부를 나타내는 리스트이며 "act-1
... act-m"은 규칙의 결론부를 나타낸다. 한편, 저장되어 있는 규칙들의 리스트를
확인하려면 "rules"라는 명령어를 이용하며 형식은 아래와 같다.
(rules)
그리고 특정 규칙의 내용을 구체적으로
확인하려면 아래와 같은 명령어를 이용하면 된다.
(pprule r-name)
저장된 규칙 중에서 특정 규칙을 제거하려면
그 규칙의 이름과 함께 "excise"라는 명령어를 이용하면 된다.
(excise r-name)
5. 변수, 연산자 그리고 특수 기호
CLIPS에서는 규칙내의 패턴들을 처리하기
위하여 몇 가지 기능들을 제공해 주며 여기에는 변수, 연산자, 특수 기호 등이 있다.
- 변수
CLIPS에서 변수를 정의할 때는
변수명 앞에 반드시 "?"를 나타내야 하며 예를 들면 다음과 같다.
?color
?value
앞에서는 사실 리스트로부터
특정 사실을 제거하기 위해서 "retract" 명령어와 함께 인덱스를 명시하는
방법을 알아보았다. 그러나 사실의 인덱스를 확인하기 어려운 경우에는 이러한
방법을 사용할 수 없다. 이 때에 변수와 "<-"를 이용하여 특정
사실을 제거할 수 있는 방법이 있다. 여기에서 "<-"의 역할은 특정
사실을 변수로 바인딩시키는 역할을 해준다. 예를 들면 다음과 같다.
(defrule modify-grandfather-fact
?old-fact
<- (is-a-grandfather Jack)
=>
(retract
?old-fact)
(assert
(has-a-grandchild Jack)
(is-a-man
Jack)))
- 특수 기호
① 와일드카드
CLIPS에서 제공되는
와일드카드는 두 가지가 있다. 첫 번째는 단일 항목만을 위하여 사용되는 것으로
"?"가 있다. 두 번째는 다중 항목을 위한 와일드카드로서 "$?"이
사용된다. 이 경우에는 항목이 존재하지 않거나 하나이상의 항목이 할당되는
것을 허용한다. 다음은 와일드카드가 사용된 예이다.
(name
? $? Smith)
위의 경우에는 아래와 같은 패턴들을 허용하는 것이다.
(name John Smith)
(name Suzie Jane
Smith)
(name John James Jones Smith)
② 항목
제약조건
항목 제약조건에는 부정 제약조건, or 제약조건, and 제약조건이
있다. 우선 부정 제약조건은 "~"으로 나타내며, 이 기호 뒤에 나타난
항목을 제외한 모든 항목을 허용한다는 의미이다. 다음과 같은 예를 생각할 수
있다.
(temperature water ~boil)
위의 예에서
세 번째 항목에 대해서는 boil을 제외한 어떠한 항목도 허용된다는 의미이다.
두 번째로 or 제약조건은 "l"으로 나타낸다. 이 제약조건을 사이에
두고 있는 패턴들을 모두 허용한다는 의미이다. 예를 들어 다음과 같은 경우가
있을 수 있다.
(temperature water cold l cool l
warm)
위의 예에서 세 번째 항목에 있어서는 cold, cool, warm 중의 어떠한
패턴에 대하여도 허용된다는 의미이다. 세 번째로는 and 제약조건으로 "&"을
사용한다.
③ 수학적인 연산자
CLIPS에서의 수학적 연산은 전위법(prefix
notation)을 이용하여 리스프 언어에서와 유사하게 사용된다. 또한 CLIPS에서의
수식은 반드시 명령어 "assert", "bind"와 함께 쓰여야만
한다. 다음은 수식을 이용한 예이다.
(assert (answer
=(* 3 4)))
(defrule subtraction
(number
?x ?y)
=>
(bind
?answer (- ?x ?y)
(fprintout
t "the answer is" ?answer crlf))
④ test함수
test 함수는
규칙의 패턴 내에 존재하는 변수, 스트링 등을 비교할 수 있는 기능을 제공해
준다.
(test (function arg-1 arg-2 ... arg-n))
위에서
function으로 사용될 수 있는 것은 CLIPS에서 허용되는 아래와 같은 것들이다.
eq(equal), neq(not equal), =(numeric equal), !=(numeric
not equal)
>=, >, <=, <
!(not),
&&(and), ∥(or)
test 함수가 사용된 예를 보면 다음과 같다.
(defrule square
(width
?obj ?w)
(length
?obj ?l)
(test
(= ?l ?w))
=>
(fprintout
t ?obj "is a square" crlf))
⑤ 패턴 연결자
패턴들 사이에
허용되는 논리 연결자는 and, or 그리고 not이 있다. 다음은 연결자를 사용하여
정의된 규칙의 예이다.
(defrule example
(analyze
portfolio)
(or
(and
(key-rate
prime)
(rate
prime stable))
(and
(key-rate t-bill)
(rate
increasing)))
=>
(fprintout
t "stable portfolio" crlf))
6. CLIPS에서의 입·출력
- fprintout 함수
CLIPS에서는 fprintout
함수를 이용하여 원하는 정보를 출력할 수 있다.
(fprintout dev item-1
item-2 ... item-n)
위에서 "dev"는 출력 장치를 지정하는
부분이며, "item"은 출력될 정보를 의미하며 이중 따옴표로 묶인 스트링이나,
특정 값이 바인딩된 변수 등이 될 수 있다.
- open, close 함수
CLIPS에서는 특정
파일을 열고자 할 때에 "open"을 이용하게 된다. 그러나 이 함수는
규칙의 결론부 내에서만 사용될 수 있으며 그 형식은 다음과 같다.
(open
"file-name" logical-name [mode])
위에서 file-name은 열고자
원하는 파일의 실제 이름이며 logical-name은 그 파일에 할당된 논리적인 이름을
의미한다. mode는 선택 사항으로 "r"은 읽기 전용을 의미하며, "w"는
쓰기 전요, "r+"을 읽기와 쓰기가 모두 가능함을 나타낸다. 한편,
열려진 파일은 "close" 함수에 의하여 닫을 수 있으며, 그 형식은
다음과 같다.
(close logical-name)
위에서 logical-name은 닫고자
원하는 파일의 논리적인 이름을 의미한다.
- 터미널로부터의 입력
터미널로부터
입력을 받기 위한 함수는 "read"와 "readline"이다. "read"는
공백에 의해 나뉘어지는 단일 데이터 값을 제공하며 "readline"은
캐리지 리턴이나 세미콜론, 파일의 끝을 알리는 것에 의해 나뉘어지는 스트링을
제공해 준다.
(read t)
(readline
t)
위에서 "t"는 입력 장치로서 터미널을 나타낸다.
- CLIPS에서의 편집기
CLIPS는 지식베이스의
구축을 돕기 위한 편집기를 제공해 준다. Micro EMACE라고 불리는 이 편집기는
프롬프트 상에서 아래의 명령어를 입력함으로서 사용할 수 있다.
(edit
["file-name"])