率直に言って、私は言語がかなりアカデミックであるため、興味のあるプロローグの構文と機能を説明するのが面倒です。 彼が私に興味を持っていることを言うだけです。 事実、プロローグは、プログラミングに対して定性的に異なるアプローチを提供する唯一の言語であり、よく知られている命令、OOP(実際には命令でもありますが、構造化とモジュール化を目的としています)は機能的です。 このアプローチを宣言論理と呼ぶことができます。
正確な用語であると主張することなく、このアプローチは、プログラムが問題状態自体のプログラミング言語のさまざまな構成によって記述されるものとして定義できます。 この場合のPLの役割は、この説明を理解し、そこから特定の結論を引き出すことです。これは、問題の正しい解決策にすぎません。
これが何を意味するのかを説明します。 次の問題を取ります。
問題の状態:ソクラテスは人間です。 すべての人は人間です。
見つける:ソクラテスは死んでいますか?
プロローグ言語の条件を記述します(コメントは%記号で始まります)。
% -
human(sokrat).
% -
human(platon).
% ,
mortal(Someone) :- human(Someone).
* This source code was highlighted with Source Code Highlighter .
ここで、ソクラテスが人間であるかどうかをプロローグシステムに尋ねます。
?- mortal(sokrat).
Yes %
?- mortal(stranger).
No % , stranger ,
% :
?- mortal(Who).
Who = platon ;
Who = sokrat
* This source code was highlighted with Source Code Highlighter .
プロローグが人工知能の問題、すなわち、リターンサーチ問題、記号計算、エキスパートシステム、自然言語解析、その他多くの研究において不可欠なツールになったことは驚くことではないことは、まさにこのプログラミングの考えに基づいています。
実際、このようなプロローグの柔軟性は、言語に固有の2つの概念(統一(サンプルとの比較)と徹底的な検索)のみに基づいています。
実際には、Bratko Iの本にあるものに基づいて、8人の女王がチェス盤に置かれるタスクのプロローグの解決策を例として挙げたいと思います。人工知能のためのPROLOGUEでのプログラミング(私はそれをお勧めします) 。
% 8 X/Y
% ,
% Y -
getSolution(S):-
S=[1/_,2/_,3/_,4/_,5/_,6/_,7/_,8/_],
solution(S).
% 0x0
solution([]).
% NxN , - (N-1)*(N-1),
% -.
solution([X/Y | Others]) :-
solution(Others),
member(Y, [1, 2, 3, 4, 5, 6, 7, 8]),
nokill(X/Y, Others).
% ,
%
nokill(_, []).
%
%
nokill(X/Y, [X1/Y1 | Others]) :-
Y =\= Y1, %
Y1-Y =\= X1-X, %
Y1-Y =\= X-X1,
nokill(X/Y, Others).
* This source code was highlighted with Source Code Highlighter .
クイーンの必要な座標を取得するには、提示された説明に基づいてソリューションシステムのプロローグを要求します。
1 ?- getSolution(P).
P = [1/4, 2/2, 3/7, 4/3, 5/6, 6/8, 7/5, 8/1] ;
P = [1/5, 2/2, 3/4, 4/7, 5/3, 6/8, 7/6, 8/1] ;
P = [1/3, 2/5, 3/2, 4/8, 5/6, 6/4, 7/7, 8/1] ;
P = [1/3, 2/6, 3/4, 4/2, 5/8, 6/5, 7/7, 8/1] ;
P = [1/5, 2/7, 3/1, 4/3, 5/8, 6/6, 7/4, 8/2] ;
...
* This source code was highlighted with Source Code Highlighter .
ところで、お気に入りのプログラミング言語ではどのように見えますか? =)
ところで、 ここでrefalで同じ問題を解決することを考えることができます。これは、プロローグとイデオロギー的に共鳴する別の興味深い関数型プログラミング言語です。