Armchair 言語は、Kahn や Saraswat による言語である Janus 言語を参考にした並行制約プログラミング言語です.
書くのが面倒になったので example や test を見てください。
アトムはこの言語が対象とする問題領域の元で、以下の内のいずれかです。
- 文字列 (ただし、このアトムが表す文字列は編集できない)
- 有理数
- 複合項 (例えば、
compound(1, 2, Variable)
のように、他のアトムの組み合わせとして定義でき、変数を取ることで遅延評価できる。)
変数ストア とは、各々の変数ごとに、 "制約" を記憶するグローバルなオブジェクトです。 制約は「無制約」か「あるアトムと等しい」のどちらかです。
エージェントとは、自身が使う変数ストアの各変数に対する制約を引数として受け取り、他のエージェントを解決するか、新しい制約を tell するものです。
エージェントには、以下の3つの種類と、その連立があります。
- エージェントが新しい制約をtell したとき、変数ストアはその制約を記憶します。ただし、同じ変数に 2 回以上の tell が試行された場合、エラーとなります。
- エージェントは、ある制約が満たされる場合において(ask)、他のエージェントを用いることが出来ます。通常
=
や>=
などを用い、:=
を用いると左右が等価であるという制約を導くことが出来るように変数を制約します。 - エージェントは、他のエージェントを用いて変数を制約することが出来ます。
エージェントが連立されたとき、それらのエージェントは並列に実行されます。
- teller と呼ばれる項を用いて、ある変数の、「制約を追加するための参照」を得ることが出来ます。
- asker と呼ばれる項を用いて、ある変数の、「ある制約が成立するかどうかを問い合わせるための参照」を得ることが出来ます。
(<tell_constraint> の左辺は!は付きません。それは節の頭の変数につきます)
ask制約は、以下の 3 つの内のいずれかを選択します。
E1 = E2
。E1
やE2
は式(後述)。variable
がT
になりうるという制約を示す。E1 >= E2 < E3
など、4 通りの不等号と 1 の組み合わせ。この通りの順序関係を示す。E1
などの式は有理数でなければなりません。compound(X, E2, ...) := E1
。E1
などの式を評価し、左辺と右辺が一致する様に変数 X を束縛し、後で使用可能にします。変数や式は何番目にでも現れることが出来ます。
tell制約は、以下の形になります。
[variable] = E1
。ただし、E1
は式。
変数が制約で束縛される以上、「式」という物はあり得ないですが、便宜上、式と呼びます。実際には「被評価物」位の意味です。
式は以下のいずれかです。
(E)
。式を()で囲ったものも式です。X
。 変数名をそのまま書いたものも式です。ただし、特に:=
式で、変数と式を区別する必要がある場合、()
で囲みます。1
やatom
。 アトムをそのまま書いたものも式です。E1 + E2
など、四則演算とモジュロ演算。E1
の評価した値が有理数ではない場合、この式を評価しているエージェントは終了します。
「式」と書かれている場合、その変数は一段階分評価されます。(その変数が Tell されなければ実行が終了しないという事です。)