您可以使用tfilter/3 和if_/3 的版本。
我还将表示形式从两个元素的列表更改为对。
fAtomPairs(sA,[basA-absAb,ab-bbsA,sA-abbsB,bsA-sAsB,sA-bb]).
tfilter(_CT_2, [], []).
tfilter(CT_2, [E-Thing|Es], Fs0) :-
if_(call(CT_2,E), Fs0 = [E-Thing|Fs], Fs0 = Fs ),
tfilter(CT_2, Es, Fs).
=(X,X,true).
=(X,Y,false) :- dif(X,Y).
if_(If_1, Then_0, Else_0) :-
call(If_1, T),
( T == true -> call(Then_0)
; T == false -> call(Else_0)
; nonvar(T) -> throw(error(type_error(boolean,T),_))
; /* var(T) */ throw(error(instantiation_error,_))
).
然后查询:
?-fAtomPairs(SA,Pairs),tfilter(=(SA),Pairs,Filtered).
Filtered = [sA-abbsB, sA-bb],
Pairs = [basA-absAb, ab-bbsA, sA-abbsB, bsA-sAsB, sA-bb],
SA = sA
false