オブジェクト指向プログラミングは、述語の内部状態を隠しておいて、 その状態を操作するのに適しています。
MINERVAでは、クラスとそのメソッドを定義することができます。
あるクラスのあるオブジェクトには、 黒板データ、つまり、bb_ で始まる 述語を使ってアクセスすることができる内部状態があります。
例:
:- class(counter).Counter :: init :- bb_put(Counter, index, 0).
Counter :: init(InitialValue) :- bb_put(Counter, index, InitialValue).
Counter :: get(Value) :- bb_get(Counter, index, Value).
Counter :: set(Value) :- bb_put(Counter, index, Value).
Counter :: next(Value) :- Counter :: get(OldValue), NewValue is OldValue + 1, Counter :: set(NewValue), Value = NewValue.
:- endclass.
新しいオブジェクトを作るために、MINERVAコンパイラは、これらの述語を処理し、 create_CLASS/1/2の述語を生成します。
結果として生成された述語は、
Object::Method(Arg1,..,ArgN)となります。 ここで、 Objectは、create_object/2で生成され、Methodは、アトム あるいは複合項でなければなりません。
上の例は、古典的なPrologでは以下のようになります。
create_counter(10,Counter), Counter :: next(Index)
上の例は、関数表記では、以下のようになります。
Counter <- create_counter(10), Index <- Counter::next, ...