У меня есть очень странная проблема с ПРОЛОГОМ. Я использовал его прежде, но это было некоторое время, и я ржав. У меня есть список переменных, и я должен удостовериться, что ни один из них не то же.
Я попробовал:
use_module(library(bounds)). all_different(A, B, C, D, 6, 8).
Однако, когда я пробую это, я получаю ошибку при высказывании, что all_different/6 не определен.
Как я могу пойти о решении этой проблемы? Есть ли какая-либо библиотечная функция, которую я могу назвать непосредственно для этого?
Я ОЧЕНЬ застреваю и был бы очень признателен за любую справку.
Заранее спасибо.
solve([
[A, 6, 1],
[B, 5, C, 2, D, E, F, G, 6],
[6, H, I, 5, J, K, 2, L, 3],
[5, M, 6, N, O, 4, P, Q, 5],
[4, R, S, T, U, 6, V, 4, W],
[2, 0, X]
]) :-
all_different([A,6,1,2,D,E]),
all_different([B,5,C,6,H,I]),
all_different([C,2,D,I,5,J]),
all_different([D,E,F,J,K,2]),
all_different([F,G,6,2,L,3]),
all_different([H,I,5,M,6,N]),
all_different([5,J,K,N,O,4]),
all_different([K,2,L,4,P,Q]),
all_different([5,M,6,4,R,S]),
all_different([6,N,O,S,T,U]),
all_different([O,4,P,U,6,V]),
all_different([P,Q,5,V,4,W]),
all_different([T,U,6,2,1,X]),
A<7, A>0, B<7, B>0, C<7, C>0, D<7, D>0,
E<7, E>0, F<7, F>0, G<7, G>0, H<7, H>0,
I<7, I>0, J<7, J>0, K<7, K>0, L<7, L>0,
M<7, M>0, N<7, N>0, O<7, O>0, P<7, P>0,
Q<7, Q>0, R<7, R>0, S<7, S>0, T<7, T>0,
U<7, U>0, V<7, V>0, W<7, W>0, X<7, X>0.
all_different([A,B,C,D,6,8]).
Я считаю, что в all_different можно передать только список.
Я предполагаю, что> / 2 и 2 могут ничего не знать об атрибутах, которые all_different / 1 применяет к переменным в списке. В SWI-Prolog этот предикат предоставляется библиотекой (clpfd), и среди других предикатов в этой библиотеке есть # 2.
?- all_different([X,Y]), 0 #< X, X #< 3, 1 #< Y, Y #< 4, indomain(X), indomain(Y). X = 1, Y = 2 ; X = 1, Y = 3 ; X = 2, Y = 3.
П.С. indomain / 1 из той же библиотеки дает все возможные значения в рамках примененных ограничений.
Библиотека ограничений ic в Eclipse Prolog предоставляет предикат alldifferent / 1, который принимает список переменных в качестве аргумента, например alldifferent ( [X, Y])
и вычисляет то, что вы ищете.