2

フォームにダブルのリストがありますA = [[1,2],[2,3],[3,4],[5,5]]

私がやろうとしているのは、数値がいずれかのdoubleの最初の数値である場合にtrueを返す関数を作成することです。したがってsomefunction(7,A)、falseをsomefunction(5,A)返し、trueを返します。

私はこれを試しましsomefunction(A,B) :- A == (B,_)たが、これは何の役にも立ちません。

4

3 に答える 3

2

member([N,_],As).

しかし、ここには2つの意見があります。

まず、本当に次のようなリストが必要[[1,2],[3,4]]ですか?常に正確に2つの要素がある場合は、ペアの使用を検討してください。つまり、ファンクターを使用し(-)/2ます。よく書かれていKey-Valueます。したがって、次のように記述し[1-2,3-4]ます。ペアのリストが一般的に使用されますが、keysort/2によってのみソートされるものがありKeyます。

次に、「名前検索」のよくあるイディオムは次のとおりです。

..., P = (Name-Value), member(P, Dict), ...

ここで注目に値するのは、ペアのリストやその他の要素に「特別な」メンバー述語が必要ないことです。「名前で」または「値で」またはその両方またはなしで検索する可能性があります...

于 2012-04-05T14:36:55.553 に答える
2

自分で再帰を実行する代わりに、「高階」述語maplist/3を組み合わせて使用nth0/3​​して、リストの最初の要素のみを選択し、結果に対して呼び出しを発行してmember/2、目的を達成することもできます。

somefunction(Element, List) :-
    maplist(nth0(0), List, Firsts),
    member(Element, Firsts).
于 2012-04-04T14:37:18.507 に答える
1

次のように再帰的に実行できます。

値がリストの先頭にあるかどうかを確認します。

somefunction(A,[[A,_]|_]).

次に、値がリストの残りの部分にあるかどうかを再帰的に確認します。

somefunction(A,[BH|BT]) :- somefunction(A,BT).
于 2012-04-04T14:07:26.240 に答える