2014-12-10 6 views
0

Я разрабатываю программу PROLOG с ограничениями для поиска решений для определенной игры.Manipulate labeling/2 output PROLOG

Вопрос №1: Для целей отладки я хочу подсчитать количество возможных решений игры. Есть ли способ сделать это с помощью предиката labeling/2?

Моя цель состоит в том, чтобы подсчитать количество возможных комбинаций между кубиками (Instant Insanity):

insanity2(Vars) :- 
     Vars = [F1,B1,R1,L1,U1,D1, 
       F2,B2,R2,L2,U2,D2, 
       F3,B3,R3,L3,U3,D3, 
       F4,B4,R4,L4,U4,D4], 

     /* Colors range (4 colors) */ 
     domain(Vars, 1,4), 

     /* Restrictions */ 
     %Color restrictions 
      % Cube #1 
     alocCubeColors(F1,B1,R1,L1,U1,D1), 
      % Cube #2 
     alocCubeColors(F2,B2,R2,L2,U2,D2), 
      % Cube #3 
     alocCubeColors(F3,B3,R3,L3,U3,D3), 
      % Cube #4 
     alocCubeColors(F4,B4,R4,L4,U4,D4), 

     %Logic restrictions 
     F1#\=F2, F1#\=F3, F1#\=F4, F2#\=F3, F2#\=F4, F3#\=F4, 
     B1#\=B2, B1#\=B3, B1#\=B4, B2#\=B3, B2#\=B4, B3#\=B4, 
     R1#\=R2, R1#\=R3, R1#\=R4, R2#\=R3, R2#\=R4, R3#\=R4, 
     L1#\=L2, L1#\=L3, L1#\=L4, L2#\=L3, L2#\=L4, L3#\=L4, 
     labeling([], Vars). 

Вопрос # 2: Можно ли управлять labeling/2 выход, чтобы rearranje его в надлежащим образом?

ответ

2

Для вашего вопроса # 1 вы можете использовать findall/3 предикат:

Ex:

| ?- X=[X1,X2], domain(X,0,2), findall(X, labeling([],X), Xl), length(Xl,L).    
X = [X1,X2], 
Xl = [[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[2,0],[2,1],[2,2]], 
L = 9, 
X1 in 0..2, 
X2 in 0..2 ? 
yes 
| ?- 
+0

Очень хороший (+1)! Если вы хотите только * номер * решений и хотите сохранить некоторую память, вы можете использовать, например: 'findall (' ** t ** ', labeling ([], Vs), Ts)' – mat