0

私のルールは、最初のパラメーターをリストの3番目の要素と統合することになっています。リストは、ルールの2番目のパラメーターです。3番目の要素がない場合、これは失敗するはずです。

多くの例と混乱の後、私はこのルールを作成しました。

third(X,[_|T]):-
    [_,Y] = T,!,fail,
    (Y,X).

したがって、私の理解は間違っていると思いますが、Tは最初のリストの末尾部分であるため、YはリストTの3番目の要素に設定されます。次に、YをXと統合します。

これらの要素を「統合」するコードについてはまだ混乱しています

4

1 に答える 1

2

failアフターカットは!、カットで選択をコミットしてから失敗するため、手順が成功しないことを保証します。

リストに正確に3つの要素がある場合にのみ、リストの3番目の要素にアクセスできます。プロシージャの先頭の最初の要素をスキップし、末尾から2番目の要素を取得します。

third(X,[_|T]):-
    [_,X] = T.

リストに正確に3つの要素が含まれていない場合、この手順は失敗することに注意してください。

ただし、プロシージャの先頭にある3番目の要素に直接アクセスする方が簡単です。例:

third(X, [_, _, X|_]).

これにより、Xが2番目の引数のリストの3番目の要素と統合されます。この|_部分により、リストにさらに多くの要素を含めることができます(テールを匿名変数と統合します)。

于 2012-10-23T17:27:29.330 に答える