サーチ…


備考

実装

  1. SWI-Prolog (無料)
    • 実装されました
  2. SICStus (商業)
  3. YAP (無料)
  4. GNU Prolog (無料)
  5. XSB (無料)
  6. B (商業)
  7. IF (商業)
  8. チャオ (無料)
  9. ミネルヴァ (商業)
  10. ECLiPSe-CLP (無料)
  11. Jekejeke Prolog (商業)
  12. プロローグIV
  13. 収入プロローグ (無料)
  14. ビジュアルプロローグ (商業)

インストールまたはセットアップ

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-prolog

  • SWI-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 - アルファベットの大文字で始まらない文字列。例えば、 - abokay
  • 数字 - 数字のための特殊な構文はありません。宣言は必要ありません。例えば12235.8
  • 変数 - 大文字またはアンダースコア( _ )で始まる文字列。例えば、 XYAbcAA
  • 複雑な用語 - ファンクタと一連の議論から作られています 。複素数項の名前は常に原子ですが、引数は原子または変数のどちらでもかまいません。例えば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は宣言型言語であり、このデータベースは次のように読むことができます。

フレッドはスーザンの父親です

ヒラリーはジョーの母親です。

すべてのためにXYXの子である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_childfather_childの関係

mother_childmother_childとjoeの関係

すべてのためにXYの関係child_of間に保持XYの関係場合father_child間に保持YX 、または関係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は、ロードするファイルを指定します。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow