Вы можете начать с того, что у вас уже есть:
filteringPairsAtoms(sA, [[basA,absAb],[ab,bbsA],[sA,abbsB],[bsA,sAsB],[sA,bb]], X) :-
X = [[sA,abbsB],[sA,bb]].
Это хорошее начало для любого. Но мы знаем больше: это должно быть так, что
filteringPairsAtoms(sA, [[sA,abbsB],[bsA,sAsB],[sA,bb]], X) :-
X = [[sA,abbsB],[sA,bb]].
%% and
filteringPairsAtoms(sA, [[bsA,sAsB],[sA,bb]], X) :-
X = [[sA,bb]].
%% and
filteringPairsAtoms(sA, [[sA,bb]], X) :-
X = [[sA,bb]].
%% and
filteringPairsAtoms(sA, [], X) :-
X = [].
Сравнивая последовательные предложения, мы также замечаем, что это должно быть
filteringPairsAtoms(sA, [[sA,abbsB] | [[bsA,sAsB],[sA,bb]] ], X) :-
sA = sA,
X = [[sA,abbsB] | Y],
filteringPairsAtoms(sA, [[bsA,sAsB],[sA,bb]], Y).
(это только первые два предложения сверху, вместе взятые); и
filteringPairsAtoms(sA, [[bsA,sAsB] | [[sA,bb]] ], X) :-
dif( sA, bsA),
X = Y,
filteringPairsAtoms(sA, [[sA,bb]], Y).
Все, что вам осталось сделать, это обобщить , заменив конкретные термины логическими переменными. Как это:
filteringPairsAtoms(SA, [Head | Tail ], X) :-
Head = [BsA, _]
dif( SA, BsA),
X = Y,
filteringPairsAtoms(SA, Tail, Y).
и доведите это до конца.