2

给定一个随时间变化的二元函数,我尝试提取有关此函数中出现的间隔的信息。例如,我有状态 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

4

1 回答 1

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

我们得到了比需要更多的间隔,因为其中一些不是最大的,但我把这个留给你考虑:)

希望这可以帮助。

于 2016-12-23T08:51:22.993 回答