微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Prolog中表达无穷大?

如何解决如何在Prolog中表达无穷大?

我正在尝试使用 random/3

random(+L:int,+U:int,-R:int)

有什么东西可以用来表示无穷大吗?

例如:

random(0,Infinity,Random_Number).

是否可以通过随机实现这一点?或者还有其他简单的选择吗?

P.S. 我在使用 sup ( Supremum ) 的地方制作了 clpfd 程序,但我没有使用 clpfd。

解决方法

评论中的讨论很有趣。我对无穷数和数学的不发达直觉告诉我:

可以在物理计算机上使用一致表示法表示的整数数量是有限的。因此,将有无数其他整数无法表示。所以,如果你随机选择任何数字,你可以在你的机器上表示它的概率是 0。你不妨定义:

random_between(0,infinite,infinite).

Transfinite numbers 可能是一个开始阅读的地方,但我该说谁呢。你需要一个数学家来解决这类问题,而不是一个编程行人。

也许你应该在https://math.stackexchange.com/问?


对于您的问题:您可以用符号表示无穷大的概念,例如原子 infinite。然后,您需要决定如何在代数中处理该概念,并为其提供规则。上面的 random_between/3 只是一个例子。如需灵感,请查看 how floating point numbers handle infinity。

,

我认为评论中的讨论不太有用。大卫是对的,没有办法得到一个没有上限的统一整数,但不清楚这是否是你想要的。绝对有方法可以从 skewed 分布中获得无界随机整数,其中接近 0 的数字比远离 0 的数字更有可能,但 没有 整数,甚至不是一个有 10000 万亿位的数字,是不可能的。 (只要不超过 Prolog 的内存即可。)

这是一个简单的生成器。一、随机长度列表:

random_length(List) :-
    random(P),(   P > 0.25
    ->  List = [_ | Tail],random_length(Tail)
    ;   List = [] ).

示例:

?- random_length(List).
List = [].

?- random_length(List).
List = [_2004,_2022,_2040,_2058,_2076].

?- random_length(List).
List = [].

?- random_length(List).
List = [_2004,_2058].

接下来,随机位的随机长度列表:

random_bit(Bit) :-
    random(P),(   P > 0.5
    ->  Bit = 1
    ;   Bit = 0 ).

random_bits(Bits) :-
    random_length(Bits),maplist(random_bit,Bits).

示例:

?- random_bits(Bits).
Bits = [0].

?- random_bits(Bits).
Bits = [1,1,0].

?- random_bits(Bits).
Bits = [].

?- random_bits(Bits).
Bits = [0,0].

然后我们可以将这个位列表评估为一个数字,假设使用这种方法:

bits_value([],0).
bits_value([Bit | Bits],Value) :-
    bits_value(Bits,TailValue),Value is TailValue * 2 + Bit.

示例:

?- random_bits(Bits),bits_value(Bits,Value).
Bits = [1,0],Value = 3.

?- random_bits(Bits),Value).
Bits = [0,Value = 2.

?- random_bits(Bits),Value = 24.

?- random_bits(Bits),1],Value).
Bits = [],Value = 0.

这些列表的长度没有限制,但它们往往很短,因此值相当低。我们可以修改 random_length 中的 0.25 因子,使更长的列表更有可能。例如,使用 0.01:

?- random_bits(Bits),Value = 64.

?- random_bits(Bits),0|...],Value = 137345267061686159418.

?- random_bits(Bits),Value = 105607189397659.

?- random_bits(Bits),Value = 104.

这里有很多可以修改的东西,例如,只包含零的列表不是很有用。您可以向此类列表添加“隐式 1”元素。您还可以将其中一位视为符号位以允许生成负数。您可以通过生成两个随机整数 PQ 并使用 P/Q 作为随机值来生成随机的、完全无界的有理数。等等。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。