次のような関係代数を実装できます。
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 = (++)