0

我正在尝试在 swi-prolog 中对数组检索进行编程。使用下面打印的当前代码,我可以检索给定索引处的元素,但我也希望能够检索给定元素的索引[es]。

aget([_|X],Y,Z) :- Y \= 0, Y2 is (Y-1), aget(X,Y2,Z).
aget([W|_],Y,Z) :- Y = 0, Z is W.

示例 1:aget([9,8,7,6,5],1,N) {检索索引 1 处的元素 8} 输出:N = 9。{正确}

示例 2:aget([9,8,7,6,5],N,7) {检索元素 7 的索引 2} 输出:false {不正确}

我理解它的方式是 swi-prolog 将以这种方式工作,几乎不需要额外的编程。很明显我做错了什么。如果您能指出我正确的方向或告诉我我做错了什么,我将不胜感激。

4

2 回答 2

1

您的代码过于程序化,第二个子句显然是错误的,仅适用于数字。

您正在寻找的功能由nth0 /3 实现。在 SWI-Prolog 中,您可以看到优化的源代码?- edit(nth0).此处已在 SO 上讨论了另一种实现(此处为我的答案)。

请注意,Prolog没有数组,而是列表。当可以改写算法以避免索引时,我们应该这样做。

于 2012-12-07T07:20:52.047 回答
0

如果将数组表示为化合物,还可以使用 ISO 标准谓词 arg/3 来访问数组元素。这是一个示例运行:

?- X = array(11,33,44,77), arg(2,X,Y).
X = array(11, 33, 44, 77),
Y = 33.

优于列表的优点是复合访问需要 O(1) 时间,而列表访问需要 O(n) 时间,其中 n 是数组的长度。

于 2016-12-02T18:13:37.257 回答