2016-03-27 5 views
1

私はn番目の順列(nPr => per(n,L,Out))を実装しようとしていますが、私はfalseを得続けます。P番目の順列のPrologの実装

ここに私がしようとしていることがあります。

per(0,_,[]). 
per(_,[],[]). 
per(R,[H|T1],[H|T]):- 
    R1 is R-1, 
    per(R1,T1,[H|T]), 
    per(R1,T1,T). 

私は間違っていますか?

組み込み順列述語を使用してn番目の順列(nPr)を実装する方法はありますか?

+1

n番目の順列(HTTPS [順列で、この資料に記載されているように]、辞書式順序に従って、計算することができる(または私は順列の番号を誤解か?):// EN。 wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order)。おそらくもっと面倒なProlog運動をするでしょう。 – lurker

答えて

1

純粋な解決策は、findall/3またはbagof/3を使用してすべての順列を収集してから、必要なものをリストから選択することです。

SWI-Prologを使用している場合はoffset/2library(solution_sequences)から使用できます。

once(offset(N, permutation(List, Permutation))) 

それとも、あなたはまたcall_nth/2の定義についてthis answerを見て、そしてそれにできます

call_nth(permutation(List, Permutation), N) 

しかし、あなたは、この真剣に考えている場合はもちろん、あなたはかなり見つける必要がありますn-th permutationあなたのリストのインデックスの、これを使用して順列を生成します。

+2

'call_nth(Goal_0、Nth)' – false

0
per(R1,T1,[H|T]), 
per(R1,T1,T). 

はあなたがここで述べている、T1R1番目の順列は[H|T]Tに等しいの両方であるということです。それはおそらくあなたが意味するものではありません。


また、あなたのper(0,_,[]).あたりに、何のゼロ番目の順列は空のリストです。しかし、リスト自体は、リストの0番目の順列ではありませんか?つまり、per(0, L, L)

関連する問題