Prolog限制 - 谜题

时间:2015-12-13 23:29:35

标签: prolog puzzle clpfd

我正在开发一款名为woodntDie的游戏。这个游戏包含9个部分,应该是这样的:

enter image description here

目的是安排所有这些碎片,使它看起来像一个骰子:

enter image description here

这是所有这9件作品的四个最终可能的解决方案。

我正在尝试实施一些限制,但这些还不够:

sum([V5, V6, V11, V12, V17, V18, V23, V24, V29, V30, V35, V36, V41, V42,  V47, V48, V53, V54], #=, 7),

相反面孔的总和应该始终为7.在这个限制中,我告诉它顶部和底部的总和面是7。

sum([V2, V19, V7, V16, V31, V26], #=, 7),

正面和背面的总和也是7。

sum([V1, V49, V13, V8, V37, V25], #=, 7),

左右脸的总和是7。

sum(Vars, #=, 21),

所有点的总和是21。

但是我得到了一个非常奇怪的输出,我得到重复的部分和一堆没有任何意义的解决方案,根本不会形成骰子。我想我需要更多的限制,我的问题是:

我如何制定限制,说某些部分不能重复(注意我可以有两件F件,但所有其他件都不能相似)

如何对此进行新的限制:

  

唯一剩下的另外两个点就是C,所以C必须与A结合才能制作4或5个脸

     

另一端靠近一端有一个点的另一个是E,所以E必须与B结合才能形成2或3个脸。

我的意思是,有没有办法说“VX,VY,VZ的总和是2或3”。

您是否有其他意见可以使解决方案更容易?

我在这里挣扎,我真的不知道该怎么做,我真的很感激能得到的所有帮助。

以下是整个代码:

:-use_module(library(clpfd)).
:-use_module(library(lists)).

dice(Vars):-
Vars=[V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18,
  V19, V20, V21, V22, V23, V24, V25, V26, V27, V28, V29, V30, V31, V32, V33, V34, V35, V36,
  V37, V38, V39, V40, V41, V42, V43, V44, V45, V46, V47, V48, V49, V50, V51, V52, V53, V54],
% pecas dos topos
domain([V5, V6, V11, V12, V17, V18, V23, V24, V29, V30, V35, V36, V41, V42,  V47, V48, V53, V54], 0, 1),
% pecas laterais
domain([V1, V2, V3, V4, V7, V8, V9, V10, V13, V14, V15, V16, V19, V20, V21, V22, V25, V26, V27, V28,
    V31, V32, V33, V34, V37, V38, V39, V40, V43, V44, V45, V46, V49, V50, V51, V52], 0,2),
table([
[V1, V2, V3, V4, V5, V6], %%peca1
[V7, V8, V9, V10, V11, V12], %%peca2
[V13, V14, V15, V16, V17, V18], %%peca3
[V19, V20, V21, V22, V23, V24], %%peca4
[V25, V26, V27, V28, V29, V30], %%peca5
[V31, V32, V33, V34, V35, V36], %%peca6
[V37, V38, V39, V40, V41, V42], %%peca7
[V43, V44, V45, V46, V47, V48], %%peca8
[V49, V50, V51, V52, V53, V54]], %%peca9

  [[2,2,0,0,1,0], %%peca1
   [2,1,0,0,1,1], %%peca2
   [2,0,0,0,1,1], %%peca3
   [2,0,0,0,0,0], %%peca4
   [1,0,0,0,1,0], %%peca5
   [1,0,0,0,0,0], %%peca6
   [1,0,0,0,0,0], %%peca7
   [0,0,0,0,1,0], %%peca8
   [0,0,0,0,0,0]]), %%peca9

% restricoes para as faces que envolve os topos de cada peça
% Na figura de descriçºao das peças os topos de cima estão guardados 
% na posicao 5 de cada lista. Os topos de baixo estoa guardados na
% posicao 6 de cada lista


   % Restrições quanto à soma de faces opostas(=7)

V2 + V19 + V7 #= TotalF1,

V8 + V37 + V25 #= TotalF2,

V5 + V23 + V11 + V53 + V47 + V41 + V29 + V35 + V17 #= TotalF3,

V18 + V36 + V30 + V54 + V48 + V42 + V6 + V24 + V12 #= TotalF4,

V1 + V49 + V13 #= TotalF5,

V16+ V31 + V26 #= TotalF6,

Totals = [TotalF1, TotalF2, TotalF3, TotalF4, TotalF5, TotalF6],

domain(Totals, 1,6),

all_different(Totals),

TotalF3 + TotalF4 #= 7,
TotalF1 + TotalF6 #= 7,
TotalF5 + TotalF2 #= 7,

A #= 100000*V1 + 10000*V2+ 1000*V5, 
element(P1,Vars,A),

B #= 100000*V7 + 10000*V8 + 10*V11 + V12,
element(P2,Vars,B),

C #= 100000*V13 + 10*V17 + V18,
element(P3,Vars,C),

D #= 100000*V19,
element(P4,Vars,D),

E #= 100000*V25 + 10*V29,
element(P5,Vars,E),

F #= 100000*V31,
element(P6,Vars,F),

G #= 100000*V37,
element(P7,Vars,G),

H #= 100*V47,
element(P8,Vars,H),

I #= 0,
element(P9,Vars,I),

F#=P7,
F#=G,

PiecesIndex = [P1, P2, P3, P4, P5, P6, P8, P9],

all_different(PiecesIndex),


%There are 21 spots on the pieces
%sum(Vars, #=, 21),




labeling([],Vars),
show(Vars).



show([V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18,
  V19, V20, V21, V22, V23, V24, V25, V26, V27, V28, V29, V30, V31, V32, V33, V34, V35, V36,
  V37, V38, V39, V40, V41, V42, V43, V44, V45, V46, V47, V48, V49, V50, V51, V52, V53, V54]) :-
write([V1, V2, V3, V4, V5, V6]), nl, 
write([V7, V8, V9, V10, V11, V12]), nl, 
write([V13, V14, V15, V16, V17, V18]), nl, 
write([V19, V20, V21, V22, V23, V24]), nl, 
write([V25, V26, V27, V28, V29, V30]), nl, 
write([V31, V32, V33, V34, V35, V36]), nl, 
write([V37, V38, V39, V40, V41, V42]), nl, 
write([V43, V44, V45, V46, V47, V48]), nl, 
write([V49, V50, V51, V52, V53, V54]), nl. 

这里是一张带有骰子表示的图片和所有那些V(每个V代表每张脸上的点)

enter image description here

ALL THE INFORMATION ABOUT THE GAME

非常感谢你提前

有任何疑问只是在skype上提出或加我:保留

祝你好运

1 个答案:

答案 0 :(得分:1)

  

我的意思是,有没有办法说“VX,VY,VZ的总和是2或3”。

如果这是至关重要的问题,请尝试以下方法:

(sum([VX,VY,VZ],#=,2);sum([VX,VY,VZ],#=,3))