Prolog の実験を始めたばかりで、リストに一意の要素のみが含まれているかどうかを確認するルールを作成しようとしていました。2 番目のバリエーションでは (肯定的なテストを否定することによって) 動作するようになりましたが、最初のバリエーションが動作しない理由を完全に理解できませんでした。
このファイルを考えると:
uniqueElements([X|Y]) :-
notmember(X, Y),
uniqueElements(Y).
notmember(X, Y) :-
\+ member(X, Y).
hasRepeatedElements([X|Y]) :-
(
member(X, Y) ->
true
; hasRepeatedElements(Y)
).
uniqueElements_2(X) :-
\+ hasRepeatedElements(X).
GNU Prolog インタープリターは、次の応答を返します。
| ?- uniqueElements([1,2,3]).
no
| ?- uniqueElements([1,2,3,2,3]).
no
| ?- uniqueElements_2([1,2,3]).
yes
| ?- uniqueElements_2([1,2,3,2,3]).
no
最初の回答が「いいえ」なのはなぜですか? (member が false を返し、true に否定されるため、uniqueElements の反復ごとに notmemeber が true を返すことを期待していました)。「\+」が「!」のように動作することを期待していると思います。do は C の if 句、または Python の 'not' キーワードです。これは誤解ですか?