По сути вы были на правильном пути. Но L ins 0..max(G)
не работает, потому что границы, которые вы передаете ins/2
, должны быть целыми числами или inf
или sup
.
страница руководства SWI-Prolog clpfd поддерживает max
в арифметических выражениях с конечным доменом, поэтому мы сначала укажите, что MaxG
является максимальным из A0
, B0
, C0
и D0
. Затем мы утверждаем, что MaxG
больше или равно каждому элементу в списке L
.
Собираем все вместе:
:- use_module(library(clpfd)).
gte_than(X,Y) :-
X #>= Y.
solve(G,L) :-
G = [A0,B0,C0,D0],
L = [A1,B1,C1,D1,A2,B2,C2,D2,A3,B3,C3,D3,A4,B4,C4,D4],
G ins 0..4,
L ins 0..sup,
MaxG #= max(max(A0,B0),max(C0,D0)),
maplist(gte_than(MaxG),L).
Вот несколько запросов:
?- solve([0,1,2,1], [0,1,2,1,1,2,1,2,1,0,1,2,1,1,1,2]).
true.
?- solve([0,1,2,1], [0,3,2,1,1,2,1,2,1,0,1,2,1,1,1,2]).
false.
?- solve([0,3,2,1], [0,3,2,1,1,2,1,2,1,0,1,2,1,1,1,2]).
true.
?- solve([0,3,2,1], [0,3,2,1,1,2,4,4,1,0,1,2,1,1,1,2]).
false.
?- solve([4,3,2,1], [0,3,2,1,1,2,4,4,1,0,1,2,1,1,1,2]).
true.
Примечание: SICStus Prolog имеет специализированное арифметическое ограничение с именем maximum/2
мы могли бы использовать здесь, но это ограничение (пока) недоступно в clpfd с SWI-Prolog.
person
repeat
schedule
14.04.2015
G
имеет длину четыре? - person repeat   schedule 14.04.2015