Matrix 如何在prolog中访问和使用矩阵

Matrix 如何在prolog中访问和使用矩阵,matrix,prolog,Matrix,Prolog,我需要随机访问prolog(swipl)中的矩阵位置。向我推荐一个库,它提供了一种在矩阵中创建和访问随机位置的方法,而无需经历处理列表的过程。SWI Prolog有无限的算术术语,那么您就不需要任何外部库了。 有几个内置的访问术语的参数,我发现是方便的。例如: ?- A = array(1,2,3,4,5,6,7), arg(3, A, X). X = 3. 根据需要处理的数据以及访问这些矩阵的频率,您可以应用数据隐藏,为自己提供首选接口 例如,您可能需要索引验证: ?- A = array(

我需要随机访问prolog(swipl)中的矩阵位置。向我推荐一个库,它提供了一种在矩阵中创建和访问随机位置的方法,而无需经历处理列表的过程。

SWI Prolog有无限的算术术语,那么您就不需要任何外部库了。 有几个内置的访问术语的参数,我发现是方便的。例如:

?- A = array(1,2,3,4,5,6,7), arg(3, A, X).
X = 3.
根据需要处理的数据以及访问这些矩阵的频率,您可以应用数据隐藏,为自己提供首选接口

例如,您可能需要索引验证:

?- A = array(1,2,3,4,5,6,7), arg(8, A, X).
false.
请注意,不会引发任何异常

arg/3还可以搜索匹配的参数:

?- A = array(1,2,3,4,5,6,7), arg(P, A, 4).
A = array(1, 2, 3, 4, 5, 6, 7),
P = 4 .
编辑


在Prolog中,分配必须始终小心处理,因为编程模型并不适合这样做。但也有一些内置的,比如,可以完成这项工作。请参阅相关文档。

谢谢您的帮助。但是我们如何更改数组中的值。。。例如,我想更改A[3]的值,然后arg(3,A,4)不起作用,因为我想将A[3]的值更改为4-1:在初学者级别使用
nb_setarg
肯定是一个非常糟糕的主意。首先,应该理解Prolog的思想。此外,
nb_setarg/3
特定于SWI和YAP。它不存在或不作为内置IF、B、GNU、SICStus、XSB、Ciao出现。更糟糕的是,甚至
nb_setarg/3
的语义也没有很好的定义。因此,这只是一种黑客行为,很可能会随着版本的变化而变化。考虑到SWI Prolog中垃圾收集的最新进展(OP需要,尽管没有标记),nb_setarg可能已经过时。我认为,特别是对于初学者来说,更传统的编程工具需要这样的“提示”。@chac:我不知道SWI中的GC进步会影响这个问题。主要的一点是,你根本不能给它一个语义。类似于变量的(全局)排序,也仍然依赖于实现;i、 e.在“更长”的时期内几乎未定义。即使定义“更长”也几乎不可能。。。但这里更糟糕,因为它也影响到地面条件。谢谢你,这起作用了。但是我们如何更改数组中的值。。。例如,我想更改A[3]的值,然后arg(3,A,4)不起作用,因为我想将A[3]的值更改为4