Результатом Sum является слово floor(Col + Row + 1), которое никогда не является целым числом, и я не знаю, почему

Я должен написать часть пролога, где я должен вычислить, какая позиция в массиве используется для хранения значения. Однако результат этих вычислений должен возвращать целое число, поэтому я использую предикат floor/1, чтобы получить целое число значения, но в моем коде это не работает. Он продолжает возвращать число с десятичной точкой, например 3,0 вместо 3

Вот мой код:

assign_value(El, NumberArray, RowNumber, I) :-
    ground(El),
    Number is NumberArray[El],
    Col is I/3,
    Row is RowNumber/3*3,
    Sum is floor(Col + Row + 1),
    subscript(Number, [Sum], El).
assign_value(_, _, _, _).

Результат Sum is floor(Col + Row + 1) никогда не является целым числом, и я не знаю почему. Кто-нибудь может мне с этим помочь?

3 ответа

Решение

Из документации этажа / 2 ( http://www.eclipseclp.org/doc/bips/kernel/arithmetic/floor-2.html)

Тип результата совпадает с типом аргумента. Чтобы преобразовать тип в целое число, используйте integer/2,

Например:

...,
Floor is floor(Col+Row+1), Sum is integer(Floor).

В ISO Prolog, оцениваемый функтор floor/1 имеет в качестве подписи (9.1.1 в ИСО / МЭК 13211-1):

этажF→I

Таким образом, он ожидает float и возвращает целое число.

Тем не менее, я не верю, что сначала нужно создать число с плавающей точкой из целых чисел, а затем напечатать их обратно до целых чисел. (div)/2 на месте (/)/2 тем самым оставаясь с целыми числами все время.

Чтение документации для floor/2, Мы видим, что

[ floor/2 ] работает на всех числовых типах. Результирующее значение является наибольшим интегральным значением, которое меньше этого числа (округление в сторону уменьшения до минус бесконечности).

Тип результата совпадает с типом аргумента. Чтобы преобразовать тип в целое число, используйте integer/2,

Таким образом, вы получаете тот же тип, который вы указали в качестве аргумента. Глядя дальше на ваш предикат, мы видим использование / оператор. Читая документацию дальше, мы видим, что

'/'/3 используется компилятором ECLiPSe для расширения вычисляемых арифметических выражений. Так что призыв к /(Number1, Number2, Result) эквивалентно

Result is Number1 / Number2

который должен быть предпочтительным для мобильности.

Тип результата деления зависит от значения глобального флага Предпочитаемое значение. Когда он выключен, результат является плавающим, когда он включен, результат является рациональным.

Ваша операция деления никогда не возвращает целое число, означающее, что все происходит с точностью до числа с плавающей запятой.

Если вы хотите выполнить целочисленное деление, вы должны использовать операторы // или же div,

Другие вопросы по тегам