为什么可以';在Prolog中,我是否可以通过数组名访问数组数据?

为什么可以';在Prolog中,我是否可以通过数组名访问数组数据?,prolog,Prolog,我试图在Prolog中构建一个国际象棋游戏,我从研究这个堆栈溢出帖子开始,因为我认为国际象棋游戏涉及二维数组形式的棋盘和棋子数据。因此,现在我正尝试使用一个更简单的数组来进行实验,以了解它是如何工作的 通过充分利用上面链接中提供的示例代码,我编写了一个print\u数组(array)谓词,以及下面的代码 arraysample([[[1],[2],[3]],[[4],[5],[6]],[[7],[8],[9]]]). array1([[1],[2],[3],[4],[5]]). print_

我试图在Prolog中构建一个国际象棋游戏,我从研究这个堆栈溢出帖子开始,因为我认为国际象棋游戏涉及二维数组形式的棋盘和棋子数据。因此,现在我正尝试使用一个更简单的数组来进行实验,以了解它是如何工作的

通过充分利用上面链接中提供的示例代码,我编写了一个
print\u数组(array)
谓词,以及下面的代码

arraysample([[[1],[2],[3]],[[4],[5],[6]],[[7],[8],[9]]]).

array1([[1],[2],[3],[4],[5]]).

print_array(Array):-
    print_rows(Array).

print_rows([]):-
    write(''),nl.    % trying to create a new line before moving on to the next row, 
                     % but at this moment it's not working
print_rows([Row|Rows]):-
    print_row(Row),
    print_rows(Rows).

print_row([]).
print_row([Cell|Columns]):-
    print_cell(Cell),
    print_row(Columns).

print_cell(Cell):-
    write(Cell),
    write(' ').

当我用这样的硬编码数组调用谓词时,它会正确地打印出结果为
true
的数组

?- print_array([[[1],[2],[3]],[[4],[5],[6]],[[7],[8],[9]]]).
但是当我使用数组名时,它失败了

?- print_array(array1).
false.
当我使用
trace
查看发生了什么时,它只显示了这样的内容

?- trace(print_array(array1)).
%         print_array/1: [call,redo,exit,fail]
true.
为什么使用数组名调用谓词在使用硬编码数组时失败?如何让它也使用数组名


注意:请在回答我的问题时向我展示一些代码,为我提供一些具体示例,就像我在问题中粘贴代码一样。如果你想发表一个抽象的评论,比如“阅读序言文档,句号”,这根本不是对任何特定问题的回答,那么首先不要写任何东西。提前感谢。

您误解了Prolog的一个基本方面<代码>数组1([[1],[2],[3],[4],[5]])。用参数,
[[1],[2],[3],[4],[5]]断言一个事实
array1
不是表示值[[1]、[2]、[3]、[4]、[5]]的变量。因此调用
print_array(array1)
并不能代替调用中
array1
[[1]、[2]、[3]、[4]、[5]
print_array
只看到一个原子,
array1
,它不是一个列表,因此会立即失败

在查询
print\u array(array1)
中,Prolog试图将该术语与您拥有的任何
print\u array/1
事实或谓词头统一起来。它查找
print\u array(array)
,并能够将其与
array=array1
统一起来

然后调用
print\u rows(array1)
。它遵循同样的过程。但是,在这种情况下,
print\u rows/1
的每个谓词头都包含一个列表:

print_rows([]):- ...
print_rows([Row|Rows]):- ...
Prolog试图将atom
array1
[]
统一起来,但失败了(在Prolog提示符下尝试
array1=[].
,它将失败)。然后,它尝试将
array1
[Row | Rows]
统一,但失败(在Prolog提示符下尝试
array1=[Row | Rows]。
,它将失败)

这会导致整个调用
print\u array(array1)
失败,因为没有其他选择

在Prolog提示符下执行此操作,而不是打印数组(array1)。

:- array1(Array), print_array(Array).

array1(Array)
将查询
array1/1
事实并生成一个解决方案,用
[[1]、[2]、[3]、[4]、[5]]实例化
数组。然后,
print\u array(array)
将是
print\u array([1]、[2]、[3]、[4]、[5])
您误解了Prolog的一个基本方面<代码>数组1([[1],[2],[3],[4],[5]])。
用参数,
[[1],[2],[3],[4],[5]]断言一个事实
array1
不是表示值[[1]、[2]、[3]、[4]、[5]]的变量。因此调用
print_array(array1)
并不能代替调用中
array1
[[1]、[2]、[3]、[4]、[5]
print_array
只看到一个原子,
array1
,它不是一个列表,因此会立即失败

在查询
print\u array(array1)
中,Prolog试图将该术语与您拥有的任何
print\u array/1
事实或谓词头统一起来。它查找
print\u array(array)
,并能够将其与
array=array1
统一起来

然后调用
print\u rows(array1)
。它遵循同样的过程。但是,在这种情况下,
print\u rows/1
的每个谓词头都包含一个列表:

print_rows([]):- ...
print_rows([Row|Rows]):- ...
Prolog试图将atom
array1
[]
统一起来,但失败了(在Prolog提示符下尝试
array1=[].
,它将失败)。然后,它尝试将
array1
[Row | Rows]
统一,但失败(在Prolog提示符下尝试
array1=[Row | Rows]。
,它将失败)

这会导致整个调用
print\u array(array1)
失败,因为没有其他选择

在Prolog提示符下执行此操作,而不是打印数组(array1)。

:- array1(Array), print_array(Array).

array1(Array)
将查询
array1/1
事实并生成一个解决方案,用
[[1]、[2]、[3]、[4]、[5]]实例化
数组。然后
print\u array(array)
将是
print\u array([1]、[2]、[3]、[4]、[5])

如果您首先输入
trace.
,然后输入查询
print\u array(array1)。
分别获得详细的查询步骤。您误解了Prolog的一个基本方面<代码>数组1([[1],[2],[3],[4],[5]])。
用参数,
[[1],[2],[3],[4],[5]]断言一个事实
array1
不是表示值
[[1]、[2]、[3]、[4]、[5]]
的变量。因此调用
print_array(array1)
并不能代替调用中
array1
[[1]、[2]、[3]、[4]、[5]
print_array
只看到一个原子,
array1
,它不是一个列表,因此会立即失败。尝试,
array1(X),print_array(X)。
如果您首先输入
trace.
,然后输入查询
print_array1(array1)。
单独,您将得到详细的查询步骤。您误解了Prolog的一个基本方面<代码>数组1([[1],[2],[3],[4],[5]])。
用参数,
[[1],[2],[3],[4],[5]]断言一个事实
array1
不是表示值
[[1]、[2]、[3]、[4]、[5]]
的变量。所以调用
pr