Sujet : The recent extension/1 addition in Dogelog Player (Was: prolog_file_name/2 was a big mistake [Novacore])
De : janburse (at) *nospam* fastmail.fm (Mild Shock)
Groupes : comp.lang.prologDate : 25. May 2025, 08:33:35
Autres entêtes
Message-ID : <100uh4c$8r34$1@solani.org>
References : 1 2 3
User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0 SeaMonkey/2.53.20
Hi,
The solution for Novacore is as follows:
- absolute_file_name/[2,3] does NOT check existence,
neither through failure nor through an error
- ONLY file_property/2 does check for existence,
also available in GNU Prolog:
http://www.gprolog.org/manual/gprolog.html#file-property%2F2- There is a tamer extension/1 option in absolute_file_name/3,
which checks the file base name, and does add the given
extension, if it does not yet have an extension.
Here is a test case, since existence is tested, it also
works with a server
www.foo.com, which might not be reachable,
and because it looks for the file base name, the server name
which has a dot, doesn't confuse absolute_file_name/3 to assume
that there is already an extension, and bar is correctly
extended to bar.p:
absolute_file_name('
http://www.foo.com/bar', X, [extension('.p')]),
X == '
http://www.foo.com/bar.p'.
- In Dogelog Player include/1, ensure_loaded/1, etc.. use
extension('.p'), other Prolog systems might use extension('.pro')
or extension('.pl'), this is just a top-level convenience,
and allows more convention:
?- [bar]
- For portable code, the recommendation is to include the extension.
This was enforced in Dogelog Player up to release 1.3.2, since
it didn't have the extension/1 option. From release 1.3.3 this
remains a best practice, but is not anymore enforced.
:- ensure_loaded('bar.p').
Bye
Mild Shock schrieb:
Hi,
The GNU Prolog specification of prolog_file_name/2
was a big mistake. It reads as follows:
prolog_file_name(File1, File2) unifies File2 with the
Prolog file name associated with File1. More precisely
File2 is computed as follows:
- if File1 has a suffix or if it is user then File2
is unified with File1.
- else if the file whose name is File1 + ’.pl’ exists
then File2 is unified with this name.
- else if the file whose name is File1 + ’.pro’ exists
then File2 is unified with this name.
- else if the file whose name is File1 + ’.prolog’ exists
then File2 is unified with this name.
- else File2 is unified with the name File1 + ’.pl’.
This predicate uses absolute_file_name/2 to check the existence of a file (section 8.26.1).
http://www.gprolog.org/manual/html_node/gprolog050.html#hevea_default836
It was adopted by SWI-Prolog and made parameterizable through
absolute_file_name/3:
https://www.swi-prolog.org/pldoc/doc_for?object=absolute_file_name/3
The big mistake is the existence check. In a web context
it requires a server rountrip or something. And since there are
3 existence checks, its 3 server rountrips possibly HEAD requests.
Formerly Jekejeke Prolog suffered from this problem. Now
with Dogelog Player and as part of Novacore we wanted to
do something else. What is the solution?
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.
>