【问题标题】:prolog all binary numbers序言所有二进制数
【发布时间】:2015-12-06 17:34:42
【问题描述】:

我需要一个能产生所有 N 位二进制数的谓词。

例如谓词 binary(2,L)

将返回L = [[0, 0], [0, 1], [1, 0], [1, 1]]。

请不要使用 findall ....

【问题讨论】:

  • 我尝试的不正确,因为我不知道如何生成二进制数
  • 是的,这是作业,我需要一个解决方案,这样我才能看到如何解决它,以便为期末考试做好准备

标签: binary prolog


【解决方案1】:

一旦你有了一个代表所有 N 位数字的列表,生成所有 N+1 位数字只需将每个 N 数字 [a,b,c,...] 展开为两个 N+1 数字:[0,a,b,c,...] 和[1,a,b,c,...].

更新:

unfold([], []).
unfold([H|T], [[0|H], [1|H]|L]) :-
   unfold(T, L).

bn(N, L) :-
   (   N = 0
   ->  L = [[]]
   ;   N1 is N - 1,
       bn(N1, L1),
       unfold(L1, L)
   ).

【讨论】:

    【解决方案2】:

    如果你需要避开findall/3,那么你需要一个聚合器来收集二进制数:

    binary(N, L) :-
      collect_binaries(N, [], L).
    

    然后您一次生成一个二进制文件并检查它是否已经存在于聚合列表中:

    collect_binaries(N, R, L) :-
      length(B, N),
      make_binary(B), % make binary of length N
      \+ memberchk(B, R),
      !,
      collect_binaries(N, [B|R], L).
    

    如果生成另一个二进制文件失败,你就完成了:

    collect_binaries(_, L, L).
    

    生成二进制文件很简单(我使用的是您在问题中提供的格式:0/1 值列表)。您遍历列表中的所有位置并使用 1 或 0:

    make_binary([]).
    make_binary([H|T]) :-
      member(H, [1,0]),
      make_binary(T).
    

    结果:

    ?- binary(2, L).
    L = [[0, 0], [0, 1], [1, 0], [1, 1]]
    Yes (0.00s cpu)
    

    【讨论】:

      猜你喜欢
      • 2017-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 2017-01-26
      • 2012-09-06
      相关资源
      最近更新 更多