Как выразить бесконечность на Прологе?

Я пытаюсь использовать random/3

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

Есть ли что-нибудь, что можно использовать для представления бесконечности?

Например:

random(0, Infinity, Random_Number).

Можно ли добиться этого с помощью рандома? Или есть другая простая альтернатива?

P.S. Я создал программы на clpfd, в которых использовал sup ( Supremum ), но я не работаю с clpfd.


person Reema Q Khan    schedule 22.12.2020    source источник
comment
Бесконечность не имеет смысла для random/3 ... как сгенерировать равномерно случайное число от 0 до бесконечности? С другой стороны, для between/3 это имеет смысл... это inf (но это зависит только от предиката)   -  person David Tonhofer    schedule 22.12.2020
comment
@DavidTonhofer, так что ты предлагаешь?   -  person Reema Q Khan    schedule 22.12.2020
comment
@DavidTonhofer, как мне сказать, что выбирают случайное число от нуля до бесконечности?   -  person Reema Q Khan    schedule 22.12.2020
comment
Вы не можете выбрать такое число (это похоже на выбор реального числа (N.B. не float) между 0 и 1,0). Вы можете выбрать только до некоторого максимума.   -  person David Tonhofer    schedule 22.12.2020
comment
@DavidTonhofer Так что мне придется дать ограничение?   -  person Reema Q Khan    schedule 22.12.2020
comment
Да... Представьте, что компьютер случайным образом выбирает число из 10000 триллионов цифр. Вы хотите, чтобы вам это дали?   -  person David Tonhofer    schedule 22.12.2020
comment
@DavidTonhofer Хорошо! Спасибо за ваш ответ. :)   -  person Reema Q Khan    schedule 22.12.2020
comment
Аналогом является random/1, где вы получаете случайное число с плавающей запятой между 0,0 и 1.0 (вероятно, генерируется путем случайной установки битов мантиссы и экспоненты)   -  person David Tonhofer    schedule 22.12.2020
comment
Можно сказать, что random_real_0_1([X|XS]):- freeze(XS, (random(0,2,X), random_real_0_1(XS))). является настоящим числом, не так ли? Тогда я мог random_real_0_1_to_prec(N,Y):- random_real_0_1(X), length(Y,N),append(Y,[_|_],X). @DavidTonhofer   -  person Will Ness    schedule 22.12.2020
comment
@WillNess Ну, на самом деле это поток битов, из которого вы затем выбираете N бит. Вероятность получения любой из возможных битовых строк N битов подбрасывания честной монеты четко определена (2 ^ -N), но выбор случайного числа от 0 до бесконечности не таков - это выбор любого бесконечного числа битов из этого потока . Мало того, что это запрещено в этой вселенной, вероятность получения любого точного числа равна 0. Может быть, вам очень повезет, и вы нажмете число, которое имеет только 0 с после конечной позиции K. :-) См. также: Книга песка   -  person David Tonhofer    schedule 22.12.2020
comment
Вы не можете получить случайное число равномерно ч / б 0 и inf, но если вы просто не хотите указывать верхний предел, вы можете просто передать случайный интервал через функцию, которая охватывает бесконечный интервал на интервале. Он будет _not_ распределен равномерно. Не очень хороший пример - 1/x, если вы сделаете random(X), Y is floor(1/X)., большинство чисел будет близко к 1, но без верхнего предела как такового.   -  person rajashekar    schedule 22.12.2020
comment
@rajashekar Должно быть, это раздача черного лебедя ...   -  person David Tonhofer    schedule 22.12.2020
comment
@DavidTonhofer, число пи по общему согласию действительно существует, несмотря на бесконечное количество цифр (правильно?). произношение числа со всеми цифрами 0, мимо, например. 10-е — такое же алгоритмическое описание, как и то, которое я дал, или короткая формула, способная генерировать последовательность цифр числа пи с любой заданной точностью. но никакое реальное никогда не дискретизируется с бесконечной точностью, всегда с некоторой конечной точностью. пока нет ограничений на этот выбор, мы считаем его четко определенным. точное расстояние — это абстракция.   -  person Will Ness    schedule 22.12.2020
comment
(под формулой числа пи я имел в виду что-то вроде en.wikipedia.org/wiki/Chudnovsky_algorithm)   -  person Will Ness    schedule 22.12.2020
comment
@WillNess Финитисты могут не согласиться с существованием числа Пи, но да ... до тех пор, пока можно записать токарную машину для генерации цифр, я согласен с этим (но реальные, трансцендентные или другие, которые могут быть записаны ТМ, конечно, очень редко). Но если вы обрываете цифровой поток на каком-то N, вы не производите выборку из вещественных чисел от 0 до бесконечности, вы выбираете целые числа от 0 до 2 ^ N-1. (Я имею в виду, очевидно, верно?)   -  person David Tonhofer    schedule 23.12.2020
comment
@DavidTonhofer смотрите мой ответ для машины Тьюринга (выраженной с использованием синтаксиса Пролога), которая не обрезает цифровой поток при любом фиксированном N.   -  person Isabelle Newbie    schedule 23.12.2020


