鉴于随着时间推移的二元函数,我尝试提取有关此函数中出现的间隔的信息。 例如。我有状态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.
这实际上工作得很好,但仍然不正确,这是我的输出,当我用clingo 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).
在我的脑海中转化为&#34;禁止,有一个间隔,使得T + L不是时间&#34; 但现在clingo说这个问题是不可理解的。
所以我尝试了另一个解决方案,它应该做同样的事情,但是以一种不那么普遍的方式:
:- 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
答案 0 :(得分:2)
带有约束的程序是不一致的,因为在ASP中,任何包含事实a.
和约束:-a.
的程序都是不一致的。你基本上是说a
是真的,同时,a
不可能是真的。
在您的情况下,例如,您有一条规则告诉interval1(9,10,a)
对某些函数是正确的,另一方面,您有一个约束表明interval(9,10,a)
不能为真,所以你得到不一致。
例如,摆脱不需要的间隔的方法是在间隔的定义中添加额外的原子,例如:
interval1(T, Length, Value) :-
time(T), duration(Length), value(Value),
time(T+Length-1), % I added this
function(Ti, Value): Ti >= T, Ti < T + Length, time(Ti).
现在程序是一致的。
我无法重现您提供的特定功能的不一致性。对我来说,以下是一致的:
time(0..9).
duration(1..10).
value(a;b).
%1{ function(T, V): value(V) }1 :- time(T).
function(0,a).
function(1,a).
function(2,b).
function(3,b).
function(4,b).
function(5,b).
function(6,a).
function(7,b).
function(8,a).
function(9,a).
interval1(T, Length, Value) :-
time(T), duration(Length), value(Value),
time(T+Length-1),
function(Ti, Value): Ti >= T, Ti < T + Length, time(Ti).
#show function/2.
#show interval1/3.
这是我在输出中得到的结果:
$ clingo test 0
clingo version 4.5.4
Reading from test
Solving...
Answer: 1
function(0,a) function(1,a) function(2,b) function(3,b) function(4,b) function(5,b) function(6,a) function(7,b) function(8,a) function(9,a) interval1(0,1,a) interval1(1,1,a) interval1(0,2,a) interval1(6,1,a) interval1(8,1,a) interval1(9,1,a) interval1(8,2,a) interval1(2,1,b) interval1(3,1,b) interval1(2,2,b) interval1(4,1,b) interval1(3,2,b) interval1(2,3,b) interval1(5,1,b) interval1(4,2,b) interval1(3,3,b) interval1(2,4,b) interval1(7,1,b)
SATISFIABLE
Models : 1
Calls : 1
Time : 0.002s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
CPU Time : 0.000s
我们获得的间隔时间比需要的多,因为有些间隔不是最大值,但是我要留下这个让你思考:)
希望这有帮助。