2

X要素がリストに属しているかどうかをチェックするこの簡単なプログラムがあります。

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

私はそれを拡張された形式で書こうとしています (以前の方法では動作があまり明確ではないため)。ということで、以下のように書きました。

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

したがって、意味はより明確です。

基本ケースを表すファクトが 1 つあります (X要素がリストの先頭にある場合、その要素はリストに属します)。

規則では、次の 2 つのことを証明する必要があります。

1) Y = [_|T]. これは、無名変数が_何とでも統一されるためです。

X2)末尾のリストの要素を再帰的に検索します。

わかりました、私の推論は正しいと思いますが、このプログラムの 2 番目のバージョンは機能しません! Y = [_|T]おそらく問題はセクションにあると思います

4

2 に答える 2

1

どちらの形式でも、プログラムは問題ありません。ここにそれを(再)書くためのさらに別の方法があります

member2(X, [Y|Ys]) :-
    X = Y ; member2(X, Ys).
于 2012-12-20T08:18:50.673 に答える
0

メンバーをチェックする教科書の例は次のとおりだと思います。

member_check(X, [X|Tail]). % or [X|_] to avoid the warning
member_check(X, [Y|Tail]) :- X \= Y, member_check(X, Tail).

2回目の試みよりもおそらくどちらが明確でしょうか?

于 2012-12-20T07:27:16.937 に答える