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

あなたのコードはあまりにも手続き的であり、2 番目の節は明らかに間違っており、数値に対してのみ機能します。

あなたが探している機能は、nth0 /3 によって実装されています。SWI-Prolog では、最適化されたソースを見ることができます?- edit(nth0).。代替の実装については、SO でここで議論されています ( here my answer )。

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 に答える