論理プログラミングは事実とルールが設定されているどのように制御する論理回路だけではなく、数学関数を使用してプログラミングパラダイムです。
関数呼び出しやその他の命令をいつ実行し、どのように評価するかを指示する慎重に構造化された制御フローの代わりに、プログラムの論理規則は、節または論理述語として記述されます。
Prologでの論理プログラミングの例。出典:Kuldeepsheoran1による-スクリーンショット、CC BY-SA 3.0、wikimedia commons
このアプローチは、遺伝的プログラミングや進化的プログラミングでよく使用されますが、一般的に、どのように達成するかではなく、どのような目標を達成するかをモデルに伝えます。
各ルールには、実行可能な数学関数ではなく、形式化されたロジックを持つヘッダーと本文が含まれます。たとえば、「And is true(header):if if C1、C2、C3 is true(body)」のようになります。事実や結果は、「それは本当です」のように、本文なしで表現されます。
ただし、Prologなどの一部のプログラミング言語では、特定の問題を解決する方法をモデルに指示するために命令型プログラミングを含めることもできます。たとえば、「Yを解くには、C1、C2、およびC3を追加します。」
ロジックプログラミングの特徴
ロジックプログラミングは、他の既存のプログラミング戦略とは大きく異なります。プログラムを使用してコンピュータに指示を与える代わりに、オブジェクト間の関係が確立されます。このようにして、コンピューターはこれらの関係を推論し、論理的なソリューションに到達できます。
ロジックプログラム内には、ファクトとルールという2つの主要なコードセットがあります。ルールは、環境についての知識を得るために事実に適用されます。
真実と論理的演繹
論理プログラムは、真理と論理演繹という2つの重要な概念によって解読できます。プログラムシンボルの実装の下で、プログラムの計算が正しいかどうかにかかわらず、真実が明らかになります。論理演繹は、論理節がプログラムの結果であるかどうかを決定します。
これらの命令は常に論理的な文および句として解釈され、それらの実行の結果は、含まれる計算の論理的な結果です。
一次論理
これは命題論理の派生物です。ドメインと呼ばれる部分的な世界の観点から、オブジェクトが真か偽かを検討します。論理プログラミングは、1次論理の一般化に基づいています。
このロジックは、構文とセマンティクスで構成されています。構文は、概念を表現するために使用される正式な言語です。一方、1次論理式のセマンティクスは、式の真の値を決定する方法を示します。
このロジックは、アルファベットと一次言語、および一連の公理と推論規則に基づいています。
条項形式
これは、1次論理のサブセットです。これは、ステートメントがユニバーサルプレフィックスまたはユニバーサル量指定子のチェーン、および句内の量指定子の自由なセットによって定義される正規化形式を持っています。
プログラムへのクエリを要求するとき、ヘッダーが一致する可能性のある句の本文が考慮されます。これは、ロジックで推論規則を適用するのと同じです。
推論のステップとして、一方が選言的X(正のリテラル)を含み、もう一方が選言的¬X(負のリテラル)を含むというプロパティーを持つ2つの節が選択されます。これらのトレードオフは、補完的なものとして知られています。
これら2つの最初の句から、補完的なものを除くすべてのリテラルを使用して、新しい解決句が構築されます。
人工知能
論理プログラミングは、知識を表すのに役立つため、コンピューターを推論させるために使用される方法論です。ロジックは、知識とそれを処理するための推論を表すために使用されます。
知識を表すために使用されるロジックは、節形式です。1次論理はよく理解されており、すべての計算上の問題を表すことができるため、これが使用されます。
Prologは、論理プログラミングのアイデアに基づいたプログラミング言語です。Prologの考え方は、ロジックをプログラミング言語のように見せることです。
論理プログラミングの例
例1
-事実:ルビは猫です。
-ルール:すべての猫には歯があります。
-相談:ルビには歯がありますか?
-結論:はい。
「すべての猫には歯がある」というルールは、「Rubyは猫である」という事実があるため、Rubyに適用できます。この例は、実際のプログラミング言語用の構文で書かれていません。
例2
この例は、最も人気のあるロジックプログラミング言語の1つであるため、Prologで記述されていることがわかります。
-フェミニン(アリッサ)。
-男性(ボビー)。
-男性(カルロス)。
-フェミニン(ドリス)。
-son_of(doris、carlos)。
-son_of(カルロス、ボビー)。
-son_of(doris、alissa)。
-father_of(F、P):-男性(F)、son_of(P、F)。
Prologは他の言語と著しく異なるため、このプログラムは読みにくくなります。「フェミニン(アリッサ)」に似たコードコンポーネント。事実です。
1つのルールは、「father_of(F、P):-male(F)、child_of(P、F)」です。記号「:-」は、「is true if」として読み取ることができます。大文字は、変数を任意のオブジェクトに適用できることを意味するため、Fはカルロス、ドリス、アリッサ、またはボビーを表すことができます。このコードは次のように翻訳できます。
-アリッサは女性です。
-ボビーは男です。
-カルロスは男です。
-ドリスは女性です。
-ドリスはカルロスの娘です。
-カルロスはボビーの息子です。
-ドリスはアリッサの娘です。
-«FがPの父である»は、Fが男性で、PがFの息子である場合に当てはまります。
クエリ
詳細については、プログラムを参照するとします。あなたは、Bobbyが一緒にいる父親を見つけるために尋ねて検索できます:?-father_of(bobby、X)。システムは次の答えを示します:X = Carlos。
この場合、値の1つが変数である関係が渡されています。プロローグが行ったことは、それらの1つが論理的に安定するまで、さまざまなオブジェクトをこの関係に適用することでした。
カルロスの唯一の父親はボビーで、ボビーは男性です。これは、「father_of(F、P):-男性(F)、son_of(P、F)」というルールを満たしました。Xが「carlos」に等しい場合、論理は適切です。
その他のお問い合わせ
他のより一般的なクエリをPrologに対して行うことができます。これにより、システムは複数の結果を生成します。
-?-parent_of(親、子)。
-父=ボビー
-子供=カルロス
-父=カルロス
-子供=ドリス
見てきたように、論理プログラミングはそれらについての知識を得るためにアリッサまたはボビーが人々であるという情報を必要としない。実際、人という概念があることを示す必要はありません。
ほとんどの非論理プログラミング言語では、人に関する情報を処理するプログラムを作成する前に、まずこれらの概念を定義する必要があります。
参考文献
- ディープAI(2020)。論理プログラミング。取得元:deepai.org。
- ウィキバーシティ(2020)。プログラミング言語の理論/論理プログラミング。取得元:en.wikiversity.org。
- インペリアルカレッジロンドン(2006)。論理プログラミング。doc.ic.ac.ukから取得。
- Jia-Huai You(2020)。論理プログラミング入門。アルバータ大学。取得元:eng.ucy.ac.cy。
- C2 Wiki(2020)。論理プログラミング。wiki.c2.comから取得。