Ответы (2)


Какая забавная дискуссия в комментариях. Моя слаборазвитая интуиция в отношении бесконечных чисел и математики подсказывает мне:

Существует конечное число целых чисел, которые могут быть представлены на физическом компьютере с использованием непротиворечивого представления. Таким образом, будет бесконечное множество других целых чисел, которые не могут быть представлены. Таким образом, если вы случайно выберете любое число, вероятность того, что вы сможете представить его на своем компьютере, равна 0. Вы также можете определить:

random_between(0, infinite, infinite).

Трансфинитные числа может быть одно место для начала чтения, но кто я сказать. Для таких вопросов вам нужен математик, а не пешеход-программист.

Может быть, вам следует спросить на https://math.stackexchange.com/?


На ваш вопрос: вы можете представить понятие бесконечности символом, например атом infinite. Затем вам нужно решить, как вы относитесь к этому понятию в своей алгебре, и предоставить для него правила. random_between/3 выше — это всего лишь один пример. Для вдохновения посмотрите, как числа с плавающей запятой обрабатывают бесконечность.

person TA_intern    schedule 23.12.2020

Я думаю, что обсуждение в комментариях приняло менее чем полезный оборот. Дэвид прав в том, что невозможно получить целое число uniform без верхней границы, но неясно, хотите ли вы этого. Существуют абсолютно разные способы получения неограниченных случайных целых чисел из асимметричного распределения, где числа ближе к 0 будут более вероятными, чем числа дальше от 0, но никаких целых чисел, даже один с 10000 триллионов цифр, невозможен. (Пока вы не превышаете память Пролога.)

Вот простой генератор. Во-первых, списки случайной длины:

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, _2022, _2040, _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, 0, 1, 1, 0, 0].

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

?- random_bits(Bits).
Bits = [0, 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, 1, 0],
Value = 3.

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

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

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

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

Эти списки не ограничены по длине, но имеют тенденцию быть короткими, поэтому значения довольно низкие. Мы можем изменить коэффициент 0,25 в random_length, чтобы сделать более длинные списки более вероятными. Например, с 0,01:

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

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

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

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

Есть много вещей, которые можно изменить в этом, например, списки, содержащие только нули, не очень полезны. Вы можете добавить неявный элемент 1 в такие списки. Вы также можете рассматривать один из битов как бит знака, чтобы разрешить генерацию отрицательных чисел. Вы можете сгенерировать случайные, полностью неограниченные рациональные числа, сгенерировав два случайных целых числа P и Q и используя P/Q в качестве случайного значения. И так далее.

person Isabelle Newbie    schedule 23.12.2020
comment
Это все хорошо, но я не понимаю, как это решает реальную проблему с вопросом. Это нечеткий вопрос, он не объясняет, что должна означать бесконечность, каков контекст, каков вариант использования и так далее. Я по-прежнему утверждаю, что случайное число от 0 до бесконечности есть бесконечность; если это не так, хотелось бы увидеть хотя бы неофициальное доказательство. - person TA_intern; 23.12.2020
comment
Дело в том, что что бы вы ни делали со списками и битами, вы просто генерируете случайное число в конечном диапазоне, возможно, каким-то образом искаженное. - person TA_intern; 23.12.2020
comment
Если я брошу шестигранный кубик, наибольшее число, которое я могу получить, равно 6; имеется фиксированная верхняя граница. Если я сверну свою программу, максимальное число, которое я могу получить, не ограничено. Назовите любое число; если его представление в виде списка умещается в памяти, моя программа по существу сгенерирует это число, а также числа, превышающие его. Я не понимаю, почему вы говорите, что числа моей программы находятся в конечном диапазоне. (Память даже не является пределом диапазона как такового: если мы превысим память, программа не сгенерирует ничего, а не то, что помещается в память.) - person Isabelle Newbie; 23.12.2020
comment
Также обратите внимание, что в моем ответе вообще не упоминается бесконечность, поэтому ваше представление о том, что случайное число от 0 до бесконечности является бесконечностью, как ни странно, не имеет к этому никакого отношения. Моя программа не генерирует случайное число от 0 до бесконечности, если вы этого не хотите. Он генерирует (искаженные) случайные целые числа ›= 0 и без верхней границы. Возможно, это поможет вам разобраться в ваших философских возражениях. - person Isabelle Newbie; 23.12.2020