Czym jest OPS5 i dlaczego warto go poznać
OPS5 to język programowania oparty na regułach produkcyjnych, stworzony w Carnegie Mellon University, który był fundamentem wielu systemów ekspertowych w latach 80. Choć technicznie OPS5 nie jest „czystym” językiem funkcyjnym w sensie Haskella czy ML, jego model obliczeniowy — transformacja bazy faktów przez aplikację reguł — jest głęboko funkcyjny w duchu: brak mutowalnego stanu w tradycyjnym sensie, deklaratywne reguły i deterministyczny cykl rozpoznawania-aktualizacji.
OPS5 jest ważny, bo pokazuje, że programowanie funkcyjne (w szerokim sensie) nie ogranicza się do list i lambd. Reguły produkcyjne to inna forma deklaratywnego programowania, w której logika biznesowa jest wyrażona jako zbiór niezależnych reguł, a silnik inferencyjny decyduje, które reguły odpalić i w jakiej kolejności.
Dla osób zainteresowanych AI, systemami ekspertowymi i regułami biznesowymi, OPS5 jest klasykiem, który warto znać. Jego idee żyją w nowoczesnych silnikach reguł jak Drools, CLIPS i w biznesowych BRMS-ach.
Krótka historia i ewolucja
OPS5 narodził się w 1979 roku na Carnegie Mellon University, stworzony przez Charlesa Forgy’ego jako implementacja algorytmu Rete — efektywnego algorytmu do dopasowywania wzorców w dużych zbiorach reguł. Nazwa OPS oznacza „Official Production System”, a „5″ to po prostu piąta wersja.
OPS5 był używany w jednych z najsłynniejszych systemów ekspertowych w historii: XCON (konfiguracja komputerów VAX dla DEC), R1 (planowanie), i wielu innych. XCON, napisany w OPS5, oszczędzał DEC-owi dziesiątki milionów dolarów rocznie — to był moment, w którym systemy ekspertowe udowodniły swoją wartość komercyjną.
W latach 80. OPS5 był standardem de facto w dziedzinie systemów produkcyjnych. Powstały warianty: OPS83 (z rozszerzeniami proceduralnymi), Art*Enterprise (komercyjna wersja od Inference Corporation) i Jess (Java-based successor). Algorytm Rete, który OPS5 spopularyzował, jest dziś używany w Drools, CLIPS i wielu innych silnikach reguł.
Kluczowe cechy i filozofia
Reguły produkcyjne to serce OPS5. Program w OPS5 to zbiór reguł, z których każda ma część warunkową (LHS — Left Hand Side) i część akcji (RHS — Right Hand Side). Reguła mówi: „jeśli w bazie faktów istnieje wzorzec X, to wykonaj akcję Y”. Silnik inferencyjny nieustannie skanuje bazę faktów i odpala reguły, których warunki są spełnione.
Algorytm Rete to genialny wynalazek Forgy’ego. Zamiast sprawdzać każdą regułę przeciwko każdemu faktowi (co byłoby O(n*m)), Rete buduje sieć (network) filtrów, która inkrementalnie aktualizuje dopasowania. Dodanie nowego faktu do bazy wymaga przejścia tylko przez relevant filtry, nie przez wszystkie reguły. To sprawia, że OPS5 może obsługiwać tysiące reguł i faktów w czasie rzeczywistym.
Baza faktów (working memory) to globalny stan systemu — zbiór elementów (faktów), z których każdy ma klasę i atrybuty. Reguły匹配 (matchują) wzorce w bazie faktów i mogą dodawać, modyfikować lub usuwać fakty.
Cykl rozpoznawania-aktualizacji (recognize-act cycle) to model obliczeniowy OPS5:
1. Match: znajdź wszystkie reguły, których warunki są spełnione (conflict set)
2. Resolve: wybierz jedną regułę z conflict set (na podstawie strategii rozwiązywania konfliktów)
3. Act: wykonaj akcję wybranej reguły
4. Powtórz
Strategie rozwiązywania konfliktów decydują, która reguła ma priorytet, gdy wiele jest spełnionych. OPS5 oferuje strategie jak recency (preferuj reguły pasujące do najnowszych faktów), specificity (preferuj bardziej specyficzne reguły) i inne.
Deklaratywność — reguły w OPS5 są deklaratywne: mówią CO ma się stać, nie JAK. Kolejność reguł w programie nie ma znaczenia (w przeciwieństwie do imperatywnego kodu). To jest funkcyjne w duchu — program jest zbiorem transformacji, nie sekwencją instrukcji.
Gdzie OPS5 sprawdza się najlepiej
OPS5 był używany przede wszystkim w systemach ekspertowych — systemach, które emulują decyzje ludzkiego eksperta w wąskiej dziedzinie. Najsłynniejszy przykład to XCON/R1, który konfigurował komputery VAX na podstawie wymagań klienta — zadanie, które wymagało tysięcy reguł i było zbyt złożone dla tradycyjnego programowania.
Diagnostyka to kolejne naturalne zastosowanie — systemy diagnostyczne w medycynie, elektronice i mechanice, gdzie reguły odwzorowują wiedzę eksperta („jeśli objaw A i objaw B, to prawdopodobna przyczyna C”).
Planowanie i harmonogramowanie — reguły produkcyjne dobrze modelują problemy, w których trzeba podjąć sekwencję decyzji na podstawie zmieniających się warunków.
Dziś OPS5 sam w sobie nie jest używany w produkcji, ale jego następcy — Drools (Java), CLIPS (C), Jess (Java) i komercyjne BRMS-y — są powszechnie stosowane w bankowości, ubezpieczeniach i logistyce do automatyzacji decyzji biznesowych.
Jak wygląda kod w OPS5
Prosty system ekspertowy do klasyfikacji zwierząt:
(object-class animal
(literal ^name ^type ^legs ^sound))
(object-class classification
(literal ^name ^category))
(p identify-dog
(animal ^name <n> ^type mammal ^legs 4 ^sound bark)
-->
(make classification ^name <n> ^category dog))
(p identify-cat
(animal ^name <n> ^type mammal ^legs 4 ^sound meow)
-->
(make classification ^name <n> ^category cat))
(p identify-spider
(animal ^name <n> ^type arachnid ^legs 8)
-->
(make classification ^name <n> ^category spider))
(p report
(classification ^name <n> ^category <c>)
-->
(write (crlf) <n> " is a " <c> (crlf)))
Każda reguła (p ...) ma warunek (LHS) i akcję (RHS). <n> to zmienna wiązana w trakcie matchowania. --> oddziela warunek od akcji. make tworzy nowy fakt w bazie.
A oto dodawanie faktów do bazy:
(build (animal ^name Rex ^type mammal ^legs 4 ^sound bark))
(build (animal ^name Whiskers ^type mammal ^legs 4 ^sound meow))
(run)
(run) uruchamia cykl rozpoznawania-aktualizacji — silnik sam decyduje, które reguły odpalić i w jakiej kolejności.
Ekosystem i narzędzia
OPS5 był dystrybuowany jako interpreter na systemy uniksowe i VMS. Nie miał rozbudowanego IDE — programiści pracowali w edytorach tekstowych i uruchamiali programy z linii poleceń. Istniały debuggery pozwalające na śledzenie cyklu reguł i inspekcję bazy faktów.
Następcy OPS5 mają bogatsze ekosystemy: CLIPS jest open source z IDE i rozbudowaną dokumentacją. Drools (część projektu KIE od Red Hat) ma pełne wsparcie enterprise — IDE w Eclipse, integrację z Spring, dashboard do zarządzania regułami. Jess integruje się z Javą i ma wsparcie dla JADE (agent framework).
Dokumentacja OPS5 to przede wszystkim artykuły Charlesa Forgy’ego i książki o systemach ekspertowych z lat 80. (np. „Production Systems” autorstwa Forgy’ego).
Mocne i słabe strony
Siłą OPS5 jest elegancki model deklaratywny — reguły są czytelne, modularne i łatwe do dodawania i usuwania. Algorytm Rete zapewnia wydajność nawet przy tysiącach reguł. Separacja logiki (reguły) od danych (baza faktów) to piękna zasada projektowa.
Słabością jest trudność w debugowaniu i rozumieniu zachowania dużych systemów reguł. Gdy setki reguł interagują ze sobą, emergentne zachowanie może być nieprzewidywalne. „Kto odpalił tę regułę i dlaczego?” to pytanie, które spędza sen z powiek programistom OPS5.
Kolejnym problemem jest brak abstrakcji funkcyjnych — nie ma funkcji wyższego rzędu, nie ma kompozycji, nie ma type safety. OPS5 jest deklaratywny, ale nie jest „funkcyjny” w sensie, w jakim rozumiemy to dziś. To raczej DSL do reguł niż ogólny język programowania.
Podsumowanie
OPS5 to klasyk, który udowodnił, że deklaratywne reguły produkcyjne mogą rozwiązywać realne problemy biznesowe na dużą skalę. Jego algorytm Rete jest fundamentalnym wkładem w informatykę, a jego idee żyją w każdym nowoczesnym silniku reguł.
Jeśli pracujecie z regułami biznesowymi, systemami decyzyjnymi albo AI — warto poznać OPS5, żeby zrozumieć korzenie narzędzi, których używacie. A jeśli szukacie nowoczesnego następcy — CLIPS (open source) i Drools (enterprise) to naturalne wybory. OPS5 pokazał drogę, inni ją utwardzili.

