生成间隔信息的问题

时间:2016-12-21 14:06:42

标签: answer-set-programming clingo

鉴于随着时间推移的二元函数,我尝试提取有关此函数中出现的间隔的信息。 例如。我有状态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

1 个答案:

答案 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

我们获得的间隔时间比需要的多,因为有些间隔不是最大值,但是我要留下这个让你思考:)

希望这有帮助。