Список элементов списка, которые подчиняются определенной кодировке в Прологе - PullRequest
1 голос
/ 25 апреля 2020

У меня есть список списков переменных L1, единый список переменных L2 и список списков переменных L3, в которых элементы являются подсписками L1, которые совместно используют переменную с L2.

У меня есть предикат common_v (L1, L2, L3), который возвращает элементы L3, но только по одному за раз.

Это работает так:

?- L1= [[A,B,C],[D,C,A],[B,F,E],[G,H,I]],
   L2= [C,X,Z],
   common_v([[A,B,C],[D,C,A],[B,F,E],[G,H,I]],[C,X,Z],L3).

L1= [[A,B,C],[D,C,A],[B,F,E],[G,H,I]], L2= [C,X,Z], L3= [A,B,C];
L1= [[A,B,C],[D,C,A],[B,F,E],[G,H,I]], L2= [C,X,Z], L3= [D,C,A];
false.

Но это должно работать как это:

L1= [[A,B,C],[D,C,A],[B,F,E],[G,H,I]],
L2= [C,X,Z],
common_v([[A,B,C],[D,C,A],[B,F,E],[G,H,I]],[C,X,Z],L3).
L1= [[A,B,C],[D,C,A],[B,F,E],[G,H,I]], L2= [C,X,Z], L3= [[A,B,C],[D,C,A]].

Как я могу это реализовать? Предикат common_v определяется следующим образом:

common_v(L1,L2,L3):- member(L,L1),member(E,L2),member(F,L),E==F.

1 Ответ

1 голос
/ 25 апреля 2020

Кажется, ваш предикат точно соответствует спецификации "... но только по одному за раз". поскольку это, вероятно, означает «генеративные последовательные решения при возврате».

Кроме того, вы хотите собрать решения в сумке.

Однако ваше исправление должно исправить ваш предикат. Потому что L3 в этом не прав.

common_v(L1,L2,L):- member(L,L1),member(E,L2),member(F,L),E==F.

Тогда:

common_v(L1,L2,L):- member(L,L1),member(E,L2),member(F,L),E==F.

:- begin_tests(bagit).

test(one) :-
  L1 = [[A,B,C],[D,C,A],[B,F,E],[G,H,I]],
  L2 = [C,X,Z],
  bagof(Lx,common_v(L1,L2,Lx),S),
  S == [[A,B,C],[D,C,A]].

:- end_tests(bagit).

rt :- run_tests(bagit).

Запрос:

?- rt.
% PL-Unit: bagit . done
% test passed
true.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...