-1

Java のようなプログラミング言語で関係代数を認識しようとするプロジェクトを開始しています。

たとえば、AmericanActor(Name) EuropianActor(Name) という 2 つのリレーションがあるとします。

RA での次の式:

AmericanActor U EuropianActor

次のプログラムと同等である必要があります。

void RAMethod(Set<Name> AmericanActors, Set<Name> EuropianActors) {
  Set<Name> xs = new Set<Name>();

  for(R r : rs) {
     xs.Add(r);
  }

  for(S s : ss) {
     xs.Add(s);
  }

  return xs;
}

このトピックに関する出版物を探しています。

4

2 に答える 2

1

次のような関係代数を実装できます。

 Set<T> union(Set<T> a, Set<T> b) {
    Set<T> res = new Set<T>();
    for (T i: a) res.Add(i);
    for (T i: b) res.Add(i);
    return res;
 }

 Set<T> projection(Set<Pair<T,U>> a) {
    Set<T> res = new Set<T>();
    for (Pair<T,U> i: a) x.Add(i.first);
    return res;
 }

 Set<T> selection(Set<T> a, Predicate<T> p) {
    Set<T> res = new Set<T>();
    for (T i: a) if (p.Call(i)) x.Add(i);
    return res;
 }

 Set<Pair<T,U>> cross(Set<T> a, Set<U> b) {
    Set<Pair<T,U>> res = new Set<Pair<T,U>>();
    for (T i: a) for (U j: b) x.Add(Pair(i,j));
    return res;
 }

次に、関係代数をコードで直接記述します。

selection(projection(union(A,B)), isPositive)

基本的に「投影」は「マップ」に対応し、「選択」は「フィルター」に対応します。

明らかに、すべてのコードが関係代数式に対応しているわけではありません。例外などのない言語に制約する場合はwhile、条件を選択に変換したり、複数のネストされたループを外積にしたり、和集合に追加したりできます。これは別の話です。

HaskellやMLなどのより宣言型の言語に慣れているかもしれません。リストを使用した実装は次のとおりです。

type Database a = [a]
select :: (a -> Bool) -> Database a -> Database a
select = filter

projectFirst :: Database (a,b) -> Database a
projectFirst = map fst

projectSecond :: Database (a,b) -> Database b
projectSecond = map snd

union :: Database a -> Database a -> Database a
union = (++)
于 2010-10-13T13:38:32.280 に答える
1

個人的には、これを行うソフトウェア ライブラリを知りません。しかし、がこのようなことをするつもりなら、関係代数式をトークンに分割するパーサーを書きます。次に、トークン リストにある関係代数演算子に基づいて舞台裏で関係代数を実行するために、作成した "RAMethod" を呼び出します。

于 2010-10-13T13:08:05.757 に答える