Sujet : Re: What about allowing numbers 1e19, etc.. (Re: Novacore is a Prolog profile that explores various relaxations)
De : janburse (at) *nospam* fastmail.fm (Mild Shock)
Groupes : comp.lang.prologDate : 21. Mar 2025, 19:29:43
Autres entêtes
Message-ID : <vrkb6m$7bc3$1@solani.org>
References : 1 2
User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0 SeaMonkey/2.53.20
Hi,
Interestingly unknowningly, to facilitate JSON
parsing, I had already partially introduced such
numbers. Namely I have already:
/* Dogelog Player 1.3.0 */
?- number_codes(X, "1e19").
X = 1.0e19.
SWI-Prolog consequently does the same:
/* SWI-Prolog 9.3.20 */
?- number_codes(X, "1e19").
X = 1.0e+19.
So all that remains is change the tokenizer a little
bit to allow 1e19. And then we can be lazy and
write 1e19, which is the winner in length, i.e. the
shortes variant among these variants:
- 10.0^19
- 10**19 /* except for SWI-Prolog 9.3.20 */
- 1.0e19
- 1e19
Bye
Mild Shock schrieb:
Hi,
Somehow I have the feeling it doesn't make
sense to only recognize floating point numbers
as number literals that have a period in it.
Most programming languages I have encountered
also recognize floating point numbers when
they have an exponent e or E in it:
- Python:
>>> 1e19
1e+19
- JavaScript:
> 1e19
10000000000000000000
JavaScript is a little special. Since it has a
integer subset inside there floating point numbers.
Now I find that SWI-Prolog also allows 1e19:
/* SWI-Prolog 9.3.20 */
?- X = 1e19.
X = 1.0e+19.
I think this is a good idea. Since there is no
confusion. Most Prolog systems I checked never
alias an operator e with a number:
/* SWI-Prolog 9.3.20 */
?- op(500,yfx,e).
true.
?- X = 1 e 2.
X = 1 e 2.
Bye
Mild Shock schrieb:
Interestingly a flag strict_iso could solve a few
vexing problems. For example the ISO core standard
did only mention floor/1 with signature F → I.
>
So in GNU Prolog I can do:
>
/* GNU Prolog 1.5.0 */
>
?- current_prolog_flag(strict_iso, X).
X = on
yes
>
?- X is floor(1).
uncaught exception: error(type_error(float,1),(is)/2)
>
?- set_prolog_flag(strict_iso, off).
yes
>
?- X is floor(1).
X = 1
yes
>
A few Prolog systems don’t share the above behavior,
like SWI-Prolog for example doesn’t throw the type error.
Also SWI-Prolog has nowhere a flag strict_iso.
>
Currently I have changed my Prolog system to tell me:
>
/* Dogelog Player 1.3.1 */
>
?- current_prolog_flag(strict_iso, X).
X = off.