Я озадачен следующими результатами. Я использую SWI-Пролог.
?- bagof(Q, (Q=A, (A=[a,_] ; A=[_,b])), X).
A = [_G16898, b],
X = [[_G16898, b]] ;
A = [a, _G16892],
X = [[a, _G16892]].
Обратите внимание, что [a,_]
и [_,b]
не объединены для получения ответа A = [a,b], X=[[a,b],[a,b]]
.
Теперь давайте попробуем то же самое с арифметическими ограничениями:
?- bagof(Q, (Q=A, (A in 1..5 ; A in 3..8)), X).
X = [A, A],
A in 3..5.
Странно, но на этот раз арифметические ограничения взяты вместе, а ответов A in 1..5, X=[A]
и A in 3..8, X=[A]
нет.
Теперь давайте попробуем это еще одним способом:
?- bagof(Q, (Q=A, ((1 #=< A, A #=< 5) ; (3 #=< A, A #=< 8))), X).
X = [A],
A in 3..5 ;
X = [A],
A in 3..5.
Арифметические ограничения объединены, как и раньше, но у нас есть два ответа вместо одного.
Как все это можно объяснить?
РЕДАКТИРОВАТЬ: еще несколько странных результатов. Сравните это:
?- A=[_,_], bagof(Q, K1^K2^(Q=A, (A=[a,K1] ; A=[K2,b])), X).
A = [_G16886, b],
X = [[_G16886, b]] ;
A = [a, _G16889],
X = [[a, _G16889]].
с этим:
?- A=[a,b], bagof(Q, K1^K2^(Q=A, (A=[a,K1] ; A=[K2,b])), X).
A = [a, b],
X = [[a, b], [a, b]].
(A=[a,_] , A=[_,b])
. С помощью точки с запятой вы говорите, что A - это список из двух элементов, который либо начинается с a, либо заканчивается на b, а не на то и другое. Я не знаю, почему/как clpfd может сочетать эти ограничения. - person Daniel Lyons   schedule 01.03.2019A=[_,_]
сA=[a,b]
. Чего ожидать в таких случаях? В вашем последнем вы ограничилиA=[a,b]
, поэтому результаты обязательно будутA=[a,b]
иA = [[a,b], [a,b]]
(дляbagof
было только две разные альтернативы). Примеры CLP(FD) интересны и единственные, которые меня удивляют на первый взгляд, и мне нужно подумать над этим. По крайней мере, поведениеin/2
и#=</2
с#>=/2
согласуется друг с другом. - person lurker   schedule 01.03.2019;/2
! Итак, если я сделаю запрос,bagof(A, (Q=A, ((1 #=< A, A #=< 5) ; (3 #=< A, A #=< 8))), X).
я получуX = [_#2098023(1..5),_#2098023(1..5)]
. Если я запрошу,bagof(A, (Q=A, ((1 #=< A, A #=< 5) ; (3 #=< A, A #=< 8))), X).
я получуX = [_#2098023(3..8),_#2098023(3..8)]
! Что-то мне подсказывает, что CLP(FD) иbagof/3
здесь плохо сочетаются. - person lurker   schedule 01.03.2019?- bagof(Q, (Q=A, (A in 1..5 ; A in 3..8)), X).
, и?- bagof(Q, (Q=A, ((1 #=< A, A #=< 5) ; (3 #=< A, A #=< 8))), X).
дают ответX = [A,A] ? ; no
. - person repeat   schedule 01.03.2019bagof/3
. - person lurker   schedule 01.03.2019bagof/3
в SWI-прологе игнорирует изменения атрибутов переменных. С?- bagof(Q, (Q=1 ; Q=2, dif(A,a)), X).
результат будетX=[1,2],dif(A,a).
Также?- bagof(Q, (Q=1 ; Q=2, A in 1..2), X).
даетX=[1,2],A in 1..2
, однако?- bagof(Q, (Q=1 ; Q=2, A in 1..1), X).
дает два ответаX=[1]
иX=[2]
. - person A. Zinoviev   schedule 01.03.2019bagof
с использованиемdif
имеет для меня смысл. А что тебе непонятно? Как уже упоминалось @false, смешивание ограничений CLP(FD), очевидно, не очень хорошая идея. Мне кажется, что из всех ваших примеров только случаи CLP(FD) дают довольно... гм... интересные результаты. - person lurker   schedule 02.03.2019bagof
с использованиемdif
показывает, что смешивание bagof с любыми переменными с атрибутами (и, в частности, с любыми ограничениями, а не только с CLP (FD)) не работает должным образом. Например,?- bagof(Q, (Q=1,dif(A,1) ; Q=2,dif(A,0)),X).
сочетает в себе два ограничения (так же, как и с clpfd), а этого не должно быть. - person A. Zinoviev   schedule 02.03.2019What is the equivalent of bagof for constraints?
Хотя это слишком много для SO-вопроса, лучше было быWhen does Prolog and Constraints play well together and when do the not?
- person Guy Coder   schedule 02.03.2019X
правильный. В таком запросе я бы скорее написалbagof(Q, A^(Q=1,dif(A,1) ; Q=2,dif(A,0)),X).
, что просто даетX = [1,2]
. Было бы интересно найти пример, в котором ограничение «побочный эффект» вызывало неправильный список результатов дляbagof/3
. Я попробовалbagof(Q, (member(Q, [1,2,3,4]), dif(Q,1) ; member(Q, [1,2,3,4]), dif(Q,4)), X).
, и он дал мнеX = [2, 3, 4, 1, 2, 3]
, что говорит мне о том, чтоbagof/3
на самом деле не сочетает ограниченияdif
. - person lurker   schedule 02.03.2019