Пролог найти все экзистенциальный квантификатор - PullRequest
1 голос
/ 20 августа 2010

У меня проблема с проблемой в Прологе.Вот некоторый код, который я использую.

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 Ответ

1 голос
/ 09 ноября 2010

Я не предполагаю, что вы используете какой-то язык программирования логики ограничений или так, чтобы A\=B делал больше, чем \+ A=B.

Я думаю, X\=V всегда терпит неудачу, так что цели, стоящие за ним, не выполняются, и отрицание \+ всегда верно.

X\=V всегда терпит неудачу, так как X=V всегда успешен, поскольку X является свежим переменная в вашем контексте.

Возможно, поможет какое-то изменение порядка.

С наилучшими пожеланиями

...