Prolog:所有数字组合

Prolog: All digit Combinations

我正在做一个练习,给定一个数字,在给定 M 长度的情况下,我应该找到该数字的所有数字组合。

例如,如果 N = 1234,M = 3,组合 = [[1,2,3], [1,2,4], [1,3,4], [2,3,4] ].

我不明白如何获得这些组合,也许使用 findall(在这种情况下我不明白如何)?

这是我为查找数字(和组合,但它只打印 [1,1,1])而编写的代码

all_digit_combinations(N, M, Combinations):-
    find_list_numbers(N, List),
    print(List),
    reverse(List, NewList),
    all_digit_combinations(N, M, NewList, Combinations).

all_digit_combinations(_N, M, List, Combinations):-
    length(Combinations, M),
    eval(Combinations, List).



find_list_numbers(N, [Last|R]):-
    N > 0,
    !,
    Last is N mod 10,
    Rest_Number is N div 10,
    find_list_numbers(Rest_Number, R).
find_list_numbers(_N, []).

eval([], _ListN).
eval([H|T], ListN):-
    member(H, ListN),
    eval(T, ListN).

要生成组合,您可以使用以下代码:

% combination(+List, +M, -Combination)

  combination(List, M, Combination) :-
     length(Combination, M),
     combination(List, Combination).

  combination(_, []).
  combination([X|Xs], [X|Ys]) :- combination(Xs, Ys).        % choose X, or
  combination([_|Xs], Ys) :- Ys \= [], combination(Xs, Ys).  % don't choose X

运行 示例:

?- combination([1,2,3,4], 3, C).
C = [1, 2, 3] ;
C = [1, 2, 4] ;
C = [1, 3, 4] ;
C = [2, 3, 4] ;
false.

要将所有解决方案收集到一个列表中,您可以使用 findall/3,如下所示:

?- findall(C, combination([1,2,3,4], 3, C), L).
L = [[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]].