これがプログラミングの質問の一部にすぎないことはわかっていますが、現在、ロジック プログラミングを少しやっています。私がまだ正しく理解していないことの 1 つは、一次論理の統合です。
ウィキペディアの記事を読んだところ、目的が 2 つの文を統一する用語を検索することであることは多かれ少なかれ明らかです。A、B、Cなどの代わりに、実世界のオブジェクトの例を誰か挙げることができますか? これが理解に役立つことを願っています。ありがとう
これがプログラミングの質問の一部にすぎないことはわかっていますが、現在、ロジック プログラミングを少しやっています。私がまだ正しく理解していないことの 1 つは、一次論理の統合です。
ウィキペディアの記事を読んだところ、目的が 2 つの文を統一する用語を検索することであることは多かれ少なかれ明らかです。A、B、Cなどの代わりに、実世界のオブジェクトの例を誰か挙げることができますか? これが理解に役立つことを願っています。ありがとう
これらの詳細な回答をありがとうございます。今、私は本当にそれを理解しています。ただし、誰かが同じ質問をもう一度探している場合に備えて、Stuart Russell と Peter Norvig の本「Artificial Intelligence: A Modern Approach」で見つけた例をここに書き留めておきます。この答えは非常に実用的なアプローチを使用していると思います:
リフトされた推論規則では、異なる論理式が同一に見える置換を見つける必要があります。このプロセスは統合と呼ばれ、すべての一次推論アルゴリズムの重要な要素です。UNIFY アルゴリズムは 2 つの文を取り、存在する場合はそれらの単一化を返します。
UNIFY の動作の例をいくつか見てみましょう。Knows(John, x): ジョンは誰を知っている?というクエリがあるとします。このクエリに対するいくつかの回答は、Knows(John, x) と一致する知識ベース内のすべての文を見つけることによって見つけることができます。以下は、知識ベースにある可能性のある 4 つの異なる文を統合した結果です。
UNIFY(Knows(John, x), Knows(John, Jane)) = {x/Jane}
UNIFY(Knows(John, x), Knows(y, Bill)) = {x/Bill, y/John}
UNIFY(Knows(John, x), Knows(y, Mother(y))) = {y/John, x/Mother(John)}
UNIFY(Knows(John, x), Knows(x, Elisabeth)) = fail
x は John と Elizabeth の値を同時に取ることができないため、最後の単一化は失敗します。
統一が使用されて有用な実世界の例を見ている場合は、HPSG や LFG など、計算言語学で使用される統一ベースの文法を調べてください。表面的には、これは統一の別のフレーバーのように見えますが、実際には同じです。
統一ベースの文法は、統一によって生成が拡張される CFG (context-free grammar) と考えることができます。CGF のすべての項は、特徴と値の有向非巡回グラフである AVM (属性値行列) を取得します。ここでの考え方は、コンパイラで使用される属性文法に似ています。
次のおもちゃの文法を想像してください。
S -> NP VP
NP -> Kim
NP -> The cats
VP -> V NP
V -> see
V -> sees
ここでは、合意にわずかな過剰生成があります。
*猫はキムを見る [S [NP 猫] [VP [V 見る] [NP キム]]]
これを修正するために、合意の概念を含めるように CFG を改良することができます。
S -> NP_sg VP_sg
S -> NP_sg VP_pl
NP_sg -> Kim
NP_pl -> The cats
VP_sg -> V_sg NP_sg
VP_sg -> V_sg NP_pl
V_sg -> sees
V_pl -> see
VP_pl -> V_pl NP_pl
VP_pl -> V_pl NP_sg
ここでは、以前からの過剰生成を拒否します。しかし、これは非常に迅速に組み合わせ爆発につながります。ただし、各用語を AVM で拡張し、解析時にこれらを統合することもできます。
S -> NP VP , C = A unified with B.
NP -> kim /[ AGR sg ]. We mark Kim as being singular
NP -> The cats / [ AGR pl ]
VP[ AGR #1 ] -> V [ AGR #1 ] NP
#1 表記は再入可能性です。これは、この機能の値が同じでなければならないことを意味します。実際、統合が成功した場合、それらは統合後にグラフ内の同じノードを指すことになります。ここで実際には、動詞句の一致機能は、句内の動詞の一致と同じであると言います。
V -> See / [ AGR pl ]
V -> Sees / [ AGR sg ]
拡張されたおもちゃの文法では、NP と VP が統合されず、AGR 機能の値が異なるため、"Kim see the cats" は拒否されます。構文解析を行うとき、AVM を一緒に統合するため、表現力が大幅に向上し、文法エンジニアが文法を簡単に記述できるようになります。通常、広範なカバレッジの UBG には 100 のオーダーのルールがありますが、同等の CFG (存在しない可能性があります) はチューリング完全であり、単一化された CFG には数千以上のルールがあります。
ロジックプログラミングは、私の知る限り、ほぼすべての統合です。インタプリタにステートメントを提供すると、インタプリタはそれを「真」であることがわかっているもの、つまりデータベースにあるものと統合しようとします。
例えば
cat(tom) :- true.
トムが猫であると断言します。
次に、クエリを実行できます
?- cat(X).
そしてプロローグが帰ってくる
X = tom
Prolog はデータベースを調べて、提供されたステートメント ( cat(X)
) を、既に「知っている」事実と統合しようとします。この場合、 を見つけcat(tom)
て、それを伝えることができますX=tom
。