【发布时间】:2011-04-01 14:32:06
【问题描述】:
我在 Prolog 中遇到问题。 这是我使用的一些代码。
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(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 应该可以解决问题,但它会返回完整的数据包,而不是过滤我不想要的数据包。
【问题讨论】:
标签: prolog prolog-findall