1

最近、Mercury で次のコード例を見つけました。

append(X,Y,Z) :-
  X == [],
  Z := Y.
append(X,Y,Z) :-
  X => [H | T],
  append(T,Y,NT),
  Z <= [H | NT].

Prolog プログラマとして、通常の統合= と、ここで使用されている:=orの違いは何だろう=>か?

Mercury リファレンスでは、これらの演算子の優先度は異なりますが、その違いについては説明されていません。

4

3 に答える 3

4

まず、インデントを使用してコードを書き直しましょう。

append(X, Y, Z) :-
    X == [],
    Z := Y.
append(X, Y, Z) :-
    X => [H | T],
    append(T, Y, NT),
    Z <= [H | NT].

すべてのコードを4つのスペースでインデントする必要があるようですが、コメントでは機能しないようです。上記のコメントは無視する必要があります(削除できません)。

上記のコードは実際のMercuryコードではなく、擬似コードです。<=and=>演算子は型クラス(IIRC)に使用され、統合ではないため、実際のMercuryコードとしては意味がありません。さらに、私は:=以前にオペレーターを見たことがありません、私は何が何であるかわかりません。

このスタイルの擬似コード(私は信じています)では、作者はそれが。の値が割り当てられている統合の割り当てタイプで:=あることを示しようとしていると思います。同様に、の脱構築を示しており、の構築示しています。と空のリストの間の同等性テストも示しています。これらの操作はすべて、統合の一種です。コンパイラーは、述部の各モードにどのタイプの統合を使用する必要があるかを認識しています。このコードの場合、意味のあるモードは次のとおりです。XY=>X<=Z==Xappend(in, in, out)

Mercuryは、この点でPrologとは異なり、使用する統合のタイプを認識しているため、より効率的なコードを生成し、プログラムがモード正しいことを保証できます。

もう1つ、この擬似コードの実際のMercuryコードは次のようになります。

:- pred append(list(T)::in, list(T)::in, list(T)::out) is det.

append(X, Y, Z) :-
    X = [],
    Z = Y.
append(X, Y, Z) :-
    X = [H | T],
    append(T, Y, NT),
    Z = [H | NT].

すべての統合はa=であり、述語とモード宣言が追加されていることに注意してください。

于 2011-08-04T03:05:58.043 に答える
3

具体的な Mercury 構文では、演算子:=はフィールドの更新に使用されます。

于 2011-08-13T07:13:09.720 に答える