2

答えは3だと思いますが、よくわかりません。誰か助けてもらえますか?

次の 2 つのステートメントが Prolog に入力されたとします。

mystery(X,[X|L],L).
mystery(X,[Y|L],[Y|M])  :-  mystery(X,L,M). 

次に、次のゴールを与えた場合、Prolog は何を返しますか?

?- mystery(c,[a,b,c,d],Z).
4

1 に答える 1

6

したがって、mystery/3次のように定義されます。

mystery(X, [X|L], L).
mystery(X, [Y|L], [Y|M]) :- mystery(X, L, M).

を見るには(少なくとも)3つの方法がありますmystery

  1. 要素 (最初のパラメーター) を受け取り、指定されたリスト (2 番目のパラメーター) でその存在を探し、同じリストから (3 番目のパラメーター) の1回の出現をX除いて返します。したがって:X

    ?- mystery(c, [a, b, c, d], Z).
    Z = [a, b, d] ;
    fail.
    
    ?- mystery(c, [a, b, c, d, c], Z).
    Z = [a, b, d, c] ;
    Z = [a, b, c, d] ;
    fail.
    
  2. 別の見方をするmysteryと、2 番目と 3 番目の引数を構成するリストが 1 つの要素に関してのみ異なるかどうか、つまり、2 番目のリストが 3 番目のリストと等しいかどうかをチェックすることです。したがって:

    ?- mystery(X, [a, b, c, d], [a, b]).
    fail.
    
    ?- mystery(X, [a, b, c, d], [a, b, c]).
    X = d ;
    fail.
    

    順序が重要であることに注意してください。

    ?- mystery(X, [a, b, c, d], [a, c, b]).
    fail.
    
  3. 最後にmystery、最初の引数が 3 番目の引数のリストに散在するすべての方法を生成することもできます。したがって:

    ?- mystery(d, Y, [a, b, c]).
    Y = [d, a, b, c] ;
    Y = [a, d, b, c] ;
    Y = [a, b, d, c] ;
    Y = [a, b, c, d] ;
    fail.
    
于 2009-11-12T09:19:15.257 に答える