I'm running the following query in a directory having an empty file empty:
?- member(EOF_action,[error,eof_code,reset]), open(empty,read,S,[eof_action(EOF_action)]), stream_property(S,end_of_stream(EOS)), close(S).
Here's what I get from different Prolog systems for EOS:
| Prolog system | eof_action(error) | eof_action(eof_code) | eof_action(reset) |
|---|---|---|---|
| SICStus Prolog | not | not | not |
| GNU Prolog | at | at | not |
| Scryer Prolog | at | at | at |
| Traella Prolog | at | at | not |
| SWI-Prolog | not | not | not |
It appears that above systems behave quite differently in this particular corner case.
Does the ISO-Prolog standard specify which behaviour is right for conforming processors?
The relation between stream position and end position:
Let S be a input stream of size n. Let p be a position in the source of the stream S.
not end of stream if p < n.at end of stream if p = n.past end of stream if p > n.On an actual implementation the stream position may be a couple (q,e) where q is the position in the source and e is in {not, at, past} such that:
not end of stream if and only if q < n and e = not.at end of stream if and only if q = n and e = at.past end of stream if and only if q = n and e = past.This is given by:
7.10.2.13
end_of_stream(E) - If the stream position is end-of-stream thenEis unified withat...
And with:
7.10.1.1
read - Input. ... input shall start at the beginning of that source.
Knowing this, the stream position is at end of stream when opening the empty file.
Either stream_property/2 has an issue or the stream is in an invalid state.
A better question could be how is a conforming system supposed to handle end of stream?
And test the empty file and non-empty file for different engines.
On the comment of the question:
There is a note on the standard that the predicate peek_char/2 leaves unaltered the stream position so query like stream_property(S, end_of_stream(Eos0)), peek_char(S, _), stream_property(S, end_of_stream(Eos)), Eos0 = Eos should succeed.
7.10.2.9 End position of a stream
When all a streamShas been input (for example by
get_byte/2orread_term/3)Shas a stream position
end-of-stream. ...
Does this include empty files, where nothing has been input, although nothing is all we have? Thinking of VSAM ... This remains pretty ambiguous no matter how we twist and turn it.
More important is what happens if we peek_char/1 or get_char/1 any further.
And even worse whether or not at_end_of_stream/0/1 and stream_property(S, end_of_stream(Eos)) are the same, at least for detecting the end the first time.
As a quick check enter
?- at_end_of_stream.
(There are two factions, two who fail and those who prompt. In the past there was much more prompting)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With