给定一个随时间变化的二元函数,我尝试提取有关此函数中出现的间隔的信息。例如,我有状态 a 和 b,以及以下功能:
a, a, b, b, b, a, b, b, a, a
然后我想要一个像这样的事实间隔(开始,长度,值):
interval(0, 2, a)
interval(2, 3, b)
interval(5, 1, a)
interval(6, 2, b)
interval(8, 2, a)
这是我到目前为止得到的:
time(0..9).
duration(1..10).
value(a;b).
1{ function(T, V): value(V) }1 :- time(T).
interval1(T, Length, Value) :-
time(T), duration(Length), value(Value),
function(Ti, Value): Ti >= T, Ti < T + Length, time(Ti).
:- interval1(T, L, V), function(T + L, V).
#show function/2.
#show interval1/3.
这实际上工作得很好,但仍然不正确,这是我的输出,当我使用 cligo 4.5.4 运行它时:
function(0,b)
function(1,a)
function(2,b)
function(3,a)
function(4,b)
function(5,a)
function(6,b)
function(7,a)
function(8,b)
function(9,a)
interval1(0,1,b)
interval1(1,1,a)
interval1(2,1,b)
interval1(3,1,a)
interval1(4,1,b)
interval1(5,1,a)
interval1(6,1,b)
interval1(7,1,a)
interval1(8,1,b)
interval1(9,1,a)
interval1(9,10,a)
interval1(9,2,a)
interval1(9,3,a)
interval1(9,4,a)
interval1(9,5,a)
interval1(9,6,a)
interval1(9,7,a)
interval1(9,8,a)
interval1(9,9,a)
它只有一个错误:T == 9 处的所有间隔(L == 1 的间隔除外)
所以我尝试添加以下约束,以摆脱那些:
:- interval1(T, L, V), not time(T + L - 1).
在我看来,这意味着“禁止,有一个间隔,这样 T + L 就不是时间” 但是现在 cligo 说这个问题将无法满足。
所以我尝试了另一种解决方案,它应该做同样的事情,但以一种不太通用的方式:
:- interval1(T, L, V), T + L > 10.
这也让整个事情无法解决。我真的不明白,我只是希望这两个规则都能摆脱函数用完的间隔。那么为什么他们会完全杀死模型的所有元素呢?
此外,在我的实验中,我将函数规则替换为:
function(
0, a;
1, a;
2, b;
3, b;
4, b;
5, b;
6, a;
7, b;
8, a;
9, a
).
即使没有有问题的约束,这也会使整个事情无法满足,这是为什么呢?
所以是的......我想,我从根本上误解了一些东西,如果有人能告诉我那到底是什么,我会非常高兴。
最好的问候 Uzaku