まず、インデントを使用してコードを書き直しましょう。
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コードとしては意味がありません。さらに、私は:=
以前にオペレーターを見たことがありません、私は何が何であるかわかりません。
このスタイルの擬似コード(私は信じています)では、作者はそれが。の値が割り当てられている統合の割り当てタイプで:=
あることを示しようとしていると思います。同様に、の脱構築を示しており、の構築を示しています。と空のリストの間の同等性テストも示しています。これらの操作はすべて、統合の一種です。コンパイラーは、述部の各モードにどのタイプの統合を使用する必要があるかを認識しています。このコードの場合、意味のあるモードは次のとおりです。X
Y
=>
X
<=
Z
==
X
append(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=
であり、述語とモード宣言が追加されていることに注意してください。