2010-08-20 29 views
1

我在Prolog中遇到問題。 以下是我使用的一些代碼。Prolog findall existential quantifier

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應該可以做到這一點,但它會返回完整的數據包,而不是過濾掉我不想要的數據包。

回答

1

我不假設你使用一些約束邏輯編程語言 或某些使得A\=B不只是\+ A=B

我猜X\=V總是失敗,所以它後面的目標沒有執行, 和否定\+總是如此。

X\=V總是失敗,因爲X=V總會成功,因爲在您的上下文中X是新鮮的 變量。

可能有些重新排序會有所幫助。

最好問候