Prolog Language チュートリアル
Prolog言語を使い始める
サーチ…
備考
実装
- SWI-Prolog (無料) swi-prolog
- cで実装されました
- SICStus (商業) sicstus-prolog
- YAP (無料) ヤップ
- GNU Prolog (無料) gnu-prolog
- XSB (無料) xsb
- B (商業) b-prolog
- IF (商業)
- チャオ (無料)
- ミネルヴァ (商業)
- ECLiPSe-CLP (無料) eclipse-clp
- Jekejeke Prolog (商業)
- プロローグIV
- 収入プロローグ (無料)
- C# 、 javascript 、 phytonで実装されています
- ビジュアルプロローグ (商業) ビジュアルプロローグ
インストールまたはセットアップ
SWI-Prolog
WindowsとMac:
- SWI-Prologを公式サイトでダウンロードする
- インストーラの指示に従ってインストールしてください。
Linux(PPA):
PPA
ppa:swi-prolog/stableをシステムのソフトウェアソースに追加します(開発者はppa:swi-prolog/devel選択することができます)。ターミナルを開き(Ctrl + Alt + T)、次のように入力し
sudo add-apt-repository ppa:swi-prolog/stableその後、パッケージ情報を更新してください:
sudo apt-get update
パッケージマネージャーからSWI-Prologをインストールします:
sudo apt-get install swi-prologSWI-Prologをコマンドラインからコマンド
swipl起動することができます
追加/ 3
append([], Bs, Bs).
append([A|As], Bs, [A|Cs]) :-
append(As, Bs, Cs).
append/3は、最もよく知られているプロローグ関係の1つです。 3つの引数の間の関係を定義し、3番目の引数が1番目と2番目の引数で指定されたリストの連結を示すリストである場合はtrue です 。
特に、良いPrologコードの典型であるように、 append/3をいくつかの方向で使用することができます。
2つの完全または部分的にインスタンス化されたリストを追加します。
?- A = [1, 2, 3], B=[4, 5, 6], append(A, B, Y) Output: A = [1, 2, 3], B = [4, 5, 6], Y = [1, 2, 3, 4, 5, 6].完全にインスタンス化された3つのリストの関係が真であるかどうかをチェックします。
?- A = [1, 2, 3], B = [4, 5], C = [1, 2, 3, 4, 5, 6], append(A, B, C) Output: false指定されたリストに2つのリストを追加するすべての可能な方法を生成します。
?- append(A, B, [1, 2, 3, 4]). Output: A = [], B = [1, 2, 3, 4] ; A = [1], B = [2, 3, 4] ; A = [1, 2], B = [3, 4] ; A = [1, 2, 3], B = [4] ; A = [1, 2, 3, 4], B = [] ; false.
CLP(FD)制約
CLP(FD)制約は、すべての深刻なProlog実装によって提供されます。彼らは純粋な方法で整数についての理由を推論することができます。
?- X #= 1 + 2.
X = 3.
?- 5 #= Y + 2.
Y = 3.
データベースプログラミング
Prologはすべてを次のように分類します。
- Atoms - アルファベットの大文字で始まらない文字列。例えば、 -
a、b、okay - 数字 - 数字のための特殊な構文はありません。宣言は必要ありません。例えば
1、22、35.8 - 変数 - 大文字またはアンダースコア(
_)で始まる文字列。例えば、X、Y、Abc、AA - 複雑な用語 - ファンクタと一連の議論から作られています 。複素数項の名前は常に原子ですが、引数は原子または変数のどちらでもかまいません。例えば
father(john,doe)、relative(a)、mother(X,Y)。
論理データベースには、一連の事実と規則が含まれています 。
原子のみを引数とする複合項は事実と呼ばれ、変数を引数とする複合項は規則と呼ばれます。
Prologにおける事実の例:
father_child(fred, susan).
mother_child(hillary, joe).
Prologにおけるルールの例:
child_of(X,Y):-
father_child(Y,X)
;
mother_child(Y,X).
注意してください;他の言語のor演算子と似ています。
Prologは宣言型言語であり、このデータベースは次のように読むことができます。
フレッドはスーザンの父親です
ヒラリーはジョーの母親です。
すべてのために
XとY、Xの子であるY場合Yの父であるXまたはYの母であるX。
実際、有限の事実および/またはルールの集合が論理プログラムを構成する。
このようなプログラムの使用は、 照会を行うことによって実証されます。クエリーを使用すると、ロジックプログラムから情報を取り出すことができます。
データベースをインタプリタにロードするには(インタプリタを実行しているディレクトリにデータベースを保存したと仮定します)、次のように入力します。
?- [nameofdatabase].
nameofdatabaseを実際のファイル名に置き換えます(ここでは、 .pl拡張子をファイル名にnameofdatabase )。
上記のプログラムとその結果に対するインタプリタのクエリの例:
?- child_of(susan,fred).
true
?- child_of(joe,hillary).
true
?- child_of(fred,susan).
false
?- child_of(susan,hillary).
false
?- child_of(susan,X).
X = fred
?- child_of(X,Y).
X = susan,
Y = fred ;
X = joe,
Y = hillary.
上記の質問とその回答は次のように読むことができます:
スーザンはフレッドの子ですか? - 真
ジョーはヒラリーの子ですか? - 真
スーザンの子であるフレッドですか? - false
スーザンはヒラリーの子ですか? - false
誰がスーザンの子ですか? - フレッド
これがPrologでロジックをプログラムする方法です。論理プログラムはより正式である:公理のセット、またはオブジェクト間の関係(述語)を定義するルール。上記のデータベースをより正式な論理的な方法で解釈する別の方法は次のとおりです。
father_childの関係はfather_childとfather_childの関係
mother_childとmother_childとjoeの関係
すべてのために
XとYの関係child_of間に保持XとYの関係場合father_child間に保持YとX、または関係mother_child間に保持Y及びX。
こんにちは世界
こんにちは、インタラクティブな通訳の世界
「こんにちは、世界!」を印刷するにはPrologインタプリタで(ここでは、SWI Prologのシェルであるswiplを使用しています):
$ swipl
<...banner...>
?- write('Hello, World!'), nl.
?-はシステムプロンプトです:これは、システムがユーザーが一連のゴールを入力する準備ができていることを示します . (フルストップ)。
ここでクエリのwrite('Hello World!'), nlは2つの目標があります:
-
write('Hello World!'):'Hello World!'表示されなければならず、 (,) - 新しい行(
nl)が続く必要があります。
write/1 ( /1と述語は、一つの引数を取ることを示すために使用される) nl/0 内蔵されている述語 (定義はPrologシステムによってあらかじめ提供されます)。ビルトイン述部は、純粋なProlog定義では得られない機能を提供するか、プログラマーが定義しなくて済むように保存します。
出力:
こんにちは世界!
はい
yesで終了し、クエリが成功したことを意味します。いくつかのシステムtrueは、 yes代わりにtrueが表示されyes 。
こんにちは、ファイルからの世界
hello_world.plという名前の新しいファイルを開き、次のテキストを挿入します。
:- initialization hello_world, halt.
hello_world :-
write('Hello, World!'), nl.
initializationディレクティブは、目標hello_world, haltファイルのロード時に呼び出すように指定します。 halt 、プログラムを終了します。
このファイルは、Prolog実行可能ファイルによって実行されます。正確なフラグはPrologシステムに依存します。 SWI Prologを使用している場合:
$ swipl -q -l hello_world.pl
これにより、出力Hello, World!が生成されますHello, World! 。 -qフラグを指定すると、run swiplを呼び出すときに通常表示されるバナーが表示されなくなります。 -lは、ロードするファイルを指定します。