检查Prolog中的数字方块

时间:2013-12-17 02:40:55

标签: prolog

square([A1, A2, A3|_], [B1, B2, B3|_], [C1, C2, C3|_]):-
    all_diff([A1, A2, A3, B1, B2, B3, C1, C2, C3]).
squares([[]|_]):- !.
squares([[A1,A2,A3|A4], [B1,B2,B3|B4], [C1,C2,C3|C4], [D1,D2,D3|D4], [E1,E2,E3|E4], [F1,F2,F3|F4], [G1,G2,G3|G4], [H1,H2,H3|H4], [I1,I2,I3|I4]]):-
    square([[A1,A2,A3], [B1,B2,B3], [C1,C2,C3]]),
    square([[D1,D2,D3], [E1,E2,E3], [F1,F2,F3]]),
    square([[G1,G2,G3], [H1,H2,H3], [I1,I2,I3]]),
    squares([A4, B4, C4, D4, E4, F4, G4, H4, I4]).

我得到了uncaught exception: error(existence_error(procedure,square/1),squares/1) - 我是Prolog的新手,所以我不太清楚这是什么意思(好吧,它说它出错了)。

顺便说一下,这是在数独游戏中。

正方形迭代穿过数独拼图的3x3正方形,从左上角,左上角和左下角开始 - 移动到顶部中间,中间中间,底部中间,依此类推。

方形检查焦点方块 - A1,A2,A3是第一行的前三个值 B1,B2,B3是第二行的前三个值,依此类推。它将它们组装成一个数组并检查以确保它们都是不同的。

1 个答案:

答案 0 :(得分:2)

就行了

square([[A1,A2,A3], [B1,B2,B3], [C1,C2,C3]]),
square([[D1,D2,D3], [E1,E2,E3], [F1,F2,F3]]),
square([[G1,G2,G3], [H1,H2,H3], [I1,I2,I3]]),

你会注意到类型是([[],[],[]]),但是,函数square是([],[],[])。

将行更改为

square([A1,A2,A3], [B1,B2,B3], [C1,C2,C3]),
square([D1,D2,D3], [E1,E2,E3], [F1,F2,F3]),
square([G1,G2,G3], [H1,H2,H3], [I1,I2,I3]),

解决了这个问题。