繁体   English   中英

将数字转换为 Prolog 中的列表?

[英]Convert numbers to list in Prolog?

我创建了一个随机二进制生成器,但它的“输出”是书面数字,我怎样才能让它们成为一个列表?

bin_gen(0)。 bin_gen(Y):- 随机(0,2,S),write(S),Y1 是 Y - 1,bin_gen(Y1)。

Y 是长度。 例如,我希望 output 1011 在 bin_gen(0) 之后成为 [1,0,1,1]。

十进制转二进制:

转换步骤:

将数字除以 2。

获取下一次迭代的 integer 商。

获取二进制数字的余数。

重复上述步骤,直到商等于 0。

十进制转二进制

Prolog 代码:

decimal_binary(Dec,Binary):-
(   Dec=0 ->                 %If Decimal is 0 then return Binary 0
    write('Binary = [0]');   %Else
decimal_binary1(Dec,Binary1), % Get Binary List
reverse(Binary1,Binary),!). %Reverse the Binary List

decimal_binary1(0,[]). %Base Case: Stop when Quotient is 0.
decimal_binary1(Dec,[Remainder|List]):- %Generate Binary List till Base Case succeeds
  divmod(Dec,2,Quotient,Remainder), %Built-in to get Quotient and Remainder
  decimal_binary1(Quotient,List).
    
divmod(Dividend, Divisor, Quotient, Remainder) :- %Built-in to get Quotient and Remainder
  Quotient  is Dividend div Divisor,
  Remainder is Dividend mod Divisor.

例子:

?- decimal_binary(13,Binary)
Binary = [1, 1, 0, 1]

?- decimal_binary(126,Binary)
Binary = [1, 1, 1, 1, 1, 1, 0]

?- decimal_binary(75,Binary)
Binary = [1, 0, 0, 1, 0, 1, 1]

?- decimal_binary(0,Binary)
Binary = [0]

给定一个 integer,您可以通过重复除以 10 将其转换为数字列表,将余数作为个位数字,并使用向下舍入的结果进行下一次迭代:

list_digits(Int, Digits) :-
    list_digits_aux(Int, [], Digits).
list_digits_aux(Int, Digits, [Int|Digits]) :- Int < 10.
list_digits_aux(Int, Digits, Acc) :-
    NextInt is Int div 10,
    NextInt > 0,
    D is Int rem 10,
    list_digits_aux(NextInt, [D|Digits], Acc).

在这段代码中,我们使用带有累加器参数的辅助谓词,这样我们就不必在最后反转结果。

但是,iiuc,如果你想要数字列表,你可以稍微调整你当前的谓词来构造数字列表,而不是打印出每个数字:

bin_gen(0, []).
bin_gen(Y, [D|Digits]) :-
    random(0,2,D),
    succ(Y1, Y),
    bin_gen(Y1, Digits).

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM