2011-08-03 7 views
1

に私は最近、マーキュリーでは、このコード例に出くわした:「:=」と「=>」マーキュリー

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

はPrologのプログラマである、私は疑問に思う:ノーマル統一= との違いは何:=または=>ここで使用していますか?

Mercury referenceでは、これらの演算子は異なる優先順位を取得しますが、その違いについては説明しません。

+0

レッツインデントを使用して再書き込みコード: 'アペンド(X、Y、Z) - X == []、 Z:= Y. アペンド(X、Y、Z) - X => [H | T]、 append(T、Y、NT)、 Z <= [H | NT]。 ' –

+0

私は レッツ・インデントを使用してコードを再書き込み、もう一度試してみます: アペンド(X、Y、Z): - X == []、 Z:= Y. append(X、Y、Z): - X => [H | T]、 append(T、Y、NT)、 Z <= [H | NT]。 すべてのコードを4つのスペースでインデントする必要があるようです。 –

答えて

4

まずレットのインデントを使用してコードを再書き込み:

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

あなたはコメントで動作するようには思えない4つのスペースですべてのコードをインデントするために持っているように見える、上記の私のコメントは、(無視されるべきです私はそれらを削除することはできません)。

上記のコードは、実際の水銀コードではなく、擬似コードです。 <==>の演算子は統一ではなくタイプメーター(IIRC)に使用されているため、実際の水銀コードと同じ意味を持ちません。さらに、私は前に:=オペレータを見たことがない、私は何かがわからない。著者は:=XYの値が割り当てられている統一の割り当てタイプであることを示そうとしていることを疑似コードのこのスタイルで

(私は信じています)。同様に=>分解を示し、Xであり、<=構造Zを示しています。また、==は、Xと空のリストの間の同等性テストを示します。これらの操作はすべて統一のタイプです。コンパイラーは、どのタイプの統一を述部の各モードに使用すべきかを知っています。このコードのために理にかなっているモードが水銀はこの点でPrologの異なるappend(in, in, out)

あり、それは使用する統合の種類を知っているため、より効率的なコードを生成し、プログラムはモード正しいであることを保証することができます。

もう一つ、この擬似コードのためのリアルマーキュリーコードは次のようになります。

:- 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]. 

注すべての統一が=で、述語とモード宣言が追加されていること。

+0

空の「無人」の変数で、変数にはすでに「存在する」変数が含まれていますか?または、他の用語がありますか? – CMCDragonkai

3

具体的な水銀構文では、オペレータ:=がフィールドの更新に使用されます。