Prolog实现第n个排列

时间:2016-03-27 17:18:22

标签: prolog

我试图实现第n个排列(nPr => per(n,L,Out)),但我一直都是假的。

这是我想要做的事情;

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

我做错了什么?

还有(更简单)使用内置置换谓词实现第n个排列(nPr)的方法吗?

2 个答案:

答案 0 :(得分:1)

天真的解决方案是使用findall/3bagof/3收集所有排列,然后从列表中选择您需要的排列。

如果您使用的是SWI-Prolog,则可以使用offset/2中的library(solution_sequences)

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

或者,您也可以查看this answer以获取call_nth/2的定义,并使用它:

call_nth(permutation(List, Permutation), N)

但是,当然,如果您对此非常认真,那么您应该找到列表中的n-th permutation索引,并使用它来生成排列。

答案 1 :(得分:0)

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

您在这里说的是R1 - T1的排列等于[H|T]T。那可能不是你的意思。

此外,根据您的per(0,_,[]).,任何内容的第0个排列都是空列表。但是列表本身不是列表的第0个排列吗?换句话说,per(0, L, L)
(或者我是否误解了排列的编号?)