Prolog找到存在量词

时间:2010-08-20 10:52:10

标签: prolog prolog-findall

我在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的使用应该可以解决问题,但它会返回完整的数据包,而不是过滤掉我不想要的数据包。

1 个答案:

答案 0 :(得分:1)

我不是假设您使用某种约束逻辑编程语言 或某些事情,以便A\=B不仅仅\+ A=B

我想X\=V总是失败,所以它背后的目标没有被执行, 否定\+总是正确的。

X\=V始终失败,因为X=V总是成功,因为X是新鲜的 变量在您的上下文中。

可能一些重新排序会有所帮助。

最好的问候