Rousselによって開発されました。Logic)」の短縮形で、この言語が論理型計算モデルを採用していることを示しています。採用しているのは「一階述語論理」と呼ばれます。「一階」とは「高階ではない」、つまり、論理自身は扱わないという意味です。それに基づいた論理体系によってプログラムを表現します。プログラムを見てみましょう。人間(X).1行目は「ソクラテスは人間である」という表明です。これは公理に相当します。死ぬ」というルールです。死ぬ(ソクラテス).と問うと、システムは三段論法を始めます。複雑な例を見てみましょう。tom).ここでは「兄弟」、「親の子」、「父の子」、「母の子」という関係を定義しています。共通の親Zを持つことを意味しています。Y).は「親の子」とは「父の子」あるいは「母の子」のいずれかであるとシステムに教えています。こちらはオアの関係になります。兄弟であるか聞いてみましょう。オブジェクト指向の解説でもそうですが、知識表現的な例題ばかりでは実際のプログラミングのイメージが掴めないかもしれません。プログラミングの例もいくつか紹介しましょう。最初はパズルを解くプログラムです。以下のプログラムは有名なハノイの塔パズルの解答を表示します。経由して移動する手順」と質問しています。らしくないのですが、かえって実際の雰囲気を伝えるかもしれません。すべての基本はルールの定義になります。ボディ.という形で定義されます。これは「ボディが真ならばヘッドも真」というルールを定義したことになります。ボディはコンマで区切った複数の項を含むことができ、その場合はボディの全ての項が真であるときはじめてヘッドが真になります。事実はヘッド.となります。人間(X).」がルールで、「人間(ソクラテス).」が事実です。true.の省略形です。ヘッドという形で行います。ヘッドもボディも名前または名前(引数,...)という形式をとります。普通の言語における関数定義のようなものです。どちらにも値も変数も置けるという点です。変数は大文字または「_」で始まる名前の識別子です。変数にはなんでも格納することができます。それ以外の識別子は「アトム1」と呼ばれます。シンボルのようなものです。同じ名前のアトムはいつも等しいと見なされます。その他にも整数や文字列などのデータ型もあります。死ぬ(ソクラテス).システムと尋ねると「死ぬ(ソクラテス)」に相当するヘッド部を探しますが、直接それは見つかりません。変数を含む「死ぬ(X)」が見つかるのでそれにマッチします。(ほんとは束縛と呼ぶ)、推論を続けます。基本的な動作になります。「死ぬ(X)」は「人間(X)」が真の時、真になります。そこでまたユニフィケーションが発生し、「人間(ソクラテス)」という事実を探します。するとその事実は定義されているので、めでたく最初の命題が真であることが分かりました。今回は調べた命題全てが真になりましたが、偽になる命題があった場合、真となる命題を求めてユニフィケーションを繰り返します。これを「バックトラック」と呼びます。ユーザーであればバックトラックの働きは正規表現でなじみがあるかもしれませんね。バックトラックがいつもありがたいとは限りません。「鳥は飛ぶ」というルールがあったとしましょう。飛ぶ(ツバメ).trueしかし、中には鳥であるのに飛ばない鳥がいます。false.とするだけでは不十分です。(ペンギンは飛ぶ)」という結論を出してしまいます。これは嬉しくありません。このような場合のために、「カットオペレータ」というバックトラックを抑制する仕組みが用意されています。カットオペレータを使うと「ペンギンは飛ばない」というルールは以下のようになります。false.「!」がカットオペレータです。カットオペレータは「ここを通り過ぎたらバックトラックしない」という意味になります。false」がマッチし、偽がカットオペレータを過ぎてから発生していますので、バックトラックが発生せず、全体が偽となります。制御構造を実現したり、効率化を行おうと思うとどうしても必要になる機能です。特徴は良くも悪くもその実行モデルでしょう。「計算」はあくまでも述語論理に基づいたユニフィケーションによって行われます。動作は完全に抽象化されていて、簡単にうかがい知ることはできません。上で効率良く動作させることが難しいということでもあります。推論をベースにした計算は、並列計算と相性が良いことも知られています。ユニフィケーションは実行順序に依存しないので、タスクスケジューリングの自由度が高いからです。ような派生言語を生んだりしています。大きな影響を受けています。