У меня проблема с проблемой в Прологе.Вот некоторый код, который я использую.
has_same_elements([X|_],Y) :-
permutation(X,Xnew),
member(Xnew,Y), !.
has_same_elements([_|Tail],Y) :-
has_same_elements(Tail,Y).
Это получает два списка списков в качестве входных данных и решает, содержат ли они списки с одинаковыми элементами.Например, [[1,2],[3,4]]
имеет те же элементы, что и [[2,1],[4,3]]
.Это отлично работает.
Теперь мой findall:
findall(V, (verdeling2(S,Perm,V), \+X^(X\=V,verdeling2(S,Perm,X),has_same_elements(X,V))) ,Verd).
Все, что важно знать, это то, что verdeling2 / 3 - это предложение, которое возвращает разные списки списков (как упомянуто выше), и этопостроенный из перестановки [1,2,3,4, ...] Некоторые различные выходные данные verdeling2 / 3 (в соответствии с перестановкой в качестве входных данных):
V = [[[1, 2], [3, 4]]] ;
V = [[[2, 1], [3, 4]]] ;
V = [[[2, 3], [1, 4]]] ;
V = [[[2, 3], [4, 1]]] ;
V = [[[1, 3], [2, 4]]] ;
V = [[[3, 1], [2, 4]]] ;
V = [[[3, 2], [1, 4]]] ;
V = [[[3, 2], [4, 1]]] ;
V = [[[1, 3], [4, 2]]] ;
V = [[[3, 1], [4, 2]]] ;
V = [[[3, 4], [1, 2]]] ;
V = [[[3, 4], [2, 1]]] ;
V = [[[1, 2], [4, 3]]] ;
V = [[[2, 1], [4, 3]]] ;
V = [[[2, 4], [1, 3]]] ;
V = [[[2, 4], [3, 1]]] ;
V = [[[1, 4], [2, 3]]] ;
V = [[[4, 1], [2, 3]]] ;
V = [[[4, 2], [1, 3]]] ;
V = [[[4, 2], [3, 1]]] ;
V = [[[1, 4], [3, 2]]] ;
V = [[[4, 1], [3, 2]]] ;
V = [[[4, 3], [1, 2]]] ;
V = [[[4, 3], [2, 1]]] ;
Теперь я бы хотел что-тоэто дает мне обзор всех списков, которые не содержат одинаковые элементы (используя has_same_elements).Я думал, что мое использование findall должно сработать, но оно возвращает полный пакет вместо того, чтобы фильтровать те, которые мне не нужны.