以下答案与有关的原始问题没有直接关系memberchk/2
;相反,它是定义meta-predicate 的先前答案的后续。 tmember/2
我们建议像这样概括成语tmember/2
:
t_non_empty_suffix(P_3, [X|Xs]) :-
if_(call(P_3,Xs,X), true, t_non_empty_suffix(P_3,Xs)).
在Prolog lambdast_non_empty_suffix/2
的基础上,我们可以这样定义:tmemberX/2
:- 使用模块(库(lambda))。
tmemberX(P_2, Xs) :-
t_non_empty_suffix(P_2+\_^call(P_2), Xs)。
以下old_memberX/2
并old_memberdX/2
使用tmemberX/2
代替tmember/2
:
old_memberX(X, Xs) :-
tmemberX(X+\E^T^( X = E, T = true ; T = false ), Xs).
old_memberdX(X, Xs) :-
tmemberX(=(X), Xs).
old_member/2
让我们比较old_memberX/2
...
?- old_member(X, [1,2,3,2,3,4,3,4,5]).
X = 1 ; X = 2 ; X = 3 ; X = 2 ; X = 3 ; X = 4 ; X = 3 ; X = 4 ; X = 5 ; false.
?- old_memberX(X, [1,2,3,2,3,4,3,4,5]).
X = 1 ; X = 2 ; X = 3 ; X = 2 ; X = 3 ; X = 4 ; X = 3 ; X = 4 ; X = 5 ; false.
……然后old_memberd/2
到old_memberdX/2
!
?- old_memberd(X, [1,2,3,2,3,4,3,4,5]).
X = 1 ; X = 2 ; X = 3 ; X = 4 ; X = 5 ; false.
?- old_memberdX(X, [1,2,3,2,3,4,3,4,5]).
X = 1 ; X = 2 ; X = 3 ; X = 4 ; X = 5 ; false.
好的!如何定义old_member
/old_memberd
直接基于t_non_empty_suffix/2
?
old_memberSFX(X, Xs) :-
t_non_empty_suffix(X+\_^E^T^( X = E, T = true ; T = false ), Xs).
old_memberdSFX(X, Xs) :-
t_non_empty_suffix(X+\_^E^( X = E ), Xs).
使用这些谓词运行上面的查询,我们得到:
?- old_memberSFX(X, [1,2,3,2,3,4,3,4,5]).
X = 1 ; X = 2 ; X = 3 ; X = 2 ; X = 3 ; X = 4 ; X = 3 ; X = 4 ; X = 5 ; false.
?- old_memberdSFX(X, [1,2,3,2,3,4,3,4,5]).
X = 1 ; X = 2 ; X = 3 ; X = 4 ; X = 5 ; false.
好吧!结果和以前一样。
让我们深入一点!作为t_non_empty_suffix/2
考虑的展示案例duplicate_in/2
。
使用t_non_empty_suffix/2
, Prolog lambdas , (=)/3
,memberd_t/3
我们定义:
','(P_1, Q_1, T) :-
if_(P_1, call(Q_1,T), T = false).
duplicate_in(X, Xs) :-
t_non_empty_suffix(X+\Es^E^( X = E, memberd_t(E, Es) ), Xs).
示例查询:
?- 重复输入(X,[1,2,3,2,3,4,3,4,5])。
X = 2 % [1, 2 ,3, 2 ,3,4,3,4,5](2 出现两次)
; X = 3 % [1,2, 3 ,2, 3 ,4, 3 ,4,5](3 出现三次)
; X = 4 % [1,2,3,2,3, 4 ,3, 4 ,5](4 出现两次)
; 错误的。