このように member/2 を使用することは、一種のProlog アンチ パターンです。member/2 は短いですが、通常、member/2 は節の索引付けを行うことができません。
あなたは自分自身を試して、これらの2つのソリューションを比較することができます:
フー メンバー:
foo_member0(X,Y):-
member(X,[1,-1]),
member(Y,[2,-2]).
foo_member(X,Y):-
foo_member0(X,Y);
foo_member0(Y,X).
フー句:
foo_clause0(1).
foo_clause0(-1).
foo_clause1(2).
foo_clause1(-2).
foo_clause2(X,Y) :- foo_clause0(X), foo_clause1(Y).
foo_clause(X,Y) :- foo_clause2(X,Y).
foo_clause(X,Y) :- foo_clause2(Y,X).
GNU Prolog で実行します。
| ?- between(1,1000000,_), foo_member(-2,-1), fail; true.
(516 ms) yes
| ?- between(1,1000000,_), foo_clause(-2,-1), fail; true.
(375 ms) yes
まあ、2 番目の引数がグラウンドのときに、一部の Prolog が自動的に member/1 を句にコンパイルし始めると、状況が変わる可能性があります。