gpt4 book ai didi

list - 给定长度的列表组合后跟 Prolog 中的排列?

转载 作者:行者123 更新时间:2023-12-05 00:46:46 25 4
gpt4 key购买 nike

我需要一个谓词来返回一个包含输入列表的所有组合的列表,并且列表结果大小在第二个参数中,谓词将是这样的

permutInListN( +inputList, +lengthListResult, -ListResult), 

例子:
permutInListN([1,2,3],2,L).
? L=[1,2].
? L=[2,1].
? L=[1,3].
? L=[3,1].
? L=[2,3].
? L=[3,2].
[1,2,3]的组合在列表中 L带长度 2 .
没有重复可能使用抵消。

这是我的代码,但它根本不起作用,没有生成所有解决方案
permutInListN(_, 0, []).
permutInListN([X|Xs], N, [X|Ys]) :- N1 is N-1, permutInListN(Xs,N1,Ys).
permutInListN([_|Xs], N, Y) :- N>0, permutInListN(Xs,N,Y).

?permutInListN([1,2,3],2,L).
L = [1, 2]
L = [1, 3]
L = [2, 3]

提前致谢。

最佳答案

你想要的是一个组合,然后是一个排列。

对于组合:

comb(0,_,[]).

comb(N,[X|T],[X|Comb]) :-
N>0,
N1 is N-1,
comb(N1,T,Comb).

comb(N,[_|T],Comb) :-
N>0,
comb(N,T,Comb).

例子:
?- comb(2,[1,2,3],List).
List = [1, 2] ;
List = [1, 3] ;
List = [2, 3] ;
false.

对于排列只需使用 SWI-Prolog permutation/2在图书馆列表中
:- use_module(library(lists)).

?- permutation([1,2],R).
R = [1, 2] ;
R = [2, 1] ;
false.

把它们放在一起
comb_perm(N,List,Result) :-
comb(N,List,Comb),
permutation(Comb,Result).

随着您的查询
?- comb_perm(2,[1,2,3],R).
R = [1, 2] ;
R = [2, 1] ;
R = [1, 3] ;
R = [3, 1] ;
R = [2, 3] ;
R = [3, 2] ;
false.

为您的谓词修改
permutInListN(List,N,Result) :-
comb(N,List,Comb),
permutation(Comb,Result).

例子
?- permutInListN([1,2,3],2,R).
R = [1, 2] ;
R = [2, 1] ;
R = [1, 3] ;
R = [3, 1] ;
R = [2, 3] ;
R = [3, 2] ;
false.

关于list - 给定长度的列表组合后跟 Prolog 中的排列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53668887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com