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]].
我正在做一个练习,给定一个数字,在给定 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]].