我是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)).
请帮帮我们......我一两个星期以来一直在尝试这个...
感谢,
维卡斯
答案 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.
?-