所有恰好有 n 位的二进制数

发布于 2024-12-22 21:15:32 字数 143 浏览 1 评论 0原文

我需要一个谓词来生成列表中长度为 N 的所有二进制数。

使用示例:

?- bins(2,L).
L = [[0,0], [0,1], [1,0], [1,1]].    % expected result

I need a predicate to produce all binary numbers with length N in a list.

Sample use:

?- bins(2,L).
L = [[0,0], [0,1], [1,0], [1,1]].    % expected result

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

零時差 2024-12-29 21:15:32

无需使用 findall/3

我们基于 foldl/4, Prolog lambdaif_/3、和(#<)/3

:- use_module(library(lambda)).
:- use_module(library(clpfd)).

bins(N,Zss) :-
   if_(N #< 1,
       ( N #= 0, Zss = [[]] ),
       ( N #= N0+1,
         bins(N0,Xss),
         foldl(\Bs^phrase(([[0|Bs]],[[1|Bs]])),Xss,Zss,[]))).

使用示例:

?- bins(4,Zss).
Zss = [[0,0,0,0],[1,0,0,0],[0,1,0,0],[1,1,0,0],
       [0,0,1,0],[1,0,1,0],[0,1,1,0],[1,1,1,0],
       [0,0,0,1],[1,0,0,1],[0,1,0,1],[1,1,0,1],
       [0,0,1,1],[1,0,1,1],[0,1,1,1],[1,1,1,1]].

这是最常见的查询:

?- bins(N,Zss).
  N = 0, Zss = [[]]
; N = 1, Zss = [[0],[1]]
; N = 2, Zss = [[0,0],[1,0],[0,1],[1,1]]
; N = 3, Zss = [[0,0,0],[1,0,0],[0,1,0],[1,1,0],[0,0,1],[1,0,1],[0,1,1],[1,1,1]]
...

No need to use findall/3!

We define bins/2 based on , foldl/4, Prolog lambdas, if_/3, and (#<)/3.

:- use_module(library(lambda)).
:- use_module(library(clpfd)).

bins(N,Zss) :-
   if_(N #< 1,
       ( N #= 0, Zss = [[]] ),
       ( N #= N0+1,
         bins(N0,Xss),
         foldl(\Bs^phrase(([[0|Bs]],[[1|Bs]])),Xss,Zss,[]))).

Sample use:

?- bins(4,Zss).
Zss = [[0,0,0,0],[1,0,0,0],[0,1,0,0],[1,1,0,0],
       [0,0,1,0],[1,0,1,0],[0,1,1,0],[1,1,1,0],
       [0,0,0,1],[1,0,0,1],[0,1,0,1],[1,1,0,1],
       [0,0,1,1],[1,0,1,1],[0,1,1,1],[1,1,1,1]].

Here is the most general query:

?- bins(N,Zss).
  N = 0, Zss = [[]]
; N = 1, Zss = [[0],[1]]
; N = 2, Zss = [[0,0],[1,0],[0,1],[1,1]]
; N = 3, Zss = [[0,0,0],[1,0,0],[0,1,0],[1,1,0],[0,0,1],[1,0,1],[0,1,1],[1,1,1]]
...
拿命拼未来 2024-12-29 21:15:32

可能有更好的方法,但这是使用 findall 的解决方案

bins(N,L) :-
    findall(Num,binary_number(N,Num),L).

binary_number(0,[]).
binary_number(N,[D|Ds]) :-
    N > 0,
    member(D,[0,1]),
    N1 is N - 1,
    binary_number(N1,Ds).

There are probably better ways, but here is a solution using findall

bins(N,L) :-
    findall(Num,binary_number(N,Num),L).

binary_number(0,[]).
binary_number(N,[D|Ds]) :-
    N > 0,
    member(D,[0,1]),
    N1 is N - 1,
    binary_number(N1,Ds).
帥小哥 2024-12-29 21:15:32

或者:

member_(A, B) :- member(B, A).
bins(Size, Result) :-
    findall(L, (length(L, Size), maplist(member_([0, 1]), L)), Result).

可以使用 lambda 进行简化模块 :

bins(Size, Result) :-
    findall(L, (length(L, Size), maplist(\X^member(X, [0, 1]), L)), Result).

Alternatively :

member_(A, B) :- member(B, A).
bins(Size, Result) :-
    findall(L, (length(L, Size), maplist(member_([0, 1]), L)), Result).

Could be simplified with the use of the lambda module :

bins(Size, Result) :-
    findall(L, (length(L, Size), maplist(\X^member(X, [0, 1]), L)), Result).
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文