Использование member / 2 таким образом является своего рода Прологом анти-паттерна . Хотя
member / 2 является коротким, обычно member / 2 не может выполнить индексацию предложения.
Вы можете попробовать себя и сравнить эти два решения:
Член Foo:
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 Clause:
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
Что ж, ситуация может измениться, если какой-нибудь Пролог начнет автоматическую компиляцию member / 1 в предложения, когда второй аргумент является заземленным.