Указывающие списки с общими свободными переменными в SWI Prolog - PullRequest
0 голосов
/ 01 мая 2020

Мне нужна помощь для предиката, который мне нужно реализовать в проекте. Выглядит это так:

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 = [].

Буду признателен за любую помощь, заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...