以这种方式使用 member/2 是一种Prolog 反模式。虽然 member/2 很短,但通常 member/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
好吧,如果某些 Prolog 开始自动将 member/1 编译为子句,当第二个参数为基础时,情况可能会改变。