Вокруг к инкрементам 2,5?

Это означает, что это глупый код:

token(T) -->
    ( "1", !, { T = one }
    ; "2", !, { T = two }
    ; "3", !, { T = three }
    )

Это менее глупый код:

token(T) --> one_two_three(T).

one_two_three(one) --> "1".
one_two_three(two) --> "2".
one_two_three(three) --> "3".

Но все же не так хорошо. Может быть, лучше:

token(T) --> [X], { one_two_three(X, T) }.

one_two_three(0'1, one).
one_two_three(0'2, two).
one_two_three(0'3, three).

Последний пример также начинает выглядеть глупо, но помните, что теперь у вас есть индексирование по первому аргументу. Вы читаете один раз, нет выбора, нет возврата назад.

Но если вы действительно хотите знать, как писать эффективно, вам нужно измерить, куда уходит время и пространство. Вы измерили?

Но если вы действительно хотите знать, как исправить, то, возможно, прочитайте «Craft of Prolog», я не понимаю всю эту книгу, но помню, что в ней был большой раздел по DCG.

Но если вы действительно хотите анализировать такие форматы, большие файлы могут найти существующие библиотеки на других языках, это может быть намного быстрее, чем самый быстрый Пролог.

7
задан Noldorin 30 June 2009 в 17:36
поделиться

2 ответа

Разделите число на 2,5, окружите к ближайшему целому числу, затем умножьте результат на 2,5.

Вы близки.

Function RoundToIncrement(ByVal orignialNumber As Decimal, ByVal increment As Decimal) As Decimal
    Return Math.Ceiling( orignialNumber / increment ) * increment
End Function

Математика. Потолок будет всегда округлять в большую сторону нецелые числа, таким образом, Вам не будет нужна посткорректировка.

19
ответ дан 6 December 2019 в 06:38
поделиться

Разделите число на 2,5. Вокруг к ближайшему 1. Умножьтесь на 2,5.

Остерегайтесь кумулятивных ошибок, и Вы все установлены.

- Adam

6
ответ дан 6 December 2019 в 06:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: