Matrix Prolog-矩阵迭代

Matrix Prolog-矩阵迭代,matrix,grid,prolog,Matrix,Grid,Prolog,我只是想提醒你,我对Prolog非常陌生,甚至不知道从哪里开始 首先,我需要创建一个3x3的网格。然后我需要遍历它并打印出当前所在的正方形 所以网格看起来像: [6],[7],[8] [5],[4],[3] [0],[1],[2] 我的讲师没有给出任何例子,我也不知道还能从哪里找到答案。好吧,您的网格将如下所示: Grid = [[6,7,8],[5,4,3],[0,1,2]]. 我喜欢用这个谓词访问矩阵: matrix(Matrix, I, J, Value) :- nth0(I,

我只是想提醒你,我对Prolog非常陌生,甚至不知道从哪里开始

首先,我需要创建一个3x3的网格。然后我需要遍历它并打印出当前所在的正方形

所以网格看起来像:

[6],[7],[8]
[5],[4],[3]
[0],[1],[2]

我的讲师没有给出任何例子,我也不知道还能从哪里找到答案。

好吧,您的网格将如下所示:

Grid = [[6,7,8],[5,4,3],[0,1,2]].
我喜欢用这个谓词访问矩阵:

matrix(Matrix, I, J, Value) :-
    nth0(I, Matrix, Row),
    nth0(J, Row, Value).
这将提供矩阵、列索引、行索引和该位置的值之间的关系。重要的是,你要把这当作一种关系,因为它可以为你做很多事情:

获取矩阵中给定坐标处的值:

?- Grid = [[6,7,8],[5,4,3],[0,1,2]], matrix(Grid, 1, 1, Value).
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
Value = 4.
?- Grid = [[6,7,8],[5,4,3],[0,1,2]], matrix(Grid, I, J, Value).
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = J, J = 0,
Value = 6 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = 0,
J = 1,
Value = 7 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = 0,
J = 2,
Value = 8 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = 1,
J = 0,
Value = 5 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = J, J = 1,
Value = 4 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = 1,
J = 2,
Value = 3 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = 2,
J = Value, Value = 0 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = 2,
J = Value, Value = 1 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = J, J = Value, Value = 2.
?- Grid = [[6,7,8],[5,4,3],[0,1,2]], 
   findall(Value, matrix(Grid, 1, _, Value), Row).
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
Row = [5, 4, 3].
?- Grid = [[6,7,8],[5,4,3],[0,1,2]], 
   findall(Value, matrix(Grid, _, 1, Value), Column).
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
Column = [7, 4, 1].
迭代矩阵:

?- Grid = [[6,7,8],[5,4,3],[0,1,2]], matrix(Grid, 1, 1, Value).
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
Value = 4.
?- Grid = [[6,7,8],[5,4,3],[0,1,2]], matrix(Grid, I, J, Value).
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = J, J = 0,
Value = 6 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = 0,
J = 1,
Value = 7 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = 0,
J = 2,
Value = 8 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = 1,
J = 0,
Value = 5 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = J, J = 1,
Value = 4 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = 1,
J = 2,
Value = 3 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = 2,
J = Value, Value = 0 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = 2,
J = Value, Value = 1 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = J, J = Value, Value = 2.
?- Grid = [[6,7,8],[5,4,3],[0,1,2]], 
   findall(Value, matrix(Grid, 1, _, Value), Row).
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
Row = [5, 4, 3].
?- Grid = [[6,7,8],[5,4,3],[0,1,2]], 
   findall(Value, matrix(Grid, _, 1, Value), Column).
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
Column = [7, 4, 1].
从矩阵中选择一行:

?- Grid = [[6,7,8],[5,4,3],[0,1,2]], matrix(Grid, 1, 1, Value).
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
Value = 4.
?- Grid = [[6,7,8],[5,4,3],[0,1,2]], matrix(Grid, I, J, Value).
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = J, J = 0,
Value = 6 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = 0,
J = 1,
Value = 7 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = 0,
J = 2,
Value = 8 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = 1,
J = 0,
Value = 5 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = J, J = 1,
Value = 4 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = 1,
J = 2,
Value = 3 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = 2,
J = Value, Value = 0 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = 2,
J = Value, Value = 1 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = J, J = Value, Value = 2.
?- Grid = [[6,7,8],[5,4,3],[0,1,2]], 
   findall(Value, matrix(Grid, 1, _, Value), Row).
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
Row = [5, 4, 3].
?- Grid = [[6,7,8],[5,4,3],[0,1,2]], 
   findall(Value, matrix(Grid, _, 1, Value), Column).
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
Column = [7, 4, 1].
从矩阵中选择一列:

?- Grid = [[6,7,8],[5,4,3],[0,1,2]], matrix(Grid, 1, 1, Value).
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
Value = 4.
?- Grid = [[6,7,8],[5,4,3],[0,1,2]], matrix(Grid, I, J, Value).
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = J, J = 0,
Value = 6 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = 0,
J = 1,
Value = 7 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = 0,
J = 2,
Value = 8 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = 1,
J = 0,
Value = 5 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = J, J = 1,
Value = 4 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = 1,
J = 2,
Value = 3 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = 2,
J = Value, Value = 0 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = 2,
J = Value, Value = 1 ;
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
I = J, J = Value, Value = 2.
?- Grid = [[6,7,8],[5,4,3],[0,1,2]], 
   findall(Value, matrix(Grid, 1, _, Value), Row).
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
Row = [5, 4, 3].
?- Grid = [[6,7,8],[5,4,3],[0,1,2]], 
   findall(Value, matrix(Grid, _, 1, Value), Column).
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]],
Column = [7, 4, 1].
构造一个新矩阵!:

?- matrix(M, 0, 0, 4), matrix(M, 1, 1, 2).
M = [[4|_G673], [_G678, 2|_G682]|_G676].
实际上,这一个谓词使这一切成为可能,因为它只是建立了矩阵的结构,浮动出调用方可能感兴趣的值,并让Prolog的回溯完成其余的工作

这个列表表示法不如C中的矩阵高效,但你不能因此而失望:你在使用Prolog

如果你真的对列表的性能感到不安,你可以做同样的事情,但是改变你的结构,使用arg/3和terms来代替列表。最妙的是,更改后,您可能会保持matrix/4的API不变!但你可能会失去5个

因此,现在显示矩阵中的所有值非常简单:

display_matrix(Matrix) :-
    matrix(Matrix, I, J, Value),
    write('I am on square ('),
    write(I), write(','), write(J),
    write(') and the value is '), write(Value), nl,
    fail.
display_matrix(_).
让我们试试看:

?- Grid = [[6,7,8],[5,4,3],[0,1,2]], 
   display_matrix(Grid).
I am on square (0,0) and the value is 6
I am on square (0,1) and the value is 7
I am on square (0,2) and the value is 8
I am on square (1,0) and the value is 5
I am on square (1,1) and the value is 4
I am on square (1,2) and the value is 3
I am on square (2,0) and the value is 0
I am on square (2,1) and the value is 1
I am on square (2,2) and the value is 2
Grid = [[6, 7, 8], [5, 4, 3], [0, 1, 2]].

希望这有帮助

我将网格表示为一个列表列表。就表示的概念而言,它与任何其他语言都没有什么不同。例如,在C语言中,您可以将2D矩阵表示为一个行数组,而每一行都是一个列值数组。在Prolog中,每一行都是列值列表,矩阵是行列表@VaughnCato说的列表列表。如果你对Prolog列表的工作原理不太了解,我建议你使用Google并找到一个好的教程。它们是Prolog的基础,就像指向C的指针一样。你是最好的!谢谢