1

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' キーワードです。これは誤解ですか?

4

1 に答える 1

2

ではuniqueElements、再帰の基本ケースを提供していません。

uniqueElements([]).

その句がないと、特定の呼び出しチェーンが空のリストのケースに到達したときに、適用可能な句が見つかりません。これはfailProlog を意味します。「証明できない」という意味。したがって、あなたの呼び出しuniqueElements([1,2,3])は と同等のものを生成しましたtrue && true && true && false

これで動作するはずです。

hasRepeatedElements基本ケースに対して定義された句もありませんが、空のリストに繰り返し要素があったかどうかを見つけるのに失敗したこと[]は、その意味論と一致しています-空のリストに繰り返し要素がないことを最初に発見する必要がありました場所。

Prolog では、「not」は「それを証明できない...」という意味です。

于 2012-08-08T07:23:37.563 に答える