2
  1. allDistinct/1パラメータが (シンボルの) リストであり、リスト内のすべてのシンボルが異なる場合に成功する述語を記述します。

    notin(A,[]).
    notin(A,[B|C]) :-
       A\=B,
       notin(A,C).
    
    allDistinct([]).
    allDistinct([_]).
    allDistinct([A|B]) :-
       notin(A,B), 
       allDistinct(B).
    
4

3 に答える 3

5

@whd による前のスケッチをフォローアップすると、次のように進めることができます。

に基づいて、次のようにiwhen/2簡潔に定義できます。distinct/1

:- use_module(library(lists), [same_length/2]).

distinct(Es) :-
   iwhen(ground(Es), (sort(Es,Fs),same_length(Es,Fs))).

SICStus Prolog 4.5.0 を使用したクエリの例:

| | ?- 個別([1,2,3])。
はい
| | ?- 個別([1,2,3.0])。
はい
| | ?- 個別([1,2,3.0,2])。
番号
| | ?- 個別([1,2,3.0,X])。
! エラー (instantiation_error,_283)
于 2016-03-09T12:24:00.513 に答える
0

これは、かなりの数の代替の合理的な解決策がある質問の 1 つです。共通ライブラリの述語を使用できると仮定すると、別の述語を次に示します。

all_distinct(List) :-
    \+ (
        select(Element, List, Tail),
        select(Element, Tail, _)
    ).

このソリューションのパフォーマンス上の利点は、重複する要素が見つかるとすぐにリストのスキャンを停止することです。sort/2しかし、標準の述語に基づくソリューションよりも高速ですか? sort/2ほとんどの Prolog システムで高度に最適化された述語であるため、不明です。さらに、すべてのリスト要素がバインドされていることが確実でない限り、安全にチェックする必要があることを忘れないでください (@repeat answer を参照)。

于 2016-03-09T14:54:35.817 に答える