2

コードでは次のようにスラッシュが使用されています。

solution([X/Y|Others]) :-
   noattack(X/Y, Others).

しかし、時々 Prolog で "/1" "/2" などを見ることがあります。

これらのステートメント (文字) は何を意味しますか?

4

3 に答える 3

5

X/Yは項 の中置構文です/(X, Y)。つまり、ファンクタが「/」で、2 つの引数 X と Y を持つ項です。/ は ISO Prolog でデフォルトの演算子の 1 つとして定義されているため、この場合に中置構文を使用することができます。 . a+b用語の infix 構文 と の infix 構文+(a, b)と同様X is Y + Zですis(X, +(Y, Z))

于 2012-03-12T12:17:28.570 に答える
3

まあ、あなたのコードでは、区切りとして使用されるだけかもしれません。これは、統合によるパターン マッチングの目的に役立ちます。

A-B = 1-2.

戻ります

A = 1,
B = 2.

-コンテンツを一致させるために区切り文字を使用したためです。ここで区切り文字は になります/

他に多く見られる/1/2は、述語を記述する場合です。

somepredicate/arity述語somepredicatearity引数を取ることを示します。例:

% member/2 : member(?Element, ?List)
member(Element, [Element|_Tail]).
member(Element, [_Head|Tail]) :-
    member(Element, Tail).

ここで、最初の行は member が 2 つの引数を取ることを示しています。この形式は、たとえば swi-prolog で、次のような述語で対象とする述語を指定するために使用することもできます。引数orlisting/1として渡すことができ、結果は異なります。maplist/2maplist/3

于 2012-03-12T11:22:08.173 に答える
2

両方の例で、中置演算子として使用されていますが、異なる、無関係な意味を持っています。

Mogがすでに指摘したように、最初のルールでは、それは単なるセパレーターであると述べています。もう 1 つの用途は、主に文書化の目的で、述語インジケーターとして使用されます。同じファンクターで異なる述語を持つことができるので便利です。

式は、ファンクターが演算子であるバイナリまたは単項関係の単なる構文シュガーです。そのような式の意味はコンテキストによって定義されます: たとえば、 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
于 2012-03-12T14:21:50.243 に答える