第 7 节讨论了一般具体化,并为具体化列表成员给出了以下定义:
memberd_t(X, Es, T) :-
l_memberd_t(Es, X, T).
l_memberd_t([], _, false).
l_memberd_t([E|Es], X, T) :-
if_( X = E
, T = true
, l_memberd_t(Es, X, T) ).
它看起来确实有点太复杂了,我无法理解。毕竟原来的
memberd/2
并没有使用if_/3
。 只有后续的优化才做到这一点。原始版本可在第 4 节中找到:
memberd(X, [E|Es]) :-
( X = E
; dif(X, E),
memberd(X, Es)
).
然后使用
if_/3
逐步优化版本。
我的尝试就这么多。 有没有更好的方法来定义
memberd_t/3
,不直接依赖于 if_/3
,并且更好地揭示我们这里有两种选择的事实?承诺:将使用我 10k 以上的代表。
看起来很简单,除非“更好”的定义有微妙之处:
memberd2_t(X, Es, T) :-
memberd2_t_(T, X, Es).
memberd2_t_(false, X, Es) :-
maplist(dif(X), Es).
memberd2_t_(true, X, Es) :-
member(X, Es).
swi-prolog 的结果:
?- length(Es, 3), memberd2_t(X, Es, T).
Es = [_A, _B, _C],
T = false,
dif(X, _A),
dif(X, _C),
dif(X, _B) ;
Es = [X, _, _],
T = true ;
Es = [_, X, _],
T = true ;
Es = [_, _, X],
T = true.