Mangleは演繹的データベースプログラミングのためのプログラミング言語です。それ はデータログの拡張機能であり、集約、関数などのさまざまな拡張機能があります。 呼び出しとオプションの型チェック。
演繹的データベースは、複数のデータソースからデータを取得するのに役立ちます 一緒にそれは私たちが統一された方法でそのデータを表現し、照会することを可能にするからです。 また、機械可読と同様に、ドメイン知識のモデル化にも使用できます。 オントロジーですが、バイナリ述語に限定されません。
データログは、関係計算に似た表現力豊かな宣言言語です (SQLとリレーショナルビューを考えてください)。リレーショナル計算とは異なり、それはまたサポートします 簡単な方法での再帰的なルールとプログラムの構造化。
マングルにはデータログがフラグメントとして含まれており、それを使用する拡張機能が追加されています より実用的です。保証された終了のような良い特性のいくつかは 拡張機能を使用すると失われます。
オープンソースプロジェクトとしてのMangleの目標は、 開発者がアクセスしやすく、簡単な実験に役立つ方法。 このリポジトリには、 アプリケーションに簡単に埋め込むことができます。
これは公式にサポートされている Google サービスではありません。
2021年後半に発見されたlog4jの脆弱性の影響を受けるソフトウェアを見つけるように求められたと想像してみてください。 のJavaアーカイブ(jarファイル)を含むプロジェクトを探したい パッチが適用されたバージョンに更新されていないlog4j。
projects_with_vulnerable_log4j(P) :-
projects(P),
contains_jar(P, "log4j", Version),
Version != "2.17.1",
Version != "2.12.4",
Version != "2.3.2".
これはマングルルールです:概念的には、実装はすべてを取得します 変数の可能な値そしてそれはすべてのサブ目標を真にします。
P
Version
このような単純なマングル規則は、選択-プロジェクト-結合リレーショナルに対応します クエリ。SQL の同じクエリは次のようになります。
SELECT projects.id as P
FROM projects JOIN contains_jar ON projects.id = contains_jar.project_id
WHERE contains_jar.version NOT IN ("2.17.1", "2.12.4", "2.3.2")
SQLとは異なり、マングルルールには名前があります 他のクエリで参照できます。
projects_with_vulnerable_log4j
(非再帰的なデータログをSQLクエリに変換するのが面白そうに思える場合は、 Logicaオープンソースプロジェクトをチェックアウトする必要があります。
実際には、クエリが十分であることはめったになく、グループ化と 集合体。
count_projects_with_vulnerable_log4j(Num) :- projects_with_vulnerable_log4j(P) |> do fn:group_by(), let Num = fn:Count().
この例では、何をするかを指定していません。ここに可能性があります そのための実装は、依存関係グラフを歩きます。 これは、マングルルールが再帰的である可能性があることを示しています。
contains_jar
contains_jar
contains_jar(P, Name, Version) :- contains_jar_directly(P, Name, Version). contains_jar(P, Name, Version) :- project_depends(P, Q), contains_jar(Q, Name, Version).
2つのルールは、プロジェクトがjarを「含む」可能性がある2つのケースに対応します。 直接、または何らかの依存関係を介して。
エンジニアリング要件の場合、現実世界のスライスをモデル化すると便利です ドメインモデルと制御された語彙を通じて。記述ロジックの使用 概念がどのように相互作用するかを説明する役割ですが、関係は常に バイナリ。マングルは二項述語を表すことができますが、任意の n 項関係も表すことができます。
one_or_two_leg_trip(Codes, Start, Destination, Price) :- direct_conn(Code, Start, Destination, Price) |> let Codes = [Code]. one_or_two_leg_trip(Codes, Start, Destination, Price) :- direct_conn(FirstCode, Start, Connecting, FirstLegPrice). direct_conn(SecondCode, Connecting, Destination, SecondLegPrice) |> let Code = [FirstCode, SecondCode], let Price = fn:sum(FirstLegPrice, SecondLegPrice).
graph LR
/zurich -->|/code/ZL <br /> 60 CHF| /lausanne
/zurich -->|/code/ZB <br /> 30 CHF| /bern
/bern -->|/code/ZL <br /> 30 CHF| /lausanne
ソースからビルドする場合は、最初にANTLRを設定する必要があります。 これにはJavaランタイム環境が必要です。
wget http://www.antlr.org/download/antlr-4.11.1-complete.jar alias antlr='java -jar $PWD/antlr-4.11.1-complete.jar'
次に、パーサーソースを生成できます
antlr -Dlanguage=Go -package gen -o ./ parse/gen/Mangle.g4 -visitor
...最後に依存関係を取得し(go.modを参照)、ライブラリをビルドします。
go get ... go build ...
Mangleメンテナは、仕様やドキュメントへの外部からの貢献を歓迎します そしてこの実装(CONTRIBUTING.md を参照)と他の 実装。プルリクエストはテンソルフローのように処理されます。 内部の使用とテストが合格することを確認するため。