Prolog Language
データ構造
サーチ…
リスト
リストは特別な種類の複合語です。リストは誘導的に定義されます:
- atom
[]
は空のリストを示すリストです。 -
Ls
がリストであれば 、'.'(L, Ls)
という語もリストである。
リストを便利にPrologに表示するための特別な構文があります。
- リスト
'.'(a, '.'(b, '.'(c, [])))
は[a,b,c]
と書くこともできます。 -
'.'(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)
という用語は、要素A
とB
ペアを表します。 Prologでは、 (-)/2
は中置演算子として定義されます。したがって、この用語はAB
と等価に書くことができます。
一般的に利用可能な述語の多くは、この構文を使用してペアを示します。この例は、 keysort/2
とpairs_keys_values/3
です。
関連リスト
すべての深刻なPrologシステムでは、要素の集合への線形アクセスよりも高速なアクセスを可能にする関連リストが利用可能です。これらの関連リストは、通常、 AVLツリーのようなバランスのとれたツリーに基づいています 。多くのPrologシステムに付属するlibrary(assoc)
というパブリックドメインライブラリがあり、要素をコレクションに挿入、取得、変更するためのO(log(N))操作が用意されています。
条項
非常に高いレベルでは、Prologにはtermという単一のデータ型しかありません。 Prologでは、すべてのデータがPrologの用語で表されます。用語は誘導的に定義されます:
- 原子は用語です。原子の例は、
x
、test
、'quotes and space'
です。 - 変数は用語です。変数は大文字で始まりまたはアンダースコア
_
。 - 整数と浮動小数点数はタームです。例:
42
および42.42
。 - 場合 : 化合物の用語は、次のように帰納的に定義、用語である
T1
、T2
、...、T_n
用語であり、 次いで、F(T1
、T2
、...、T_n
)また、Fはのファンクタ呼ばれる用語であります複合用語
ライブラリ(レコード)を使用した名前付きフィールドの用語
[record][1]
ライブラリは、名前付きフィールドで複合語を作成する機能を提供します。指示文:- record/1 <spec>
は、 <spec>
によって定義された用語のフィールドを初期化、設定、取得する述語の集合にコンパイルします。
たとえば、名前付きフィールドx
とy
持つ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.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */