ウィキペディアによると、Prolog の単一のデータ型は用語です。このテキストでは、「Prolog の単一データ タイプが用語である」とも言及されていますが、「Prolog のデータ型の分類」の説明に進みます (ただし、1 つの型しかないと思っていました...) さて、これらのスライドは異なるデータ型について言及しています: 「数字、文字、および文字列」。
では、実際に Prolog のデータ型は何ですか?
かみます: Prolog には単一のデータ型がありterm
ます。あまり役に立たない答えですね。
用語は次のように細分されます。
変数。特定の用語に統一されていないプレースホルダー。変数は、正規表現に一致する記号によって識別されます[A-Z_][A-Za-z_0-9]*
。変数_
は特別です。それは無名変数です。のすべての出現_
は、個別の変数を示します。たとえば、事実を考えると、
foo(1,2,3).
のようなテストfoo(_,_,_).
は成功しますが、のようなテストfoo(A,A,A).
は失敗します。
ただし、変数が値と統合される (バインドされる) と、それは変数ではなくなります。
数字は または のいずれfloat
かinteger
です。通常の種類のルールが適用されます (たとえば-321
、整数である-321.0
か-3.21e+02
、浮動小数点数のようなものです。
アトムは名前であり、通常は小文字で始まる単語 (例: atom
) で表され、通常の表現に一致し[a-z][A-Za-z0-9_]*
ます。別の方法として、アトムをアポストロフィ (例: ) で区切ることもできます'atom'
。これにより、他の方法では使用できない文字を簡単に使用できます。アトムの構文はそれよりもいくらか複雑です: 基本的に、別のカテゴリに分類されないものはすべてアトムを形成します (たとえば、[]
空のリストを表す特別なアトムと、結合を表すコンマ ( ,
) はすべてアトムです。
それ以外は基本的に構造体、つまり用語のタプルであり、アリティ(引数の数) を持つファンクター(アトムの規則に一致する名前)によってタグ付けされます。アトムをアリティ 0 の構造として扱うこともできます。
プロローグの他の「データ型」の上に構文糖が注がれています。
リスト./2
は、左側の引数がリストの先頭、右側の引数が末尾の構造体で示されます。アトムによって示される空のリスト[]
。例えば、
[a]
は内部的に次のよう.(a,[])
に表されます。[a,b]
としてのリスト.(a,.(b,[]))
[a,b|[c]]
としてのリスト.(a,.(b,.(c,[])))
。どちらの表記法を使用してもリストを記述できることに注意してください。それらは適切に統合されます。ただし、括弧付きリスト表記を使用することの魅力を見ることができます。
同様のシンタックス シュガーが文字列にも適用されます。文字列は、二重引用符で区切られたテキストの文字列として記述できます: "The cat and the hat"
. ただし、内部的には、文字列は、実装内部エンコーディングの各文字のコード ポイントを表す整数のリストとして表されます。たとえば、文字列"cat"
は内部的に (ASCII/UTF-8 で) list として表されます[99,97,116]
。"cat"
読みやすいですよね?
私の(それほど謙虚ではない)意見では、「言語のデータオブジェクトは用語と呼ばれます。用語は、定数、変数、または複合用語のいずれかです」(および節は複合用語です)と言うのは良いように聞こえますが、EBNF 構文には実際には約6 ページ全体があるため、そのステートメントで表現されていない (多くの) 隠された構造があります。したがって、プログラム テキストはこれらのいくつかの構文クラスに分解できますが、これらの低レベルの部分から特定の方法で組み立てる必要があるリスト、辞書、文字列などにも関心があります。とにかく、グラフィックが続きます。これは特に SWI-Prolog に当てはまりますが、「その他のプロローグ」はほとんど同じです。「本当にその他のプロローグ」でない限り (たとえば、アンサー セット プログラミング プロローグの方が簡単かもしれません。
これがSVGダイアグラムです(ソースはこちら):
上記は SWI-Prolog に固有のものです。理由は次のとおりです。
dict
(連想配列) データ型があります。string
SWI Prolog では別のデータ型です。伝統的に、「文字列」は単なる「文字のリスト」です。[]
です。従来、空のリストはヌル ポインターに似ています。[|]
、従来の.
.a()
。伝統的に、これらは存在しません。NrD
存在します。歴史が好きな人のために、1975 年 9 月に Philippe Roussel によって書かれた最初の Prolog マニュアルからの「用語」の説明をここに示します。これはProlog Héritageにあります。
Prologの単一のデータ型は用語です
このステートメントは正しいと同時に、やや役に立たないものでもあります。Prolog では型はあまり役割を果たしていないと言えます。すべてが項であり、変数は型付けされておらず、必要に応じて他の項と統合されます。
一方、数値、アトム、複合項はデータ型ではありません。これらは異なる種類の項であり、わずかに異なります。複合用語は、リスト、文字列、および「その他の」種類のファンクターのような用語にさらに細分されます。
ISO 標準とその正誤表 2 には、Prolog のデータ型をテストするいくつかのテスト述語が含まれています。Richard O'Keefe は、これらのテスト述語 http://www.complang.tuwien.ac.at/ulrich/iso-prolog/okeefe.txt を次のように整理していました。
true
|
+---------+---------+
| |
nonvar var
|
+---------+--------------------------+
| |
compound atomic=constant
|
+----------------+---------+---------+
| | |
number string atom=symbol
|
+-------+-------+
| |
integer float
ISO Prolog の一部ではない有理数と複雑な文字列は省略しましたが、ISO Prolog の一部ではありませんが、文字列を保持しました。たとえば、本物の文字列、つまり、文字コード リストの二重引用符で囲まれた省略形ではなく、実際のデータ型です。 、現在 SWI-Prolog バージョン 7 に含まれています。一般に、ISO Prolog では、Prolog 実装に新しいデータ型を追加できます。
ツリーにはいくつかの優れたプロパティがあります。
1) 兄弟は排他的です:
s1、..、sn が兄弟の場合、指定された引数に対してテスト述語 si の最大 1 つが保持されます。したがって、たとえば、float(X) または integer(X) のいずれか、または 2 つのいずれも成り立たないことはわかっていますが、特定の X に対して両方が一緒に成り立つわけではありません。
2) 子は親に含まれます
。c が子で p が親の場合、c は p を意味します。たとえば、number(X) が成立する場合、atomic(X) も特定の X に成立することがわかっています。
ISOコア標準ですでに定義されているデータ型は、ツリーに簡単には収まりません。たとえば、長さ 1 のアトムは文字と呼ばれます。0..max_code の間の整数を文字コードと呼びます。0 から 255 までの整数はバイトと呼ばれます。文字コードまたはバイトの場合もあります。文字には -1 の resp も含まれる場合があります。end_of_file。これらのデータ型には独自のテスト述語がなく、テストは他の述語から派生する必要があります。
厳密に言えば、ISO コア標準では、リスト セルを単にアリティ 2 とファンクター '.' の複合体として定義し、空のリストをアトム '[]' として定義しています。SWI-Prolog バージョン 7 などの一部の Prolog システムは、このルールに違反し、リスト セルに別のファンクターを使用します。新しい ISO テスト述語 callable/1 は、アトムと化合物を結合します。
次に、指定された用語のルート要素のマニフェスト型だけを見ない、より全体的なテスト述語があります。たとえば、述語 Ground/1 は項全体を調べる必要があり、テスト述語 acyclic_term/1 も同様であり、どちらも ISO 標準の一部です。
http://ktiml.mff.cuni.cz/~bartak/prolog/data_struct.htmlを参照してください。
用語は、いくつかの異なる種類のデータを含むことができるコンテナです (オブジェクト指向言語の継承を考えてください)。