2.16.1 ISO Syntax Support
AllApplicationManualNameSummaryHelp

  • Documentation
    • Reference manual
      • Overview
        • The SWI-Prolog syntax
          • ISO Syntax Support
            • Processor Character Set
            • Nested comments
            • Character Escape Syntax
            • Syntax for non-decimal numbers
            • Using digit groups in large integers
            • Rational number syntax
            • NaN and Infinity floats and their syntax
            • Force only underscore to introduce a variable
            • Unicode Prolog source
            • Singleton variable checking
    • Packages

2.16.1.6 Rational number syntax

As of version 8.1.22, SWI-Prolog supports rational numbers as a primary citizen atomic data type if SWI-Prolog is compiled with the GMP library. This can be tested using the bounded Prolog flag. An atomic type also requires a syntax. Unfortunately there are few options for adding rational numbers without breaking the ISO standard.30ECLiPSe uses numerator_denominator. This syntax conflicts with SWI-Prolog digit groups (see section 2.16.1.5) and does not have a recognised link to rational numbers. The notation 1/3r and 1/3R have also been proposed. The 1/3r is compatible to Ruby, but is hard to parse due to the required look-ahead and not very natural. See also https://en.wikipedia.org/wiki/Rational_data_type.

ECLiPSe and SWI-Prolog have agreed to define the canonical syntax for rational numbers to be e.g., 1r3. In addition, ECLiPSe accepts 1_3 and SWI-Prolog can be asked to accept 1/3 using the module sensitive Prolog flag rational_syntax, which has the values below. Note that write_canonical/1 always uses the compatible 1r3 syntax.

natural
This is the default mode where we ignore the ambiguity issue and follow the most natural <integer>/<nonneg> alternative. Here, <integer> follows the normal rules for Prolog decimal integers and <nonneg> does the same, but does not allows for a sign. Note that the parser translates a rational number to its canonical form which implies there are no common divisors in the resulting numerator and denominator. Examples of ration numbers are:

1/21/2
2/41/2
1 000 000/33 0001000/33
-3/5-3/5

We expect very few programs to have text parsed into a rational number while a term was expected. Note that for rationals appearing in an arithmetic expression the only difference is that evaluation moves from runtime to compiletime. The utility list_rationals/0 may be used on a loaded program to check whether the program contains rational numbers inside clauses and thus may be subject to compatibility issues. If a term is intended this can be written as /(1,2), (1)/2, 1 / 2 or some variation thereof.

compatibility
Read and write rational numbers as e.g., 1r3. In other words, this adheres to the same rules as natural above, but using the‘r’instead of‘/’. Note that this may conflict with traditional Prolog as‘r’can be defined as an infix operator. The same argument holds for 0x23 and similar syntax for numbers that are part of the ISO standard.

While the syntax is controlled by the flag rational_syntax, behavior on integer division and exponentiation is controlled by the flag prefer_rationals. See section section 4.27.2.2 for arithmetic on rational numbers.