X = a:b または X = ab のような用語を時々見かけます。
X = Y:Z のような要求を行うことができ、コンパイラは Y を a に、Z を b に統合します。
今私の答え: 2 つの Prolog アトムを結合するために使用できる文字 (または文字のシーケンス) は?!
この問題に関する詳細情報へのリンクを教えてください。
ドイツからのあなたの助けと親切な敬意に感謝します
X = a:b または X = ab のような用語を時々見かけます。
X = Y:Z のような要求を行うことができ、コンパイラは Y を a に、Z を b に統合します。
今私の答え: 2 つの Prolog アトムを結合するために使用できる文字 (または文字のシーケンス) は?!
この問題に関する詳細情報へのリンクを教えてください。
ドイツからのあなたの助けと親切な敬意に感謝します
2 つの Prolog アトムを結合するために使用できる文字 (または文字のシーケンス) は?!
ここで求めているのは、Prolog の演算子構文定義全体です。これに対する完全な回答を得るには、タグ iso-prologを参照して、Prolog 規格 ISO/IEC 13211-1 を取得する方法の詳細を確認してください。
しかし、最初の短い答えとして:
プロローグの構文は、
機能表記、いいね+(a,b)
、プラス
動的に再定義可能な演算子構文に加えて
いくつかの追加。
演算子として使用できる「文字」を知りたいようです。
簡単な答えOp
は、に成功するすべてのアトムを使用できるということですcurrent_op(Pri,Fix,Op)
。したがって、どの演算子が存在するかを動的に尋ねることができます。
?- current_op(プリ、フィックス、オペレーション)。 プリ = 1、 修正 = fx、 Op = ($) ; プリ = 1150、 修正 = fx、 Op = (module_transparent) ; プリ = 700、 修正 = xfx、 Op = (=@=) ; プリ = 700、 修正 = xfx、 オペ = (@>=) ; プリ = 700、 修正 = xfx、 操作 = (>=) ...
これらのすべての演算子は、指定された優先度を持つ前置、中置、または後置として、指定された方法で使用できます。これらの演算子には SWI 固有のものもあれば、標準で定義されているものもあります。上記では、 と のみ@>=
が>=
標準演算子です。
ほとんどの演算子は、グラフィック文字#$&*+-./:<=>?@^~
のみ、または小文字で始まる文字、数字、およびアンダースコアで構成されます。2 人のソロ キャラクター!;
が,|
いて、さらに特別なキャラクターがいます。上記とは異なる演算子名は引用符で囲む必要があります - それらに遭遇することはめったにありません。
演算子がどのようにネストされているかを確認するには、 を使用しますwrite_canonical(Term)
。
長い答えは、そのような演算子を自分で定義することもできるということです。ただし、演算子の構文を変更すると、理解するのが非常に困難な多くの影響が生じることが多いことに注意してください。多くのシステムでは、めったに使用されない構成が異なるため、なおさらです。たとえば、あなたが言及したシステム、SWIはいくつかの点で異なります。
Prolog 言語について詳しく学ぶまでは、新しい演算子を定義しないことをお勧めします。
中身を見てみましょうX = Y:Z
?- display( X = Y:Z ).
=(_G3,:(_G1,_G2))
true.
次に、ファンクターが演算子であるネストされた構造があります。
演算子はアトムであり、アトム構文の規則では、考慮すべき 3 つの種類があるとされています。
編集
ファンクター(関数コンストラクターの省略形だと思いますが、関数は Prolog のコンテキストでは誤解を招く可能性があります) は、いくつかの引数を「結び付ける」シンボルです。引数の数はarityと呼ばれます。Prolog では、用語はアトミック リテラル (数値やアトムなど)、または再帰構造であり、それぞれが用語自体 (少なくとも 1 つ) であるファンクターといくつかの引数で構成されます。
適切な宣言、つまり op/3 があれば、単項項と 2 項項は、あなたが示すような式として表すことができます。
: 特殊文字を使用した演算子の例は、':-' です。
member(X,[X|_]).
member(X,[_|T]) :- member(X, T).
OPは言った(そして私は引用する):
時々、次のような用語を目にします:
X = a:b
またはX = a-b
私は次のようなリクエストを行うことができ
X = Y:Z
、コンパイラは期待どおり Y を a に、Z を b に統合します。今私の答え: 2 つの Prolog アトムを結合するために使用できる文字 (または文字のシーケンス) は?!
短い答えは、ほとんど何でもあなたが望むものです (それがアトムである場合)です。
より長い答えはこれです:
表示されているのは infix( x infix_op b
)、prefix( pfx_op b
)、suffix( b sfx_op
)演算子です。アリティが 2 の構造体はすべて、中置演算子にすることができます。アリティが 1 の構造体はすべて、前置演算子または後置演算子にすることができます。その結果、任意のアトムが演算子になる可能性があります。
Prolog は、優先順位駆動型の再帰降下パーサー (当然のことながら Prolog で記述) を介して解析されます。operator/3
演算子は、述語での優先順位と結合性とともに定義および列挙されます。結合性は、解析ツリーの構築方法と関係があります。のような式は、 (右結合) または(左結合)a - b - c
として解析できます。( a - ( b - c ) )
( ( a - b ) - c )
優先順位は、オペレーターがどれだけ緊密にバインドされるかに関係しています。a + b * c
結合のような式は、結合( a + ( b * c )
性のためではなく、'*'/2 (乗算) が '+'/2 (加算) よりも優先されるためです。
演算子を自由に追加、削除、変更できます。これは、プロローグの構文を壊して自分自身を撃つ余地がたくさんあるということではありません。
ただし、任意の演算子式は通常の表記法でも記述できることに注意してください。
a + b * c
とまったく同じです
'+'( a , '*'(b,c) )