Prologで「/」が何を意味するのかわからないことがあります
-
12-12-2019 - |
質問
私はコードでこのように使用されるスラッシュを参照してくださ:
solution([X/Y|Others]) :-
noattack(X/Y, Others).
しかし、時には私は"/1""/2"などを見ることがあります。Prologで。
これらの文(文字)はどういう意味ですか?
解決
両方の例では、 Infix演算子として使用されていますが、異なる、無関係の、意味を持ちます。
最初のルールでは、MOGがすでに指摘されているので、それはただの区切り文字です。 他の使用は、主に文書化の目的で、述語インジケータとしてです。私たちは同じフノッタと異なる述部を持つことができるので便利です。
式は、ファンクタがオペレータであるバイナリまたは単項の関係についての構文砂糖です。そのような式の意味はコンテキストによって定義されています。たとえば、IS / 2は式の算術評価の世話をします。ここでは、オペレータは予想される算術演算を実行します。
.
?- X is 10 / 3.
X = 3.3333333333333335.
組み込み current_op を検査することを許可します。 を試してみてください
.
?- current_op(Precedence,Associativity,/).
Precedence = 400,
Associativity = yfx .
述語の名前付き述語を持つことができます。愚かな例:
.
/(A, B) :- format(A, B).
またはより良い
.
A / B :- format(A, B).
は、短距離として使用できます。この使用法は推奨されており、プログラムの読み取りが難しくなりますが、そのような定義は有効なルールです。
.?- 'hello ~s' / [world].
hello world
他のヒント
X/Y
は、/(X, Y)
という用語、つまり「/」という用語の場合は、2つの引数が「/」である用語は次のとおりです。ISO Prologのデフォルト演算子a+b
という用語のIFFIX構文は、+(a, b)
という用語のINFIX構文です。
さて、あなたのコードでは、それは単に区切り文字として使用されるかもしれません。これは、統一を通じてパターンマッチングの目的のために役立ちます:
A-B = 1-2.
戻ります
A = 1,
B = 2.
区切り文字を使用したので -
コンテンツを一致させるのに役立ちます。ここで区切り文字は次のようになります /
.
あなたが見る他の場所 /1
と /2
述語を記述するときには多くのことがあります。
somepredicate/arity
述語が次のことを示します somepredicate
テイク arity
引数。例を示します。:
% member/2 : member(?Element, ?List)
member(Element, [Element|_Tail]).
member(Element, [_Head|Tail]) :-
member(Element, Tail).
ここで私たちの最初の行は、メンバーが2つの引数を取ることを示しています。この形式は、たとえばswi-prologで、次のような述語で対象とする述語を指定するために使用することもできます listing/1
:そこでは引数として渡すことができます maplist/2
または maplist/3
そして結果は異なります。