SQL 言語およびトリガー機能と非常によく似た、メモリ内でのテーブルベースのリアクティブ宣言型プログラミングをサポートするプログラミング言語またはパッケージはありますか?
たとえば、PERSON
テーブルJOB
を関数として定義できます
name: PERSON -> STRING
female: PERSON -> BOOLEAN
mother: PERSON -> PEOPLE
father: PERSON -> PEOPLE
title: JOB -> STRING
company: JOB -> STRING
salary: JOB -> INTEGER
empoyee: JOB -> PERSON
次に、次のような関数を計算したいと思います。
childcount: PERSON -> INTEGER
childcount(P) = |{ Q in PERSON : father(Q) = P or mather(Q) = P }|
income: PERSON -> INTEGER
income(P) = SUM { salary(J) : J in JOB and empoyee(J) = P }
incomeperchild: PERSON -> INTEGER
incomeperchild(P) = income(P) / childcount(P)
parent: PERSON x PERSON -> BOOLEAN
person(P,Q) = (P = father(Q)) or (P = mother(Q))
error: PERSON -> BOOLEAN
error(P) = (female(P) and (exists Q in PERSON)(father(Q) = P))
or (not female(P) and (exists Q in PERSON)(mother(Q) = P))
or (exists Q in PERSON)(parent(P,Q) and error(Q))
したがって、基本的には、テーブルの値が変更されるたびに自動的に更新されるテーブルの計算列が必要です。同様のことは SQL トリガーでも表現できますが、そのような機能を言語に組み込み、メモリ上で実行できるようにしたいと考えています。変更の伝播を最適化する必要があります。これを行うためのフレームワークはありますか?
オブザーバー パターンとリアクティブ プログラミングは、個々のオブジェクトに焦点を当てています。しかし、何百万もの行が存在する可能性があるため、テーブル内の各行のポインターと余分な構造を維持したくありません。すべてのルールは一般的なものです (ただし、親子関係などを介して異なる行を参照することはできます)。そのため、何らかの形式の再帰が必要です。