제스 (프로그래밍 언어)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
제스는 자바 기반의 전문가 시스템 및 규칙 엔진으로, CLIPS를 기반으로 개발되었다. 변수 바인딩, 함수 정의, 사실 집합 정의, 템플릿 정의, 새로운 사실 추가 등의 기능을 제공하며, 헌혈 가능 여부 판단과 같은 규칙을 정의하는 예시를 통해 사용법을 보여준다. 교육 및 정부 사용에는 프리웨어, 상업적 사용에는 라이선스가 필요한 독점 소프트웨어이며, CLIPS는 자유-오픈 소스 소프트웨어이다. 관련 시스템으로는 CLIPS, ILOG 규칙, JBoss Drools, Prolog, OpenL Tablets, DTRules 등이 있다.
Jess는 리스프와 유사한 괄호 기반 문법을 사용하는 규칙 기반 시스템 개발 도구이다. 아래 하위 섹션에서는 Jess의 기본적인 문법 요소들과 이를 활용한 간단한 코드 예제를 살펴볼 수 있다. 예제에는 기본적인 문법 구조와 함께, 헌혈 가능 여부를 판단하는 규칙 시스템 구현 사례가 포함되어 있다.
(내용 없음)
2. 코드 예시
2. 1. 기본 문법 예제
Jess 프로그래밍 언어의 기본적인 문법 예시는 다음과 같다.
; 이것은 주석입니다.
(bind ?x 100) ; 변수 ?x에 100을 할당한다. (다른 언어의 x = 100 과 유사)
; 두 수 중 큰 값을 반환하는 max 함수 정의
(deffunction max (?a ?b)
(if (> ?a ?b) then ?a else ?b))
; 'myroom'이라는 이름의 사실 집합 정의
(deffacts myroom
(furniture chair) ; 방 안에 의자가 있다는 사실
(furniture table) ; 방 안에 테이블이 있다는 사실
(furniture bed) ; 방 안에 침대가 있다는 사실
)
; 'car'라는 이름의 템플릿 정의
(deftemplate car
(slot color) ; 색상 슬롯
(slot mileage) ; 주행 거리 슬롯
(slot value) ; 가격 슬롯
)
; 'car' 템플릿을 사용하여 새로운 자동차 사실 생성
(assert (car (color red) (mileage 10000) (value 400)))
아래는 헌혈 가능 여부를 판단하는 규칙을 보여주는 Jess 샘플 코드이다.
(clear) ; 작업 메모리와 규칙을 초기화한다.
; 헌혈자 정보를 저장할 템플릿 정의 (이름, 혈액형)
(deftemplate blood-donor (slot name) (slot type))
; 초기 헌혈자 데이터 (사실) 정의
(deffacts blood-bank ; 이름과 혈액형을 작업 메모리에 추가한다.
(blood-donor (name "Alice")(type "A"))
(blood-donor (name "Agatha")(type "A"))
(blood-donor (name "Bob")(type "B"))
(blood-donor (name "Barbara")(type "B"))
(blood-donor (name "Jess")(type "AB"))
(blood-donor (name "Karen")(type "AB"))
(blood-donor (name "Onan")(type "O"))
(blood-donor (name "Osbert")(type "O"))
)
; 규칙 1: 같은 혈액형끼리 수혈 가능 (단, 자신에게 수혈 불가)
; A->A, B->B, O->O, AB->AB 처리
(defrule can-give-to-same-type-but-not-self
(blood-donor (name ?name)(type ?type))
(blood-donor (name ?name2)(type ?type2 &:(eq ?type ?type2) &: (neq ?name ?name2) )) ; 혈액형은 같고 이름은 다른 경우
=>
(printout t ?name " can give blood to " ?name2 crlf) ; 수혈 가능 메시지 출력
)
; 규칙 2: O형은 다른 모든 혈액형에게 수혈 가능 (단, 자신에게 수혈 불가)
; O->A, O->B, O->AB 처리 (O->O는 규칙 1에서 처리)
(defrule O-gives-to-others-but-not-itself
(blood-donor (name ?name)(type ?type &:(eq ?type "O"))) ; 헌혈자가 O형인 경우
(blood-donor (name ?name2)(type ?type2 &: (neq ?type ?type2) &: (neq ?name ?name2) )) ; 수혈자가 O형이 아니고, 다른 사람인 경우
=>
(printout t ?name " can give blood to " ?name2 crlf) ; 수혈 가능 메시지 출력
)
; 규칙 3: A형 또는 B형은 AB형에게 수혈 가능
; A->AB, B->AB 처리 (O->AB는 규칙 2에서, AB->AB는 규칙 1에서 처리)
(defrule A-or-B-gives-to-AB
(blood-donor (name ?name)(type ?type &:(or (eq ?type "A") (eq ?type "B" )))) ; 헌혈자가 A형 또는 B형인 경우
(blood-donor (name ?name2)(type ?type2 &: (eq ?type2 "AB") &: (neq ?name ?name2) )) ; 수혈자가 AB형이고, 다른 사람인 경우
=>
(printout t ?name " can give blood to " ?name2 crlf) ; 수혈 가능 메시지 출력
)
;(watch all) ; 모든 동작(사실 추가/제거, 규칙 활성화/실행 등)을 감시하려면 주석 해제
(reset) ; 작업 메모리를 deffacts에 정의된 초기 상태로 리셋
(run) ; 규칙 실행 시작
2. 2. 헌혈 가능 여부 판단 규칙 예제
아래는 Jess를 사용하여 헌혈 가능 여부를 판단하는 간단한 규칙 기반 시스템 예제 코드이다. 이 코드는 Jess의 기본적인 기능인 템플릿 정의(`deftemplate`), 사실 정의(`deffacts`), 규칙 정의(`defrule`)를 보여준다.
(clear) ; 작업 메모리를 초기화한다.
; 헌혈자 정보를 저장하기 위한 템플릿 정의
(deftemplate blood-donor
(slot name) ; 이름 슬롯
(slot type) ; 혈액형 슬롯 (A, B, AB, O)
)
; 초기 헌혈자 데이터(사실)를 정의하여 작업 메모리에 추가
(deffacts blood-bank
(blood-donor (name "Alice")(type "A"))
(blood-donor (name "Agatha")(type "A"))
(blood-donor (name "Bob")(type "B"))
(blood-donor (name "Barbara")(type "B"))
(blood-donor (name "Jess")(type "AB"))
(blood-donor (name "Karen")(type "AB"))
(blood-donor (name "Onan")(type "O"))
(blood-donor (name "Osbert")(type "O"))
)
; 규칙 1: 같은 혈액형끼리 헌혈 가능 (단, 자기 자신에게는 불가)
; 예: A형 -> A형, B형 -> B형, O형 -> O형, AB형 -> AB형
(defrule can-give-to-same-type-but-not-self
(blood-donor (name ?name)(type ?type)) ; 첫 번째 헌혈자 (이름: ?name, 혈액형: ?type)
(blood-donor (name ?name2)(type ?type2 &:(eq ?type ?type2) &: (neq ?name ?name2))) ; 두 번째 헌혈자 (혈액형이 같고(?type == ?type2) 이름이 다른(?name != ?name2))
=> ; 조건 만족 시 실행될 액션
(printout t ?name " can give blood to " ?name2 crlf) ; 결과 출력: "?name 은(는) ?name2 에게 헌혈할 수 있습니다."
)
; 규칙 2: O형은 다른 모든 혈액형에게 헌혈 가능 (단, 자기 자신에게는 불가)
; O형 -> O형 경우는 규칙 1에서 처리됨
(defrule O-gives-to-others-but-not-itself
(blood-donor (name ?name)(type ?type &:(eq ?type "O"))) ; 첫 번째 헌혈자 (혈액형이 O형)
(blood-donor (name ?name2)(type ?type2 &: (neq ?type ?type2) &: (neq ?name ?name2))) ; 두 번째 헌혈자 (혈액형이 다르고 이름도 다른)
=>
(printout t ?name " can give blood to " ?name2 crlf) ; 결과 출력
)
; 규칙 3: A형 또는 B형은 AB형에게 헌혈 가능
; O형 -> AB형, AB형 -> AB형 경우는 다른 규칙에서 처리됨
(defrule A-or-B-gives-to-AB
(blood-donor (name ?name)(type ?type &:(or (eq ?type "A") (eq ?type "B" )))) ; 첫 번째 헌혈자 (혈액형이 A형 또는 B형)
(blood-donor (name ?name2)(type ?type2 &: (eq ?type2 "AB") &: (neq ?name ?name2))) ; 두 번째 헌혈자 (혈액형이 AB형이고 이름이 다른)
=>
(printout t ?name " can give blood to " ?name2 crlf) ; 결과 출력
)
;(watch all) ; 모든 동작(사실 추가/제거, 규칙 활성화/실행 등)을 감시하려면 주석 해제
(reset) ; 작업 메모리를 deffacts에 정의된 초기 상태로 리셋
(run) ; 규칙 엔진 실행 및 결과 출력
위 코드는 다음과 같이 동작한다.3. 라이선스
3. 1. 라이선스 종류
Jess의 소프트웨어 라이선스는 교육 및 정부 사용에 대해서는 프리웨어로 제공된다. 그러나 상업적인 목적으로 사용할 경우에는 라이선스를 구매해야 하는 독점 소프트웨어이다. 한편, Jess의 기반이 된 CLIPS는 자유-오픈 소스 소프트웨어이다.
3. 2. CLIPS와의 관계
Jess의 소프트웨어 라이선스는 교육 및 정부 사용에 대해서는 프리웨어이며, 상업적 사용의 경우에는 라이선스가 필요한 독점 소프트웨어이다. 반면, Jess의 기반이자 시작 코드인 CLIPS는 자유-오픈 소스 소프트웨어이다.
4. 관련 시스템
Jess와 유사한 규칙 기반 시스템 및 프로그래밍 언어는 다음과 같다.
- CLIPS
- ILOG 규칙
- JBoss Drools
- Prolog
- OpenL Tablets
- DTRules
4. 1. CLIPS
CLIPS는 전문가 시스템을 구축하기 위한 공개 도메인 소프트웨어 도구이다.4. 2. ILOG 규칙
ILOG 규칙은 비즈니스 규칙 관리 시스템(BRMS)이다.4. 3. JBoss Drools
Drools는 비즈니스 규칙 관리 시스템(BRMS)이다.4. 4. Prolog
Prolog는 범용 논리 프로그래밍 언어이다.4. 5. OpenL Tablets
OpenL Tablets는 비즈니스 중심 규칙 및 BRMS이다.4. 6. DTRules
DTRules는 의사 결정표를 기반으로 하는 자바용 오픈 소스 규칙 엔진이다.
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com