2016-12-21 6 views
1

時間の経過とともに2進関数が与えられた場合、この関数で発生する間隔に関する情報を抽出しようとします。 など。このような間隔情報の生成に関する問題

a, a, b, b, b, a, b, b, a, a 

、私は実際の間隔([スタート]、長さ、値)を望む:私は状態aとb、および以下の機能を持たせてここ

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. 

これは実際にちょっとうまく動作しますが、私はclin​​go 4.5.4とそれを実行したときにはまだない、正しく、これが私の出力は、次のとおりです。

だから私はそれらを取り除くために、以下の制約を追加しようとしたTの== 9(1ここで、L == 1を除く)

ですべての間隔:

一つだけバグがあります
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 + Lは、時間ではないように、間隔を持つように、禁止されている」に変換さ

:- interval1(T, L, V), not time(T + L - 1). 

しかし、今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

プログラムがあるため、実際a.:-a.が矛盾している制約の両方を含む任意のプログラムASPで矛盾しています。基本的にはaが真であり、同時にaは真ではないと言っています。例えば、interval1(9,10,a)がいくつかの関数で真であることを示すルールがあり、一方で、interval(9,10,a)が真であることができないという制約があるため、矛盾が生じます。

望ましくない間隔を取り除く方法は、例えば、間隔の定義に余分な原子を追加することです。g:

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 

我々は必要以上の間隔を取得しているが、私はあなたのことを考えるためにこれを残して:)

希望がこれを助けます。

+0

お返事ありがとうございました。 interval1の定義で提案した1行を追加するだけで問題は解決しました。しかし、最初の制約は ": - interval1(T、L、V)、function(T + L、V)"です。なぜ、これが不整合を引き起こさないのでしょうか? – Uzaku

+0

わかりました。私は、ルールの代わりに関数を手で定義すると、制約が機能しないことに気づいたため、矛盾が生じます。私は間隔の定義に制約を移し、 "関数ではない(T + Length、Value)"を追加する必要があります。 "時間間隔の次の要素が間隔と同じ値であれば間隔はありません"区間(0,2、a)と区間(1,1、a)を生成する。何故ですか? – Uzaku

+0

NVM、私はちょうどそれらが正面ではなく、後ろではないことに気付いたので、定義に "not function(T - 1、Value)"を追加することによって、今私が望むものを得ました。ありがとうございました:) – Uzaku

関連する問題