使用Prolog在网格中的相同行和列中查找重复项

时间:2011-06-26 23:33:05

标签: prolog

我是Prolog的新手。我正在编写Prolog代码来解决一个难题,这需要我在二维数字网格中找到重复。


我的意见如下:

grid(1,1,1).
grid(2,1,2).
grid(2,1,3).
grid(5,1,4).
grid(3,2,1).
grid(4,2,2).
grid(5,2,3).
grid(9,2,4).
grid(6,3,1).
grid(7,3,2).
grid(2,3,3).
grid(8,3,4).
grid(4,4,1).
grid(5,4,2).
grid(1,4,3).
grid(3,4,4).


代表矩阵:

1 2 2 5
3 4 5 9
6 7 2 8
4 5 1 3

我正在尝试的代码类似于:

finddup(N,X,Y):-
        a is X, b is Y,
        print('Rule 1 \n'),
        ((grid(N,U,1), U \= a, print('U->'), write(U), print('\n'), print('X->'), write(a));
        (grid(N,1,U), U \= b, print('U->'), write(U), print('\n'), print('Y->'), write(b));
        (grid(N,U,4), U \= a, print('U->'), write(U), print('\n'), print('X->'), write(a));
        grid(N,4,U), U \= b, print('U->'), write(U), print('\n'), print('Y->'), write(b)));
        print('Rule 2 \n'),
        ((finddup(N,X-1,Y), X-1 >= 1, X-1 =< 4, Y >= 1, Y =< 4);
        (finddup(N,X+1,Y), X+1 >= 1, X+1 =< 4, Y >= 1, Y =< 4);
        (finddup(N,X,Y-1), X >= 1, X =< 4, Y-1 >= 1, Y-1 =< 4);
        (finddup(N,X,Y+1), X >= 1, X =< 4, Y+1 >= 1, Y+1 =< 4)).


请帮帮我们......我一两个星期以来一直在尝试这个...


感谢,
维卡斯

1 个答案:

答案 0 :(得分:2)

您不需要尝试指定行索引和列索引的范围,因为它们已经在grid(..)事实中明确给出。让Prolog回顾价值观。

finddup(N,R,C) :-
    grid(N,R,C),
    grid(N,R,C2), C \= C2,
    grid(N,R2,C), R \= R2.

grid(N,R,C)将验证给定值是否在网格中,或者如果N,R,C中的任何(或全部)没有值,它将回溯所有可能的组合。

grid(N,R,C2), C \= C2,会在同一行中找到另一列具有相同N的列。

同样适用于grid(N,R2,C), R \= R2 - 但是另一行。

这将为它找到的任何副本返回true,但在此之后可能会返回false,因为最后一个回溯可能会失败。例如:

?- finddup(N,R,C).
N = 2,
R = 1,
C = 3 ;
false.

?- finddup(2,1,3).
true ;
false.

?- 

(分号是用户输入的地方)

一旦找到解决方案,您可以在末尾添加剪切以停止任何进一步的回溯:

finddup(N,R,C) :-
    grid(N,R,C),
    grid(N,R,C2), C \= C2,
    grid(N,R2,C), R \= R2, !.

给出

?- finddup(N,R,C).
N = 2,
R = 1,
C = 3.

?- finddup(2,1,3).
true.

?-