Prolog-如何将时间戳设置为谓词中的参数?

问题描述

当我向DB断言新事实时,是否可以使用get_time(T)[内置函数]作为参数? (我只想在事实断言时间之间进行比较。)

代码

:- dynamic start/2.
    
start_interval(A) :- start(A,_),!,false.
start_interval(A) :- assert(start(A,get_time(T))).

运行示例:

Warning: c:/users/*****/desktop/prolog/4.pl:6:
Warning:    Singleton variables: [T]
Welcome to SWI-Prolog (threaded,64 bits,version 8.2.1)
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software.
Please run ?- license. For legal details.

For online help and background,visit https://www.swi-prolog.org
For built-in help,use ?- help(Topic). or ?- apropos(Word).

?- start_interval(1).
true.

?- start_interval(2).
true.

?- listing(start).
:- dynamic start/2.

start(1,get_time(_)).
start(2,get_time(_)).

true.

?- get_time(T).
T = 1598718310.038124.

我想获取时间戳,而不是“ start(#,get_time(_))”,它是在我最初调用start_interval(Num)时创建的。 (当我调用它时,也可以看到get_time(T)的输出

有可能吗? 也许还有另一种方法可以在事实断言时间之间进行比较?

解决方法

您只需要实际调用(无论后面是什么)get_time(T)表达式(名义上是谓词,但实际上不是,因为它的行为取决于被调用的确切时间 。非常不合逻辑:我们是真正的I / O。

在撰写本文时,它仍然是一个不被称为的语法元素,以字面意义本身为代表。

(此外,优先使用assertz/1而不是较旧的assert/1):

所以:

:- dynamic start/2.

start_interval(A) :- start(A,_),!,false.
start_interval(A) :- get_time(T),assertz(start(A,T)).

然后:

?- start_interval(1).
true.

?- start(A,T).
A = 1,T = 1598726506.9420764.