2

LogicBlox で「暗黙の」ロジックをエンコードしたいと考えています。私は述語を持っています:

Number(n),hasNumberName(n:i)->int(i).
isTrue[n] = i -> Number(n), boolean(i).

そして、その述語にいくつかのデータを追加します。

+Number(1).

ここで、数字 2 と数字 3 を作成し、この論理規則に従ってこれら 2 つの数字の真理値を作成します。

isTrue[1] が true の場合、isTrue[2] が true または isTrue[3] が true です。(isTrue[1] は (isTrue[2] または isTrue[3]) を意味します)

だから私は述語を作成します:

 implies[n1,n2,n3] = e -> Number(n1), Number(n2), Number(n3),boolean(e).

次に、次のようなルールを作成しようとします。

isTrue[n2] = true;isTrue[n3] = true <- isTrue[n1] = true,implies[n1,n2,n3] = true.

しかし、LogicBlox レポート:「エラー: 論理和は、ルールの先頭ではサポートされていません」

では、これをエンコードして LogicBlox のロジックを暗示するにはどうすればよいでしょうか?

4

2 に答える 2

2

あなたの質問から、Prologのバックグラウンドでこの質問をしているようです。その場合は、Datalog の概要を読むと役立つ場合があります。たとえば、「Datalog について常に知りたいと思っていたこと (そしてあえて聞いたことがないこと)」などです。

表現したいロジックは、解決または検索戦略を必要とするため、意図的に Datalog では許可されていません。Prolog とは対照的に、Datalog は、表現できるプログラムの計算上の複雑さを意図的に制限しています。これらの制限の結果として、データベース管理システムで使用するための重要な要件を満たし、最も重要なことは、非常に大きなデータ セットをサポートすることです。Datalog の優れた入門書を読むと、計算の複雑さの制限がより明確になります。

より多くのプログラムを表現できるようにするために、人々は Datalog の拡張を研究してきました (完全な Prolog に行くことなく、より手続き的なセマンティクスが得られます)。この特定の例は、「Disjunctive Datalog」と呼ばれます。もっと読みたい場合は、Googleのヒットがこれに適しています。LogicBlox は (少なくとも現在は) Disjunctive Datalog を実装していません。これは、私たちの主な目的がスケーラブルなデータベース管理システムになることだからです。

LogicBlox は、特定のプログラムに対するソルバーの使用をサポートしています。典型的な例はナップザック問題です。問題が最適化問題として表現できる場合 (ほぼ確実に表現できますが、定式化には通常、従来の最適化問題ではないものに対してある程度の創造性が必要です)、この機能を使用できます。ソルバーの機能は、公開されている資料ではまだ十分に文書化されていません。試してみたい方は直接お問い合わせください。

于 2015-10-11T03:55:56.163 に答える
0

1 -> 2 または 3 という制約を適用しようとしていると思いますか? もしそうなら、を使用して値を導出しようとして<-もうまくいきません: 2 も 3 も存在しない場合、どちらを作成するようにシステムに指示していますか? ->代わりに、構文を使用して制約を記述してください。結局のところ、制約含意であり (右矢印の構文は偶然ではありません!)、言語で許容される右側に選言を置きます。次に、1 を作成しようとして 2 も 3 も存在しない場合、含意が保持されないため、システムは制約の失敗を報告します。

また、通常、論理言語ではブール値関数は必要ありません。「真」であると見なすisTrue(x)セットにすることができます(存在しないものは「偽」です)。x

于 2015-10-10T18:14:31.977 に答える