サーチ…


リスト

リストは特別な種類の複合語です。リストは誘導的に定義されます:

  • atom []空のリストを示すリストです。
  • Lsがリストであれば'.'(L, Ls)という語リストである。

リストを便利にPrologに表示するための特別な構文があります。

  1. リスト'.'(a, '.'(b, '.'(c, [])))[a,b,c]と書くこともできます。
  2. '.'(L, Ls)という用語は[L|Ls]と書くこともできます。

これらの表記はどのような方法でも組み合わせることができます。たとえば、 [a,b|Ls]という用語は、 Lsがリストの場合はリストです。

リストを作成する

Listという変数で統一されたリテラルからなるリスト。

?- List = [1,2,3,4].
List = [1, 2, 3, 4].

consingによってリストを構築する:

?- Tail = [2, 3, 4], List = [1|Tail].
Tail = [2, 3, 4],
List = [1, 2, 3, 4].

組み込みのlength/2を使用して未知の値のリストを構築する:

?- length(List,5).
List = [_G496, _G499, _G502, _G505, _G508].

Prologではすべてが本質的にTermであるため、リストは異種の動作をします。

?- List = [1, 2>1, this, term(X), 7.3, a-A].
List = [1, 2>1, this, term(X), 7.3, a-A].

つまり、リストには内部リストと呼ばれる他のリストも含めることができます。

List = [[1,2],[3,[4]]].

ペア

慣例により、ファンクタ(-)/2は、しばしばPrologの要素のを示すために使用されます。たとえば、 -(A, B)という用語は、要素ABペアを表します。 Prologでは、 (-)/2中置演算子として定義されます。したがって、この用語はABと等価に書くことができます。

一般的に利用可能な述語の多くは、この構文を使用してペアを示します。この例は、 keysort/2pairs_keys_values/3です。

関連リスト

すべての深刻なPrologシステムでは、要素の集合への線形アクセスよりも高速なアクセスを可能にする関連リストが利用可能です。これらの関連リストは、通常、 AVLツリーのようなバランスのとれたツリーに基づいています 。多くのPrologシステムに付属するlibrary(assoc)というパブリックドメインライブラリがあり、要素をコレクションに挿入、取得、変更するためのO(log(N))操作が用意されています。

条項

非常に高いレベルでは、Prologにはtermという単一のデータ型しかありません。 Prologでは、すべてのデータがPrologの用語で表されます。用語は誘導的に定義されます:

  • 原子は用語です。原子の例は、 xtest'quotes and space'です。
  • 変数は用語です。変数は大文字で始まりまたはアンダースコア_
  • 整数と浮動小数点数はタームです。例: 42および42.42
  • 場合化合物の用語は、次のように帰納的に定義、用語であるT1T2 、...、 T_n用語であり、 次いで、F( T1T2 、...、 T_n )また、Fはファンクタ呼ばれる用語であります複合用語

ライブラリ(レコード)を使用した名前付きフィールドの用語

[record][1]ライブラリは、名前付きフィールドで複合語を作成する機能を提供します。指示文:- record/1 <spec>は、 <spec>によって定義された用語のフィールドを初期化、設定、取得する述語の集合にコンパイルします。

たとえば、名前付きフィールドxy持つpointデータ構造を定義することができます。

:- use_module(library(record)).

:- record point(x:integer=0,
                y:integer=0).

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

?- default_point(Point), point_x(Point, X), set_x_of_point(10, Point, Point1).
Point = point(0, 0),
X = 0,
Point1 = point(10, 0).

?- make_point([y(20)], Point). 
Point = point(0, 20).

?-  is_point(X). 
false.

?- is_point(point(_, _)).
false.

?- is_point(point(1, a)).
false.

?- is_point(point(1, 1)).
true.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */


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