0

私はこのコードで場所を探し、その場所が存在するかどうかを教えてくれました。コードは次のとおりです。

    location(C, L).
    location(C, [C,L]|_]).
    location(C, [_|T]):- location(C,T,L).

C が場所 L にチェストとして表示された場合に true にしたいと考えています。次のコードを入力します。

    location(b,[(a, 1), (b,2)]).

胸がその場所にあることがわかったので、答えは「はい」として与えられるべきです。これは私に「はい」を与えますが、コードを次のように変更すると:

   location(e, [(a,1), (b,2)]).

いいえと言わなければならないときでも、私はまだイエスを受け取ります。何が足りないのか誰か知っていますか?

4

1 に答える 1

0

こんにちは、私はあなたの質問に答えて、あなたの誤りを指摘しようとします。あなたの最初の行は、任意の C が L の要素であると述べています。Prolog での統合は、上から下に向かって、左から右に行われます。そのため、Prolog は常にその行を統合するため、常に true を返します。2 行目と 3 行目に構文エラーが含まれています。とにかく、ここにあなたの質問に答えるコードがあります:

%ここでは、空の場所にチェストを入れることはできないと言います

 location(_,[]) :- fail.

% どうにかして C を含む head にたどり着いた場合、それは真です

location(C,[Head|_]) :- Head=(C,_).

% ここで、C が何か (頭から) と等しくない場合は、尾で C を探すようにします。

location(C,[Head|Tail]):- Head=(Something,_),not(Something = C),location(C,Tail).

次の方法でも解決できます

%基本的には、Chest=(C,_) となる L にメンバーの Chest があるかどうかを尋ねます。

location1(C,L) :- member(Chest,L),Chest=(C,_). 
于 2012-11-28T20:01:06.800 に答える