【发布时间】:2021-04-19 12:39:40
【问题描述】:
TL;DR: 谓词 datime/2(由 SICStus Prolog 和 SWI-Prolog 提供)将 UNIX time 与包含年、月、日、小时、分钟和秒的记录相关联。
对于一些极端情况,我得到了奇怪的答案,这让我想知道: 在这些情况下,符合 ISO 标准的 Prolog 系统应该引发哪些错误?
首先,这是datime/2 documentation——SICStus Prolog Manual 的一部分:
<strong>now(-When)</strong>将当前日期和时间统一为带有When的UNIX 时间戳。
<strong>datime(-Datime)</strong>将Datime与当前日期和时间统一为datime/6形式的datime(Year,Month,Day,Hour,Min,Sec)记录。所有字段都是整数。
<strong>datime(+When,-Datime)</strong><strong>datime(-When,+Datime)</strong>将now/1获得的时间戳转换为datime/6记录。 可以双向使用。
所以这是一些虚假的 SICStus Prolog 4.6.0 输出:
| ?- use_module(library(system)).
yes
| ?- datime(X,Y).
no % expected: result | error
| ?- datime(-67768200000000000,X).
no % expected: result | error
| ?- datime(X,datime(19700000000000,1,1,1,0,0)).
X = -32029950380687608 ? ; % expected: X >= 0
no
SWI-Prolog 8.2.0 给出了一些奇怪的“答案”:
?- use_module(library(dialect/sicstus/system)).
true.
?- datime(X,datime(1970,1,1,1,0,0)).
ERROR: Arguments are not sufficiently instantiated
% expected: X = 0
?- datime(10000000000000000000000000,X).
X = datime(1901, 1461302465, 32753, 9, 35, 13).
?- datime(1000000000000000000000000000,X).
X = datime(1901, 1461302465, 32753, 9, 35, 13).
?- datime(100000000000000000000000000000,X).
X = datime(1901, 1461302465, 32753, 9, 35, 13).
% expected: different answers for different queries
所以: 在这些情况下,符合 ISO 标准的 Prolog 系统应该引发哪些错误?
【问题讨论】:
-
我认为您可以 1) 保持 ISO 兼容或 2) 有有意义的例外。但不是两者兼而有之。
-
@DavidTonhofer:你能举一 (1) 个例子来证实你的观点吗?
-
@false 如果我说 Java 没有在语言规范中列出允许的异常集就足够了吗?但是没关系:“合同违反”或“断言失败”也不例外。
-
@DavidTonhofer:到目前为止,您还没有给出一个具体示例来说明您最初的争论。你只是做了一些非常抽象的评论。
-
@DavidTonhofer。让我们继续关注 Prolog。我不能同时担心 Prolog 和 Java。
标签: prolog iso-prolog