我有以下规则在具有特定日期的数据库中查找事实:
preceding(ID,Date,Category,Preceding) :-
setof([ID,D,Category,Amount], row(ID,D,Category,Amount), Preceding),
D @< Date.
after(ID,After,Category,Rows) :-
setof([ID,D,Category,Amount], row(ID,D,Category,Amount), Rows),
D @> After.
preceding
工作得很好:
?- preceding(ID,'2020-01-01',Category,Preceding).
Preceding = [[100002, '2018-11-05', 'CEM', 500.0], [100007, '2018-11-01', 'Consulting Package', 100000.0], [100011, '2017-10-25', 'CEM', 500.0], [100012, '2017-10-15', 'CEM', 500.0], [100012, '2017-10-25', 'Tuition Package', 5543.37], [100013, '2017-10-15', 'CEM'|...], [100013, '2017-11-08'|...], [100014|...], [...|...]|...].
但after
不起作用:
?- after(ID,'2000-01-01',Category,Rows).
false.
请注意,这两个规则之间的唯一区别@<
是vs.@>
运算符。我试过改变操作数的顺序,改变规则中语句的顺序,但它不起作用。
我也尝试过颠倒逻辑:
after(ID,After,Category,Rows) :-
setof([ID,D,Category,Amount], row(ID,D,Category,Amount), Rows),
After @< D.
这也不起作用。
我什至写了一个单独的规则来检查我是否可以让操作员工作:
isafter(A,B) :- A @> B.
这行得通。但是用D @> After
我isafter(D,After)
的after
规则替换是行不通的。
为什么制作“之前”条件有效,但“之后”条件无效?你能让我的after
规则起作用吗?:)
(我实际上想编写一个between
同时使用“之前”和“之后”条件的函数,但我意识到我的between
函数的确切问题是@>
。)