Мне нужна помощь для предиката, который мне нужно реализовать в проекте. Выглядит это так:
mypredicate( ListOfLists, List1, Result)
По сути, Результатом является список членов ListOfLists
, которые имеют хотя бы одну общую переменную с List1
.
. Имеется в том, что List1
и элементы ListOfLists
являются списками свободных переменных.
Пример того, что он должен делать:
List1 = [A,B,C],
ListOfLists = [[A,G,D],[E,J,X,T],[A,C,M],[F,K,L,J,R]],
mypredicate( ListOfLists, List1, Result).
% ==>
Result = [[A,G,D],[A,C,M]];
false.
Я застрял на этом так много времени, и я не могу понять, что это правильно. Это была моя самая близкая попытка (я думаю):
% Similar to the predefined member/2, but changed to work with free variables.
member_wout_unify(_, []) :- fail.
member_wout_unify( El, List) :- List = [P | R], (P == El ;
member_wout_unify( El, R)).
% common_elements(List1, List2) is true if there is at least
% one element which appears in both lists.
% Works with free variables.
common_elements([], _) :- fail.
common_elements([El | _ ], List2) :- member_wout_unify(El, List2).
common_elements([ _ | R ], List2) :- common_elements(R, List2).
mypredicate( ListOfLists, List1, Result) :-
bagof( Member_ListOfLists,
( member_wout_unify( Member_ListOfLists, ListOfLists),
common_elements( List1, Member_ListOfLists) ),
Result).
Этот предикат возвращает false.
, даже если это не предполагается.
Я пытался использовать findall/3
вместо bagof/3
, но всегда отвечает Result = []
.
Буду признателен за любую помощь, заранее спасибо.