为什么可以';在Prolog中,我是否可以通过数组名访问数组数据?
我试图在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_
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试图将atomarray1
与[]
统一起来,但失败了(在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试图将atomarray1
与[]
统一起来,但失败了(在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