32

面接質問!

これは、通常member、Prologで関係を定義する方法です。

member(X, [X|_]).        % member(X, [Head|Tail]) is true if X = Head 
                         % that is, if X is the head of the list
member(X, [_|Tail]) :-   % or if X is a member of Tail,
  member(X, Tail).       % ie. if member(X, Tail) is true.

1つのルールのみを使用して定義します。

4

4 に答える 4

40
  1. 解決:

    member(X, [Y|T]) :- X = Y; member(X, T).
    
  2. デモンストレーション:

    ?- member(a, []).
    fail.
    ?- member(a, [a]).
    true ;
    fail.
    ?- member(a, [b]).
    fail.
    ?- member(a, [1, 2, 3, a, 5, 6, a]).
    true ;
    true ;
    fail.
    
  3. 使い方:

    • X2番目の引数である最初の引数の出現を探しています[Y|T]
    • 2番目の引数はリストであると見なされます。Yその頭にT一致し、尾に一致します。
    • その結果、空のリストの述語は失敗します(そうあるべきです)。
    • X = Y(つまりX、と統合できるY)場合は、Xリストにあります。それ以外の場合( )は、テールにある;かどうかをテストします。X
  4. 備考:

    • (統一)を使用すると、 (同等性のテスト)を使用するよりも柔軟なコードが得られることを指摘してくれた謙虚なコーヒーに感謝します。===
    • このコードは、特定のリストの要素を列挙するためにも使用できます。

      ?- member(X, [a, b]).
      X = a ;
      X = b ;
      fail.
      
    • また、特定の要素を含むすべてのリストを「列挙」するために使用できます。

      ?- member(a, X).
      X = [a|_G246] ;
      X = [_G245, a|_G249] ;
      X = [_G245, _G248, a|_G252] ;
      ...
      
    • 上記のコードでを置き換える===、柔軟性が大幅に低下します。すぐに失敗しmember(X, [a])、スタックオーバーフローが発生しますmember(a, X)(SWI-Prologバージョン5.6.57でテスト済み)。

于 2009-11-16T19:24:48.873 に答える
23

他に使用できる述語を指定しなかったので、少しごまかしてみます。:P

member(X, L) :- append(_, [X|_], L).
于 2009-11-17T00:11:51.447 に答える
7
newmember(X, Xs) :-
   phrase(( ..., [X] ),Xs, _).

... --> [] | [_], ... .

実際、次の定義はそれXsがリストであることも保証します。

member_oflist(X, Xs) :-
   phrase(( ..., [X], ... ), Xs).

謝辞

上記の定義の最初の出現は...pにあります。205、注1

David B. Searls、明確な句文法を使用したDNAの言語学の調査。NACLP 1989、第1巻。

于 2012-07-31T12:17:09.920 に答える
-3

これを試すこともできます:

member(X,L) :- append(_,[X|_],L).
于 2020-03-24T20:01:25.117 に答える