-1

我正在开始一个项目,我想尝试在类似 java 的编程语言中识别关系代数。

例如,给定两个关系: AmericanActor(Name) EuropianActor(Name)

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 回答