• What about allowing numbers 1e19, etc.. (Re: Novacore is a Prolog profi

    From Mild Shock@21:1/5 to Mild Shock on Fri Mar 21 19:21:36 2025
    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.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Mild Shock@21:1/5 to Mild Shock on Fri Mar 21 19:29:43 2025
    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.


    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Mild Shock@21:1/5 to Mild Shock on Sun May 25 09:22:08 2025
    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.


    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Mild Shock@21:1/5 to Mild Shock on Sun May 25 09:33:35 2025
    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.



    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Mild Shock@21:1/5 to Mild Shock on Sun May 25 09:39:39 2025
    Corr.: Typo

    This here:

    Here is a test case, since existence is tested, it also

    Should read:

    Here is a test case, since existence is NOT tested, it also

    Mild Shock schrieb:
    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.




    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)