フォームにダブルのリストがありますA = [[1,2],[2,3],[3,4],[5,5]]
私がやろうとしているのは、数値がいずれかのdoubleの最初の数値である場合にtrueを返す関数を作成することです。したがってsomefunction(7,A)
、falseをsomefunction(5,A)
返し、trueを返します。
私はこれを試しましsomefunction(A,B) :- A == (B,_)
たが、これは何の役にも立ちません。
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), ...
ここで注目に値するのは、ペアのリストやその他の要素に「特別な」メンバー述語が必要ないことです。「名前で」または「値で」またはその両方またはなしで検索する可能性があります...
自分で再帰を実行する代わりに、「高階」述語maplist/3
を組み合わせて使用nth0/3
して、リストの最初の要素のみを選択し、結果に対して呼び出しを発行してmember/2
、目的を達成することもできます。
somefunction(Element, List) :-
maplist(nth0(0), List, Firsts),
member(Element, Firsts).
次のように再帰的に実行できます。
値がリストの先頭にあるかどうかを確認します。
somefunction(A,[[A,_]|_]).
次に、値がリストの残りの部分にあるかどうかを再帰的に確認します。
somefunction(A,[BH|BT]) :- somefunction(A,BT).