エキスパートシステムと知識工学 ― 生成規則・前向き推論・確度係数から、真理維持システムと医療・化学・数式処理・商用生産システムまで
規則ベースのエキスパートシステムを構成する知識ベース・ワーキングメモリ・推論エンジン・ユーザーインターフェースという基本構造と、前向き推論/後ろ向き推論、確度係数/ファジー推論による不確実性の扱いをSwiftのサンプルコードで確認したうえで、メタ知識・真理維持システム(依存記録)・定性的推論という発展的な話題、知識工学(Knowledge Engineering)という営み、そして医療・化学・数式処理・商用生産システム・資源探査・軍事物流という各問題領域で作られた代表的なエキスパートシステム群を整理します。
目次
- はじめに
- 1. エキスパートシステムの基本構造:知識ベース・ワーキングメモリ・推論エンジン・ユーザーインターフェース
- 2. 推論の方向性:前向き推論と後ろ向き推論(目的指向推論)
- 3. 不確実性の扱い:確度係数とファジー推論
- 4. 知識工学(Knowledge Engineering)― 知識獲得のボトルネックとエキスパートシステム・シェル
- 5. メタ知識・真理維持システム・定性的推論 ― 依存記録・制約保留による候補生成・制約ネットワーク
- 6. 医療診断分野:MYCIN・EMYCIN・Digitalis Advisor・Caduceus・PUFF
- 7. 化学・分子構造分野:DENDRAL・Meta-DENDRAL・CRYSALIS・LHASA・SECS・SYNCHEM
- 8. 数式処理分野:SAINT・SIN・MATHLAB・MACSYMA・Maple・REDUCE・SMP・muMATH
- 9. プロダクションシステムと商用化:R1/XCON・OPS5・OPS83・OPS86
- 10. 資源探査・地質分野:PROSPECTOR・DIPMETER ADVISOR
- 11. 軍事・物流分野:DART
- まとめ
- 注釈
- 参考資料
はじめに
エキスパートシステム(Expert System)は、特定の専門家が持つ知識を計算機に移し替え、その専門家の代わりに助言や診断を行わせようとする、記号主義AI(Symbolic AI)の中でも最も実用化に近づいたジャンルです。
エキスパートシステムには共通する特徴があります。それは、扱う対象を一定の分野(問題領域, task domain)に限定するということです。「あらゆる問題を解く賢いプログラム」ではなく、「血液感染症の診断」「質量分析データからの分子構造推定」「VAXコンピュータの部品構成」といった狭く深い1つの領域に特化することで、はじめて実用に足る性能が得られる、という発想です。これは Edward Feigenbaum が「knowledge is power(知識こそが力である)」と呼んだ仮説そのものであり、汎用の推論手法を洗練させるよりも、特定領域の専門知識を大量に注ぎ込む方が実際の問題を解けるという、1970年代のAI研究の転換点を象徴しています。
この記事では、まず規則ベースのエキスパートシステムの基本構造をSwiftのサンプルコードで確認し、そのうえで、専門家から知識を引き出してシステムに落とし込む**知識工学(Knowledge Engineering)**という営みと、メタ知識・真理維持システム・定性的推論といった発展的な話題を整理します。最後に、医療・化学・数式処理・商用生産システム・資源探査・軍事物流という各問題領域で実際に作られた代表的なエキスパートシステム群を見ていきます。
1. エキスパートシステムの基本構造:知識ベース・ワーキングメモリ・推論エンジン・ユーザーインターフェース
規則ベースのエキスパートシステムは、次の4つの部品に分けて考えると理解しやすくなります。
| 部品 | 役割 |
|---|---|
| 知識ベース(Knowledge Base) | 専門知識を「もし〇〇ならば△△」という**生成規則(production rule)**の集合として蓄積したもの |
| ワーキングメモリ(Working Memory) | 現在分かっている事実(症状・観測データなど)を保持する作業領域 |
| 推論エンジン(Inference Engine) | 知識ベースの規則をワーキングメモリの事実に照らして機械的に発火させ、新しい事実を導く部品 |
| ユーザーインターフェース(User Interface) | 利用者との対話(質問・回答の受付、結論とその根拠の提示)を担う部品 |
この4分割は、Newell と Simon が人間の問題解決過程の計算モデルとして提案した**プロダクションシステム(production system)**の構造をそのまま受け継いでいます(注1)。重要なのは、知識ベースと推論エンジンが分離しているという設計です。推論エンジンは領域に依存しない汎用の機械であり、領域固有の知識はすべて知識ベース側に外部化されています。この分離が、4節で見る「エキスパートシステム・シェル」という考え方の土台になります。
推論エンジンの中核は、**match(規則の条件部とワーキングメモリを照合する)→ resolve(発火させる規則を1つ選ぶ)→ act(結論をワーキングメモリに追加する)という「match-resolve-actサイクル」です。ワーキングメモリに変化がなくなるまでこのサイクルを繰り返す方式を前向き推論(forward chaining)**と呼びます。以下のサンプルは、単純な命題(真偽だけを持つ事実)を条件部に持つ生成規則を使い、前向き推論の手続きを実装したものです(後ろ向き推論の実装は2節で扱います)。
final class WorkingMemory {
private(set) var facts: Set<String> = []
func assert(_ fact: String) { facts.insert(fact) }
func contains(_ fact: String) -> Bool { facts.contains(fact) }
}
// 知識ベース: 1件の生成規則(IF部の全条件が揃えばTHEN部の事実を導く)
struct Rule {
let name: String
let ifConditions: [String]
let thenFact: String
}
final class InferenceEngine {
let knowledgeBase: [Rule]
init(_ knowledgeBase: [Rule]) { self.knowledgeBase = knowledgeBase }
// 前向き推論: match(条件照合)→ resolve(発火規則の決定)→ act(事実の追加)
// というサイクルを、新しい事実が追加されなくなるまで繰り返す
func forwardChain(_ memory: WorkingMemory) -> [String] {
var log: [String] = []
var fired = true
while fired {
fired = false
for rule in knowledgeBase {
guard !memory.contains(rule.thenFact) else { continue }
guard rule.ifConditions.allSatisfy(memory.contains) else { continue }
memory.assert(rule.thenFact)
log.append("\(rule.name): \(rule.ifConditions.joined(separator: " ∧ ")) → \(rule.thenFact)")
fired = true
}
}
return log
}
}
let knowledgeBase = [
Rule(name: "R1", ifConditions: ["発熱", "喉の痛み"], thenFact: "上気道炎の疑い"),
Rule(name: "R2", ifConditions: ["上気道炎の疑い", "膿性の鼻水"], thenFact: "細菌性の疑い"),
Rule(name: "R3", ifConditions: ["細菌性の疑い"], thenFact: "抗菌薬の検討を推奨")
]
let memory = WorkingMemory()
memory.assert("発熱")
memory.assert("喉の痛み")
memory.assert("膿性の鼻水")
let engine = InferenceEngine(knowledgeBase)
let trace = engine.forwardChain(memory)
trace.forEach { print($0) }
// R1: 発熱 ∧ 喉の痛み → 上気道炎の疑い
// R2: 上気道炎の疑い ∧ 膿性の鼻水 → 細菌性の疑い
// R3: 細菌性の疑い → 抗菌薬の検討を推奨
trace にサイクルごとの発火記録を残しているのは、単なるデバッグ用の副産物ではありません。エキスパートシステムのユーザーインターフェースは、結論を返すだけでなく「なぜその結論に至ったか(WHYコマンド)」「どうやってその事実が分かったか(HOWコマンド)」を利用者に説明する**説明機能(explanation facility)**を備えることが重視されました。trace はその最小限の実装だと考えられます。
なお、ここでの forwardChain はサイクルのたびに全ルールを線形に見直す素朴な実装です。実際のプロダクションシステム言語(9節のOPS5など)は、事実が変化した差分だけを扱うReteアルゴリズム(Charles Forgy, 1979年)によって、ルール数・事実数が数千に達しても効率よく照合できるようにしています(注2)。
2. 推論の方向性:前向き推論と後ろ向き推論(目的指向推論)
前節の forwardChain は「今分かっている事実から出発し、導ける結論をすべて導く」というデータ駆動の推論でした。これに対し、「ある1つの結論(ゴール)が成り立つかどうかを確かめたい」という場合には、後ろ向き推論(backward chaining)、別名目的指向推論(goal-directed reasoning)の方が効率的です。ゴールから出発し、それを導くために必要なIF部をサブゴールとして再帰的に遡り、末端では利用者に直接質問して事実を確認します。
extension InferenceEngine {
// 後ろ向き推論(目的指向推論): goal をワーキングメモリが既に持っていれば即座に真。
// 持っていなければ goal を THEN 部に持つ規則を探し、その IF 部をサブゴールとして
// 再帰的に証明できるかを確かめる。
func backwardChain(_ goal: String, memory: WorkingMemory) -> Bool {
if memory.contains(goal) { return true }
guard let rule = knowledgeBase.first(where: { $0.thenFact == goal }) else {
return false // 対応する規則も既知の事実もない ―― ここで利用者に問い合わせる余地がある
}
let proved = rule.ifConditions.allSatisfy { backwardChain($0, memory: memory) }
if proved { memory.assert(goal) }
return proved
}
}
let freshMemory = WorkingMemory()
freshMemory.assert("発熱")
freshMemory.assert("喉の痛み")
freshMemory.assert("膿性の鼻水")
engine.backwardChain("抗菌薬の検討を推奨", memory: freshMemory) // true
// R3 の抗菌薬の検討を推奨 ← R2 の細菌性の疑い ← R1 の上気道炎の疑い ← 発熱 ∧ 喉の痛み ∧ 膿性の鼻水
// という順にサブゴールへ遡り、末端がすべてワーキングメモリの事実と一致したため証明成功
なお、この実装は簡潔さを優先して、ゴールを導ける規則を最初の1つしか試していません。同じ結論を導く規則が複数ある実際のシステムでは、候補の規則を順に試し、失敗したら別の規則に切り替えるバックトラックの機構が必要になります。
前向き推論は「今ある事実から何が言えるか全部知りたい」場面(9節のR1/XCONのような構成・設定問題)に向き、後ろ向き推論は「特定の仮説が正しいかどうかを効率よく検証したい」場面(6節のMYCIN、10節のPROSPECTORのような診断・鑑定問題)に向きます。同じ生成規則の集合であっても、どちらの向きで辿るかはシステムの目的によって使い分けられました。
3. 不確実性の扱い:確度係数とファジー推論
現実の専門知識は「発熱があれば必ず感染症である」というような確実な規則ばかりではありません。「発熱があれば、おそらく感染症である」という度合いを扱う必要があります。1970〜80年代のエキスパートシステムでは、これを厳密な確率論(ベイズ推定)ではなく、専門家が直感的に申告しやすい2つのヒューリスティックな枠組みで扱いました。
確度係数(Certainty Factor, CF)
MYCIN(6節)が導入した**確度係数(CF)**は、ある事実の確からしさを -1(確実に偽)〜 +1(確実に真)の数値で表します(注3)。ベイズ推定が要求する大量の条件付き確率を専門家から聞き出すのは非現実的だったため、Shortliffe と Buchanan は「専門家が個々の規則ごとに『この規則にはどれくらい自信があるか』を申告する」という、より扱いやすい方式を設計しました。
複数の規則が独立に同じ結論を支持する場合、その確信度は次の結合公式で1つにまとめられます。
final class CertaintyMemory {
private var cfs: [String: Double] = [:]
func cf(of fact: String) -> Double { cfs[fact] ?? 0 }
// MYCINの結合公式(両者が支持し合う正の値の場合):
// 新しい根拠は「まだ確信が埋まっていない残り (1 - current)」の分だけ確信を積み増す
func assert(_ fact: String, cf: Double) {
let current = self.cf(of: fact)
cfs[fact] = current + cf * (1 - current)
}
}
struct CFRule {
let ifConditions: [String]
let thenFact: String
let cf: Double // 専門家が申告した、この規則自体の確信度
}
func applyForward(_ rules: [CFRule], to memory: CertaintyMemory) {
for rule in rules {
// IF部の確信度はconditionの最小値を採用する(論理積は最小値で伝播させる)
let evidence = rule.ifConditions.map(memory.cf).min() ?? 0
guard evidence > 0 else { continue }
memory.assert(rule.thenFact, cf: rule.cf * evidence)
}
}
let cfRules = [
CFRule(ifConditions: ["培養陽性"], thenFact: "グラム陰性菌感染の疑い", cf: 0.6),
CFRule(ifConditions: ["発熱"], thenFact: "グラム陰性菌感染の疑い", cf: 0.3)
]
let cfMemory = CertaintyMemory()
cfMemory.assert("培養陽性", cf: 0.8)
cfMemory.assert("発熱", cf: 1.0)
applyForward(cfRules, to: cfMemory)
cfMemory.cf(of: "グラム陰性菌感染の疑い")
// R1由来: 0.6 * 0.8 = 0.48
// R2由来: 0.3 * 1.0 = 0.3 を結合公式で合成 → 0.48 + 0.3 * (1 - 0.48) = 0.636
2つの独立した根拠(培養検査と発熱)がどちらも同じ結論を支持したことで、単独の値(0.48)よりも高い確信度(0.636)に落ち着いています。これは確率の乗法定理とは異なる、専門家の直感に合わせて設計された発見的な計算です。なお、根拠が結論を否定する場合(負のCF)には符号の組み合わせに応じて打ち消し合う式に切り替わりますが、ここでは支持し合う場合だけを実装しています(完全な結合公式は注3の文献を参照)。
ファジー推論(Fuzzy Inference)
確度係数が「ある命題がどれくらい確からしいか(真偽の不確実性)」を扱うのに対し、Lotfi Zadeh が1965年に提案したファジー集合(Fuzzy Set)とそれに基づくファジー推論(注4)が扱うのは、そもそも「高熱」「若い」「速い」といった概念そのものが持つ**あいまいさ(vagueness)です。ある値がある集合に属するかどうかを0か1かではなく、0〜1の隷属度(degree of membership)**で表します。
// ファジー集合を、low で隷属度0 → peak で1 → high で再び0になる三角形の関数として表す
struct FuzzySet {
let low: Double
let peak: Double
let high: Double
// x がこの集合にどの程度属するか(隷属度)を 0〜1 で返す
func membership(_ x: Double) -> Double {
guard x > low, x < high else { return 0 }
return x < peak ? (x - low) / (peak - low) : (high - x) / (high - peak)
}
}
let highFever = FuzzySet(low: 37.5, peak: 39.0, high: 41.0) // 「高熱」という概念の定義
highFever.membership(38.5) // 0.666… ―― 「高熱」に3分の2程度当てはまる
highFever.membership(40.0) // 0.5 ―― ピークを過ぎ、隷属度が下がり始めている
この隷属度をそのままIF-THENルールの結論の強さとして使うのが、Ebrahim Mamdani が1975年に定式化した代表的なファジー推論方式です(注5)。確度係数もファジー推論も、確率論のように大量の条件付き確率や統計データを要求せず、専門家の直感的な申告や言語化しやすい概念をそのまま計算に持ち込める点で共通しており、当時の知識工学が抱えていた「専門家からどう知識を引き出すか」という課題への、2つの異なる回答だったと言えます。
4. 知識工学(Knowledge Engineering)― 知識獲得のボトルネックとエキスパートシステム・シェル
ここまでの推論エンジンやCF計算は、いわば「空の器」です。器に何を注ぐか、つまりその問題領域における生成規則をどう作るかが、エキスパートシステム開発の実質的な難所でした。この作業を担う専門職を知識工学(Knowledge Engineering)、担当者を**ナレッジエンジニア(knowledge engineer)**と呼びます(注6)。
ナレッジエンジニアの仕事は、ソフトウェア開発の要件定義に似ていますが、対象がプログラムの仕様ではなく人間の専門家の暗黙知である点が異なります。専門家自身、自分がどのような判断基準で結論に至っているかを明確に言語化できないことが多く、面談・観察・試行錯誤を繰り返しながら規則の形に磨き上げていく必要がありました。この、専門知識を引き出して形式化する作業そのものが開発全体のボトルネックになる現象は**知識獲得のボトルネック(knowledge acquisition bottleneck)**と呼ばれ、エキスパートシステムの実用化における最大の課題であり続けました。
1節で見た「知識ベースと推論エンジンの分離」は、この課題への重要な回答の一つでした。MYCINから医療知識だけを取り除き、推論エンジンと説明機能を持つユーザーインターフェースだけを残したものが **EMYCIN(Empty MYCIN)です(van Melle, 1979年)(注7)。EMYCINは領域に依存しない汎用の「器」として再利用でき、これに肺機能検査の知識を注いだものが6節のPUFF、構造工学の知識を注いだものがSACONです。この「器と中身を分離し、器を使い回す」という発想はエキスパートシステム・シェル(expert system shell)**として一般化され、1980年代のKEE・ARTといった商用シェル、さらに後年のCLIPS・Jess・Droolsといったルールエンジンへと受け継がれています。
もう一つの回答が、7節で扱うMeta-DENDRALです。専門家との面談で規則を1つずつ聞き出す代わりに、実験データそのものから規則を自動的に帰納させようとする試みで、知識獲得のボトルネックを機械学習によって迂回しようとした早い例だと位置づけられます。
5. メタ知識・真理維持システム・定性的推論 ― 依存記録・制約保留による候補生成・制約ネットワーク
ここまでの推論エンジンは「規則をどう適用するか」に集中していましたが、実際のエキスパートシステムはより高度な2つの課題にも直面しました。1つは「どの規則をどんな順序で試すべきか」という知識についての知識をどう扱うかという課題、もう1つは、前提が覆ったときや複数の競合する仮説を管理しながら結論を導くときに、どう効率よく整合性を保つかという課題です。
メタレベルの知識と反省・学習
生成規則の集合(対象レベルの知識)とは別に、「どの規則を優先して試すべきか」「どういう場合にこの規則群を無視してよいか」といった、知識の使い方についての知識をメタレベルの知識(meta-level knowledge)と呼びます。Randall Davis はMYCINの知識ベースを対話的に拡張・デバッグするためのTEIRESIAS(1976年)を開発し、その中でメタ規則(meta-rule)という考え方を導入しました(注8)。メタ規則は、たとえば「院内感染が疑われる場合は、まず緑膿菌に関する規則群を優先的に試す」といった形で、対象レベルの規則そのものではなく、規則群を試す優先順序を制御します。
これは、システムが自分自身の推論過程を対象として扱う反省(reflection)の一種です。4節のMeta-DENDRALが、質量分析の個別規則ではなく「規則をどう見つけるか」という、より高いレベルの探索戦略を学習によって獲得しようとしたことも、同じ意味で反省的・メタレベルの学習だったと言えます。対象レベルの知識をいくら充実させても、それをどう使うかという層が伴わなければ、規則数が増えるほど探索が非効率になっていく、という問題への回答です。
真理維持システム(TMS)と依存記録
前向き推論・後ろ向き推論は、いったん導いた結論をワーキングメモリに置きっぱなしにします。しかし、ある前提が後になって誤りだと分かった場合、その前提から導かれた結論もすべて誤りになるはずです。素朴な実装では、これを検出するために全ての結論を最初から導き直す必要があります。
Jon Doyle が1979年に提案した真理維持システム(Truth Maintenance System, TMS)(注9)は、それぞれの結論に「なぜそれを信じているか」という根拠を依存記録(dependency recording)として持たせることで、この再計算を避けます。前提を撤回するときは、依存記録を遡ってその前提に依存していた結論だけを選んで取り除けばよく、無関係な結論には手を触れません。
// 真理維持システム: 各結論に「どの事実から導かれたか」という依存記録を持たせておくと、
// 前提を1つ撤回したときに、それに依存する結論だけを選んで取り除ける
final class TruthMaintenanceSystem {
private(set) var justifications: [String: [String]] = [:] // 結論 → それを支えている事実群
func believe(_ conclusion: String, supportedBy facts: [String]) {
justifications[conclusion] = facts
}
// fact に直接・間接に依存している結論の集合を依存記録から遡って求める
private func dependents(of fact: String) -> Set<String> {
var result: Set<String> = []
for (conclusion, facts) in justifications where facts.contains(fact) {
result.insert(conclusion)
result.formUnion(dependents(of: conclusion))
}
return result
}
// 前提の撤回: 依存記録をたどり、影響を受ける結論だけをまとめて取り除く
// (依存記録がなければ、全結論を最初から導き直す必要がある)
func retract(_ fact: String) {
for conclusion in dependents(of: fact) {
justifications.removeValue(forKey: conclusion)
}
}
}
let tms = TruthMaintenanceSystem()
tms.believe("グラム陰性菌感染の疑い", supportedBy: ["培養陽性"])
tms.believe("抗菌薬の検討を推奨", supportedBy: ["グラム陰性菌感染の疑い"])
tms.retract("培養陽性") // 培養結果が誤りだったと判明
// 「グラム陰性菌感染の疑い」「抗菌薬の検討を推奨」の両方が依存記録をたどって連鎖的に撤回される
// ―― 無関係な他の結論はそのまま残る
de Kleer は1986年、この考え方を発展させ、結論を単一の信念として持つのではなく、どの仮定の組み合わせ(環境, environment)の上でその結論が成り立つかをタグ付けする**仮定に基づく真理維持システム(Assumption-based TMS, ATMS)**を提案しました(注10)。ATMSでは矛盾する複数の仮説を1つに絞り込まずに並行して保持でき、診断のように「複数の候補仮説を比較しながら絞り込む」問題と相性のよい枠組みになっています。
制約ネットワークとモデルに基づく診断 ― シミュレーション規則・制約保留による候補生成
問題を「変数とその取り得る値、変数間の制約」として定式化したものを**制約ネットワーク(constraint network)**と呼びます。David Waltz が1975年、線画から3次元物体を解釈する場面で、頂点ごとの矛盾する解釈を制約伝播によって削り落とす手法を示したことは、制約ネットワークの初期の代表的な成功例として知られています(注11)。
この制約ネットワークと前段の依存記録を組み合わせ、装置の故障診断に応用したのが、Randall Davis らの**モデルに基づく診断(model-based diagnosis)です(注12)。対象の装置(たとえばデジタル回路)を部品どうしの制約ネットワークとして表現し、各部品には「入力がこうなら出力はこうなる」という正常動作のシミュレーション規則(simulation rule)を持たせて、入力から期待される出力を予測します。予測の一つひとつには「どの部品が正常だと仮定した結果か」という依存記録が付けられます。実測値が予測と食い違ったとき、疑わしい部品の制約を1つずつ保留(suspension)して矛盾が解消するかを調べれば、「この部品が壊れていると仮定すればすべての観測と辻褄が合う」という故障候補を機械的に列挙できます。これが制約保留による候補生成(candidate generation by constraint suspension)**です。「この症状ならたいていここが壊れている」という専門家の経験則を規則化する診断とは対照的に、装置の構造と正常動作のモデルだけから診断を導ける点、経験則が存在しない新品の装置や未知の故障にも対応できる点が特徴です。
定性的推論
物理的な装置やシステムの挙動を、精密な微分方程式ではなく「増加・不変・減少」のような定性的な値の組み合わせで表現し、その状態がどう遷移し得るかを追跡する手法を**定性的推論(qualitative reasoning)**と呼びます。de Kleerによる定性物理学、Kenneth Forbusの定性プロセス理論(Qualitative Process Theory)、Benjamin KuipersのQSIMは、いずれもこの考え方を代表する研究です(注13)。「流入量が流出量を上回れば水位は増加する」といった定性的な因果関係を規則として記述し、可能な定性的状態の遷移をすべて列挙(envisioning)することで、数値モデルを構築できない、あるいは構築する必要のない場面でも装置の振る舞いを予測・診断できるようにします。前段のモデルに基づく診断で部品の正常動作を定性的に記述する場面とも地続きで、10節のDIPMETER ADVISORのような物理量の解釈を扱うシステムにも親和性が高い考え方でした。
6. 医療診断分野:MYCIN・EMYCIN・Digitalis Advisor・Caduceus・PUFF
医療診断は、専門知識が高度に体系化されている一方で人手不足も深刻という理由から、エキスパートシステムの初期の主戦場になりました。
MYCIN(Edward Shortliffe, Stanford, 1972〜1980年)は、血液中の細菌感染症を診断し、適切な抗生物質とその投与量を推奨するシステムです(注3)。数百本規模の生成規則を持ち、後ろ向き推論(目的指向推論)で「この患者はグラム陰性菌に感染している可能性が高いか」といった仮説を検証しながら、3節の確度係数で結論の確からしさを扱いました。専門医と同等かそれ以上の診断精度を示した評価実験で知られていますが、誤診時の責任の所在といった法的・倫理的な理由から、実際の臨床現場に投入されることはありませんでした。
EMYCINは前節で見た通り、MYCINから医療知識を除いた汎用シェルです。
Digitalis Therapy Advisor(MITのグループ、1970年代半ば)は、心不全治療薬ジギタリスの投与量調整を助言する、ごく初期の医療診断支援システムの一つです。MYCINが確度係数を用いたのに対し、こちらは決定分析(decision analysis)的な発想を取り入れており、同じ「医療診断支援」という問題領域でも異なる不確実性の扱い方が並行して模索されていたことがうかがえます。
Internist-Iとその後継であるCaduceus(Jack Myers・Harry Pople, University of Pittsburgh, 1970年代〜1980年代)は、MYCINが単一の感染症に的を絞ったのに対し、内科領域全般を対象とし、複数の疾患が同時に存在する患者を診断しようとした野心的なシステムです。疾患と症状の関連を重み付けされたスコアのネットワークとして表現しましたが、疾患の組み合わせが増えると考慮すべき仮説が爆発的に増える組合せ爆発に直面し、Caduceusではこの問題を緩和するための領域の分割アルゴリズムが導入されました。
PUFF(スタンフォード大学とパシフィック医療センター、EMYCINベース)は、肺機能検査の測定値から肺疾患を診断するシステムで、4節のEMYCINシェルを実際に医療の別領域へ転用した具体例です。研究室のデモにとどまらず、実際の患者データの解釈に日常的に使われた数少ないエキスパートシステムの一つとされています。
7. 化学・分子構造分野:DENDRAL・Meta-DENDRAL・CRYSALIS・LHASA・SECS・SYNCHEM
DENDRAL(Edward Feigenbaum・Joshua Lederberg・Bruce Buchanan, Stanford, 1965年〜)は、質量分析計のデータから未知の有機化合物の分子構造を推定するシステムで、しばしば最初の本格的なエキスパートシステムとされます(注14)。化学の専門知識を大量に組み込むことで、汎用的な探索アルゴリズムだけでは実用的な時間で解けなかった構造推定問題を解けるようにし、これが冒頭で触れた「knowledge is power」仮説の実証例になりました。
Meta-DENDRALは、DENDRALが使う質量分析の規則そのものを、専門家への面談ではなく実測データから自動的に学習しようとしたプログラムです。4節で触れたとおり、知識獲得のボトルネックを機械学習で迂回しようとした早期の試みとして位置づけられます。
CRYSALISはDENDRALファミリーの一つで、X線結晶構造解析の電子密度マップからタンパク質の立体構造を解釈するシステムです。複数の異なる粒度の知識源(低レベルの画像処理から高レベルの構造仮説まで)を1つの共有データ構造上で協調させる**黒板アーキテクチャ(blackboard architecture)**を採用しており、これはHearsay-IIの音声認識研究に由来する設計です。
有機合成の分野では、目標となる分子から出発して「どの結合を切ればより単純な出発物質にたどり着けるか」を逆向きに考える逆合成解析(retrosynthetic analysis)という考え方が中心的な役割を果たしました。LHASA(E. J. Corey, Harvard, 1969年〜)はこの逆合成解析をヒューリスティックに支援するシステムで、Coreyはこの合成戦略の考案によりノーベル化学賞を受賞しています。SECS(W. Todd Wipke)も同じ系譜に属する逆合成解析の支援システムです。LHASA・SECSはいずれも、化学者が画面上で対話しながら探索の方向を導く対話型の設計でした。一方、SYNCHEM(Herbert Gelernter, SUNY Stony Brook)は、人間の誘導なしにシステム自身の探索とヒューリスティックで合成経路を導こうとした点で対照的です。同じ有機合成計画という問題領域の中に、「専門家が対話的に探索を導く」路線と「システムが自律的に探索する」路線という2つの設計思想が併存していたことになります。
8. 数式処理分野:SAINT・SIN・MATHLAB・MACSYMA・Maple・REDUCE・SMP・muMATH
数式処理(記号数式処理, Computer Algebra)の系譜も、「専門家の解法知識を計算機に注ぎ込む」という点でエキスパートシステムと発想の根を共有しています。対象が医療や化学ではなく数学そのものであるだけで、「熟練した数学者ならこう解く」という手続き的な知識を大量に組み込むことで実用的な性能を得た、という構図は同じです。
SAINT(James Slagle, MIT, 1961年)は、大学初年度レベルの記号積分の問題をヒューリスティックな探索によって解いた、最初期のAIプログラムの一つです。SIN(Symbolic INtegrator, Joel Moses, MIT, 1967年)はSAINTの後継で、場当たり的な探索の代わりに、積分の種類ごとに体系立てられたアルゴリズムを適用する方式に切り替え、はるかに高い信頼性を達成しました。
MATHLAB(Carl Engelman, MITRE社, 1964年〜)は初期の対話型数式処理システムです。MITのProject MACでは、このMATHLABと前述のSINの流れを汲むMACSYMA(1968年〜1980年代)が開発されました。MACSYMAは当時としては最大級のLISPプログラムの一つとされ、記号積分・因数分解・方程式の簡約化など幅広い数式処理を統合した、包括的な数式処理システムの原型となりました。MACSYMAが大型計算機を必要としたのに対し、より小さな計算機でも効率よく動く数式処理システムとして開発されたのがMaple(University of Waterloo, 1980年〜)で、現在も使われ続けています。
REDUCE(Anthony Hearn, 1968年〜)はMACSYMAとは独立に開発された、もう一つの初期の数式処理システムで、現在もオープンソースとして開発が続いています。SMP(Symbolic Manipulation Program, Stephen Wolfram, Caltech, 1981年)は、後にWolframが手がけるMathematicaの直接の前身にあたります。muMATH(David Stoutemyer, Soft Warehouse)は、大型計算機を必要とした他の数式処理システムとは対照的に、黎明期のパーソナルコンピュータ上で動作する小型の数式処理システムとして設計され、数式処理を個人の机の上に持ち込んだ点で異彩を放っています。
9. プロダクションシステムと商用化:R1/XCON・OPS5・OPS83・OPS86
OPS5(Charles Forgy, Carnegie Mellon University, 1977年)は、1節で見たプロダクションシステムの構造をそのままプログラミング言語として実装した、汎用の生成規則ベース言語です。1節の注記で触れたReteアルゴリズムを実装しており、ルールと事実の数が数千に達しても実用的な速度で前向き推論を行えました。
R1(後にXCONと改称, John McDermott, CMU/Digital Equipment Corporation, 1980年)は、OPS5で実装された、DEC社のVAXコンピュータの受注構成(どの部品をどう組み合わせるか)を決定するシステムです。診断ではなく**構成・設定(configuration)**という問題領域に前向き推論を適用した好例であり、商業的に大きな成功を収めた最初期のエキスパートシステムとされています。人手による構成作業では発生しがちだった見積もりの誤りを大幅に減らし、DEC社に多額のコスト削減をもたらしたと報告されています。
OPS5の商業的な後継として、OPS83・OPS86(Production Systems Technologies社)が開発されました。LISP環境に依存していたOPS5に対し、C言語などの実用的な環境に近づけることで、産業界での本格的な実運用に耐える生産システム言語として展開されました。
10. 資源探査・地質分野:PROSPECTOR・DIPMETER ADVISOR
PROSPECTOR(SRI International, 1976年〜)は、地質学者の鉱床評価の知識を規則化し、ある地域にどの鉱物の鉱床が存在する可能性が高いかを推論する鉱物探査エキスパートシステムです。鉱床のタイプごとのモデルを意味ネットワーク風の構造で表現し、後ろ向き推論と確率的な重みづけを組み合わせて評価を行いました。1980年、ワシントン州マウント・トールマンにおいてPROSPECTORが指摘したモリブデン鉱床の存在が実際のボーリング調査で確認されたことは、エキスパートシステムが実世界で経済的価値のある新しい発見に貢献した初期の事例としてしばしば引用されます(注15)。
DIPMETER ADVISOR(Schlumberger社, 1980年代)は、石油探査で得られるディップメータ(地層の傾斜を計測する検層データ)を解釈し、断層や褶曲といった地質構造を推定するシステムです。信号処理的なデータの前処理と、地質学の専門知識を規則化した推論とを組み合わせている点が特徴で、5節で見た定性的推論とも親和性の高い領域です。
11. 軍事・物流分野:DART
DART(Dynamic Analysis and Replanning Tool, BBN Technologies/DARPA, 1991年)は、湾岸戦争(Desert Storm)における米軍の輸送・兵站計画の立案・再計画を支援するために実運用されたシステムです。人員・物資・輸送手段という制約が絶えず変化する状況下で、計画を動的に立て直すという実時間性の高い問題領域に取り組みました。DARPAの当局者は、この1度の実運用がもたらした効率化だけで、それまで30年間にわたるAI研究への政府投資の総額を回収したと証言したと伝えられており、記号主義AIの研究成果が大規模な実務に橋渡しされた象徴的な事例としてしばしば引用されます。
まとめ
| システム | 開発者・年代 | 問題領域 | 推論の方向性・特徴 |
|---|---|---|---|
| MYCIN / EMYCIN | Shortliffe, Stanford, 1970年代 | 血液感染症の診断 | 後ろ向き推論、確度係数。EMYCINは知識を抜いた汎用シェル |
| Digitalis Advisor | MIT, 1970年代前半 | ジギタリス投与量調整 | 決定分析的なアプローチ |
| Caduceus (Internist-I/II) | Myers・Pople, Pittsburgh大 | 内科領域の複合疾患診断 | 重み付けスコアと領域分割 |
| PUFF | Stanford/Pacific Medical, EMYCINベース | 肺機能検査の解釈 | シェルの転用の実例。臨床運用まで到達 |
| DENDRAL / Meta-DENDRAL | Feigenbaum他, Stanford, 1965年〜 | 質量分析からの分子構造推定 | 最初期のエキスパートシステム。Meta-DENDRALは規則の自動学習 |
| CRYSALIS | Stanford | タンパク質のX線結晶構造解析 | 黒板アーキテクチャによる複数知識源の協調 |
| LHASA / SECS | Corey (Harvard) / Wipke (Stanford) | 有機合成の逆合成解析 | ヒューリスティックによる合成経路探索 |
| SYNCHEM | Gelernter, SUNY Stony Brook | 有機合成経路の生成 | より網羅的な探索路線 |
| SAINT / SIN | Slagle / Moses, MIT | 記号積分 | 探索からアルゴリズム的解法への移行 |
| MACSYMA / Maple / REDUCE / SMP / muMATH | MIT他 | 数式処理全般 | 現代のCASの直接の祖先 |
| R1/XCON, OPS5, OPS83/86 | McDermott/Forgy, CMU | VAXの受注構成 | 前向き推論、Reteアルゴリズムによる商用化 |
| PROSPECTOR | SRI International, 1976年〜 | 鉱物資源探査 | 後ろ向き推論と確率的重みづけ |
| DIPMETER ADVISOR | Schlumberger, 1980年代 | 石油探査の検層データ解釈 | 信号処理と規則ベース推論、定性的推論との親和性 |
| DART | BBN/DARPA, 1991年 | 軍事物流の動的再計画 | 実運用による大規模な実証 |
いずれの問題領域に固有のシステムも、根底にあるのは1節で見た「知識ベース+ワーキングメモリ+推論エンジン+ユーザーインターフェース」という共通の骨格と、2節・3節で見た「前向き推論/後ろ向き推論」「確度係数/ファジー推論」という共通の道具立てです。さらに5節で見たように、メタ知識による反省的な制御、真理維持システムによる依存記録、制約保留による候補生成を使うモデルに基づく診断、定性的推論による物理系のモデル化は、この基本骨格をより高度な問題に耐えられるよう拡張する試みでした。違うのは、その道具立てにどの問題領域の専門知識を注ぎ込んだか、そしてその知識をどうやって引き出したか(4節の知識工学)だけだとも言えます。
一方で、これらのシステムはいずれも知識獲得のボトルネックという課題から逃れられず、専門知識の更新・保守コストの高さ、隣接する問題領域への応用の難しさ(領域の外に出た途端に無力になる「もろさ, brittleness」)が、1980年代後半以降のエキスパートシステム・ブームの終息(いわゆるAIの冬)の一因になりました。それでも、ここで見た「知識ベースと推論エンジンの分離」「前向き/後ろ向き推論」「不確実性の定量化」「依存記録による効率的な信念の更新」という発想は、現在のルールエンジンや意思決定支援システムに形を変えて受け継がれています。
注釈
- Allen Newell・Herbert A. Simon が人間の問題解決過程の計算モデルとして提案したプロダクションシステム(production system)の枠組み。IF-THEN形式の生成規則の集合と、それを機械的に適用する制御機構からなる。
- Charles L. Forgy, "Rete: A Fast Algorithm for the Many Pattern/Many Object Pattern Match Problem"(1982年)。ワーキングメモリの差分だけを扱うことで、規則数・事実数が多い場合でも効率的な前向き推論を可能にした。
- Edward H. Shortliffe, "Computer-Based Medical Consultations: MYCIN"(1976年)。確度係数(Certainty Factor)と後ろ向き推論を用いた血液感染症診断システム。
- Lotfi A. Zadeh, "Fuzzy Sets"(1965年)。集合への所属を0/1ではなく0〜1の隷属度で表すファジー集合論を提案。
- Ebrahim H. Mamdani, "Application of Fuzzy Algorithms for Control of Simple Dynamic Plant"(1975年)。ファジー集合に基づく制御・推論方式(Mamdani型ファジー推論)を定式化した。
- 知識工学(Knowledge Engineering)という用語は Edward Feigenbaum によって広められた。専門家からの知識獲得(knowledge elicitation)と形式化を担う専門職としてのナレッジエンジニアの役割を指す。
- William J. van Melle, "A Domain-Independent Production-Rule System for Consultation Programs"(1979年)。MYCINから医療知識を除いた汎用シェルEMYCIN(Empty MYCIN)を提案。
- Randall Davis, "Applications of Meta Level Knowledge to the Construction, Maintenance and Use of Large Knowledge Bases"(Stanford PhD thesis, 1976年)。MYCINの知識ベースを対話的に拡張・デバッグするTEIRESIASを開発し、メタ規則という考え方を導入した。
- Jon Doyle, "A Truth Maintenance System"(1979年)。結論に依存記録(正当化, justification)を持たせ、前提の撤回に伴う信念更新を効率化する枠組み。
- Johan de Kleer, "An Assumption-Based TMS"(1986年)。信念を仮定の集合(環境)にタグ付けし、複数の矛盾する仮説を並行して保持できるようにした真理維持システム。
- David L. Waltz, "Understanding Line Drawings of Scenes with Shadows"(1975年)。線画の頂点解釈を制約伝播によって絞り込む、制約ネットワークの初期の代表例。
- Randall Davis, "Diagnostic Reasoning Based on Structure and Behavior"(Artificial Intelligence, 1984年)。装置の構造と部品の正常動作モデル(制約ネットワークとシミュレーション規則)から、依存記録と制約保留によって故障候補を生成するモデルに基づく診断を提案した。
- Johan de Kleer の定性物理学、Kenneth Forbus の定性プロセス理論(Qualitative Process Theory, 1984年)、Benjamin Kuipers のQSIM(1986年)。いずれも物理系の挙動を定性的な値と規則で表現する定性的推論の代表的研究。
- Bruce G. Buchanan・Edward A. Feigenbaum, "DENDRAL and Meta-DENDRAL: Their Applications Dimension"(1978年)。
- Richard O. Duda・Peter E. Hart他, PROSPECTORによるモリブデン鉱床(マウント・トールマン, ワシントン州)の探査事例(1980年前後)。
参考資料
- Expert system - Wikipedia
- Knowledge engineering - Wikipedia
- Production system (computer science) - Wikipedia
- Rete algorithm - Wikipedia
- MYCIN - Wikipedia
- Certainty factor - Wikipedia
- Fuzzy logic - Wikipedia
- Truth maintenance system - Wikipedia
- Assumption-based truth maintenance system - Wikipedia
- Qualitative reasoning - Wikipedia
- Constraint satisfaction problem - Wikipedia
- Internist-I - Wikipedia
- Dendral - Wikipedia
- Computer algebra system - Wikipedia
- Macsyma - Wikipedia
- XCON - Wikipedia
- OPS5 - Wikipedia
- Prospector (expert system) - Wikipedia
- Dynamic Analysis and Replanning Tool - Wikipedia
元記事(Bitz Notebook): エキスパートシステムと知識工学 ― 生成規則・前向き推論・確度係数から、真理維持システムと医療・化学・数式処理・商用生産システムまで